mikrocontroller.net

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


Autor: Timo Ottersberg (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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/...

Datenblatt des AT90S8535 (Timer/Counter2 S.42 ff)
http://www.atmel.com/dyn/resources/prod_documents/...



#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

Autor: Uwe (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Timo Ottersberg (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Henning (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Fiffi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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);
}

Autor: Timo Ottersberg (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Timo Ottersberg (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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-

Autor: Fiffi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.