Forum: Mikrocontroller und Digitale Elektronik Atmega8 Timer2 CTC Problem


von Asterix (Gast)


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?

von Tom (Gast)


Lesenswert?

Die Abfrage im if muß mit PINB erfolgen
1
if (PINB & (1<<PB0))

von Asterix (Gast)


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.

von Asterix (Gast)


Lesenswert?

...und das war es. Sry, dass ich hier die Pferde wild gemach habe, für 
so einen Kleinsch***, aber ich habe echt lange daran gesessen.

von Tom (Gast)


Lesenswert?

Ist mir auch schon passiert, daher ists mir gleich aufgefallen. Viel 
Erfolg noch.

Beitrag #6551731 wurde vom Autor gelöscht.
von Lötlackl *. (pappnase) Benutzerseite


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.

: Bearbeitet durch User
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.