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.