Thursday, November 30, 2023

bit por bit - MISO and MOSI

console show
### spi programmer for ATTINY85    1
#
load lpttcl
set ver [package require lpttcl]

lpt_wrdata 0x00
puts [lpt_rdstat]
set val 0
lpt_rdstat

proc clearBit {n} {
global val
set val [expr $val & [expr ~$n]]
lpt_wrdata $val
}

proc setBit {n} {
global val
set val [expr $val | $n]
lpt_wrdata $val
}

proc setSCK {value} {
  if {$value == 1} {
    setBit 2
  } else {
    clearBit 2
  }
}

proc setMOSI {value} {
  if {$value == 1} {
    setBit 4
  } else {
    clearBit 4
  }
}

proc setRES {value} {
  if {$value == 1} {
    setBit 1
  } else {
    clearBit 1
  }
}

proc readMISO {} {
  # added
  after 100
  set miso [lpt_rdstat]
  if {$miso == 127} {set y 1}
  if {$miso == 63}  {set y 0}
  return $y
}

proc initialisiere {} {
  global h hh hhh hhhh
  set h    [open /sys/class/gpio/gpio25/value w]
  set hh   [open /sys/class/gpio/gpio24/value w]
  set hhh  [open /sys/class/gpio/gpio23/value w]
  set hhhh [open /sys/class/gpio/gpio22/value r]
  setMOSI 0
  #flush $hh
  setSCK 0
  #flush $hhh
  after 100
  setRES 1
  #flush $h
}

proc start-programming {} {
  global h hh hhh
  setMOSI 0
  setSCK 0
  after 100
  setRES 0
}

proc stop-programming {} {
  global h hh hhh
  setMOSI 0
  setSCK 0
  after 100
  setRES 1
}

proc sende-u-empfange {n} {
  global hh hhh hhhh
  binary scan [binary format H* $n] b* bits
  set y 0

  setSCK 0
  set x [readMISO]
  update
 
  for {set i 7} {$i > -1} {incr i -1} {
      #puts "bit $i = weight [expr int(pow(2,$i))]"
      update
      set weight [expr int(pow(2,$i))]
      if {$x == 1} {incr y $weight}
      setMOSI [string index $bits $i]
      setSCK 1
      after 1
      setSCK 0
      set x [readMISO]
  }
 
  return [format %X $y]
}

after 1000
start-programming

set ein [open 207 r]
set aus [open result w+]

set zzz ""
set nn 0
set zeit1 [clock milliseconds]

while {[eof $ein] != 1 } {
  set zeile [gets $ein]
  puts -nonewline "$zeile - "
 
  if {[lindex $zeile 0] == "FF"} break
  set y ""
 
  set z [sende-u-empfange [lindex $zeile 0] ]
  set y "$y $z"
 
  set z [sende-u-empfange [lindex $zeile 1] ]
  set y "$y $z"
 
  set z [sende-u-empfange [lindex $zeile 2] ]
  set y "$y $z"
 
  set z [sende-u-empfange [lindex $zeile 3] ]
  set y "$y $z"
  puts "$y"
 
  incr nn 4
}

set zeit2 [clock milliseconds]
set diff [expr $zeit2 - $zeit1]
set teiler [expr 1.0*$diff/$nn]

stop-programming

close $ein
close $aus
puts "*** DONE"
puts "$diff Millisekunden $nn Instruktionen $teiler ms pro Instruktion"

 

No comments: