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"