www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATTiny45 Timer und Interrupt


Autor: Carsten M. (carstenm)
Datum:

Bewertung
0 lesenswert
nicht 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++;
}

Autor: Winfried (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nebenbei: i sollte volatile angelegt werden, sonst gibt es Probleme.

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

Autor: Carsten M. (carstenm)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Winfried,

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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
volatile int i =0;

int main (void)
{

  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 */

  sei();      /* Interrupts erlauben */

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

ISR(TIMER1_OVF_vect)
{
  i++;
}

Autor: Carsten M. (carstenm)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Micha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wird i eventuell einfach optimiert, sprich hast Du Optimierung 
eingeschaltet?

Autor: Johannes M. (johnny-m)
Datum:

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

Autor: Carsten M. (carstenm)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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"

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.