Atmega8 Timer2 CTC Problem

Gast #6551695
Lesenswert?

Hallo,

ich möchte die Pins eines Atmega8 mithilfe des Timer2 togglen; PB0 und 
PB1 sollen dabei gegensätzliche Zustände annehmen; sprich um 180° 
verschoben sein.
Mit folgendem Code klappt das leider nicht, und ich finde auf Teufel 
komm' raus den Fehler nicht.
Der uC läuft bei 1Mhz. Frequenz der Pins sollte bei den gegebenen 
Einstellungen knapp 2kHz sein, aber ich messe 0V an beiden Pins.
1
#include <avr/interrupt.h>
2
#include <avr/io.h>
3

4

5
int main(void)
6
{
7
  DDRB |= (1<<DDB1) | (1<<DDB0) | (1<<PB2);
8
  PORTB |= (1<<PB2);   //um zu testen, ob Port C überhaupt "lebt"
9
  TCCR2 |= (1<<WGM21);  //CTC mode
10
  OCR2 = 250;    //top value
11
  TIMSK |= (1<<OCIE2);    //erlaube Overflow-Interrupts
12
  sei();                  //erlaube globale Interrupts
13
    while (1) 
14
    {
15
    }
16
}
17

18
ISR(TIMER2_COMP_vect)
19
{
20
  PORTB ^= (1<<PB0);      //toggle PB0 bei jedem compare match
21
  if(PORTB & (1<<PB0))    //setze PB1 gegensätzlich zu PB2
22
  {
23
    PORTB &= !(1<<PB1);
24
  }
25
  else
26
  {
27
      PORTB |= (1<<PB1);
28
  }
29
}

Ich stehe total auf dem Schlauch. Weiß jemand weiter und kann mir 
helfen?
Gast #6551708
Lesenswert?

Danke Tom,

das stimmt natürlich! Wird gleich geändert... In dem Fall sollte aber 
Pin B0 trotzdem funktionieren. Gerade habe ich gesehen, dass ich Depp 
keine "Clock Source" gesetzt habe. Weil ich keinen Prescaler brauche, 
dachte ich, das sei obsolet, sehe jetzt aber, dass dann der Timer gar 
nicht läuft. Beides wird nachgebessert.
Beitrag #6551731 wurde von einem Moderator gelöscht.
Persönliche Seite #6551782
Lesenswert?

Ich habe starke Zweifel, daß dieser Ausdruck das tut, was es tun soll.
1
PORTB &= !(1<<PB1);
Meiner bescheidenen Meinung nach sollte es eher heißen.
1
PORTB &= ~(1<<PB1);

AVR-Studio Disassembling dazu:
1
PORTB &= !(1<< PB1);
2
IN        R20,0x02       In from I/O location    // keine Ahnung, was der Quatsch hier bewirken soll, das wissen nur die Compiler-Bauer
3
OUT       0x02,R17       Out to I/O location     // hier wird es interessant
4

5
PORTB &= ~(1 << PB1);}
6
CBI       0x02,1         Clear bit in I/O register
Feuer frei für die verblödeten Forentrolle, die schon ungeduldig in 
ihren Startlöchern lauern.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren