mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATMEGA128 Timer


Autor: Markus (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

ich hab hier ein Problem und komme nicht weiter. Mittlerweile werk ich 
schon ein paar Tage daran. Auch google und das Forum können mir 
irgendwie nicht weiterhelfen.

Ich möchte eine Uhr bauen und hab mir dazu ein RTC-Projekt aus dem Forum 
runter geladen. Jetzt muss ich es natürlich auf meinen Controller und 
meinen Takt anpassen. Die Uhrzeit möchte ich dann auf dem LCD ausgeben.

Ich hab mein komplettes Projekt angehängt, weil ich mir nicht ganz 
sicher bin, ob mein Problem ausschließlich mit dem Timer zusammen hängt.

Hier mal meine Beschreibung:

Ich verwende einen ATMEGA128 mit einem 14.7456MHz Quarz. Ich stelle also 
meinen Timer auf einen Prescaler von 1024 ein. Das heißt, mein Timer 
würde 14400 mal in der Sekunde auslösen. OCR0 hab ich auf 144 gesetzt. 
Der Timer löst 100 mal Pro Sekunde aus -> also ein mal pro ms. Jetzt 
erhöhe ich pro Interupt meinen Counter um 1 und wenn dieser 100 erreicht 
hat, wäre eigentlich eine Sekunde verstrichen.

Hier mal ein Auszug aus meinem Code:
void rtcInit(void) {
         // ... hier Steht noch anderer Code
  // Timer initialisieren
  TCCR0 = RTC_TPS_VAL;
  OCR0 = RTC_TCOMP_VAL;
  TIMSK |= (1<<OCIE0);
  sei();
}

ISR(SIG_OUTPUT_COMPARE0){
  TCNT0 -= RTC_TCOMP_VAL;
       
    // Zeit inkrementieren
    if(++rtcTime.subSec >= RTC_IRQS_SEC) {
      rtcTime.subSec = 0;
      rtcTime.sec++;
    }
         //... der Restliche Code zum berechnen der Zeit
         //if(rtcTime.sec >= 60) {...
}

void main(void) {
     //... Code
     rtcInit();

     //... Code
     char Buffer[20];
     sprintf(Buffer, "%.2d:%.2d:%.2d.%.3d", rtcTime.hour,
          rtcTime.min,
          rtcTime.sec,
          rtcTime.subSec);

     lcd_string(Buffer);
}

Ich hoffe, Ihr könnt mir weiter helfen.

Danke, Markus

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja ... klar ... hab mein Problem vergessen ... entschuldigt:

Der Timer läuft viel zu schnell. Wenn die Uhr in Wirklichkeit ca. 20 
Sekunden läuft, wird eine Zeit von ca. 3 Minuten angezeigt.

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
... und hier noch meine Definition ... ich weiß nicht, was heute mit mir 
los ist ...
#define RTC_IRQS_SEC    100
#define RTC_TCOMP_VAL    144
#define RTC_TPS_VAL    (1<<CS00) | (1<<CS02) //1024

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
144 Schritte erfordern eine Grenze von 143 (Wert für OCR0).
http://www.mikrocontroller.net/articles/AVR-GCC-Tu...

>   TCNT0 -= RTC_TCOMP_VAL;
Das solltest du nicht machen. Das ist im CTC-Modus (Auto-Reload) 
kontraproduktiv.
http://www.mikrocontroller.net/articles/AVR-GCC-Tu...

Die Initialisierung des CTC-Modus vermisse ich zum Teil.

Läuft dein Atmega128 tatsächlich mit 14.7456MHz? Wenn nicht, kann das 
Programm nicht korrekt laufen. Ein einfacher Test ist ein Blinkdemo 
einer LED im 1s Takt mit einer Warteschleife. Wenn das 1 Min läuft 
sollte man 60 Blinkzyklen zählen können. Sind es nur 4 ist was faul ;-)

Autor: Oliver Ju. (skriptkiddy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Markus:
Warum verwendest du nicht den CTC-Modus? Der ist doch gerade zu 
prädestiniert für deinen Anwendungsfall.

Gruß Skriptkiddy

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, klar, 143 ... geht ja bei 0 los. Aber das erklärt nicht den großen 
Unterscheid.

Ich denke, das mit der LED kann ich mir schenken. Ich weiß, dass was 
faul ist ;o) ... sagt mir mein LCD ... oder meinst Du, alles andere erst 
mal raus-schmeißen?

