Forum: Mikrocontroller und Digitale Elektronik OC0A Toggle on Compare Match


von Tobias N. (tobias_n)


Lesenswert?

Hallo Forum,
Bei meinem Atmega328 soll der OC0A (PD6) Pin bei einem Compare Match 
togglen, tut dies allerding nicht. Kann mal jemand drüber schauen welche 
Bits ich hier falsch setze?
1
DDRD = 0xff;
2
OCR0A = 180;
3
TCCR0A |= (1<<COM0A0) | (WGM01);
4
TCCR0B |= (1<<CS02) | (1<<CS00);

Comparematch mit 100Hz bei 18.432Mhz.

Ich steh grad aufm Schlauch...

Vielen Dank schonmal.
Grüße

von Karl M. (Gast)


Lesenswert?

Hallo,

wo lernt man denn so etwas unübersichtliches hinzuschreiben ?
1
DDRD = 0xff;
2
OCR0A = 180;
Wer soll das für Dich überprüfen ?

Wer setzt die Zählerregister für dich auf die passenden Werte?

von S. Landolt (Gast)


Lesenswert?

> TCCR0A |= (1<<COM0A0) | (WGM01);
Zumindest fehlt hier ein '1<<'.

von Tobias N. (tobias_n)


Lesenswert?

Karl M. schrieb:
> Wer setzt die Zählerregister für dich auf die passenden Werte?

Was genau meinst du? Ich setze das einmal und im CTC Mode setzt sich der 
Zähler bei einem Compare Match automatisch auf 0 oder nicht?!

S. Landolt schrieb:
> Zumindest fehlt hier ein '1<<'.

... stimmt danke :) Funktioniert aber trotzdem noch nicht.

von S. Landolt (Gast)


Lesenswert?

> Funktioniert aber trotzdem noch nicht.
Sicher? Wie sieht jetzt das Programm aus?

von S. Landolt (Gast)


Lesenswert?

Arduino o.ä.? Dann sollten Sie die beiden '|=' durch '=' ersetzen.

von Tobias N. (tobias_n)


Lesenswert?

S. Landolt schrieb:
> Arduino o.ä.? Dann sollten Sie die beiden '|=' durch '=' ersetzen.

Ja Arduino. Das hat jetzt funktioniert. Wieso ist das so?

Der Code sieht jetzt so aus:
1
 /* INIT TIMER 0 */
2
  TCCR0A = (1<<COM0A0) | (1<<WGM01);  // CTC, OC0A
3
  TCCR0B = (1<<CS02) | (1<<CS00); //prescaler 1024
4
  OCR0A = 180;

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Tobias N. schrieb:
> Wieso ist das so?

In der Arduino Welt wird der Timer0 erstmal zur Erzeugung der millis() 
benutzt und ist deswegen schon programmiert, bevor dein Programm 
überhaupt aufgerufen wird.
https://arduino-info.wikispaces.com/Timers-Arduino
Mit dem = statt |= setzt du komplett neue Werte in die Timer Register, 
statt nur mit den schon gesetzten zu verodern - deswegen klappts jetzt. 
Allerdings gehen die millis() nun nicht mehr.

von Tobias N. (tobias_n)


Lesenswert?

Ah, dass mit millis(), micros() und delay() wusste ich aber nicht das 
mit dem überschreiben der Register. Wieder was gelernt :)

Vielen Dank.

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.