Moin Moin Ich habe ein Problem mit der leidigen RTC. Ich nutze den AT90S8535 mit den TOSC Pins und einem 32768Hz Uhrenquarz. Leider kann ich den µc nicht davon überzeugen, dass er den Uhrenquarz als Clocksource nehmen soll. Wenn ich auf den 8MHz Quarz umschalte funktioniert alles wunderbar nur leider zu schnell und zu ungenau. Den Uhrenquarz habe ich schon ausgetauscht. Der scheidet also als Fehlerursache aus. Auch habe ich schon stundenlang mit den Registern (TIMSK, ASSR, TCCR2, TCNT2, usw.) rumgespielt. Allerdings ohne erfolg. Unten habe ich noch mal die von mir verwendeten Dokumente und Quelltextausschnitte von mir gepostet. Bei Google und hier findet man leider nicht so viel zu diesem Thema. Schönes Restwochenende Timo Ottersberg Application Note zum Thema RTC http://www.atmel.com/dyn/resources/prod_documents/DOC1259.PDF Datenblatt des AT90S8535 (Timer/Counter2 S.42 ff) http://www.atmel.com/dyn/resources/prod_documents/DOC1041.PDF #include <90s8535.h> #define AS2 3 #define TOIE2 7 #define OCIE2 8 // Timer 2 overflow Interrupt interrupt [TIM2_OVF] void timer2_ovf_isr(void){ mach_was(); } void main(void){ ... Ports initialisieren ... Timer/Counter initialisieren ... // Timer/Counter 2 initialisieren TIMSK &=~((1<<TOIE2)|(1<<OCIE2)); //Timer/Counter2 Interrupt abschalten ASSR |= (1<<AS2); //Als Quelle den externen Quarz wählen TCNT2 = 0x00; //Startwert 0x00 TCCR2 = 0x05; //Quarzfrequenz durch 128 teilen while(ASSR&0x07); //Warten bis TCCR2 geupdatet wurde TIMSK |= (1<<TOIE2); //Timer/Counter2 Interrupt aktivieren SREG=0x80; //Globale Interrupts anschalten // Global enable interrupts #asm("sei") while (1){ mach_was_anderes(); }; } Alle Werte scheinen mir während das Programm läuft korrekt zu sein. ASSR = 8 TIMSK = 128 TCNT2 = 0 //läuft natürlich nicht :-( TCCR2 = 5 SREG = 128
Hi! Ich vermute mal der 32 kHz Quarz läuft nicht. An der Stelle solltest du mal ansetzen und ihn zum schwingen überreden. MFG Uwe
Hiho Danke erstmal für die Antwort. Das währe natürlich auch noch eine sehr logische Möglichkeit. Aber wie bekomme ich ihn zum Anschwingen? Im Datenblatt steht ja, dass der µC keine externen Kondensatoren zum Anschwingen benötigt. MFG Timo Ottersberg
vieleicht gerade das uhrenquarz doch. es gibt ttl schaltunen, die ein quarz takt auf ttl pegel heben. und das quarz gleichzeitig am schwingen halten. irgendwo in einem der "30x schaltungen" bücher währe sowas zu finden.
Hallo Timo, ich verwende einen 32,768 kHz Uhrenquarz von Reichelt. Es funktioniert ! Wenn ich aber versuche mit meinem Oszilloskop daran zu messen, bleibt er stehen ... Hier mein Code: / WinAVR 20030913 // Target : AT90S8535 // Crystal: 8.0000Mhz // // PORTB = 8 LED's // PC6,7 = 32.768 kHz crystal #include <avr/io.h> #include <avr/signal.h> #include <avr/interrupt.h> #define u08 unsigned char void init(void) { cli(); //disable all interrupts DDRB = 0xFF; TIMSK &=~((1<<TOIE2)|(1<<OCIE2)); //Disable TC2 interrupt ASSR |= (1<<AS2); //set Timer/Counter2 to be asynchronous from the CPU clock with a second external clock(32,768kHz)driving it. TCNT2 = 0x00; TCCR2 = 0x05; //prescale the timer to be clock source / 128 to make it exactly 1 second for every overflow to occur while(ASSR&0x07); //Wait until TC0 is updated TIMSK |= (1<<TOIE2); //set 8-bit Timer/Counter0 Overflow Interrupt Enable GIFR = 0xFF; // clear all interrupt flags sei(); //re-enable interrupts } SIGNAL(SIG_OVERFLOW2) { PORTB = ~PORTB; } int main(void) { init(); while(1) { } return(0); }
Moin Moin Danke für deine Antwort Fiffi. Da unsere Quelltexte an den entscheidenen Stellen komplett identisch sind schließe ich einen Software fehler zu 95% aus. Also zurück zum Quarz. Wass kann es denn für Ursachen haben, dass der Quarz nicht anschwingt? Also ich bin dabei meine selbstgebaute Nixie-Uhr zu optimieren. Früher kam der Sekundentackt über einen externen Interrupt. Aber da der AT90S8535 ja die RTC bietet wollte ich eigentlich auf die exterenen MOS-Teiler verzichten. Die Nixie-Röhren arbeiten bei mir mit (ich traue es mich gar nicht es zu sagen)180V Gleichgerichteter Netzspannung die natürlich mit an GND liegt. Kann es sein, dass diese Spannung, die evtl. nicht 100%ig geglättet ist, der Grund ist warum der Quarz nicht anschwingt ? MFG Timo O.
Bei Nixie-Röhren scheidet doch eh ein Batteriebetrieb aus. D.h. nimm doch einfach den CPU-Takt (4MHz) und alle Probleme sind vorbei. Im Gegenteil, je höher die Frequenz eines Quarzes, umso höher seine Güte und umso geringer die Temperaturabhängigkeit. D.h. Du kannst bequem eine Genauigkeit besser 1min/Jahr erreichen, was mit dem 32kHz Quarz kaum möglich ist. Da ein Bastler aber kaum über einen hochgenauen Frequenzmesser verfügt, läßt man die Uhr einfach 1-2 Monate laufen und ermittelt die Abweichung über diese Zeit. Daraus kann man dann die wirkliche Quarzfrequenz ausrechnen und damit wiederum die entsprechenden Teilerfaktoren in der Software korrigieren. Peter
Moin Peter Jo da hast du wohl recht. Eigentlich kommt es auch gar nicht so auf die Genauigkeit an, da das Ding so und so über DCF77 abgeglichen wird. Nur mit dem externem Quarz wähe es ja wesendlich eleganter den trotzdem erforderlichen Sekundentakt zu generieren. Nun gut dann werde ich das über den CPU-Takt machen und das ganze dann nochmal zusätzlich runterteilen. MFG Timo Ottersberg PS: Ich wunder mich immer wieder über dein Wissen. Du schaffst es wirklich zu fast jedem Thema eine qualifizierte Antwort zu geben. -Danke-
Hallo Timo,
>Eigentlich kommt es auch gar nicht so auf die
Genauigkeit an, da das Ding so und so über DCF77 abgeglichen wird.
Das habe ich auch vor ...
Wie willst du beide synchronisieren ?
@Fiffi, "Wie willst du beide synchronisieren ?" Z.B. so: http://www.mikrocontroller.net/forum/read-4-23408.html @Timo, Danke Mit dem 8051 beschäftige ich mich seit 1989 und da gewinnt man schon einige Erfahrungen. Meine ersten Quelltexte sehen aus heutiger Sicht auch grauenvoll aus. Arbeitsmäßig entwickle ich aber hauptsächlich Hardware. Und wenn man von beidem was versteht, kann man sehr gut optimieren, welche Aufgabe in Software oder in Hardware leichter zu erledigen ist. Peter
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.