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?
>Wo gibt es ein Tutorial mit Beispielen in C? http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Programmieren_mit_Interrupts MfG Mark
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?
Nein, läuft nicht, Du hasst die Kommentare vergessen. Außerdem fehlt die ISR. Duck&wech... ...
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 | }
|
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!
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.
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. ...
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.
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 | }
|
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.