PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Interrupt wird nicht ausgelöst



einballimwas
01.09.2009, 13:07
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?


#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);

}

PicNick
01.09.2009, 13:11
Hab' ich den sei() übersehen ?

(Enable Global Interrupt)

Ceos
01.09.2009, 13:11
du hast das sei() vergessen! interrupts sind default aus (i-bit = 0)

einballimwas
01.09.2009, 13:19
Eingefügt, weigert sich trotzdem zu funktionieren. Der Mega zieht nur 2mA mehr aus dem Netzteil. :(


#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);

}
Danke für die Antworten!

PicNick
01.09.2009, 13:22
Du wolltest doch toggeln
PORTD = 0xFF;
sollte dann heissen
PORTD ^= 0xFF;

einballimwas
01.09.2009, 13:27
Ist auch drinne.. Daran kanns aber nicht liegen, denn die ISR wird nicht ausgeführt. 8-[


#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);

}

einballimwas
01.09.2009, 13:36
Und sie wird doch ausgeführt!

Allerdings hätte ich einen pin aus dem register nicht toggeln dürfen :)

Danke schön!

askazo
01.09.2009, 13:37
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

einballimwas
01.09.2009, 14:09
Ja, sie funktioniert :) allerdings ist der Output nicht so wie erhofft:
http://www.abload.de/thumb/img_7024ud8j.jpg (http://www.abload.de/image.php?img=img_7024ud8j.jpg) http://www.abload.de/thumb/img_7018ldyl.jpg (http://www.abload.de/image.php?img=img_7018ldyl.jpg)

Bild1: Ich habe den motor blockiert, er steht also!
Bild2: Motor läuft mit obigem Code

PicNick
01.09.2009, 14:16
Bild2 scheint mit verwirrend ?

Mit Toggeln ist der Output immer 50:50 , d.i. eigentlich keine regelbare PWM

einballimwas
01.09.2009, 14:29
scheint so, als ob der motor eine negative spannung induzieren würde und dabei noch etliche störungen produziert.

Man bemerke bei Bild 1, das Oszi ist auf DC eingestellt, dh es gibt eine negative spannung von ca 15V und das die Hälfte der Nullperiode!

Momentan hab ich das Teil auch ohne jegliche entstörung angeschlossen, dh störungen auf dem 2ten Bild sind normal.
http://www.abload.de/thumb/motorsteuerung7usx.png (http://www.abload.de/image.php?img=motorsteuerung7usx.png)