ATTiny45 Timer und Interrupt

OP #823202
Lesenswert?

Hallo,

ich beschäftige mich gerade mit dem ATTiny45 und Timern sowie 
Interrupts.
Ich wollte einen Timer programmieren, der beim Overflow einen Interrupt 
auslöst und "i" dann hoch zählt. Dazu habe ich mir den unten 
aufgeführten Quellcode erstellt.

Ich habe Timer1 benutzt, ich kann zwar im AVR Studio sehen, das er 
scheinbar korrekt konfiguriert wurde, jedoch scheint es das er nicht los 
läuft bzw. "i" nicht hochgezählt wird.

Im Tutorial hab ich schon geschaut und ich glaube das ich die Globalen 
Interrups nicht eingeschaltet habe. Jedoch muß ich die Stelle, wo das 
beschrieben wird, überlesen haben. Oder liegt mein Problem woanders.

Danke schonmal für eure Hilfe.

Gruß

Carsten



int i =0;
int main (void)
{

  sei();      /* Interrupts erlauben */
  TCCR1 |= (1<<CS10) | (1<<CS11) | (1<<CS12) | (1<<CS13); /* CPU/16384 
als Takt */
//  TCNT1 = 0;    /* Startwert Counter */
//  OCR1A = 0xFFFF;    /* Stopwert Counter */
  DDRB = 0xFF;    /* Alle Pins als Ausgang */
  TIMSK |= (1<<TOIE1);  /* Overflow Interrupt an */

  while(1)
  {
    PORTB |= (1<<PB0);
  }
  return 0;
}

ISR(TIMER1_OVF_vect)
{
  i++;
}
#823226
Lesenswert?

> /* CPU/16384 als Takt */

Dir ist klar, dass du im Simulator 16384 mal auf 'Single Step' F10
drücken musst, bevor du das erste mal eine Veränderung im
Timerregister siehst?

Im Simulator sollte man den Vorteiler nicht zu groß wählen, sonst
tippt man sich einen Ast ab, bevor sich am Timer was tut.

Das volatile ist wichtig, wenn du mit dem i später im Hauptprogramm
noch was machen willst.
Den sei() macht man erst zum Schluß der Initialisierung, wenn
alles korrekt aufgesetzt ist und das Gesamtsystem loslagen darf
1
volatile int i =0;
2

3
int main (void)
4
{
5

6
  TCCR1 |= (1<<CS10) | (1<<CS11) | (1<<CS12) | (1<<CS13); /* CPU/16384
7
als Takt */
8
//  TCNT1 = 0;    /* Startwert Counter */
9
//  OCR1A = 0xFFFF;    /* Stopwert Counter */
10
  DDRB = 0xFF;    /* Alle Pins als Ausgang */
11
  TIMSK |= (1<<TOIE1);  /* Overflow Interrupt an */
12

13
  sei();      /* Interrupts erlauben */
14

15
  while(1)
16
  {
17
    PORTB |= (1<<PB0);
18
  }
19
  return 0;
20
}
21

22
ISR(TIMER1_OVF_vect)
23
{
24
  i++;
25
}
OP #823266
Lesenswert?

Hallo Karl,

ich lasse das Programm immer mit "Auto-Step" laufen (zumindest wenn ich 
mir sowas anschauen möchte).

Den Teiler habe ich testweise auf 1 gesetzt und die sei() - Befehl nach 
deinem Beispiel an andere Stelle gesetzt. Leider blieb "i" immmer noch 
0.

Hast du noch eine Idee was ich Falsch machen könnte?
#823398
Lesenswert?

Hmm. Der Timer wird im AVR-Studio tatsächlich nicht inkrementiert.
Ich kann aber auch mit dem Datenblatt nicht ausmachen warum das so
ist.
Dieser Timer ist ja ein 8 Bit Timer, der auch asynchron von der PLL
aus angesteuert werden kann. Ev. ist das ein Bug im Simulator.
Hast du mal am realen Prozessor probiert, ob das funktioniert?

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