Hallo zusammen,
ich probiere gerade den Timer an meinem AtMega32 korrekt zu verwenden.
Ich habe einen Systemtakt von 16MHz. Entspricht das dem clkI/O, der für
den Timertakt verwendet wird? Im Datenblatt finde ich dazu keine
definitive Aussage...
Die wichtigen Code-Teile:
1 | int main(void)
|
2 | {
|
3 | // Timer konfigurieren
|
4 | TCCR1A = (1<<WGM12); // CTC Modus
|
5 | TCCR1B |= (1<<CS11) | (1<<CS10); // Prescaler 64
|
6 |
|
7 | // ((16000000/64)/1000) = 250
|
8 | OCR1A = 250-1; // Aufruf alle 1ms
|
9 |
|
10 | // Compare Interrupt erlauben
|
11 | TIMSK |= (1<<OCIE1A);
|
12 |
|
13 | // Global Interrupts aktivieren
|
14 | sei();
|
15 | while(1)
|
16 | {
|
17 | char lcdBuffer[20];
|
18 | for (int i=0; i<20; i++)
|
19 | lcdBuffer[i] = ' ';
|
20 | sprintf(lcdBuffer, "Zeit: %02d.%03d", sekunde, millisekunden);
|
21 | lcd_line(lcdBuffer);
|
22 | }
|
23 | }
|
24 |
|
25 | ISR (TIMER1_COMPA_vect)
|
26 | {
|
27 | millisekunden++;
|
28 | if(millisekunden == 1000)
|
29 | {
|
30 | sekunde++;
|
31 | millisekunden = 0;
|
32 | }
|
33 | }
|
Normalerweise sollten die Sekunden/Millisekunden Angaben nun korrekt
hochlaufen, sie tun dies allerdings viel zu langsam. (geschätzt Faktor
800 oder so)
Wo mache ich einen Fehler? Ich habe mich schon mehrmals durchs
Datenblatt gewühlt, kann aber nix finden...
Viele Grüße,
Daniel