Hab' ich den sei() übersehen ?
(Enable Global Interrupt)
Ich bin (wie man an meinen vorigen posts sieht) Anfänger in C. Da ich in meiner Schaltung einen Fehler gemacht habe und dadurch die OCx pins nicht so nutzen kann wie ich möchte, brauche ich eine Software PWM. Wie das funktionier ist mir klar:
Timer zählt hoch -> OVerflow -> Interupt toggelt den pin
Ergebnis: eine pwm mit 0,5* Overflowfrequenz, Tastverhältnis 1:1
Der interrupt wird aber nicht ausgelöst! Woran könnte das liegen?
Code:#define F_CPU 16000000UL #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> SIGNAL(SIG_OVERFLOW0) //Interrupt fürs Pintoggeln { TCNT0 = 223; // Vorladen des Timers PORTD = 0xFF; //ISR "Lebenszeichen" (lässt einen motor drehen) } int main(){ DDRD = 0xFF; //DDRD auf ausgang setzen // Initialisierung des counters: TIMSK |= (1<<TOIE0); // Interrupts aktivieren TCNT0 = 223; // Vorladen des timers TCCR0 = (1<<CS01); // Prescaler von 8 do{ __asm__ __volatile (";tu nichts! gib nur den blöden Assembler kommentar aus, denn die ISR macht alles"); }while(1); }
Hab' ich den sei() übersehen ?
(Enable Global Interrupt)
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
du hast das sei() vergessen! interrupts sind default aus (i-bit = 0)
Eingefügt, weigert sich trotzdem zu funktionieren. Der Mega zieht nur 2mA mehr aus dem Netzteil.
Danke für die Antworten!Code:#define F_CPU 16000000UL #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> SIGNAL(SIG_OVERFLOW0) //Interrupt fürs Pintoggeln { TCNT0 = 223; // Vorladen des Timers PORTD = 0xFF; //ISR "Lebenszeichen" (lässt einen motor drehen) } int main(){ DDRD = 0xFF; //DDRD auf ausgang setzen sei(); //Interrupts global aktivieren // Initialisierung des counters: TIMSK |= (1<<TOIE0); // Interrupts aktivieren TCNT0 = 223; // Vorladen des timers TCCR0 = (1<<CS01); // Prescaler von 8 do{ __asm__ __volatile (";tu nichts! gib nur den blöden Assembler kommentar aus, denn die ISR macht alles"); }while(1); }
Du wolltest doch toggeln
PORTD = 0xFF;
sollte dann heissen
PORTD ^= 0xFF;
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Ist auch drinne.. Daran kanns aber nicht liegen, denn die ISR wird nicht ausgeführt.
Code:#define F_CPU 16000000UL #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> SIGNAL(SIG_OVERFLOW0) //Interrupt fürs Pintoggeln { TCNT0 = 223; // Vorladen des Timers PORTD ^= 0xFF; //ISR "Lebenszeichen" (lässt einen motor drehen) } int main(){ DDRD = 0xFF; //DDRD auf ausgang setzen sei(); //Interrupts global aktivieren // Initialisierung des counters: TIMSK |= (1<<TOIE0); // Interrupts aktivieren TCNT0 = 223; // Vorladen des timers TCCR0 = (1<<CS01); // Prescaler von 8 do{ __asm__ __volatile (";tu nichts! gib nur den blöden Assembler kommentar aus, denn die ISR macht alles"); }while(1); }
Und sie wird doch ausgeführt!
Allerdings hätte ich einen pin aus dem register nicht toggeln dürfen
Danke schön!
Hi,
Dein Code funktioniert bei mir einwandfrei.
Der Interrupt wird alle 18µs aufgerufen.
Ist Dein "Lebenszeichen" vielleicht falsch angeschlossen?
PS:
- "SIGNAL" ist veraltet. Stattdessen solltest Du "ISR" verwenden.
- Am Ende der main() sollte ein return 0; stehen. (Ist aber reine Formsache...)
Gruß,
askazo
Bild2 scheint mit verwirrend ?
Mit Toggeln ist der Output immer 50:50 , d.i. eigentlich keine regelbare PWM
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Lesezeichen