huzzel
Geowizard
Ich möchte hier mal mein Wählscheibentelefon vorstellen, das mit einem Tiny13 einen MP3-Player steuert.
Hier die Schaltung:
Stromversorgung wird über zwei AAA-Batterien gewährleistet. Der MP3-Player nutzt nur eine der Batterien. Das hat zur Folge, dass die Reihenfolge beim Einlegen zu beachten ist, da sich der Tiny auch über den Player Strom zieht und schon anfängt, wo er es noch gar nicht soll :/ .
Die Ausgänge B.0, B.1 und B.2 steuern den MP3-Player über einen Optokoppler.
B.3 ist der Wählscheibeneingang
B.4 wird als Eingang (Gabelschalter) und als Ausgang (READY-LED) benutzt.
Ich habe hier diesen Kompromiss wählen müssen, da ich keine Tinys verbraten wollte, weil ich den Resteingang mitbenutze (Ich habe keinen Hochvoltprogrammierer, sonst hätte ich den Resteingang mitbenutzt)
Die große Schwierigkeit war, den MP3-Player bei Starten auf einen definierten Zustand zu bringen. Bei meinem verbauten Player ging das über Verzeichnis vorwärts, beim letzten Verzeichnis ging es nicht weiter und somit hatte ich meinen definierten Anfangstrack.
Die READY-LED zeigt an, ob das Telefon bereit ist. Beim Start dauert es sehr lange (ca. 15 Sekunden bis alles durch ist), aber im Betrieb max eine Sekunde.
Die ganze Programmierung kommt ohne Interrups aus.
Nach jeder gewählten Nummer wird diese überprüft. Die programmierte Nummer ist im EEPROM abgelegt, also max. 64 Stellen (man hätte zwar auch noch mehr programmieren können, aber 64 Stellen reichen auch so
). Sind alle Ziffern richtig gewählt, springt das Programm zur Ausgabe.
Wenn zuwenige Ziffern gewählt wurden, wartet das Programm, ob noch eine Ziffer kommt, wenn nicht, dann geht es zum "Kein Anschluss unter dieser Nummer"
Der Gabelschalter wird ständig überprüft, ob der Hörer aufgelegt wird, wenn ja, zurück auf Anfang.
Auch innerhalb der Ausgabe Wird der Gabelschalter überprüft. Wenn Aufgelegt wird, wird wieder auf den definierten Track weitergesprungen. Der definierte Track ist ein Track mit 12 Minuten nichts. Aber auch mehr wie 12 Minuten zu warten bringt nichts, da der Player fest auf Trackwiederholen eingestellt ist
.
Die richtige und die falsche Ansage wird nach einer definierten Zeit beendet und es geht zurück auf Anfang.
Und hier noch der Code
Hier die Schaltung:

Stromversorgung wird über zwei AAA-Batterien gewährleistet. Der MP3-Player nutzt nur eine der Batterien. Das hat zur Folge, dass die Reihenfolge beim Einlegen zu beachten ist, da sich der Tiny auch über den Player Strom zieht und schon anfängt, wo er es noch gar nicht soll :/ .
Die Ausgänge B.0, B.1 und B.2 steuern den MP3-Player über einen Optokoppler.
B.3 ist der Wählscheibeneingang
B.4 wird als Eingang (Gabelschalter) und als Ausgang (READY-LED) benutzt.
Ich habe hier diesen Kompromiss wählen müssen, da ich keine Tinys verbraten wollte, weil ich den Resteingang mitbenutze (Ich habe keinen Hochvoltprogrammierer, sonst hätte ich den Resteingang mitbenutzt)
Die große Schwierigkeit war, den MP3-Player bei Starten auf einen definierten Zustand zu bringen. Bei meinem verbauten Player ging das über Verzeichnis vorwärts, beim letzten Verzeichnis ging es nicht weiter und somit hatte ich meinen definierten Anfangstrack.
Die READY-LED zeigt an, ob das Telefon bereit ist. Beim Start dauert es sehr lange (ca. 15 Sekunden bis alles durch ist), aber im Betrieb max eine Sekunde.
Die ganze Programmierung kommt ohne Interrups aus.
Nach jeder gewählten Nummer wird diese überprüft. Die programmierte Nummer ist im EEPROM abgelegt, also max. 64 Stellen (man hätte zwar auch noch mehr programmieren können, aber 64 Stellen reichen auch so
Wenn zuwenige Ziffern gewählt wurden, wartet das Programm, ob noch eine Ziffer kommt, wenn nicht, dann geht es zum "Kein Anschluss unter dieser Nummer"
Der Gabelschalter wird ständig überprüft, ob der Hörer aufgelegt wird, wenn ja, zurück auf Anfang.
Auch innerhalb der Ausgabe Wird der Gabelschalter überprüft. Wenn Aufgelegt wird, wird wieder auf den definierten Track weitergesprungen. Der definierte Track ist ein Track mit 12 Minuten nichts. Aber auch mehr wie 12 Minuten zu warten bringt nichts, da der Player fest auf Trackwiederholen eingestellt ist
Die richtige und die falsche Ansage wird nach einer definierten Zeit beendet und es geht zurück auf Anfang.
Und hier noch der Code
Code:
$regfile = "ATtiny13.DAT"
$crystal = 128000 'Frequenz des internen Oszillators
$hwstack = 16
Const Nummern = 11 'hardwarestack herabsetzen damit genügend variablen zur verfügung stehen
Config Portb = &B00010111
'PIN 3 (PIN4) Eingabe/Ausgabe Gabelumschalter 0-> Aufgelegt 1-> Abgehoben / READY-LED
' Schalter offen -> Abgehoben
'Pin 2 (PIN3) Eingabe Wählschalter
'PIN 7 (PB2) Ausgabe Enter
'Pin 6 (PB1) Ausgabe Vorwärts
'PIN 5 (PB0) Ausgabe Play
Portb = 0 'Ausgänge auf Low setzen
Stop Ac 'Analog-Kom parator abschalten, um Strom zu sparen
Stop Adc
Dim X As Byte
Dim Y As Integer
Dim Ziffern As Byte
Dim Zahl As Byte
Dim Ok As Bit
Dim Pruefziffer As Byte
Config Portb.4 = Output
Portb.4 = 1 'LED-Test
Wait 2
Portb.4 = 0
' Warten, bis hochgefahren
Wait 9
' Player vorbereiten
' Einschalten
Portb.0 = 1
Waitms 1500
'lange EIN drücken
Portb.0 = 0
Waitms 2000
'Enter um Wiedergabe vorzubereiten
Gosub Enter
Gosub Play
Gosub Warten_lang
Gosub Play 'pause
Gosub Enter 'menü
Gosub Enter 'folder
Gosub Warten_lang
Gosub Vorwaerts 'nächster Ordner
Gosub Warten_lang
Gosub Enter 'Ordner auswählen
Gosub Warten_lang
Gosub Play
'Grundzustand
'READY-LED an
Portb.4 = 1
Ziffern = 0
Ok = 1
'Wait 4
Do
Gosub Warten
If Pinb.3 = 0 Then 'Wählschalter = 1
'READY-LED aus
Portb.4 = 0
Config Portb.4 = Input
Do
If Portb.4 = 1 Then
Ok = 0
Exit Do
End If
Incr Ziffern 'Ziffern +1
Zahl = 0 'Zahl 0 setzten
Do 'Zahl +1
Incr Zahl
Do
nop
Loop Until Pinb.3 = 1 'Warten auf 0
'X ist Zeit, um Zahlende zu erkennen. 10 ergibt 100ms
For X = 0 To 10
'Waitms 10
Gosub Warten
If Pinb.3 = 0 Then 'warten, ob noch ein Impuls kommt
X = 0
Exit For 'Warten abbrechen
End If
Next X
' X MUSS hier 1 höher sein, als bei der for-Schleife!!!
Loop Until X = 11
Readeeprom Pruefziffer , Ziffern 'Ziffer prüfen
If Pruefziffer <> Zahl Then
Ok = 0 'Wenn Ziffer falsch, OK auf 0
End If
If Ziffern = Nummern And Ok = 1 Then Exit Do 'wenn bisher alles richtig, dann raus bei x-Ziffern
'Timeout für zuwenige Ziffern
For Y = 0 To 250
'Waitms 10
If Pinb.4 = 1 Then Exit Do 'Wenn Hörer aufgelegt, ende
Gosub Warten
If Pinb.3 = 0 Then 'warten, ob noch ein Impuls einer neuen Ziffer kommt
Y = 0
Exit For
End If
Next Y
'Y MUSS hier 1 höher sein, als bei der for-Schleife!!!
Loop Until Y = 251
If Pinb.4 = 0 Then 'wenn Hörer nicht aufgelegt
If Ok = 1 And Y <> 251 Then 'Wenn alles passt Ausgabe OK
Gosub Ausgabeok
Else 'sonst Ausgabe Fehler
Gosub Ausgabefehler
End If
End If
Ziffern = 0 'Grundeinstellung
Ok = 1
'READY-LED an
Config Portb.4 = Output
Portb.4 = 1 'Grundeinstellung
End If
Loop
Warten:
Waitms 10
Return
Warten_lang:
Waitms 300
Return
Vorwaerts:
Portb.1 = 1
Gosub Warten_lang
Portb.1 = 0
Gosub Warten_lang
Return
Play:
Portb.0 = 1
Gosub Warten_lang
Portb.0 = 0
Gosub Warten_lang
Return
Enter:
Portb.2 = 1
Gosub Warten_lang
Portb.2 = 0
Gosub Warten_lang
Return
Ausgabefehler:
Gosub Vorwaerts
For Y = 0 To 5000
Gosub Warten
If Pinb.4 = 1 Then Exit For
Next Y
Gosub Vorwaerts
Gosub Vorwaerts
Return
Ausgabeok:
Gosub Vorwaerts
Gosub Vorwaerts
For Y = 0 To 4700
Gosub Warten
If Pinb.4 = 1 Then Exit For
Next Y
Gosub Vorwaerts
Return
End