www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Timer-Interrupt in C


Autor: Maxim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

wie lege ich fest, was der uC (ATMega8) bei einem Timer-Interrupt machen 
soll? In Assembler gibt es ja einen Vektor und da kann ich dann springen 
...

Wo gibt es ein Tutorial mit Beispielen in C?

Autor: E. B. (roquema) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das steht in deinem Compiler-Manual...

Autor: Mark .. (mork)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Wo gibt es ein Tutorial mit Beispielen in C?

http://www.mikrocontroller.net/articles/AVR-GCC-Tu...

MfG Mark

Autor: Maxim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#include <avr/io.h>
#include <avr/interrupt.h> 

int main(void) {

  PORTB = 0xFF;
  DDRB = 0b00001000;
  TCCR2 = 0b01101011;

  sei();

  while(1) {
  }

  return 0;
}


Müsste doch laufen, oder?

Kann am entsprechenden Pin aber nichts messen.

Wiedermal ein Flag vergessen?

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, läuft nicht, Du hasst die Kommentare vergessen. Außerdem fehlt die 
ISR.

Duck&wech...
...

Autor: Maxim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#include <avr/io.h>
#include <avr/interrupt.h> 

int main(void) {

  PORTB = 0xFF;         //Pull-up
  DDRB = 0b00001000;    //Pin3 am PortB als Ausgang (PWM-Pin)
  TCCR2 = 0b01101011;   //Fast-PWM-Mode (non-inverted) mit 32er Prescaler

  sei();                //Allgemeine Interruptfreigabe

  while(1) {            //Endlosschleife
  }

  return 0;
}

Autor: Maxim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Brauche ich beim PWM-Betrieb eine ISR?! Ist doch Quatsch.

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

Bewertung
0 lesenswert
nicht lesenswert
Du schreibst, dass Du einen Interrupt programmieren willst. Und dazu 
brauchst Du eine ISR. Das ist kein Quatsch. Wenn Du nur einen Pin 
toggeln willst, brauchst Du wiederum keinen Interrupt und damit auch 
keine ISR. Also entscheide Dich bitte, was Du wirklich willst!

Autor: Maxim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Och Mist, bin total durcheinander. Ich habe mich jetzt eine Weile in PWM 
eingelesen (Datenblatt und hier) und ging komischerweise davon aus, dass 
ihr wisst, worum es geht. ;)

Aaaalllso, der uC soll im PWM-Mode arbeiten. Der Quellcode steht ja 
schon oben. Aber am entsprechenden Pin liegt dauernd eine 0 an. Ich 
komme nicht mehr weiter.

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Maxim wrote:
> Brauche ich beim PWM-Betrieb eine ISR?!

Nein, brauchst Du nicht.

Du hast aber nach "Interrupt" gefragt, dazu braucht man eine ISR. Du 
hast sogar auf Assembler und Vektor verwiesen, das braucht zwingend eine 
ISR.

> Ist doch Quatsch.

Da hast Du natürlich recht. Du hättest nicht nach Interrupt 
(Unterbrechung, hier speziell Programmunterbrechung) fragen sollen, 
sondern nach PWM.

Tip: Schau Dir an, welche Register Dein Timer noch hat und was diese für 
Aufgabe haben. Achte besonders darauf, wie man Zählumfang und Tastgrad 
einstellt. Sind beide gleich, wird es kein messbares Signal geben.

...

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

Bewertung
0 lesenswert
nicht lesenswert
Maxim wrote:
> Och Mist, bin total durcheinander. Ich habe mich jetzt eine Weile in PWM
> eingelesen (Datenblatt und hier) und ging komischerweise davon aus, dass
> ihr wisst, worum es geht. ;)
Klar. Wir sind alle Hellseher hier...

> Aaaalllso, der uC soll im PWM-Mode arbeiten. Der Quellcode steht ja
> schon oben. Aber am entsprechenden Pin liegt dauernd eine 0 an. Ich
> komme nicht mehr weiter.
Klar. Eine PWM braucht ja auch einen Compare-Wert, der das 
Tastverhältnis definiert. Und wenn der Null ist, dann ist das PWM-Signal 
auch Null.

Autor: Maxim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aha, dankeschön!

Jetzt läuft alles.

Hier der funktionierende Quellcode:
#include <avr/io.h>
#include <avr/interrupt.h> 

#define  led_1    PD6
#define button_1  PIND2

int main(void) {

  PORTB = 0xFF;
  DDRB  = 0b00001000;
  OCR2  = 128;
  TCCR2 = 0b01101011;

  sei();

  while(1) {
  }

  return 0;
}

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gratuliere, dass der "Quatsch" nun läuft.

...

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.