Forum: Mikrocontroller und Digitale Elektronik RTC über TOSC läuft nicht


von Timo Ottersberg (Gast)


Lesenswert?

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

von Uwe (Gast)


Lesenswert?

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

von Timo Ottersberg (Gast)


Lesenswert?

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

von Henning (Gast)


Lesenswert?

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.

von Fiffi (Gast)


Lesenswert?

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);
}

von Timo Ottersberg (Gast)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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

von Timo Ottersberg (Gast)


Lesenswert?

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-

von Fiffi (Gast)


Lesenswert?

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 ?

von Peter D. (peda)


Lesenswert?

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