mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Genaue Sekunde AVR


Autor: Tim H. (hotty) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Ich habe folgendes Problem:
Ich baue gerade an einer Uhr und dazu brauch ich den Sekundentakt. Ich 
habe jetzt das Beispiel aus dem Wiki übernommen und meine Quarzfrequenz 
eingesetzt (4.9152 MHz). Dann hatte ich eine Abweichung von 44 Sekunden 
bei einer Minute (Uhr ging nach). Nach der Formel hab ich ein Neues XTAL 
berrechnet (4915200*(1-(44/60))). Allerdings hatte ich dann schon wieder 
44 Sekundenabweichung. Ich hab dann nochmal andere XTAL Werte 
ausprobiert --> Keine änderung. Aber Wenn ich DEBOUNCE änder merkt man 
die Änderung. In dem Angehangen Program sind jetzt ca. 80MHz angeben, 
auch das mach keinen Unterschied zu 8MHz oder 0.8MHz.
Hardware: Ich habe einen Quartz mit 22pF Kondensatoren. Fuses: CKOPT = 
haken,
SUT_CKSEL: Ext.Crystal/Resonator High Freq.; Start-up time 1K CK + 64ms. 
(in AVR Studio mit ISP mkII). Ich hab auch schon verschiedene 
Einschwingzeiten ausprobiert.
Frage: Woran liegt das? Ist das Hardwarebedingt oder ein 
Softwareproblem?

Tim

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Sieht nach CKDIV8-Fuse aus.

MfG Spess

Autor: Tim H. (hotty) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achso ich habe einen MEGA16 ... der hat laut der Fuse Liste keine

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
alle Variablen, die in der ISR verändert werden, und außerhalb gelesen 
werden müssen volatile werden.

Nach dem du das bereinigt hast, mach noch mal einen Test.

den prescaler kannst du übrigens in der ISR selbst definieren:
ISR(TIM1_COMPA_vect)  // <-- benutze keine deprecated sachen, sondern ISR
{
  static prescaler = DEBOUNCE;      // <-- variablen so lokal wie möglich definieren
  if( --prescaler == 0 ){ 
    prescaler = (uchar) DEBOUNCE;
    m++;      // exact one second over    // <-- m muss volatile sein
  aflag = 1;                              // <-- aflag  muss volatile sein
  }  
#if XTA % DEBOUNCE
  if (prescaler <= XTA % DEBOUNCE)
    OCR1A += XTA / DEBOUNCE +1;   // <-- rechne das mal aus! 87127040L/64= 1361360 - much too much
  else
#endif
    OCR1A += XTA / DEBOUNCE;   // <-- s.o.

}
data braucht übrigens nicht volatile sein

Autor: Zwölf Mal Acht (hacky)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann waere noch die Toleranz der Quarze mit 100ppm.

Autor: Tim H. (hotty) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Hier mal meine neue Datei. Irgendwie läuft der Timer wohl gar nicht 
mehr?! Zumindest ändert sich auf der Uhr nichts.

Das hier musste ich machen, damit die Funktion wordclock noch ganz 
aufgerufen wird, denn sonst werden nur die ersten 2 Zeilen gemultiplext, 
die anderen bleiben aber aus. So funktioniert das. Kann es daran liegen 
und wenn: wie bekomm ich beides zum laufen.
cli();
if(aflag == 1) {assign(); aflag = 0;}
wordclock();
sei();

Tim

Autor: Fabian S. (jacky2k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich weiß bis heute nicht warum, aber bei vielen Codes sieht man, dass 
vor dem cli() das SREG gesichert wird und nach dem sei() 
wiederhergestellt wird. Hat das evtl was damit zu tun, dass der nicht 
mehr läuft?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Tim H. (hotty) Benutzerseite

>Hier mal meine neue Datei. Irgendwie läuft der Timer wohl gar nicht
>mehr?! Zumindest ändert sich auf der Uhr nichts.

Tja, man sollte vielleicht mal bissel nachdenken.

>Das hier musste ich machen, damit die Funktion wordclock noch ganz
>aufgerufen wird, denn sonst werden nur die ersten 2 Zeilen gemultiplext,

Ziemlicher Mist. Schon mal was von einem Timer gehört? Schon mal 
funktionierende Codes zum Thema LED-Matrix angeschaut?

>cli();
>if(aflag == 1) {assign(); aflag = 0;}
>wordclock();
>sei();

cli() uns sei() sind hier VOLLKOMMENER MIST! Damit sind die Interrupts 
so gut wie immmer gesperrt. Klar dass da kein Timer mehr läuft.

Mach es doch einfach wie im Tutorial!

MFG
Falk

Autor: Tim Hotfilter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok ich schau mal. Aber kannst du mir kurz sagen was genau ich ändern 
soll.
Danke schonmal.

Tim

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Tim Hotfilter (Gast)

>Ok ich schau mal. Aber kannst du mir kurz sagen was genau ich ändern
>soll.

Pack das Multiplexen etc. in einen Timer, dort kann man auch problemlos 
die Uhr hochzählen lassen. Anstatt der for schleife mass man halt den 
Index normal hochzäglen und bei Erreichen des Maximums wieder bei 0 
anfangen.

MfG
Falk

Autor: Ulf Rolf (roolf)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tim H. schrieb:

> berrechnet (4915200*(1-(44/60))).

In Ganzzahl-Arithmetik gibt es da kräftige Rundungsfehler.

Autor: Fabian S. (jacky2k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kräftig ist Lustig... 44/60 ist 1, 1-1 ist 0 und 0 mal 4915200 ist 0 :D

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm?

44/60 ist 0. 0-1 ist -1. -1 mal 4915200 ist -4915200. Im Übrigen muss an 
die 4915200 ein L Suffix angehangen werden.

Autor: Icke (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mach dirs doch einfach und nimm einen Quarz mit 4,194304 MHz. Dann 
entfällt die ganze Rechnerei.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Anderen Quarz nehmen, damit man einfacher rechnen kann? Pff, Langweiler! 
;)

Übrigens ist der Code nach meinem Empfinden nach ziemlich grausam 
geschrieben :-)

Autor: Icke (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mhhmm, hast Recht. Warum einfach, wenns auch umständlich geht. Da lernt 
man ja nix bei g

Autor: Thilo M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich weiß gar nicht, wer das Märchen mit den 22pF am Quarz erfunden hat?!
Da gehören (beim HC49-U) laut Datenblatt 5..55pF dran. Bessere 
Genauigkeit habe ich zwischen 4 und 20MHz machgemessenermaßen mit 33pF 
erreicht.

Wenn die Uhr genau sein soll, dann an XTAL2 33pF und an XTAL1 einen 
Trimmer der 33pF und leicht drüber hat. Dann kann mit einem ordentlichen 
Frequenzzähler genau abgestimmt werden. ;)

Autor: Tim H. (hotty) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Diese Formel berchne ich doch nicht im Programm oder hast du die da etwa 
gesehen? Die hab ich auch dem Wiki und mit dem Taschenrechner 
ausgerechnet.

Ich hab das multiplexing jetzt in den Timer gepackt und das läuft super. 
Trotzdem will die Uhrzeit nicht so wirklich -> Also gar nicht

Autor: Tim H. (hotty) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Ich hab jetzt den Fehler gefunden und es funktioniert: es heißt 
TIMER1_COMPA_vect und nich TIM1_COMPA_vect ...

Tim

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thilo M. schrieb:
> Ich weiß gar nicht, wer das Märchen mit den 22pF am Quarz erfunden hat?!
> Da gehören (beim HC49-U) laut Datenblatt 5..55pF dran. Bessere
> Genauigkeit habe ich zwischen 4 und 20MHz machgemessenermaßen mit 33pF
> erreicht.
Das Datenblatt!

> Wenn die Uhr genau sein soll, dann an XTAL2 33pF und an XTAL1 einen
> Trimmer der 33pF und leicht drüber hat. Dann kann mit einem ordentlichen
> Frequenzzähler genau abgestimmt werden. ;)

