Guten Morgen, Bin schon seit Tagen dabei, eine RTC mit der internen Hardware vom xMega zu realisieren. Benutzen tue ich ein XPLAINED Board mit einem LCD. Der xMega besitzt auch eine externe Batterie. Nun Soll es damit wohl möglich sein, die Uhrzeit zwischen zu speichern. Wie genau funktioniert das. Wie zähle ich die Zeit weiter, wenn VCC nicht mehr vorhanden ist?
Gast
#4748602
Jan H. schrieb: > Nun Soll es damit wohl > möglich sein, die Uhrzeit zwischen zu speichern. Was soll es helfen die Zeit zu speichern? Und wo? Im EEPROM? Jan H. schrieb: > Wie zähle ich die Zeit weiter Du zählst nicht die Zeit weiter sondern die Uhr deines XMega.
Gast
#4748647
Nimm dir doch das Beispielprojekt dazu heran... da ist doch alles realisiert. Jedenfalls bei dem Xplained ohne LCD ist es verwendet. Wenn die extra mit Batterie ausliefern, dann wird es bei deinem Board wohl im Beispielprojekt ebenfalls verwendet werden.
Ich steige durch das Datenblatt bsw. durch den Abschnitt RTC32 nicht durch. Das heißt im Endeffekt, die RTC32 muss ein Register haben, was während VCC aus ist, weiter zählt? Ist es eins von den "Cnt" Registern?
Gast
#4748818
Google mal nach AVR Appnote 1321 da ist ein Bisschen was beschrieben. Ich habe vorige Woche mich genau durch diesen Kram gefräst.. Du brauchst die VBAT Initialisierungsgeschicht aus der Appnote:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
..und ja, ich habe auch an mir gezweifelt, die Manuals sind nicht übermäßig didaktisch geschrieben.. aber bei mir funzt das indessen (auf anderer Hardware). Gruß, Holm
Danke. Wie funktioniert das? Ist das der Zählstand der in den Register von RTC32.CNT0 - 3 ist? Oder muss ich in der ISR Variablen deklarieren und die werden dann weiter gezählt?
Schau dir das Datablatt vom 256a3bu an, auf Seite 27 ist ein Diagramm wie das mit dem Battery Backup geht. Gruß JackFrost
Gast
#4749570
Die RTC32 ist ein 32Bit counter der mit Batteriepower weiterlaufen kann, bei Sekundentakt läuft der nach 168 Jahren (?) über, bis dahin mußt Du Dir um die Zeit keine Sorgen machen. Umrechnen der Sekunden nach Zeit mittels mktime() und gmtime() (oder localtime etc..). Interrupts sind nicht unbedingt notwendig. Gruß, Holm
Hallo Holm, Das macht einiges Verständlicher. Ich bin mir immer noch nicht ganz sicher, wo ich die Sekunden nun auslesen kann. Ist ziemlich doof beschrieben. Sind es wirklich die jeweils 8 x 4 Bit breiten CNT Register?
Gast
#4749645
hole Dir doch mal die Appnote und das dazugehörige Zip Archiv, die Funktionen sind darin dokumentiert und das Ganze darfst Du ja auch benutzen. Suche nach AVR1321 z.B. bei Atmel auf der Webseite unter den Dokuementen zum AtXmega. Das was Du suchst steht in rtc32_driver.c
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
Gruß, Holm
Ich habe den Zähler jetzt Initalisiert, laufen tut er aber viel zu schnell. Normalerweise sollte das CNT Register ja jede Sekunde um +1 erhöht werden oder sehe ich das falsch? Es wird aber viel zu schnell gezählt. Hier meine Init ->
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
Gast
#4751165
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
Gruß, Holm
Danke für deine Unterstützung. Leider funktioniert das alles nicht so wirklich. Habe jetzt die Init von der Atmel Note genommen... Und von deinem letzten Post die VBAT Init. Diese führe ich direkt nach der Init von der RTC32 aus. Wenn alles Konfiguriert ist, lese ich das CNT Register aus. Leider steht dort jedes mal "0".
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
Gast
#4752045
Jan H. schrieb: > Danke für deine Unterstützung. > Leider funktioniert das alles nicht so wirklich. > Habe jetzt die Init von der Atmel Note genommen... Was denn nun, vorher hattest Du den Zustand "viel zu schnell" was daran lag, das Du bei der Intialisierung nicht den 1 Sekunden Takt sondern den 1Khz Takt ausgewählt hast.
1 | |
für 1Hz mußt Du aber
1 | |
benutzen. ..und nun zählt das Ding gar nicht mehr? Du mußt Dir klar darüber werden wann Du die Uhr initialisieren willst, das sollte tunlichst nicht bei jedem Systemstart sondern nur bei einem Reset passieren ansonsten haut es Dir die Zeit jedes Mal durcheinander. > Und von deinem letzten Post die VBAT Init. Diese führe ich direkt nach > der Init von der RTC32 aus. Im Code der Application Note ist das so, das vbat_init() vor RTC32_Initialize() ausgeführt wird wenn ein Reset vorliegt, der 32Khz Oszillator mit Teiler muß erst einmal eingeschaltet werden. Die Kontrolle über den Oszillator hat der vbat Modul. Da ich keinen PowerOn Reset bei meiner Hardware hin bekomme ohne 3 Stecker abzuziehen habe ich im Code einmalig vbat_init() beim startup gerufen und das so programmiert. Damit lief der Zähler dann los. Danach habe ichs wieder auskommentiert und wieder neu programmiert. Gruß, Holm
Sobald ich die Versorgungsspannung weg nehme, Resetet er den Zähler (CNT) und beim Starten fängt er wieder von "0" an. Ob ich es auskommentiere oder nicht. Kannst du mir mal deine Main zeigen?
Gast
#4752438
Jan H. schrieb: > Sobald ich die Versorgungsspannung weg nehme, Resetet er den Zähler > (CNT) und beim Starten fängt er wieder von "0" an. Ob ich es > auskommentiere oder nicht. > > Kannst du mir mal deine Main zeigen? ...eigentlich nicht, ich werde dafür bezahlt das für Jemanden zu entwickeln, aber der Ausschnitt tuts vielleicht..das ist sowieso nur der Appnote entsprechend:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
90% davon hast Du schon mal gesehen.. Gruß, Holm
Und der RTC32 wird gar nicht Konfiguriert?
Gast
#4752486
grr...
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
Wenn Du ihn jedesmal neu initialisierst brauchst Du Dich nicht wundern warum der immer von vorne anfängt zu zählen. Gruß, Holm
Villeicht bin ich einfach nur zu Blöd dafür. Er zeigt mir jedes mal nach nem Neustart "0" an!
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
49 | |
50 | |
51 | |
52 | |
Gast
#4752652
Offensichtlich ist bei dir der Status nicht VBAT_STATUS_OK. Warum nimmst Du nicht mal den originalen und änderst ihn erst ab wenn er funktioniert hat? Hast Du die Brownout Detecor enable fuse gesetzt? Was ist mit dieser Funktion?
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
Gruß, Holm
Holm, besten dank! Ich muss jetzt noch mal genau nach schauen an was es gelegen hat. Die Funktion vbat_system_check() hat aufjedenfall den Erfolg gebracht. Besten dank!
Gast
#4752839
Na also, geht doch. Viel weiter bin ich auch noch nicht, aber die Zeit lät sich stellen mit mktime() und zum auslesen nehme ich gmtime()...2038 läuft allerdings dann der 23 Bit Timer über.. Ich bin dabei eine Software zu portieren die ich mal für den AtXmega128A3 geschrieben hatte und der hatte eine extern (PCFxxxx) Uhr on Board die nun wegrationalisiert wurde. Ich habe noch genug an der Baustelle zu tun..die ADUs machen auch nicht ganz das was ich will.. Gruß, Holm
Hallo Holm, Eine Frage noch, kann es sein, dass so wie der Counter jetzt konfiguriert ist, es nicht möglich ist den Interrupt weiter laufen zu lassen?
Gast
#4755028
..ist doch ausgeschaltet in vbat_init() :
....
//RTC32_SetCompareIntLevel(RTC32_COMPINTLVL_LO_gc);
RTC32_SetCompareIntLevel(RTC32_COMPINTLVL_OFF_gc);
...
Ich brauchte keinen Interrupt, wollte nur zwecks Datenspeicherung auf SD
Karte den aktuellen Timestamp abrufen können.
Den müßtest Du dort also wieder aktivieren, logischerweise reagiert die
CPU auf den Interrupt aber nur im Sleepmode oder wenn sie wach ist,
nicht wenn sie keinen Saft hat.
Gruß,
Holm
Ja ist klar, habe ich schon gesehen. Habe Versucht den Overflow Interrupt zu nehmen, bzw. einfach wie von dir gepostet (nicht CompareMatch) sondern eben Overflow. Leider passiert da nichts. Wie machst du das mit den Sekunden? Rufst du ständig das CNT Register ab und stellst den Wert da oder rufst du ihn einmalig beim App Start ab und lässt es dann via. Interrupt weiter zählen? Bzw. Wie würdest du das machen?
Gast
#4755109
..der Overflow Interrupt löst bei Sekundentakt doch erst alle 168 Jahre aus (oder so..) Du mußt also noch ein Bisschen warten. ..es sei denn Du betriebst die Uhr wieder "zu schnell". Ich brauche keine Echtzeit im Programm, es gibt da aber einen durchlaufenden 100ms Interrupt nach dem ich mich richte. Beim Abspeichern von Datensätzen wird simpel der aktuelle Zeitstempel aus der RTC gelesen und dann verwendet. Gruß, Holm
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.