Hmm ... warum sollte mein Controller nicht mit 14.745 MHz laufen? Auf 
dem Quarz stehts drauf (also glaub ich das mal). Die Fuse-Bits sollten 
auch passen CKSEL0, 1, 2 und 3 sind auf 1

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>#define RTC_TPS_VAL    (1<<CS00) | (1<<CS02) //1024

->#define RTC_TPS_VAL    (1<<WGM01) | (1<<CS00) | (1<<CS02) //1024

  uns diese Zeile '  TCNT0 -= RTC_TCOMP_VAL;' raus.

MfG Spess

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Fusebitinfo hast du jetzt erst gegeben.

Nicht rauswerfen. Ich schreibe für kleine Unterfragen gerne ein 
Miniprogramm.

Der große Unterschied kommt (wenn CTC richtig initialisiert ist) durch 
deine Manipulation des Timerzählers in der ISR.

In dem Moment der ISR setzt der AVR den Zähler auf 0. Du ziehst 144 ab. 
Der Zähler steht also auf 112 und läuft hoch. Gleichzeitig steht OCR0 
auf 144 und wartet auf den nächsten Match. Du hast also alle (144-112 = 
33) 34 Takte einen Interrupt statt alle 143 Takte. Du warpst also mit 
Level 4,2!

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das mit dem "Rauswerfen" war eher gemeint mit "ein Programm, das nur 
eine LED zum blinken bringt und sonst nix" ;o)

Ja, das mit dem TCNT0 -= ... ist mir klar. Ich habe nur vergessen, es 
raus zu nehmen, weil ich den Timer auch anders probiert hab, nicht als 
Comp.
#define RTC_TPS_VAL    (1<<WGM01) | (1<<CS00) | (1<<CS02) //1024

hat leider auch nicht viel gebracht.

Der Timer läuft immer noch viel zu schnell ...

30 Sekunden in Echt entsprechen ca. 4 Minuten am uC ... (hab ich eine 
Zeitmaschine erfunden? ;o) ... das wäre als etwa Faktor 8.
Hmm ... 8 ... kommt mir ein wenig komisch vor, dass es genau 8 ist ... 
passt vielleicht irgendein Prescaler oder so nicht?


Ich könnte natürlich meine Zähler und dergleichen so lange anpassen, bis 
ich auch mein gewünschtes Ergebnis kommt, aber das kann doch nicht die 
Lösung sein, oder?

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich denke, ich hab den Fehler gefunden. So funktionierts:
#define RTC_TPS_VAL  (1<<WGM01) | (1<<CS00) | (1<<CS01) | (1<<CS02)

Aber laut Datenblatt heißt das doch, dass Clock von einer externen 
Quelle kommt ... kann das sein, dass im Datenblatt da ein Fehler drinnen 
ist ... kann ich mir nicht vorstellen.

Aber hier mal der Link

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

auf Seiten 158 / 159

Autor: Oliver Ju. (skriptkiddy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Markus schrieb:
> Ich denke, ich hab den Fehler gefunden. So funktionierts:
> #define RTC_TPS_VAL  (1<<WGM01) | (1<<CS00) | (1<<CS01) | (1<<CS02)

Normal dürfte das so nicht funktionieren, weil für einen Prescaler von 
1024 lediglich CS00 und CS02 gesetz werden müssen, wie du ja schon 
richtig aus dem Datenblatt abgelesen hast. Mit CS01 zusätzlich wählst du 
einen externen Takt aus.


Gruß Skriptkiddy

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, ich weiß ... ich versteh das auch nicht ganz. Aber wenn ich nur CS00 
und CS02 setze, dann komm ich (rechnerisch) auf einen Prescaler von 128 
-  einen solchen sollte es aber eigentlich nicht geben.

Mein Prozessor ist ein ATMEGA128 16AU, kannst damit was zu tun haben? 
Eher nicht, oder?

Jetzt haben mich die Timer vorher schon ein wenig verwirrt, aber das 
gibt mir jetzt endgültig den Rest ;o)

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Table 56. Clock Select Bit Description
CS02 CS01 CS00 Description
0 0 0 No clock source (Timer/Counter stopped)
0 0 1 clkT0S/(No prescaling)
0 1 0 clkT0S/8 (From prescaler)
0 1 1 clkT0S/32 (From prescaler)
1 0 0 clkT0S/64 (From prescaler)
1 0 1 clkT0S/128 (From prescaler)
1 1 0 clkT0S/256 (From prescaler)
1 1 1 clkT0S/1024 (From prescaler)     <================


===============>
#define RTC_TPS_VAL  ((1<<WGM01) | (1<<CS00) | (1<<CS01) | (1<<CS02))
WGM01 siehe Table 52 Mode 2 CTC

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Stefan B. schrieb:
> Table 56. Clock Select Bit Description...

Aber nicht beim Timer0 vom ATMega128:

Table 68. Clock Select Bit Description

CS02 CS01 CS00 Description
  0   0    0   No clock source (Timer/Counter stopped)
  0   0    1   clkI/O/(No prescaling)
  0   1    0   clkI/O/8 (From prescaler)
  0   1    1   clkI/O/64 (From prescaler)
  1   0    0   clkI/O/256 (From prescaler)
  1   0    1   clkI/O/1024 (From prescaler)
  1   1    0   External clock source on T0 pin. Clock on falling edge
  1   1    1   External clock source on T0 pin. Clock on rising edge

@Markus (Gast)

Hast du auch den richtigen Controller eingestellt?

MfG Spess

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Table 68 gilt für Timer/Counter2
                               ^

Table 56 für Timer/Counter0 (TCCR0...)
                          ^

(Mein Datenblatt ist Rev. 2467R–AVR–06/08)

Autor: soundsou (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zitat: Der Timer löst 100 mal Pro Sekunde aus -> also ein mal pro ms.

denk das nochmals durch, vieleicht liegt auch hier der hund begraben :-)

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du meinst im Makefile? Ja, eigentlich schon.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stimmt in Rev. 2464U–AVR–08/10 ist "lustigerweise" die Reihenfolge der 
Inhalte

...,Timer2, Timer1, Timer0,...

in meinem alten Datenblatt ist die Reihenfolge

...,Timer0, Timer1, Timer2,...

Daher schon mal die unterschiedliche Tabellennummer.

Wenn aber wie oben geschrieben die Zeile
#define RTC_TPS_VAL  ((1<<WGM01) | (1<<CS00) | (1<<CS01) | (1<<CS02))
zu einem funktionierenden Programm führt, wird das neue Datenblatt wohl 
einen Fehler haben.

So ein Kuddelmuddel, ich behalte mal mein altes Datenblatt :-)

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan B. schrieb:
> Table 68 gilt für Timer/Counter2
>                                ^
>
> Table 56 für Timer/Counter0 (TCCR0...)
>                           ^
>
> (Mein Datenblatt ist Rev. 2467R–AVR–06/08)

ich hab mir grad das Datenblatt für den ATmeag128(L) auf der Atmel-Seite 
geholt und da ist Tabelle 68 für Timer0...

Rev. 2464U–AVR–08/10

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>(Mein Datenblatt ist Rev. 2467R–AVR–06/08)

Meins Rev. 2464U–AVR–08/10

Und die Tabelle 56 befindet sich bei mir im Kapitel zu Timer2

Table 56. Clock Select Bit Description
CS22 CS21 CS20....

MfG Spess

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Datasheet Revision History behandelt das Thema überhaupt nicht :-(
Im Anhang die ältere Version.

Autor: Stefan B. (stefan) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Mist beim Bearbeiten kann man nix anhängen.
Also hier die ältere Version...

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Die Datasheet Revision History behandelt das Thema überhaupt nicht :-(

Ich kann aber gern heute Abend mal in meiner Sammlung von ATMEL-CDs 
nachsehen. Allerdings hat deine Angabe eine andere Dokumentennummer:

Rev. 2467R–AVR–06/08
        ^
Rev. 2464U–AVR–08/10
        ^

Im Partdescriptionfile ist der Prescaler allerdings wie in deinem 
'alten' Datenblatt:

<....      1 2 3  4   5   6    7
<Prescaler>1:8:32:64:128:256:1024</Prescaler>
</TIMER0>

Mystisch

MfG Spess

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Smile :-)

An der Dokumentnummer habe ich mich auch schon detektivisch ausgelassen.

Man zieht ja vom Atmelserver die doc2467.pdf
                                       ^

Und das passt auch gut zu der Rev. Nummer des alten Datenblatts.

Jetzt hat das neuste Datenblatt die Rev. Nummer 2464... Was könnte die 
doc2464.pdf sein? Es lohnt nicht das auszuprobieren. Es ist eine Appnote 
die mit diesem Thema nix zu tun hat. vermutlich ist es ein weiterer 
Fehler beim Update der Rev.-Nummer.

Mönsch, wenn Atmel das Knuth Versprechen machen würde, wäre ich heute 
reich geworden.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Gute Nachricht: Das aktuelle Datenblatt vom ATMega128 ist korrigiert.

MfG Spess

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.