Forum: Mikrocontroller und Digitale Elektronik Atmega 32 Timer0 will nicht


von -_- (Gast)


Lesenswert?

Moin,

und zwar initialisiere ich so meinen Timer0:
1
  TCCR0 |= (1<<WGM01);
2
  TIMSK |= (1<<OCIE0);
3
  OCR0 = 15;

Dazu habe ich folgende ISR:
1
ISR(TIMER0_COMP_vect)
2
{...}

Passt das so? Denn die ISR wird nie aufgerufen.

von Karl H. (kbuchegg)


Lesenswert?

Logo.
Dein Timer läuft ja auch nicht. Du hast ihm keinen Vorteiler zugewiesen.

von -_- (Gast)


Lesenswert?

Ah ich Depp...ich seh es auch gerade. Ich dachte per default wäre der 
Vorteiler 1.

von Karl H. (kbuchegg)


Lesenswert?

-_- schrieb:
> Ah ich Depp...ich seh es auch gerade. Ich dachte per default wäre der
> Vorteiler 1.

Das wär aber schön blöd, wenn die Timer immer laufen würden und Strom 
verbrauchen, selbst wenn sie gar keiner braucht :-)

von -_- (Gast)


Lesenswert?

Hmm aber das sollte doch gehen, oder?
1
  TCCR0 |= (1<<WGM01) | (1<<CS00);
2
  TIMSK |= (1<<OCIE0);
3
  OCR0 = 15;

Aber irgendwie geht er immer noch nciht in die ISR. Interrupts global 
sind an.

von Karl H. (kbuchegg)


Lesenswert?

Eine der wichtigsten Regeln im Forum:

Zeige nach Möglichkeit immer vollständigen Code!

Warum?

erstens ist das für dich am einfachsten. Du musst nichts ausschneiden
zweitens ist es für uns am einfachsten. Wir müssen nicht blöd nachfragen
drittens sitzt der Fehler meistens dort, wo du ihn nicht vermutest. Denn 
wenn er dort sitzen würde, dann hättest du ihn selber auch gesehen.
viertens können wir dann im Zweifelsfall den Code auch mal durch den 
Compiler jagen und ihn sich in Aktion ansehen.

von -_- (Gast)


Lesenswert?

Ok es funktioniert doch. Nur nun habe ich ein anderes Problem. Egal wie 
klein ich OCR0 setzte. Ich bekomme keinen Impuls kürzer als 2µs hin. In 
der ISR schalte ich nur einen Pin um:
1
PORTC ^= (1<<PC7);
.

von spess53 (Gast)


Lesenswert?

Hi

>Ok es funktioniert doch. Nur nun habe ich ein anderes Problem. Egal wie
>klein ich OCR0 setzte. Ich bekomme keinen Impuls kürzer als 2µs hin. In
>der ISR schalte ich nur einen Pin um:

>PORTC ^= (1<<PC7);

Das wundert dich? Sieh dir mal den Assemblercode davon an. Mit welcher 
Taktfrequenz läuft dein AVR?

MfG Spess

von -_- (Gast)


Lesenswert?

Er läuft mit 16MHz. Bei einem OCR0 von 15 sollte die ISR ja alle 1µs 
aufgerufen werden. Dazu habe ich mal testweise in der ISR eine Variable 
bis 20 hochgezählt, und dann den PIN umgeschalten. Da war der Impuls 
50µs lang. Aber vermutlich braucht der Vergleich auch zu viele Takte.

von Karl H. (kbuchegg)


Lesenswert?

15 ist schon sehr kurz.
So eine ISR hat ja auch einen Overhwad, der jedesmal beim Betreten bzw. 
Verlassen der Funktion ausgeführt werden muss. Mit 15 Takten von einem 
Aufruf zum nächsten wirds da schon seeeehr eng.

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.