Forum: Mikrocontroller und Digitale Elektronik Atmega32u4 - Timer0 Probleme


von Rene K. (xdraconix)


Lesenswert?

Ich bin am verzweifeln :D

Ich habe einen Atmega32u4 und möchte dessen Timer0 im CTC Mode bringen 
und über OCR0B (PinD0) ausgeben... aktuell:


1
DDRD |= (1<<0) | (1<<4);          //Pin D0 to Output
2
  
3
TCCR0A = (1<<COM0B0)|(1<<WGM01);  //Toggle OCB0B on Compare Match & CTC Mode    
4
TCCR0B = (1<<CS00);               //Prescaler: None
5
    
6
sei();                            //Global interrupt enabled

Der müsste doch laufen?! Die Register werden sonst nirgend woanders mehr 
beschrieben.

von Peter II (Gast)


Lesenswert?

muss man nicht noch den Prescaler und die Taktquelle einstellen?

Sei() ist auch nicht zwingend notwendig

von Alexander S. (alex998)


Lesenswert?

Probiers mal mit OC0A, sollte gehen.

von Rene K. (xdraconix)


Lesenswert?

Ja, mach ich ja über TCCR0B und CS00 auf eins... damit stelle ich den 
Prescaler auf "none" - die Taktquelle ist ja der externe Quarz. Muss ich 
den auch einstellen?! Nimmt er dies nicht "intern mit"?

Ich kann über CS00, CS01, CS02 ja auch auf externe Taktquelle auf T0 Pin 
umstellen, aber dann nimmt er ja kein Prescaler mehr.

von Alexander S. (alex998)


Lesenswert?

Siehe Datenblatt: Atmel-7766I-USB-ATmega16U4/32U4-Datasheet_072015
S.99:

"For generating a waveform output in CTC mode, the OC0A output can be 
set to toggle"

von Rene K. (xdraconix)


Lesenswert?

Alexander S. schrieb:
> Siehe Datenblatt: Atmel-7766I-USB-ATmega16U4/32U4-Datasheet_072015
> S.99:
>
> "For generating a waveform output in CTC mode, the OC0A output can be
> set to toggle"

Ja ist ja richtig, aber muss ja auch togglen wenn OCR0A nicht gesetzt 
ist. Dann zählt er bis 0xff, toggelt und fängt bei 0x00 wieder an.

" The waveform generated
will have a maximum frequency of fOC0 = fclk_I/O/2 when OCR0A is set to 
zero (0x00)"

Ebenfalls auf der Seite 99 bissle unter deinem Satz.

von Alexander S. (alex998)


Lesenswert?

Was ich dir sagen wollte: CTC funktioniert nicht mit dem Register OCR0B 
und dem Pin OC0B. Nur A.

von Rene K. (xdraconix)


Lesenswert?

Aaaaaber... dein Hinweis war dennoch gut, durch löschen der Zeile mit 
OCR0B gehts nun aber :D Was macht OCR0B... ich muss mal suchen :)

von Alexander S. (alex998)


Lesenswert?

Du hast jetzt in TCCR0A COM0A0 gesetzt?

von Rene K. (xdraconix)


Lesenswert?

Alexander S. schrieb:
> Du hast jetzt in TCCR0A COM0A0 gesetzt?

Nein, ich hatte noch OCR0B gesetzt... das ist im Source oben nicht zu 
sehen... Quasi:

1
OCR0B = 250;


Nach auskommentieren von dieser Zeile funktionierte es nun dann auch und 
ich bekomme einen Takt an PinD0 (OC0B).

von mohikaner (Gast)


Lesenswert?

Rene K. schrieb:
> Alexander S. schrieb:
>> Du hast jetzt in TCCR0A COM0A0 gesetzt?
>
> Nein, ich hatte noch OCR0B gesetzt... das ist im Source oben nicht zu
> sehen... Quasi:

Ohne Worte

von Alexander S. (alex998)


Lesenswert?

Rene K. schrieb:

> Nach auskommentieren von dieser Zeile funktionierte es nun dann auch und
> ich bekomme einen Takt an PinD0 (OC0B).

Ist aber kein CTC, das funktioniert nur mit OCR0A.

von Rene K. (xdraconix)


Lesenswert?

mohikaner schrieb:
> Rene K. schrieb:
>> Alexander S. schrieb:
>>> Du hast jetzt in TCCR0A COM0A0 gesetzt?
>>
>> Nein, ich hatte noch OCR0B gesetzt... das ist im Source oben nicht zu
>> sehen... Quasi:
>
> Ohne Worte

?!? Noch nie was im Code stehen gehabt wo man den Wald vor Bäumen nicht 
mehr gesehen hat!?!

Alexander S. schrieb:
> Rene K. schrieb:
>
>> Nach auskommentieren von dieser Zeile funktionierte es nun dann auch und
>> ich bekomme einen Takt an PinD0 (OC0B).
>
> Ist aber kein CTC, das funktioniert nur mit OCR0A.

OCR0A muss doch aber nicht zwingend gesetzt sein, CTC sagt doch noch nur 
"Clear Timer on Compare Match", dieser tritt doch auch ein wenn OCR0A = 
0x00 ist. Da dann TCNT1 bis 254 durchzählt und wieder bei 0 beginnt, 
dann aber nicht mit OCR0A vergleicht sondern weiterzählt bis 254 - Wenn 
OCR0A aber 0x01 hat, da allerdings setzt der compare TCNT1 bei 0x01 
zurück.

von mohikaner (Gast)


Lesenswert?

Rene K. schrieb:
> mohikaner schrieb:
>> Rene K. schrieb:
>>> Alexander S. schrieb:
>>>> Du hast jetzt in TCCR0A COM0A0 gesetzt?
>>>
>>> Nein, ich hatte noch OCR0B gesetzt... das ist im Source oben nicht zu
>>> sehen... Quasi:
>>
>> Ohne Worte
>
> ?!? Noch nie was im Code stehen gehabt wo man den Wald vor Bäumen nicht
> mehr gesehen hat!?!

Doch. Es wird aber immer wieder gebeten, den kompletten Code zu posten. 
Da wäre das sicher dem einen oder anderen aufgefallen. Für mich wieder 
ein Anlaß bei unvollständigen Angaben nicht tiefer zu schauen.

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.