Uhr läuft nicht genau ATmega16

Delaware

Neues Mitglied
01. Feb. 2010
6
0
0
Sprachen
Hallo,

ich baue gerade eine Berlin Uhr mit einem Mega16 in C programmiert.

Den Timer habe ich so konfiguriert :

----------------------------------------------------------------------------
// Timer 0 konfigurieren
TCNT1H=0; // Timer Daten REgister Timer1 high auf 0
TCNT1L=0; // Timer Daten REgister Timer1 LOW auf 0
TCCR1B |=(1<<CS12)|(1<<CS12); // TImer Starten mit Vorteiler


// TCCR0 |= (1<<CS02)|(1<<CS02); // oder so 1/1024 CPU TAkt funzt1
// Overflow Interrupt erlauben
TIMSK |= (1<<TOIE1);
TCNT1=33387; //Timer Vorladen
// Global Interrupts aktivieren
sei();
----------------------------------------------------------------------------




Die Timer ISR sieht so aus :
----------------------------------------------------------------------------
ISR (TIMER1_OVF_vect)
{

if (sec<59) sec++; else {sec=0; min++;} // Uhrzeit
if (min>59) {min=0; stu++;} // else {min=0; sec=0;}
if ((stu==23)&(min==59)&(sec==59)) {stu=0; min=0; sec=0;}

seku = ~seku; //sekunden Blinken für LED


TCNT1=33387;}
----------------------------------------------------------------------------




Trotz diverser TCNT1 Einstellung läuft die Uhr immer zu langsam oder zu schnell mehrere Sekunden am Tag.

Die Uhrzeit wird auf einem Display und auf einer LED Anzeige (Multiplex) ausgegeben.

Was mache ich denn Falsch ???

AT Mega16 - 8Mhz Quarz - ( Ext. CLock; STart-up time: 6 CK + 64ms)

christoph
 
Hallo Delaware,

wir haben im Forum ein kleines Tool, was einem für eine gegebene fsys und Interrupt-Zeit den Reload-Wert bzw. den Compare-Wert errechnet.

Das Tool kannst du hier downloaden:
AVR-Timer-Calculator

Du nutzt den Timer1 und dessen Overflow-Interrupt, der Prescaler ist auf 1/256 eingestellt.

Ich bekomme einen Reload-Wert von 34286 raus (siehe Anhang), der Overflow-Interrupt erfolgt dann nach 1 Sekunde.

Ich würde hier eher den Compare-Interrupt vorziehen, da man in der Interruptroutine nicht extra den Timerwert nachladen muss. Übrigends, das Nachladen des Timers kostet auch Zeit, erst recht, wenn du das erst am Ende der ISR machst. In deinem Fall macht es nicht viel aus, da die ISR nur einmal die Sekunde aufgerufen wird, der Fehler ist also dadurch nicht so groß, aber er tritt auf.

Für Uhr-Anwendungen, solltest du den Timer asynchron über den Oszillator TOSC1/2 takten, an dem ein 32,768kHz Quarz angeschlossen ist, der Fehler ist dann kleiner als wenn du über fosc (XTAL1/2) taktest.

Vielleicht hilft dir das schon etwas weiter.

Grüße,
Dirk
 

Anhänge

  • timer_calc.png
    timer_calc.png
    19 KB · Aufrufe: 26
Für Uhr-Anwendungen, solltest du den Timer asynchron über den Oszillator TOSC1/2 takten, an dem ein 32,768kHz Quarz angeschlossen ist, der Fehler ist dann kleiner als wenn du über fosc (XTAL1/2) taktest.

Kann ich nur unterstützen. Selbst mit 16MHz habe ich es damals nicht geschafft, die Uhr genau zu bekommen...
Den Quarz getauscht, und schon ist alles kein Problem mehr...

Gruß Rainer
 
AHA, also anstatt den 8mhz Quarz einen 32.768 khz.
Was außer den Reload muß ich im Programm ändern ?.
Läuft der uPC dann auch mit 32.768 Khz?

christoph
 
Guten Morgen Christoph,

asynchron kannst du nur den 8bit Timer2 über TOSC takten. Der Systemtakt beträgt weiterhin 8MHz. Du musst hier also die Timerinitialisierung und die ISR auf Timer2 umschreiben und den Roloadwert entsprechend neu berechnen.

Bit AS2 im Register ASSR muss gesetzt werden, damit der Timer2 asynchron durch TOSC getaktet wird.

Dirk

Aus dem Datenblatt:
Timer/Counter2 is named clkT2S. clkT2S is by default connected to the main
system I/O clock clkIO. By setting the AS2 bit in ASSR, Timer/Counter2 is asynchronously
clocked from the TOSC1 pin. This enables use of Timer/Counter2 as a Real Time Counter
(RTC). When AS2 is set, pins TOSC1 and TOSC2 are disconnected from Port C. A crystal can
then be connected between the TOSC1 and TOSC2 pins to serve as an independent clock
source for Timer/Counter2. The Oscillator is optimized for use with a 32.768 kHz crystal.
 
