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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.