Mikro-TPS für den
Sparrow
Nachdem mit der binären Telegraphie eine passende Eingabemethode
für den Sparrow entwickelt wurde kam die Frage auf, ob man damit nicht
wenigstens eine ganz kleine Tastenprogrammierbare
Steuerung
(TPS) realisieren könnte. Einschränkungen ergeben sich aus den wenigen
Portleitungen und aus dem begrenzten Speicher. Und tatsächlich hat sich
gezeigt, dass der Programmspeicher des Tiny13 schnell voll wird. Hier
eine erste Version der Mikro-TPS.
Sparrow_TPS1
Wie
gewohnt hat das Programm eine Tonausgabe für die binäre Telegraphie.
Der Anwender drückt beim Start auf S1 um den Programmiermodus zu
starten. LED2 geht an um die Eingabe des ersten Befehls anzuzeigen. Man
gibt zuerst das 4-Bit Kommando ein, dann die 4-Bit Daten. Während der
Datenausgabe ist LED2 aus, danach geht sie für die nächste
Befehls-Eingabe wieder an. Das erleichtert die Orientierung. Nach der
letzten Eingabe tippt man FF ein um den Programmiermodus zu beenden.
Nach der Eingabe oder nach dem Start ohne Eingabe gibt die TPS das
eigegebene Programm zunächst akustisch aus, damit man eine Kontrolle
hat ob alles richtig eingegeben wurde. danach wird das eingegebene
Programm ausgeführt. In dieser Version ist nur der Ausgang B3 (1 8 =
LED2 an) nutzbar, weil LED1 als Sound-Ausgang konfiguriert wurde.
Es existieren nur drei Befehle:
1, Portausgabe an Port B
2, Wartezeit 1ms bis 60 s
3, Sprung zurück
Download: Sparrow_TPS1.zip
Direkt laden: http://tiny.systems/categorie/cheepit/TPS1.html
'Sparrow_TPS1.bas
'Dit 100 ms = 0, Dah 300 ms = 1, Low Bit first
$regfile = "attiny13.dat"
$crystal = 1200000
$hwstack = 8
$swstack = 4
$framesize = 4
Led1 Alias Portb.1
Led2 Alias Portb.3
S1 Alias Pinb.0
S2 Alias Pinb.2
Config Portb = &B000011010
Dim D As Byte
Dim T As Byte
Dim B As Byte
Dim C As Byte
Dim A As Byte
Dim Addr As Byte
Dim Eebyte As Byte
Dim Dat As Byte
Dim Kom As Byte
Dim Adrhi As Byte
Dim Adrlo As Byte
Dim Adrret As Byte
'Dim Prog As Byte
Dim Dd As Word
Dim Times(16) As Word
Dim Delaytime As Word
Dta:
Data 1% , 2% , 5% , 10% , 20% , 50% , 100% , 200% , 500% , 1000% , 2000% , 5000% , 10000% , 20000% , 30000% , 60000%
Declare Sub Receivebinary
Declare Sub Sendbinary
' Timer 0 is configured for Sound at OC0B / PB1
Config Timer0 = Pwm , Prescale = 8 , Compare B Pwm = Clear Up
If S1 = 0 Then
Receivebinary
A = 0
Do
Led2 = 1
Receivebinary
D = C * 16
Led2 = 0
Receivebinary
C = C And 15
D = D + C
Writeeeprom D , A
A = A + 1
Loop Until D = 255
'Else
' Dat = &H12 : Writeeeprom Dat , 0 'Dout=2
' Dat = &H29 : Writeeeprom Dat , 1 '1000 ms
' Dat = &H18 : Writeeeprom Dat , 2 'Dout=8
' Dat = &H29 : Writeeeprom Dat , 3 '1000 ms
' Dat = &H34 : Writeeeprom Dat , 4 'Adr = Adr - 4
End If
A = 0
Do
Readeeprom Eebyte , A
If Eebyte < 255 Then
Led2 = 1
C = Eebyte / 16
Sendbinary
Waitms 500
Led2 = 0
C = Eebyte And 15
Sendbinary
A = A + 1
Waitms 500
End If
Loop Until Eebyte = 255
Addr = 0
Do
Readeeprom Eebyte , Addr
Addr = Addr + 1
Dat = Eebyte And 15
Kom = Eebyte / 16
If Kom = 1 Then '1: Direkte Portausgabe
Portb = Dat Or &B11100101
End If
If Kom = 2 Then
Restore Dta
Delaytime = Lookup(dat , Dta)
Waitms Delaytime '2: Wartezeit
End If
If Kom = 3 Then '3: Sprung - relativ
Addr = Addr - 1
Addr = Addr - Dat
End If
If Kom = 4 Then
A = Dat
End If
Loop
Sub Receivebinary
C = 0
B = 1
Do
Do
Loop Until S1 = 0
Pwm0b = 80
T = 0
Do
Waitms 10
T = T + 1
Loop Until S1 = 1
Pwm0b = 0
Waitms 10
If T > 15 Then
C = C + B
End If
Shift B , Left
T = 0
Do
Waitms 10
T = T + 1
Loop Until S1 = 0 Or T > 25
Loop Until T > 25
End Sub
Sub Sendbinary
Do
B = C And 1
If B = 1 Then
Pwm0b = 80
Waitms 300
Else
Pwm0b = 80
Waitms 100
End If
Pwm0b = 0
Waitms 100
Shift C , Right
Loop Until C = 0
End Sub
Sparrow_TPS2
Die
zweite Version der Mikro-TPS kennt mehr Befehle, hat dafür aber eine
sehr
spartanische Eingabe. Diesmal wurde auf die Tonausgabe und auf das
Auslesen des
Programms verzichtet. Man muss das Programm also mit voller
Konzentration
"blind" eingeben, was aber wegen der einfachen
4-Bit-Eingaben gelingt. Der eingesparte Speicherplatz wurde
für weitere
Befehle genutzt. Die Ausgabe-Bits wurden umsortiert, sodass man nun
drei Ausgabeports
hat.
1, Portausgabe an Port B,
1=B1, 2=B3, 4 =B4
2, Wartezeit 1ms bis 60 s
3, relativer Sprung zurück
4, A
5 2, C=A
8, AdrHi
9, AdrLo, absoluter Sprung
A, C-mal
C 4, Skip if S1=1
C 5, Skip if S2 =1
Programmbeispiele:
Gegentaktblinker:
11 28 12 28 34
RS-Schalter S1, S2:
C5 12 C4 11 34
Zeitschalter S2, 1 min: C5 93 32 13 2F
10 36
Für einen Neustart des TPS-Programms kann man übrigens die neue
Reset-App verwenden: http://tiny.systems/categorie/cheepit/Reset.html
Download: Sparrow_TPS2.zip
Direkt laden: http://tiny.systems/categorie/cheepit/TPS2.html
'Sparrow_TPS2.bas
'Dit 100 ms = 0, Dah 300 ms = 1, Low Bit first
$regfile = "attiny13.dat"
$crystal = 1200000
$hwstack = 8
$swstack = 4
$framesize = 4
Led1 Alias Portb.1
Led2 Alias Portb.3
S1 Alias Pinb.0
S2 Alias Pinb.2
Config Portb = &B000011010
Dim D As Byte
Dim T As Byte
Dim B As Byte
Dim C As Byte
Dim A As Byte
Dim Addr As Byte
Dim Eebyte As Byte
Dim Dat As Byte
Dim Kom As Byte
Dim Adrhi As Byte
Dim Adrlo As Byte
Dim Adrret As Byte
'Dim Prog As Byte
Dim Dd As Word
Dim Times(16) As Word
Dim Delaytime As Word
Dta:
Data 1% , 2% , 5% , 10% , 20% , 50% , 100% , 200% , 500% , 1000% , 2000% , 5000% , 10000% , 20000% , 30000% , 60000%
Declare Sub Receivebinary
Declare Sub Sendbinary
' Timer 0 is configured for Sound at OC0B / PB1
' Config Timer0 = Pwm , Prescale = 8 , Compare B Pwm = Clear Up
If S1 = 0 Then
Receivebinary
A = 0
Do
Led2 = 1
Receivebinary
D = C * 16
Led2 = 0
Receivebinary
C = C And 15
D = D + C
Writeeeprom D , A
A = A + 1
Loop Until D = 255
End If
Addr = 0
Do
Readeeprom Eebyte , Addr
Addr = Addr + 1
Dat = Eebyte And 15
Kom = Eebyte / 16
If Kom = 1 Then '1: Direkte Portausgabe
Led1 = Dat.0
Led2 = Dat.1
Portb.4 = Dat.2
End If
If Kom = 2 Then
Restore Dta
Delaytime = Lookup(dat , Dta)
Waitms Delaytime '2: Wartezeit
End If
If Kom = 3 Then '3: Sprung - relativ
Addr = Addr - 1
Addr = Addr - Dat
End If
If Kom = 4 Then
A = Dat
End If
If Kom = 5 Then
If Dat = 2 Then C = A
End If
If Kom = 8 Then
Adrhi = Dat 'Oberes Nibble der Adresse
End If
If Kom = 9 Then
Addr = Adrhi * 16 'Springe absolut 0...255
Addr = Addr + Dat
End If
If Kom = 10 Then
C = C - 1
C = C And 15
If C > 0 Then 'C-mal
Addr = Adrhi * 16 'Springe absolut 0...255
Addr = Addr + Dat
End If
End If
If Kom = 12 Then
If Dat = 4 Then
If S1 = 1 Then Addr = Addr + 1
End If
If Dat = 5 Then
If S2 = 1 Then Addr = Addr + 1
End If
End If
Loop
Sub Receivebinary
C = 0
B = 1
Do
Do
Loop Until S1 = 0
' Pwm0b = 80
T = 0
Do
Waitms 10
T = T + 1
Loop Until S1 = 1
' Pwm0b = 0
Waitms 10
If T > 15 Then
C = C + B
End If
Shift B , Left
T = 0
Do
Waitms 10
T = T + 1
Loop Until S1 = 0 Or T > 25
Loop Until T > 25
End Sub
Der
Sparrow-Bot 1
Zwei sparsame Motoren von Franzis (Typ Kassettenrekorder, siehe auch www.b-kainka.de/bastel140.html) wurden direkt
an Port B1 (grün) und B3 (rot) angeschlossen. Auf die Achsen wurden
kurze Abschnitte weicher Drahtisolierung geschoben. Das sind nun die
Räder, ein getriebefreier Antrieb. Hinten wird der Robbi von einer Kufe
aus Draht geführt. Alles zusammen mit der Li-Akku auf ein Stückchen
Schrottplatine gebunden, fertig ist der Sparrow-Bot. Die Software ist
ganz einfach und wurde mit Bascom geschrieben:
Download: Sparrow_Bot1.zip
Direkt laden: http://tiny.systems/categorie/cheepit/SparrowBot.html
'ATtiny13 Sparrow_Bot1.bas
$regfile = "attiny13.dat"
$crystal = 1200000
$hwstack = 8
$swstack = 4
$framesize = 4
Config Portb = &B000011010
Led1 Alias Portb.1
Led2 Alias Portb.3
S1 Alias Pinb.0
S2 Alias Pinb.2
Led1 = 0
Led2 = 0
Do
Led1 = 1
Led2 = 1
Waitms 500
Led1 = 0
Led2 = 0
Waitms 500
Led1 = 1
Waitms 500
Led1 = 0
Waitms 500
Loop
End
Aber mit der TPS geht es noch besser und hat den Vorteil, dass man das
Programm jederzeit auf dem Parkett verändern kann. Das Programm besteht
nur aus vier Ausgaben und vier Wartezeiten. Auf den Rücksprung kann
verzichtet werden, denn der gelöschte Speicher enthält durchgehend FF,
was nicht ausgeführt wird und am Ende wieder zum Anfang führt:
13 29 10 29 11 29 10 29