www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Timer Interrupt


Autor: mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich möchte für einen ATmega32 einen Timer mit Interrupt programmieren. 
Der 8bit Timer0 soll im CTC-Modus arbeiten.
#include <avr/io.h>;
#include <avr/interrupt.h>

void init(void) {

  // LED auf PD1
  DDRD |= 0x01;
  PORTD |= 0x01;

  /* CTC aktivieren */
  TCCR0 &= ~(1<<WGM00);
  TCCR0 |= (1<<WGM01);

  /* prescaler 1*/
  TCCR0 |= (1<<CS00);
  TCCR0 &= ~(1<<CS01);
  TCCR0 &= ~(1<<CS02);

  OCR0 = 100;
        TIMSK |= (1 << OCIE0);

  sei();
}

ISR(TIMER0_COMP_vect) {
  PORTD &= ~0x01;
}

int main(void) {

  init();
  while(1) {
  }  

}
Da die LED nicht ausgeschaltet wird, gehe ich davon aus, dass die 
Interruptroutine nicht ausgeführt wird. Kann mich vielleicht jemand 
helfen und sagen wo mein Fehler bei der Timerinitialisierung ist? Oder 
was ich sonst falsch gemacht habe?
Vielen Dank schon mal im Voraus!
Mike

Autor: Axel Düsendieb (axel_jeromin) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mike schrieb:
> /* CTC aktivieren */
>   TCCR0 &= ~(1<<WGM00);
>   TCCR0 |= (1<<WGM01);
>
>   /* prescaler 1*/
>   TCCR0 |= (1<<CS00);
>   TCCR0 &= ~(1<<CS01);
>   TCCR0 &= ~(1<<CS02);

die ledtzten beiden Zeilen killen alle Veroderungen dadrüber

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Axel Düsendieb (axel_jeromin) Benutzerseite

>> /* CTC aktivieren */
>>   TCCR0 &= ~(1<<WGM00);
>>   TCCR0 |= (1<<WGM01);
>
>   /* prescaler 1*/
>>   TCCR0 |= (1<<CS00);
>>   TCCR0 &= ~(1<<CS01);
>>   TCCR0 &= ~(1<<CS02);

>die ledtzten beiden Zeilen killen alle Veroderungen dadrüber

Nö, die löschen gezielt Bits, auch wenn die nach dem Reset sowieso 
gelösht sind. Siehe Bitmanipulation. Man beachte das "~"

MFG
Falk

Autor: Thomas Eckmann (Firma: Thomas Eckmann Informationst.) (thomase)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mike schrieb:
> // LED auf PD1
>
>   DDRD |= 0x01;
>
>   PORTD |= 0x01;

Das ist aber nicht PD1 sondern PD0.


Das gleiche hier:
mike schrieb:
> ISR(TIMER0_COMP_vect) {
>
>   PORTD &= ~0x01;
>
> }

hier wird auch PD0 auf 0 gesetzt.


mfg.

Autor: Andreas B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mike schrieb:
> ISR(TIMER0_COMP_vect) {
>   PORTD &= ~0x01;
> }

Bit 1 wird im ISR immer nur gelöscht, nicht gewechselt wie wohl die 
Absicht war. Dazu brauchts ein XOR:
ISR(TIMER0_COMP_vect) {
  PORTD ^= 0x01;
}

Autor: Thomas Eckmann (Firma: Thomas Eckmann Informationst.) (thomase)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas B. schrieb:
> Bit 1 wird im ISR immer nur gelöscht

Das ist nicht Bit 1, das ist Bit NULL.

Und wenn man den Kommentar oben richtig deutet, hat er seine LED an PD1 
angelötet.

mfg.

Autor: Andreas B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Öh ja, habe nicht genau genug gelesen, ich dachte es ging ums Blinken.

Autor: mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also die LED hängt an PD0 (hab vorhin ausversehen PD1 geschrieben). Das 
ändert aber nichts an der Tatsache, dass der Interrupt nicht 
funktioniert. Zu Testzwecken, ob mein Interrupt ausgelöst wird, wollt 
ich die LED beim ersten Interrupt ausschalten. Sie bleibt aber an. 
Daraus schließe ich, dass bei der Timerinitialisierung irgendwo ein 
Fehler ist.

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

Bewertung
0 lesenswert
nicht lesenswert
mike schrieb:
> also die LED hängt an PD0 (hab vorhin ausversehen PD1 geschrieben). Das
> ändert aber nichts an der Tatsache, dass der Interrupt nicht
> funktioniert. Zu Testzwecken, ob mein Interrupt ausgelöst wird, wollt
> ich die LED beim ersten Interrupt ausschalten. Sie bleibt aber an.

WIe ist denn die LED an den Portpin angeschlossen?

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Bist du sicher, das du das richtige File aufspielst?

MfG Spess

Autor: mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
über einen Widerstand auf Masse. Die LED funktioniert. Ich kann sie ja 
auch bei der Initialisierung anschalten. Nur die Interruptroutine wird 
nicht ausgeführt.

Autor: mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja bin ich.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Schon mal im Simulator getestet? In Assembler funktioniert es.

MfG Spess

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

Bewertung
0 lesenswert
nicht lesenswert
Laut Simulator ist da nichts auffälliges in deinem Code. Simulator sagt: 
es funktioniert.

Autor: MWS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Anderer Controller im Makefile eingetragen ?

Autor: mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So ... ich hab mir heute morgen mal von einem Bekanntenen einen anderen 
ATmega32 besorgt ... und siehe da, es geht! Anscheinden hat meiner eine 
defekt. Vielen Dank für euere Hilfe.

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.