C Timer programmieren?

Ich sehe eigentlich keinen Fehler.

Entferne mal bei der Timerkonfiguration folgende Zeile:
TIMSK = (1<<OCIE2);
Wenn du nämlich einmal Interrupts global freigeben solltest, dann wird auch der CompareMatch-Interrupt des Timer2 ausgelöst. Bei dem Rücksprung (reti) wird dann das Interrupt-Flag gelöscht, du wirst es also im Hauptprogramm nicht mehr pollen können.

Die Sekunden, Minuten und Stunden müssen kein "volatile unsigned int" sein, es reicht "uint8_t" (unsigned char).

Ansonsten sehe ich leider keinen Fehler.

Dirk
 
In AVR Studio 5 muss ich aber nichts weiter umstellen oder(fuses oder ähnliches)?

Ich glaub die internen Kondensatoren sind nicht aktiviert.. Hab gelesen, dass man irgendwie den CKOPT fuse aktivieren soll aber wie genau mache ich das?^^
 
Hallo,
In AVR Studio 5 muss ich aber nichts weiter umstellen oder(fuses oder ähnliches)?

Ich glaub die internen Kondensatoren sind nicht aktiviert.. Hab gelesen, dass man irgendwie den CKOPT fuse aktivieren soll aber wie genau mache ich das?^^

um den Timer2 asynchron durch den TOSC-Oszillator betreiben zu können, muss der Systemtakt vom internen RC-Oszillator kommen. Das ist mit folgenden Fusebit-Einstellungen möglich:

CKSEL3..0 = 0001 (1MHz)
CKSEL3..0 = 0010 (2MHz)
CKSEL3..0 = 0011 (4MHz)
CKSEL3..0 = 0100 (8MHz)

0=programmiert

(Angaben ohne Gewähr)

Im Programmierdialog des AVRStudio also auf "internal RC-Oscillator ..." stellen (Auswahltext so ähnlich)

CKOPT Fuse wird für externen Quarz 16MHz benötigt (also nicht programmieren).

Nach meinen Erfahrungen läuft nicht jeder Uhrenquarz mit dem für 32,768kHz optimiertem Oszillator, es kann sein, dass es nicht zur Oszillation kommt, dass der Oszillator Probleme mit dem Anschwingen hat (dauert lange bis er auf der richtigen Frequenz schwingt) oder dass der Oszillator mit viel zu hoher Frequenz schwingt. Falls du damit Probleme hast, musst du mal bei Atmel nachforschen, welchen Oszillator-Typ im ATmega8 verbaut wurde und dafür den vorgechlagenen Quarz einsetzen (es gibt von Atmega bis Xmega glaube drei oder vier Oszillator-Typen). Eventuell hast du ausgerechnet einen RTC Quarz erwischt, der nicht passt, muss aber nicht sein.
Alternative ist ein fertiges Minimalsystem einzusetzen (zum Beispiel ein Mikrocontrollermodul), wo dieser Umstand berücksichtigt wurde.

Aber es muss nun nicht unbedingt daran liegen. Stelle erst mal die Fusebits (CKSEL3..0) richtig ein. Vielleicht habe ich auch etwas bei der Initialisierung übersehen, vielleicht kann auch jemand anderes mal drüber schauen, dann auch vielleicht mal in das Datenblatt "Asynchonous Operation of Timer2" schauen.

Grüße,
Dirk

Aus dem Datenblatt:
• XTAL2/TOSC2 – Port B, Bit 7
XTAL2: Chip clock Oscillator pin 2. Used as clock pin for crystal Oscillator or Low-frequency
crystal Oscillator. When used as a clock pin, the pin can not be used as an I/O pin.
TOSC2: Timer Oscillator pin 2. Used only if internal calibrated RC Oscillator is selected as chip
clock source, and the asynchronous timer is enabled by the correct setting in ASSR. When the
AS2 bit in ASSR is set (one) to enable asynchronous clocking of Timer/Counter2, pin PB7 is dis-
connected from the port, and becomes the inverting output of the Oscillator amplifier. In this
mode, a crystal Oscillator is connected to this pin, and the pin cannot be used as an I/O pin.
If PB7 is used as a clock pin, DDB7, PORTB7 and PINB7 will all read 0.

• XTAL1/TOSC1 – Port B, Bit 6
XTAL1: Chip clock Oscillator pin 1. Used for all chip clock sources except internal calibrated RC
Oscillator. When used as a clock pin, the pin can not be used as an I/O pin.
TOSC1: Timer Oscillator pin 1. Used only if internal calibrated RC Oscillator is selected as chip
clock source, and the asynchronous timer is enabled by the correct setting in ASSR. When the
AS2 bit in ASSR is set (one) to enable asynchronous clocking of Timer/Counter2, pin PB6 is dis-
connected from the port, and becomes the input of the inverting Oscillator amplifier. In this
mode, a crystal Oscillator is connected to this pin, and the pin can not be used as an I/O pin.
If PB6 is used as a clock pin, DDB6, PORTB6 and PINB6 will all read 0.
 
