Forum: Compiler & IDEs Interface zwischen RTC und ATmega16 zum Uhrzeit einstellen


von Damien (Gast)


Lesenswert?

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ß

von Karl H. (kbuchegg)


Lesenswert?

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.

von Damien (Gast)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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

von Damien (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Damien (Gast)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Damien (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.