Forum: Mikrocontroller und Digitale Elektronik ATTiny45 Timer und Interrupt


von Carsten M. (carstenm)


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++;
}

von Winfried (Gast)


Lesenswert?

Nebenbei: i sollte volatile angelegt werden, sonst gibt es Probleme.

Gab es nicht ein global Interrupt enable Flag, was man noch setzen muss?

von Carsten M. (carstenm)


Lesenswert?

Hallo Winfried,

das genau ist ja meine Frage. Aber wie und wo ich das machen muß ist mir 
leider bis jetzt verborgen gelieben.

von Karl H. (kbuchegg)


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
}

von Carsten M. (carstenm)


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?

von Micha (Gast)


Lesenswert?

wird i eventuell einfach optimiert, sprich hast Du Optimierung 
eingeschaltet?

von Johannes M. (johnny-m)


Lesenswert?

Micha wrote:
> wird i eventuell einfach optimiert, sprich hast Du Optimierung
> eingeschaltet?
Wenn i volatile ist, darf da nichts optimiert werden!

von Carsten M. (carstenm)


Lesenswert?

Hallo,

ich hab das ganze nochmal auf Timer0 umgebaut, damit läuft es wunderbar. 
D.h. gehe ich mal davon aus, das i nicht optimiert wird.

von Karl H. (kbuchegg)


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?

von Johannes M. (johnny-m)


Lesenswert?

Zitat aus der Hilfe (known issues für Tiny25/45/85):
"Timer/Counter1, including the Dead Time Generator, is currently not 
supported in the AVR Simulator"

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.