PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Ich möchte den ds1307 über eine RC5 Fernbedienung beschreiben.



infosystems
04.03.2013, 21:58
Hallo Ich habe mir eine Uhr mit Bascom gebastelt. Alles funktioniert eigentlich. Aber der DS1307 muss auch irgendwann nachgestellt werden.
Da ich keine andere Möglichkeit habe würde ich das gerne mit einer RC5 Fernbedienung machen.

Leider schaffe ich es nicht und hoffe auf Eure Hilfe.

Ich stelle es mir so vor. Ich tippe die Zahlen der Reihe nach in die Fernbedienung und mit der OK Taste werden die Daten in den DS1307 übernommen. Über ein/aus möchte ich noch ein und ausschalten.




$regfile = "m16def.dat" 'ATmega 16
$crystal = 8000000 'Quarz: 8 MHz$baud = 9600$lib "mcsbyte.lbx" ' for smaller code$lib "ds1307clock.lib" ' lib

Config Rc5 = Pind.2
Dim Ein_aus As Bit
Dim Zeit As Byte
'Dim Time$ As String * 8'Time$ = "17:37:00"

Enable Interrupts


Dim Address As Byte , Command As Byte
Print "Waiting for RC5..."

Do


Getrc5(address , Command)

If Address = 0 Then Command = Command And &B01111111
If Command = 32 Then If Ein_aus = 1 Then Ein_aus = 0 Else Ein_aus = 1 End If End If Waitms 500 Print "Status " ; Ein_aus End If
Select Case Command
Case 16 : Print "0" ; Zeit = 0 Case 17 : Print "1" Case 18 : Print "2" Case 19 : Print "3" Case 20 : Print "4" Case 21 : Print "5" Case 22 : Print "6" Case 23 : Print "7" Case 24 : Print "8" Case 25 : Print "9" Case 40 : Print "ok" Case 19 : Print "3" Case 20 : Print "4" Case 21 : Print "5" Case 22 : Print "6" Case 23 : Print "7"' Case Else : Print "Not in Case statement"

End Select



Loop
End




Ich schaffe es nun, die Zahlen einzeln am Terminal auszugeben, habe aber keine Ahnung wie die Zahlen zusammengefasst werden. Zum Beispiel in 1230 für 12 Uhr 30

Ich bitte um Hilfe.

Gruß

Rici

RoboHolIC
05.03.2013, 00:23
Du musst die numerischen Wertentsprechungen der per RC5 übertragenen Ziffern ermitteln. Das geht über die schon verwendete CASE-Struktur oder, indem man den Offset (RC5-Code der Ziffer "0") von den RC5-Zifferncodes abzieht. Laut deinem Codebeispiel scheint der Offset = 16 zu sein.
Recht viel mehr braucht man gar nicht tun, weil die DS1307 ja mit BCD-Darstellung arbeitet. Sollte Bascom allerdings die Stunden/Minuten/Sekunden als zweistellige Zahlen erwarten, berechnet man eben die Ziffernfolge "1", "2" als 1*10 + 2*1 = 12

Gruß
RoboHolIC

infosystems
05.03.2013, 08:18
Danke Robo,

das mit dem Offset, tolle Idee. Habe ich auch gleich umgesetzt.
Das mit den mehrstelligen Zahlen ist auch genial. Leider schaffe ich es nicht, dass umzusetzen.

Ich habe da eine do loop Schleife. Da komme ich so nicht weiter.
Ich habe es mir so vorgestellt:
Ich drücke die Menü Taste. Diese hat den Code 25. Damit aktiviere ich das Einstellen der Uhr.
Dann kann ich über die Zifferntasten zum Beispiel 1235 für 12:35 eingeben.
Wenn die entsprechende Sekunde erreicht ist, drücke ich OK (Code 24) und die Daten werden in den DS1307 geschrieben.
Ich schaffe es nicht, die Codes in diesem Fall 1235 in eine Variable zu bringen.

Hier mein Code:

$regfile = "m16def.dat" 'ATmega 16


$crystal = 8000000 'Quarz: 8 MHz
$baud = 9600
$lib "mcsbyte.lbx" ' for smaller code
$lib "ds1307clock.lib" ' lib




Config Rc5 = Pind.2


Enable Interrupts


Dim Address As Byte , Command As Byte


Do


Getrc5(address , Command)




If Address = 0 Then
Command = Command And &B01111111
Command = Command - 16
Print "command " ; Command
End If


Waitms 200




Loop


End

Danke und Grüße

Rici

RoboHolIC
05.03.2013, 09:33
Hallo Rici.

Der Fortschritt mit dem Offset ist doch schon mal was!

Für die weitere Verarbeitung kannst du drei Wege beschreiten: Entweder eine blinde Eingabe von zwei (vier) Ziffern, Umrechnung und erst dann Übernahme der Zahl(en) in die RTC; oder jeden RC5-Empfang sofort einarbeiten: empfangenes Zeichen dekodieren, Byte mit zwei BCDs von der RTC holen, Bitmanipulation mit SHIFT, AND und OR, danach Byte zurückschreiben in die RTC. (verarbeitet Bascom bei der RTC Ziffern oder Zahlen ?) Im letzteren Fall kann es auch ohne Fehleingaben zu unstimmigen Werten kommen: wenn man von 17 Uhr auf 23 Uhr korrigiert, würde nach der ersten "2" nämlich "27:00" Uhr dastehen (fängt Bascom dergleichen ab?). Ich habe keinen Schimmer, was die DS1307 damit machen würde. Wenn es dir nicht zu viel Aufwand ist, probiere es aus, es ist ja doch die elegantere Eingabeoption.
In jedem Fall sollte man auch eine Plausibilitätskontrolle der Werte machen. Das gilt auch für die blinde Eingabe von zwei bzw. vier Ziffern.

Die dritte Möglichkeit wäre die inkrementelle Eingabe, wie sie bei Stand-Alone-Weckern , Armbanduhren etc. üblich ist: aktuelle Zahl holen, inkrementieren oder dekrementieren, ggf. Rollover/Rollunder bearbeiten, zurück in die RTC. Die Steuerung könnte so aussehen: Cursor hoch/runter +/- eine Stunde; Cursor links/rechts -10 / +1 Minute.

Vielleicht gehen meine Beiträge auch etwas an deiner Bascom-Realität vorbei. Ich habe damit keinerlei Erfahrung damit, weil ich ausschließlich mit PIC-Controllern und Assembler arbeite und daher alles "zu Fuß" mache. Derzeit steht mein erstes RTC-Projekt mit einer DS1307 vor der Vollendung: Der TRAUMINATOR - ein Wecker und Nickerchen-Timer mit der Option zu "multimedialen" Wecksignalen: Rütteln, pusten, Ding-Dong-Klingel etc. und natürlich auch ein Piepser (, den ich bei käuflichen Weckern aber oft nicht höre, wenn ich auf dem falschen Ohr liege!!! Das war auch die Triebkraft zur Entwicklung eines eigenen bedarfsgerechten Schlafterminierungssystems). Bedient wird er lediglich mit drei Tasten - geht alles.

Gruß
RoboHolIC