Forum: Mikrocontroller und Digitale Elektronik ATtiny84: Timer1-Interrupt geht nur 1x


von JR (Gast)


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

: Bearbeitet durch User
von Micha H. (mlh) Benutzerseite


Lesenswert?

JR schrieb:

>    PORTB ^= (1 << 0);    // toggle the LED at PORTB0

Das geht nicht.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Du kannst aber schreiben
1
PINB |= (1<<PB0) ;
Dann sollte der Pin toggeln.

von JR (Gast)


Lesenswert?

Micha H. schrieb:
>>    PORTB ^= (1 << 0);    // toggle the LED at PORTB0
>
> Das geht nicht.

Ich habe es jetzt probiert mit:
PORTB ^= (1 << PB0);

geht auch nicht :-(

von Thomas E. (thomase)


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.

von JR (Gast)


Lesenswert?

Matthias Sch. schrieb:
> PINB |= (1<<PB0) ;

...auch das geht nicht 8((

liegt die Ursache evtl. doch in den Register-Bits?

von Micha H. (mlh) Benutzerseite


Lesenswert?

Micha H. schrieb:

>>    PORTB ^= (1 << 0);    // toggle the LED at PORTB0
>
> Das geht nicht.

Disregard. Das geht schon, ich habe da nur mit einem Auge hingeschaut, 
nämlich mit dem falschen.

von Thomas E. (thomase)


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.

von Achim K. (aks)


Lesenswert?

Hast Du den Reset (PB3) ausgeschaltet (fuse)?
Wenn nicht, dann macht DDRB = 0x0F einen Reset.

von JR (Gast)


Lesenswert?

Thomas Eckmann schrieb:

> void timer_init( void )            // Timer 1 init
> {
>    TCCR1B = (1<<CS12) | (1<<CS10) | (1 << WGM12);
>    OCR1A = 7812;
>    TIMSK1 = (1<<OCIE1A);  // enable Output Compare B Match Interrupt
>  }

Danke!

Jetzt blinkt sie...

Ich werde wohl noch mal das datenblatt lesen müssen.

Gruß
JR

von Thomas E. (thomase)


Lesenswert?

Achim K. schrieb:
> Hast Du den Reset (PB3) ausgeschaltet (fuse)?
> Wenn nicht, dann macht DDRB = 0x0F einen Reset.
Ja ne, is klar.

mfg.

von JR (Gast)


Lesenswert?

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

von Thomas E. (thomase)


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.

von Achim K. (aks)


Lesenswert?

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.

von Thomas E. (thomase)


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.
Ich schrieb ja schon "is klar".

Wenn der Pin Reset ist, kannst du intern mit dem machen, was du willst. 
Da passiert gar nichts.

mfg.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


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.

von Achim K. (aks)


Lesenswert?

Sch... OK ihr habt recht.

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.