JA, gut jetzt benötge ich noch etwas Hilfe bei der Umsetzung von den Atmel Datenblätter in einen C Code.

Meine Timer initialisierung :

TCNT2 =0;
TCCR2 |= (1<<CS22); // Teiler auf 256
TIMSK |= (1<<TOIE2);
ASSR |= (1<<AS2);
TCNT2 = 128; // Prescaler auf 128
sei ();



Die ISR

ISR (TIMER2_OVF_vect)
{ ....

TCNT2=128; //neu Laden
}



Funzt aber überhaupt nicht. Also die Uhr läuft nun gar nicht mehr.
(AT mega 16 int.8Mhz - Ext Quarz 32,768kHz an PC6/PC7 - TOSC2 TOSC1.)
 
Hallo,

ich sehe leider keinen Fehler, der dazu führt, warum der Interrupt nicht ausgelöst wird, ich habe auch sonst keine Idee.

Noch einige Hinweise:
  1. Um den Prescaler 1/256 einzustellen, musst du die Bits CS22 und CS21 setzen, du setzt nur CS22.
  2. Wenn du das Bit PSR2 im Register SFIOR setzt, setzt dies den Prescaler zurück. So kannst du den Prescaler definiert starten.
  3. Wenn du ein Prescalerbit setzt, läuft der Timer. Du solltest den Prescaler erst dann auswählen, wenn der Timer initialisiert und konfiguriert wurde.
Aber warum es bei dir nun garnicht läuft, da muss ich leider passen. Vielleicht hat ja noch jemand eine Idee.

Dirk
 
JA, jetzt bin ich etwas weiter (ich hatte die beiden C 22pF am Quarz kurz mal weggelassen).

Jetz läuft die Uhr wieder - aber nur wenn ich auch noch einen Tastkopf anklemme.

Erst mal testen ob sie Richtig läuft.

christoph
 
Der Vollständigkeit halber.

Mit 2 56pF Kondensatoren an dem Uhrenquarz läuft die UHR (TCNT2=128 vorladen) sehr gut.

Und die ersten 5min auch genau.

christoph
 
Hi Christoph,

Mit 2 56pF Kondensatoren an dem Uhrenquarz läuft die UHR (TCNT2=128 vorladen) sehr gut.

Und die ersten 5min auch genau.
wenn ich mich recht entsinne dann steht im Datenblatt irgedwas drin das man
für nen 32kHz-Quarz größere Kondensatoren blaucht. Am Oscillator2 sind
glaube ich auch größere interne Kondensatoren dran.

Gruß
Dino
 
JA, im Datenblatt seht folgend :



jedoch ohne die externen Kondensatoren läuft mein Timer (noch) nicht.
Extern habe ich zwei 56pF dran und über Nacht 2 sek. Timeshift nach hinten.

Über die internen Kondensatoren habe ich folgendes :

"...CKOPT-Fuse programmieren
muss, um die internen 32pF Kondensatoren zu aktivieren..."

christoph

uVMTKqKlTzsesql.png
 
Hallo,

ich hab mir das im ATmega16-Datenblatt nochmal angesehen ..
Code:
[B]Clock Sources[/B]
The device has the following clock source options, selectable by Flash Fuse bits as shown
below. The clock from the selected source is input to the AVR clock generator, and routed to the
appropriate modules.

[B]Table 2.[/B] Device Clocking Options Select(1)
[FONT="Courier New"]Device Clocking Option             | CKSEL3..0
-----------------------------------+----------
External Crystal/Ceramic Resonator | 1111 - 1010
External Low-frequency Crystal     |    1001
External RC Oscillator             | 1000 - 0101
Calibrated Internal RC Oscillator  | 0100 - 0001
External Clock                     |    0000  [/FONT]
Note: 1. For all fuses “1” means unprogrammed while “0” means programmed

...

The Oscillator can operate in three different modes, each optimized for a specific frequency
range. The operating mode is selected by the fuses CKSEL3..1 as shown in Table 4.

Table 4. Crystal Oscillator Operating Modes
[FONT="Courier New"]CKOPT |   CKSEL3..1   | Frequency Range | Recommended Range for Capacitors
      |               |     (MHz)       | C1 and C2 for Use with Crystals (pF)
------+---------------+-----------------+-------------------------------------
  1   |    101(1)     |   0.4 - 0.9     |     –
  1   |      110      |   0.9 - 3.0     |  12 - 22
  1   |      111      |   3.0 - 8.0     |  12 - 22
  0   | 101, 110, 111 |     1.0 ≤       |  12 - 22 [/FONT]
Note: 1. This option should not be used with crystals, only with ceramic resonators.
die ganzen Angaben hören bei 900kHz für Quarze auf. Irgendwo hab ich da
mal was genaueres drüber gelesen ... :confused:

Gruß
Dino
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)