Hallo zusammen, ich habe an meinen ATmega16 eine DS1307 RTC angeschlossen. Es funktioniert auch alles wunderbar. Ich habe ein Programm geschrieben, welches die Uhrzeit über USART ausgibt und ein Programm mit dem ich die Urzeit einstellen kann. Jedoch muss ich, wenn ich die Uhrzeit einstellen will, immer das "uhrzeiteinstellen.c" Programm auf den ATmega16 brennen. Was ich jetzt programmieren will, ist ein Interface zur Kommunikation zwischen dem ATmega16 und der RTC. Sodass ich, während mein Uhranzeige läuft die Uhrzeit über bestimmte Kommandos verändern kann. Jedoch habe ich im Moment keine Ahnung wie ich das Anstellen soll.. Habe mir schon überlegt es über den USART_RECV Interrupt laufen zu lassen.. Hat da jemand vielleicht ne Idee oder ein ähnliches Problem bereits gelöst? Wäre um jede Hilfe dankbar. Gruß
Damien schrieb: > Hat da jemand vielleicht ne Idee oder ein ähnliches Problem bereits > gelöst? Welche Teile hast du schon fertig? (deine Dateinamen sagen uns nichts) Das wichtigste ist, dass du die eigentliche Aktion (das Setzen der Uhrzeit) von der Benutzerinterkation trennst. D.h. deine Library soll umfassen Funktionen zum Auslesen von Uhrzeit und Datum Funktionen zum Setzen von Uhrzeit und Datum Was mit der Uhrzeit/Datum weiter passiert, bzw. wo dieser Daten beim Setzen herkommen, ist nicht mehr das Bier dieser Library. Das wäre der erste zu realisierende Schritt: Die Kommunikation mit der RTC zu kapseln und in Form von einfach zu benutzenden Funktionen zur Verfügung stellen. Nur die Kommunikation, nicht mehr! OK. Eventuell könnte man über Hilfsfunktionen nachdenken, die eine standardisierte Stringrepräsentierung der Zeit in einem String zur Verfügung stellen bzw. von deinem String auslesen, aber das ist dann schon das höchste der Gefühle. Insbesondere ist es nicht Aufgabe dieser Lib: ein LCD mit der aktuellen Zeit zu versorgen Tasten abzufragen und damit die Uhrzeit zu manipulieren sich direkt an eine UART klemmen und dort auf Setz Kommandos zu warten etc. (also alles was nicht direkt mit der RTC und deren Funktions- weise zu tun hat) Da eine DS1307 über I2C angeschlossen wird, sehe ich nicht wie da jetzt in dieser Kernfunktionalität ein USART_RECV ins Spiel kommen würde.
Also ich habe eine funktion zum setzten und eine funktion zum ausgeben. Ich muss doch irgendwie meinem Programm mitteilen: "So, jetzt will ich setzen". Daher dachte ich mir das ich den RECV Interrupt genau dafür benutze. Zum Beispiel: "Setze wenn "P" auf der Tastatur gedrückt wurde die nächste Eingabe als Sekunde, die nächste als Minute, die nächste als Stunde usw. Verstehst du wie ich es meine?
Damien schrieb: > Also ich habe eine funktion zum setzten und eine funktion zum ausgeben. Gut! > Ich muss doch irgendwie meinem Programm mitteilen: "So, jetzt will ich > setzen". OK > Daher dachte ich mir das ich den RECV Interrupt genau dafür > benutze. Zum Beispiel: "Setze wenn "P" auf der Tastatur gedrückt wurde > die nächste Eingabe als Sekunde, die nächste als Minute, die nächste als > Stunde usw. > > Verstehst du wie ich es meine? Jetzt versteh ich dich. Das hat dann ja mit der RTC eigentlich gar nichts zu tun, sondern die RTC ist da jetzt mehr oder weniger zufällig im Spiel. Deine eigentliche Frage lautet ja: Wie schicke ich Kommandos per UART zu meinem µC? Solche Kommandos könnten sein
1 | Led1 on |
2 | Led2 off |
3 | start Timer |
oder eben auch
1 | time 11 54 00 |
2 | date 26 8 2010 |
Und da wiederrum wirst du auf die Fragestellung auflaufen: wie empfange ich eine komplette Zeile und leg mir die in einem char Array als String ab. Ein Standardproblem, über das es hier im Forum jede Woche einige Fragen gibt.
Benutze mal die Forensuche mit zb diesen Suchebgriffen uart string empfangen die kannst du auch noch variieren. Dein erstes Ziel ist es, einen Text über die UART zu empfangen
Genau, ich kann dir mal mein Programm zeigen mit dem ich die Uhrzeit bisher eingestellt habe. Habe es in den Anhang getan. Dort siehst du dann das ich z.B das Sekunden-Register 0x00 auf 0x30 setzen muss, um die Sekunden auf "30" zu setzen. Jetzt habe ich das Problem, wie wandele ich eine bzw. zwei "char" Tastatureingaben (also in dem Fall "3" und "0" für 30) so um, das ich am ende durch diese Informationen "0x30" and meine "Register-Setz-Funktion" übergeben kann, sodass er es dann auf 30 setzt. Das ist im Grunde mein Problem.
Damien schrieb: > Dort siehst du dann das ich z.B das Sekunden-Register 0x00 auf 0x30 > setzen muss, um die Sekunden auf "30" zu setzen. Jetzt habe ich das > Problem, wie wandele ich eine bzw. zwei "char" Tastatureingaben (also in > dem Fall "3" und "0" für 30) so um, Die hast du nicht, bzw. solltest sie nicht haben. Was du hast ist ein kompletter String char Text[] = "30"; int Sekunden = atoi( Text ); > das ich am ende durch diese > Informationen "0x30" and meine "Register-Setz-Funktion" übergeben kann, > sodass er es dann auf 30 setzt. Das ist im Grunde mein Problem. Du brauchst erst mal Basiswissen in der Stringverarbeitung. Und ein C-Buch.
Ja aber jedes mal wenn ich eine Taste auf der Tastatur drücke wird der Interrupt ausgeführt und ein char an UDR gesendet. Diesen muss ich dann verarbeiten. Oder meinst du ich soll alle Tastatureingaben in einen String speichern und ihn dann später verarbeiten?
Damien schrieb: > Ja aber jedes mal wenn ich eine Taste auf der Tastatur drücke wird der > Interrupt ausgeführt und ein char an UDR gesendet. Genau > Diesen muss ich dann > verarbeiten. Oder meinst du ich soll alle Tastatureingaben in einen > String speichern und ihn dann später verarbeiten? Genau das meine ich. Das ist der übliche Weg. Denn damit ermöglichst du deinem Benutzer, dass er sich auch einmal vertippen kann und mittels Backspace die bisher eingetippten Zeichen wieder löschen kann. Damit erreichst du, dass du ein einigermassen ausreichend ansprechendes Interface hinkriegst. Und einfacher ist es ausserdem auf lange Sicht, selbst wenn die Alternative zunächst einfacher aussieht solange man nur eine einzige Taste hat, die etwas auslöst.
Ok. Ich werde mich dann mal versuchen.. danke für die Hilfe :)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.