-         
Ergebnis 1 bis 4 von 4

Thema: Problem mit Timerinterrupt

  1. #1

    Problem mit Timerinterrupt

    Anzeige

    Liebe Forengemeinde,

    nachdem ich mehrere Abende vergeblich versucht habe, den Fehler in meinem Programm zu finden, bitte ich ergebenst um Hilfe:
    (ich bin Anfänger beim Mikroprozessor-Programmieren)

    Ich verwende einen Arduino mit Atmega328P und das AtmelStudio 7 zum Programmieren.

    Mit dem Timer1 möchte ich ein PWM-Signal erzeugen mit 500ms Taktzeit. Am PortB Pin1 soll 25% rauskommen und am PortB Pin2 75% Tastverhältnis. Um das Arbeiten des OCIE1A-Interrupts zu testen, will ich zusätzlich am PortB Pin4 eine LED im gleichen Takt wie am PortB Pin2 blinken lassen.

    Das Programm sieht so aus:

    # define F_CPU 16000000UL //CPU-Frequenz
    #define PRESCALER 256
    #define MS500 F_CPU/PRESCALER/1000 * 500

    void INITialisierung(void)
    {
    //Wir verwenden den Timer1, der auf die Pins 9 und 10 des Arduino geht
    DDRB |= (1<<DDB1) |(1<<DDB2)|(1 << DDB4);
    // PB1, PB2 and PB4 are now output
    // Entspricht PIN9, 10 und 12 am Arduino
    ICR1 = MS500;
    // set MAX auf 500ms
    OCR1A = MS500/5;
    // set PWM for 20% duty cycle @ 16bit
    OCR1B = MS500/4*3;
    // set PWM for 75% duty cycle @ 16bit

    // Setzen Modus 14... Fast PWM mit Timerruecksetzen bei OCR1A-Vergleich und ICR1 als MAXwert)
    TCCR1A |= (1<<WGM11)|(1 << COM1A1)|(1 << COM1B1);
    TCCR1B |= (1<<WGM12)|(1<<WGM13);

    TIMSK1 |= (1<<OCIE1A); //enable Interrupt bei OCR1A-Vergleich

    TCCR1B |= (1<<CS12);
    // START the timer with prescaler 256
    // Ein Timertick ist dann 16 µs

    sei();

    }

    ISR(TIMER1_COMPA_vect)
    {
    PORTB ^= (1 << PB4); //Pin12 Togglen
    }

    int main(void)
    {
    INITialisierung();
    while (1){}
    }

    Das Programm funktioniert insoweit, als am Pin 1 und 2 des PortB die richtigen Signale ankommen.
    Am Pin4 des PortB entsteht jedoch ein PWM-Signal mit 500ms High und 500ms Low. D.h. die ISR wird nicht beim Compare-Match aufgerufen, sondern beim Rücksetzen des Timers beim Erreichen des ICR1-Registerwertes.

    Hat jemand eine Erklärung für dieses Verhalten?

    Das Programm hier ist nur ein Testprogramm, später möchte ich in der ISR das Register OCR1A beschreiben und so die Pulsweite des PWM-Signals aktualisieren.

    Danke schon mal...

    Gruß Alfred

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    60
    Beiträge
    2.435
    Hallo Alfred,
    Zitat Zitat von U001 Beitrag anzeigen
    Das Programm funktioniert insoweit, als am Pin 1 und 2 des PortB die richtigen Signale ankommen.
    Am Pin4 des PortB entsteht jedoch ein PWM-Signal mit 500ms High und 500ms Low. D.h. die ISR wird nicht beim Compare-Match aufgerufen, sondern beim Rücksetzen des Timers beim Erreichen des ICR1-Registerwertes.

    Hat jemand eine Erklärung für dieses Verhalten?
    Ja, du machst einen Denkfehler.
    Die ISR wird aufgerufen und toggelt dann Pin 12. Also beim ersten Aufrufen geht der Pin von 0 auf 1.
    500ms später ist dann der nächste ISR Aufruf und Pin 12 geht von 1 auf 0.

    Pin 1 und 2 werden beim Compare-Match verändert UND wenn der Timer zurückgesetzt wird.

    MfG Peter(TOO)
    Manchmal frage ich mich, wieso meine Generation Geräte ohne Simulation entwickeln konnte?

  3. #3
    Oh Mann,

    da hatte ich echt ein Brett vor'm Hirn.

    Ganz herzlichen Dank!

    Gruß Alfred

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    60
    Beiträge
    2.435
    Hallo Alfred,
    Zitat Zitat von U001 Beitrag anzeigen
    da hatte ich echt ein Brett vor'm Hirn.
    Der nächste Winter kommt bestimmt, da kann ein Brett mollig warm geben

    MfG Peter(TOO)
    Manchmal frage ich mich, wieso meine Generation Geräte ohne Simulation entwickeln konnte?

Ähnliche Themen

  1. ATMega32 UART problem --> Problem gelöst
    Von ChristophB im Forum C - Programmierung (GCC u.a.)
    Antworten: 3
    Letzter Beitrag: 12.03.2010, 18:45
  2. Problem mit Atmega644P Erkennung (Bascom-Versions-Problem)
    Von Rohbotiker im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 11.08.2008, 18:52
  3. timerinterrupt aufrufen
    Von pebisoft im Forum C - Programmierung (GCC u.a.)
    Antworten: 3
    Letzter Beitrag: 05.04.2005, 22:01

Berechtigungen

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