-         

Ergebnis 1 bis 3 von 3

Thema: Interrupt abhängig von PWM statt PWM-Periode

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    05.08.2005
    Beiträge
    61

    Interrupt abhängig von PWM statt PWM-Periode

    Anzeige

    Hallo,

    ich benutze an meinem ATmega169 alle 4 PWM Kanäle, daher
    kann ich leider keinen weiteren timer nutzen. Ich möchte nun
    aber zu einer festen Periode Aktionen durchführen, dazu wollte
    ich die Periodendauer des PWM nutzen, die ja konstant sein sollte
    und vom aktuellen Wert des PWM unabhängig ist. Leider ist es nun
    so, dass meine dadurch gesteuerte LED immer in unterschiedlichen
    Perioden blinkt, wenn ich den PWM-Wert verändere. Was mache ich
    falsch???

    Wie gesagt, ich möchte einen Interrupt zum Ende einer PWM Periode
    und nicht dann, wenn die Flanke kommt.

    Code:
    SIGNAL (SIG_OUTPUT_COMPARE1A) {
    
    	// count for 100ms routine
    	ui_interruptCounter0++;
    	if (ui_interruptCounter0 > TIME_100_MS) {
    		timer100ms();
    		ui_interruptCounter0 = 0;
    	}
    }
    
    static void initPWM(void) {
    
    	// init pwm timer
    	
    	// 8bit timer/counter 0 
    	TCCR0A = (1<<WGM00)|(1<<COM0A1)|(1<<CS01);
    	// set initial pwm
    	OCR0A = 200;
    	
    	
    	// 16bit timer/counter 1
     	TCCR1A = (1<<WGM10)|(1<<COM1A1)|(1<<COM1B1);
    	TCCR1B = (1<<CS10);
    	// set initial pwm
    	OCR1A = 200;
    	OCR1B = 200;
    	
    	
    	// 8bit timer/counter 2
    	TCCR2A = (1<<WGM20)|(1<<COM2A1)|(1<<CS21);
    	// set initial pwm
    	OCR2A = 200;
    	
    }
    
    static void initInterrupt(void) {
    	
    	// switch interrupt on
    	TIMSK1 |= (1<<OCIE1A);
    	
    	// enable interrupts
    	sei();
    }
    
    timer100ms() {
    
            // control LED
    
    }
    Danke und Gruß
    RICOLA

  2. #2
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.554
    Meinen mega168 hatte ich bei der Initialisierung der PWM mit

    Code:
    TIMSK1 |= (1<<TOIE1);
    programmiert. Dabei kam, unabhängig von der PWM, ein Interrupt - den ich allerdings nicht wollte. Ich musste ihn daher bei der PWM-Initialisierung explizit verbieten:
    Code:
    TIMSK1 &= ~(1<<TOIE1);
    Vielleicht ist das auch DEIN Weg?
    Ciao sagt der JoeamBerg

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    25.11.2003
    Beiträge
    1.111
    Du hast den "OutputCompareInterrupt1A" aktiviert anstelle des auch schon von Joe erwähnten TimerOverflowInterruptEnable".
    Daher gibts einen IRQ immer dann, wenn der Zähler den von Dir in OCR1A angegebenen Wert erreicht, anstatt dann, wenn der Zähler überläuft.
    Gruß

Berechtigungen

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