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

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.