Mikro-TPS für den Sparrow       

Elektronik-Labor  Projekte  AVR                  




Video: http://youtu.be/MKM-CHtdWxg

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






Elektronik-Labor  Projekte  AVR