Atmega8 Timer2 CTC Problem

Gast #6551695
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
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
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

Eine eigene Frage? Dieser Thread ist über 5 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.