- 3D-Druck Einstieg und Tipps         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 11

Thema: Interrupt wird nicht ausgelöst

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.05.2007
    Beiträge
    170

    Interrupt wird nicht ausgelöst

    Anzeige

    LiFePo4 Akku selber bauen - Video
    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);
    
    }

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Hab' ich den sei() übersehen ?

    (Enable Global Interrupt)
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    du hast das sei() vergessen! interrupts sind default aus (i-bit = 0)

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.05.2007
    Beiträge
    170
    Eingefügt, weigert sich trotzdem zu funktionieren. Der Mega zieht nur 2mA mehr aus dem Netzteil.

    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);
    
    }
    Danke für die Antworten!

  5. #5
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Du wolltest doch toggeln
    PORTD = 0xFF;
    sollte dann heissen
    PORTD ^= 0xFF;
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.05.2007
    Beiträge
    170
    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);
    
    }

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.05.2007
    Beiträge
    170
    Und sie wird doch ausgeführt!

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

    Danke schön!

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.11.2005
    Alter
    49
    Beiträge
    1.146
    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

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.05.2007
    Beiträge
    170
    Ja, sie funktioniert allerdings ist der Output nicht so wie erhofft:
    Bild hier   Bild hier  

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

  10. #10
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    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.

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen