Forum: Mikrocontroller und Digitale Elektronik ATmega32 Timer 0 CTC-Mode: Prescaler nicht aktiv?


von prog0 (Gast)


Lesenswert?

Hallo zusammen

Ich teste im Moment meinen ATmega32 ein wenig.
Am uC hängt ein 16MHz Quarz welcher korrekt konfiguriert wurde 
(_delay_ms() funktioniert)

Mein Code:
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <avr/pgmspace.h>
4
#include <util/delay.h>
5
6
ISR(TIMER0_COMP_vect) { 
7
  PORTC ^= (1<<PC1);
8
}
9
10
int main(void) {
11
  DDRC |= (1<<PC0);
12
  DDRC |= (1<<PC1);
13
  
14
  TCCR0 = (1<<CS02) | (1<<WGM01);  // /64 | CTC mode
15
  OCR0  = 97; // => 99.328ms @ 16 MHz
16
  TIMSK |= (1<<OCIE0);
17
  sei();
18
  
19
  for(;;) {
20
    _delay_ms(100);
21
    PORTC ^= (1<<PC0);
22
  }
23
}

Eine LED an PC0 blinkt wie erwartet mit 10Hz. Die LED an PC1 leuchtet 
allerdings nur schwach (50%). Es schaut so aus als wäre der Prescaler 
nicht aktiv.

Weiss jemand warum das so sein könnte?

Vielen Dank & Grüsse
prog0

von Lötlackl *. (pappnase) Benutzerseite


Lesenswert?

prog0 schrieb:
> TCCR0 = (1<<CS02) | (1<<WGM01);  // /64 | CTC mode

Das kann so nicht stimmen. Wenn nur CS02 gesetzt ist, dann ist der 
Vorteiler 256! (Datenblatt S.82 "Table 42. Clock Select Bit 
Description")

von Spess53 (Gast)


Lesenswert?

Hi

Was erwartest du? Dein Interrupt wird ca. alle 1,5ms aufgerufen. das 
ergibt einen Blinkfrequenz von über 300Hz.

MfG Spess

von prog0 (Gast)


Lesenswert?

@Lötlackl

Stimmt, vielen Dank (habs vom vielen Ausprobieren vergessen zu ändern).

Allerdings funktioniert es mit der geänderten Zeile weiterhin nicht.
1
TCCR0 = (1<<CS01) | (1<<CS00) | (1<<WGM01);  // /64 | CTC mode

Hat jemand eine Idee wieso?

von Spess53 (Gast)


Lesenswert?

Hi

>Allerdings funktioniert es mit der geänderten Zeile weiterhin nicht.

>TCCR0 = (1<<CS01) | (1<<CS00) | (1<<WGM01);  // /64 | CTC mode

Noch schlimmer. Die obige Rechnung war mit Prescaler 256. Bei Prescaler 
64 sind es 392 µs und 1,276 kHz.

MfG Spess

von Ingo (Gast)


Lesenswert?

Du hast:

16MHz/((97+1) * 64 ) = 99378,88 Hz

Das nochmal durch 2, weil du toggelst = 49689,44 Hz

Deine Rechnung scheint fehlerhaft zu sein...



Ingo

von Ingo (Gast)


Lesenswert?

Sorry, Spess hat recht, ich hab Punkt vor Strich nicht beachtet

von Spess53 (Gast)


Lesenswert?

Hi

>16MHz/((97+1) * 64 ) = 99378,88 Hz

Ergibt bei mir 2551,... Hz.

MfG Spess

von prog0 (Gast)


Lesenswert?

Alles klar, vielen Dank für eure Hilfe!
Das Wochenende ist gerettet ;)

(Ich habe jeweils als fOSC = 16 Mhz / 256 genommen.)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.