ATtiny84: Timer1-Interrupt geht nur 1x

Gast #3547296
Lesenswert?
• ▲
▼
Hallo zusammen.

Ich bin mit meinem AVR-Latein am Ende:

Folgendes Mini-Programm läuft nicht, bzw. die ISR wird nur 1x 
durchlaufen.
Dabei soll die LED im Sekundentakt getoggelt werden.
Was mache ich falsch?

Liegt es daran, dass bei Nutzung des Registers TCCR1B auch in TCCR1A 
noch etwas gesetzt werden muss?
1
/*
2
LED blinken mit timer-interrupt auf attiny84 8Mhz
3
*/
4

5
#include <avr/io.h>
6
#include <avr/interrupt.h>
7

8

9

10
ISR( TIM1_COMPB_vect )             
11
{
12
   PORTB ^= (1 << 0);    // toggle the LED at PORTB0
13
}
14
//-------------------------------------------------------
15
void timer_init( void )            // Timer 1 init
16
{
17
  TCCR1B = (1<<WGM13) | (1<<WGM12) | (1<<CS12) | (0<<CS11) | (1<<CS10);  // CTC ; XTAL / 1024
18
  OCR1BH = 0x1E;    // set Output compare register to 7812 (== 1 sec)
19
  OCR1BL = 0x84;
20
  TIMSK1 = (1<<OCIE1B);  // enable Output Compare B Match Interrupt
21
}
22
//-------------------------------------------------------
23
int main( void )
24
{
25
 DDRB = 0x0F;           // make the PORTB pins to outputs
26
 
27
 timer_init();
28
 sei();
29
 while(1){  //
30
 }
31
}
Gruß
JR
#3547313
Lesenswert?
• ▲
▼
JR schrieb:
> Liegt es daran, dass bei Nutzung des Registers TCCR1B auch in TCCR1A
> noch etwas gesetzt werden muss?
Ja.
WGM10 und WGM11.
1
ISR( TIM1_COMPA_vect )
2
{
3
   PORTB ^= (1 << 0);    // toggle the LED at PORTB0
4
}
5

6
void timer_init( void )            // Timer 1 init
7
{
8
  TCCR1A = (1 << WGM10) < (1 << WGM11) 
9
  TCCR1B = (1<<CS12) | (1<<CS10); 
10
  OCR1A = 7812;
11
  TIMSK1 = (1<<OCIE1A);  // enable Output Compare B Match Interrupt
12
}


Micha H. schrieb:
> JR schrieb:
>
>>    PORTB ^= (1 << 0);    // toggle the LED at PORTB0
>
> Das geht nicht.
Interessant. Erzählst du uns auch warum nicht?

mfg.
#3547322
Lesenswert?
• ▲
▼
Mist! Vertan!

Vergiss das:
> void timer_init( void )            // Timer 1 init
> {
>   TCCR1A = (1 << WGM10) < (1 << WGM11)
>   TCCR1B = (1<<CS12) | (1<<CS10);
>   OCR1A = 7812;
>   TIMSK1 = (1<<OCIE1A);  // enable Output Compare B Match Interrupt
> }
> [/c]
>

So:
1
void timer_init( void )            // Timer 1 init
2
{
3
   TCCR1B = (1<<CS12) | (1<<CS10) | (1 << WGM12);
4
   OCR1A = 7812;
5
   TIMSK1 = (1<<OCIE1A);  // enable Output Compare B Match Interrupt
6
 }

mfg.
#3547350
Lesenswert?
• ▲
▼
JR schrieb:
> Achim K. schrieb:
>> Hast Du den Reset (PB3) ausgeschaltet (fuse)?
>> Wenn nicht, dann macht DDRB = 0x0F einen Reset.
>
> Den RESET-PIN (PB3) hab ich nicht weggefused.
> Die LED brennt aber auch nicht.
> Der ATtiny macht auch keinen RESET.
>
> Ich sollte wohl lieber nur PB0...PB2 zum Ausgang machen...
> Danke!
>
> JR

Hör da nicht drauf. Das ist dummes Zeug. Vor allen Dingen lass die 
Finger von der Resetfuse!

mfg.
(Firma: matzetronics) #3547360
Lesenswert?
• ▲
▼
Achim K. schrieb:
> Da PORTB nach einem Reset 0 ist, schaltet DDRB = 0x0F PB3 auf 0 und löst
> einen Reset aus, außer der Reset ist per Fuse (Reset Fuse oder DWEN)
> abgeschaltet.

Nö. Ich zitiere mal aus dem Datenblatt, Seite 65:
> Pullup is activated and output driver and digital input are deactivated
> when the pin is used as the RESET pin.

Ausgangstreiber und Eingang ist also gesperrt, wenn der Pin seine 
Funktion als RESET wahrnimmt. Du kannst also z.B. auch nicht den Zustand 
des RESET Pins als PINB3 abfragen.

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.