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

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