Gut, also nachdem mein Chip(Danke dino^^) wieder geht, habe ich mal die verschiedenen Einstellungen getestet, und die waren alle gleich schnell? Ich brauche also für 60 Sekunden auf der Uhr ca. 10 Sekunden. :(

//Edit: Ich habe mal so ne Art "Ausgleichsabfrage" gemacht, die vor den Sekunden noch bis 6 hochrechnet, dann um eine Sekunde erhöht und die "Ausgleichsvariable" wieder auf 0 setzt. Mal gucken was ich jetzt für Verzögerungen nach ner Stunde habe, da das ja eig. extrem ungenau ist^^

//Edit2: Ok, diese Methode kann man eig. knicken, da nach 5 Minuten schon knapp 10 Sekunden falsch laufen :D
 
Hi,

Gut, also nachdem mein Chip(Danke dino^^) wieder geht, habe ich mal die verschiedenen Einstellungen getestet, und die waren alle gleich schnell? Ich brauche also für 60 Sekunden auf der Uhr ca. 10 Sekunden. :(
und weiter gehts ... ;)

//Edit2: Ok, diese Methode kann man eig. knicken, da nach 5 Minuten schon knapp 10 Sekunden falsch laufen :D
na das ist ja ein "gepfusche" :rolleyes: :eek:

Wenn es überhaupt nicht so will wie es soll ... Du willst dir ja (im ersten Beitrag zu lesen) ne Binäruhr bauen.
Nimm dir ne DS1307 Echtzeituhr. Die hält dir beim Stromausfall auch noch die Uhrzeit aufrecht. Die packst du an den I2C-Bus des Atmels. Wenn du noch mehr IO-Pins brauchst dann kannst du mit nem I2C-Portbaustein (PCF8574) nochmal 8 Pins zur Verfügung stellen. Die RTC kannst du so einstellen das sie an nem Ausgang ein 1Hz-Signal rausgibt. Damit kannst du dann einfach auf nen Interrupt-Pin des Atmels gehen und in der Interrupt-Routine läßt du dann einfach die Sekunden hochzählen. Die Überläufe für die Sekunden, Minuten, Stunden, ... kannst du dann ja im Hauptprogramm abfangen. Damit hast du dann einen schönen sauberen 1Hz-Takt für die Uhr und den Rest kannst du notfalls sogar über den internen 8MHz RC-Oszillator laufen lassen. Dann sind nochmal 2 Pins frei da du ja für den restlichen Kram keinen genauen Takt von einem Quarz mehr brauchst.

Gruß
Dino
 
:D Naja das mit dem RTC kann ich gern später mal versuchen, jetzt würde ich aber lieber ne Lösung mit dem Quarz finden^^ Es kann doch nicht sein, dass es nicht geht :eek: Die Binäruhr soll eh nur nen kleiner Test sein um ein wenig mit dem Thema zu arbeiten :D (und mit den Controllern zu spielen(!!!) :D)

Nein aber irgendwas kann da ja nicht stimmen, wenn bei unterschiedlichen Hz Zahlen die Uhr trotzdem gleich läuft.


MfG Jawaiica
 
jetzt würde ich aber lieber ne Lösung mit dem Quarz finden^^ Es kann doch nicht sein, dass es nicht geht :eek: Die Binäruhr soll eh nur nen kleiner Test sein um ein wenig mit dem Thema zu arbeiten :D (und mit den Controllern zu spielen(!!!) :D)
Hmm ... OK ... Also erstmal Bestandsaufnahme ...

Im Datenblatt ist bei Fig.10 Clock-Distribution die Taktverteilung im Chip zu sehen.

Systemtakt mit internem RC-Oszillator um den TOSC für das Uhrenquarz beim Mega8 freizubekommen ?
=> Clock-Fuses auf internen calibrated RC-Oszillator
damit wird der Timer/Counter-Oszillator frei für den Uhrenquarz.
Die interne Taktverteilung wird durch die AVR-Clock-Control-Unit gesteuert.

nur der Timer2 unterstützt die asynchrone Taktung (wie Dirk schon gesagt hat).
Das sieht man im Datenblatt bei Fig 45. 8-bit Timer/Counter Block Diagram

im Register ASSR (Asynchronous Status Register) kann man als Taktquelle mit dem Bit AS2 (=1) den Oszillator mit TOSC1/TOSC2 einstellen. (Kapitel "Asynchronous Operation of the Timer/Counter")

unter anderem steht da ...
"The CPU main clock frequency must be more than four times the Oscillator frequency."
... also am besten die CKDIV8-Fuse so einstellen das volle 8MHz Takt an der CPU liegen. Auch wenn die 32kHz weit unter 1MHz sind.

bei "Figure 56. Prescaler for Timer/Counter2" ist die Taktversorgung von Timer2 gut zu sehen.

Nun muß noch der Prescaler CS20..22 richtig eingestellt werden, der richtige Betriebsmodus des Timers2 gewählt werden und der richtige Wert im Timerregister damit man auf den richtigen Teilerfaktor für den "Uhrentakt" kommt. ;)

Sieh mal nochmal alles durch ob du wirklich alle Punkte erwischt hast. Am besten geht das immer mit dem Datenblatt in dem man sich die internen Abläufe ansehen kann.

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)