mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Atmega32 16-bit Timer als Interruptquelle


Autor: Matthias W. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Morgen µC Gemeinde,

im Prinzip sagt der Betreff schon alles aus. Ich möchte dass der 16-bit 
Timer des Atmega32 mir in regelmäßigem Abstand (vorerst nur ca. im 
Abstand 1ms) einen Interrupt auslöst, der sagen wir mal eine LED an PD5 
ein und ausschaltet.

Ich bin Anfänger und möchte zunächst alle Funktionen des Atmega 
austesten um damit verschiedene Projekte zu realisieren. Die hiesigen 
Tutorials habe ich schon durchforstet leider ohne Erfolg, auch das 
Datenblatt gewälzt etc.. Aber der Interrupt will einfach nicht kommen :(

Hier ein paar Code Schnipsel:


Initialisierung des Timers (CTC-Modus, Prescaler-1024, TOP = 1000, Timer 
1 CompareA Interrupt gesetzt):


TCCR1A &= ~(1<<WGM11);
TCCR1A &= ~(1<<WGM10);
TCCR1B |= (1<<WGM12);
TCCR1B &= ~(1<<WGM13);
TCCR1B |= (1<<CS12);
TCCR1B &= ~(1<<CS11);
TCCR1B |= (1<<CS10);
OCR1A = 0x03E8; /*(entsprich dual 1000)*/
TIMSK |= (1<<OCIE1A);

so weit alles richtig ;) ?

Weiterhin die Interrupt-Routine (laut s.42 Datenblatt):

ISR(TIMER1_COMPA_vect){

 PORTD |= (1<<PD5);


}

Globale Interrupts sind mit sei(); aktiviert, #include <avr/interrupt.h>
hab ich auch nicht vergessen. Den ganzen Code zu Posten wird ein wenig 
schwierig da es nur ein kleiner Teil einer Routinge zur LCD-Ansteurung 
ist, ich denke das würde stark verwirren. Die LED will einfach nicht 
angehen, was sie ja theoretisch einmal müsste. Wenn ich den 
entsprechenden Schnipsel anfangs in die main schreibe, dann leuchtet sie 
natürlich.

Autor: Düsendieb (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Matthias W. schrieb:
> TCCR1A &= ~(1<<WGM11);
> TCCR1A &= ~(1<<WGM10);
> TCCR1B |= (1<<WGM12);
> TCCR1B &= ~(1<<WGM13);
> TCCR1B |= (1<<CS12);
> TCCR1B &= ~(1<<CS11);
> TCCR1B |= (1<<CS10);
> OCR1A = 0x03E8; /*(entsprich dual 1000)*/
> TIMSK |= (1<<OCIE1A);
> so weit alles richtig ;) ?

Ersetze obiges durch:
TCCR1A =0;            // disable PWM and Compare Output Mode
TCCR1B=1;        // use CLK prescale value
TCNT1=0xff00;     // reset TCNT1
sei();      // enable interrupts

Autor: Matthias W. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, aber dann verwende ich doch Mode 12 CTC, wobei TOP durch ICR1 
definiert wird und in TIMSK aktiviere ich keinen Interrupt ????

Autor: Düsendieb (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Matthias W. schrieb:
> TIMSK aktiviere ich keinen Interrupt???

haste recht, habe ich vergessen.

TIMSK = (1<<TOIE1);   // enable TCNT1 overflow

fehlt noch

Autor: Matthias W. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Hilfe ;)

Aber ich bin ein ziemlich großer Depp, jetzt weiß ich warum es nicht 
Funktioniert hat. Ich hab in der main vergessen die µC in eine 
Endlosschleife zu setzten, damit ist das Programm durchgelaufen und er 
hat einfach nie die Möglichkeit bekommen den Interrupt zu erleben. 
Gestern hab ich garantiert eine Stunde drüber gegrübelt warum es nicht 
geht, jetzt poste ich hier und mir fällt es auf :>

Autor: Düsendieb (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
so funktioniert die Gesprächspsychotherapie

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.