Die 22pF werden auch nur "pauschal" empfohlen. Es hängt stark von der 
Kapazität der Quarze ab, soweit ich weiß.

Autor: Thilo M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Die 22pF werden auch nur "pauschal" empfohlen. Es hängt stark von der
>Kapazität der Quarze ab, soweit ich weiß.

Eher vom ESR und der Frequenz. ;)

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann ich so nicht bestätigen.
Das ATmega16 Datenblatt zum Beispiel sagt eindeutig ab 1MHz 12-22 pF.

Autor: Thilo M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann lieber im Datenblatt des Quarzes schauen, nicht bei Atmel. ;)

Autor: Tim H. (hotty) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
http://www.reichelt.de/?;ACTION=3;LA=444;GROUP=B41...
-> Der Quarz

+ Datenblatt (Anhang)

-> sagt 16pF

-> Ist das überhaupt die Abblockkondensator Kapazität?

Autor: Thilo M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na, das Datenblatt sagt's schon:
QMIM004,194      4.194.304Hz      32pF

Autor: Tim H. (hotty) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab doch nen 4,9152Mhz

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Na, das Datenblatt sagt's schon:
>QMIM004,194      4.194.304Hz      32pF

Davon muss man aber noch hardwarebedingte Kapazitäten abziehen.

MfG Spess

Autor: avr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auch hier weis Atmel wiedereinmal Rat:

http://www.atmel.com/dyn/resources/prod_documents/...

Hier ist auch eine Berechnung für die Kondensatoren.

Die 22-33 pF werden hier nur als gängige Werte die
sich bewährt haben bezeichnet.

Und was das Messen und dann ziehen angeht, es gibt Leute
die nehmen dann das Signal direkt am Quarz, einige sind
so "profesionell" und verwenden einen Tastkopf mit
ca. 15 pF, andere machen es sogar direkte Klemmen.
Aber der Abgleich soll dann stimmen ;)

avr

Autor: Thilo M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich benutze den mega644 und die Fuse CKOUT und einen Trimmer-C an 
XTAL-1, dann bin ich unabhängig von der Last am Quarz. Die Uhren laufen 
perfekt. ;)

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
spess53 schrieb:
> Hi
>
>>Na, das Datenblatt sagt's schon:
>>QMIM004,194      4.194.304Hz      32pF
>
> Davon muss man aber noch hardwarebedingte Kapazitäten abziehen.

Richtig! 10pF beim ATmega16 laut Electrical Characteristics (steht aber 
unter TWI, gilt aber sicher auch für andere Pins).
Dann würden 22pF ja wieder hinkommen.

Autor: Thilo M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie gesagt, ich hab's mit 'nem sehr genauen Frequenzzähler ausgemessen. 
33pF sind auch nicht 100% genau, aber um Längen besser als 22pF.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Thilo M. (power)

>Wie gesagt, ich hab's mit 'nem sehr genauen Frequenzzähler ausgemessen.
>33pF sind auch nicht 100% genau, aber um Längen besser als 22pF.

[ ] Dir ist klar, dass die Kapazität vom QUARZ und nicht vom AVR 
abhängt.

MFG
Falk

Autor: Thilo M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falk Brunner schrieb:

> [X] Dir ist klar, dass die Kapazität vom QUARZ und nicht vom AVR
> abhängt.

Das habe ich weiter oben schon geschrieben. ;)

>Dann lieber im Datenblatt des Quarzes schauen, nicht bei Atmel. ;)

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.