-
        

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

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    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.836
    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
    33
    Beiträge
    2.410
    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.836
    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
    42
    Beiträge
    1.141
    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:


    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.836
    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
  •