Forum: Mikrocontroller und Digitale Elektronik Timer-Interrupt in C


von Maxim (Gast)


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?

von E. B. (roquema) Benutzerseite


Lesenswert?

Das steht in deinem Compiler-Manual...

von Mark .. (mork)


Lesenswert?

>Wo gibt es ein Tutorial mit Beispielen in C?

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Programmieren_mit_Interrupts

MfG Mark

von Maxim (Gast)


Lesenswert?

1
#include <avr/io.h>
2
#include <avr/interrupt.h> 
3
4
int main(void) {
5
6
  PORTB = 0xFF;
7
  DDRB = 0b00001000;
8
  TCCR2 = 0b01101011;
9
10
  sei();
11
12
  while(1) {
13
  }
14
15
  return 0;
16
}

Müsste doch laufen, oder?

Kann am entsprechenden Pin aber nichts messen.

Wiedermal ein Flag vergessen?

von Hannes L. (hannes)


Lesenswert?

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

Duck&wech...
...

von Maxim (Gast)


Lesenswert?

1
#include <avr/io.h>
2
#include <avr/interrupt.h> 
3
4
int main(void) {
5
6
  PORTB = 0xFF;         //Pull-up
7
  DDRB = 0b00001000;    //Pin3 am PortB als Ausgang (PWM-Pin)
8
  TCCR2 = 0b01101011;   //Fast-PWM-Mode (non-inverted) mit 32er Prescaler
9
10
  sei();                //Allgemeine Interruptfreigabe
11
12
  while(1) {            //Endlosschleife
13
  }
14
15
  return 0;
16
}

von Maxim (Gast)


Lesenswert?

Brauche ich beim PWM-Betrieb eine ISR?! Ist doch Quatsch.

von Johannes M. (johnny-m)


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!

von Maxim (Gast)


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.

von Hannes L. (hannes)


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.

...

von Johannes M. (johnny-m)


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.

von Maxim (Gast)


Lesenswert?

Aha, dankeschön!

Jetzt läuft alles.

Hier der funktionierende Quellcode:
1
#include <avr/io.h>
2
#include <avr/interrupt.h> 
3
4
#define  led_1    PD6
5
#define button_1  PIND2
6
7
int main(void) {
8
9
  PORTB = 0xFF;
10
  DDRB  = 0b00001000;
11
  OCR2  = 128;
12
  TCCR2 = 0b01101011;
13
14
  sei();
15
16
  while(1) {
17
  }
18
19
  return 0;
20
}

von Hannes L. (hannes)


Lesenswert?

Gratuliere, dass der "Quatsch" nun läuft.

...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.