- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 8 von 8

Thema: Timer Interrupt wird nicht mehr ausgelöst

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.08.2008
    Ort
    DE
    Beiträge
    523
    Kleiner Hinweis. Ein delay_ms(4000); in einer ISR ist wirklich sehr sehr sehr sehr sehr sehr sehr sehr sehr schlecht und sollte um jeden Preis vermieden werden!!!! Du blockierst damit einfach alles.

    mfg

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    23.10.2013
    Beiträge
    6
    @Wsk8, bin mir dessen bewusst.
    Der Inhalt in der ISR dient aktuell nur zu Visualisierung (ob Magnetventil komplett durchschaltet).
    Kann leider nur Schritt für Schritt programmieren, da ich eben ein Neueinsteiger in diesem Themengebiet bin.

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    23.10.2013
    Beiträge
    6
    Hallo,
    hab den Rat von Wsk8 beherzigt und habe in die Interrupt-Routine einen weiteren Timer eingebaut (ist das so üblich?).

    #define F_CPU 1000000UL
    #include <avr/io.h>
    #include <avr/interrupt.h> //Datei interrupt.h einbinden
    #include <util/delay.h>

    ISR(TIMER1_COMPA_vect) //Interrupt service routine wenn Vergleichswert erreicht ist
    {
    static uint16_t swTeiler = 0; //Deklarieren von swTeiler
    swTeiler++; //Zählschritt einstellen
    if (swTeiler == 30) //Wert bis Interrupt ausgelöst wird
    {
    swTeiler = 0; //Teiler wieder auf 0 setzen
    PORTD |= (1<<PD6); //PortD Strom an
    TCCR1B |= (1<<WGM12) | (1<<CS12);
    TIMSK |= (1<< OCIE1B);
    OCR1B = 3094;
    sei();


    }
    }
    ISR (TIMER1_COMPB_vect)
    {
    static uint8_t vTeiler = 0;
    vTeiler++;
    if (vTeiler == 4)
    {
    vTeiler = 0;
    PORTD &= ~(1<<PD6);

    }
    }

    int main (void)

    {


    DDRD |= (1<<PD6); //PD6 als Ausgang deklarieren




    //Timer konfigurieren
    TCCR1B |= (1<<WGM12) | (1<<CS12); //CTC-Mode und Vorteiler auswählen
    //Tabelle

    TIMSK |= (1<<OCIE1A); //Timer1 auswählen (Output Compare A Match Interrupt Enable
    //Interrupt aufrufen, wenn der Vergleichswert erreicht ist
    //Tabelle

    OCR1A = 3906; //Vergleichswert zur bestimmung einer Sekunde
    //Interrupts aktivieren

    sei();


    int i = 0; //Schleifenvariable deklariert
    while(i<2) //Zwei mal wird die Schleife durchlaufen
    {
    //Zu beginn des Programmstarts, sollen 2 Schmierungen druchgeführt werden
    i++;
    PORTD |= (1<<PD6);
    _delay_ms(3000); //Schmierzeit
    PORTD &= ~(1<<PD6);
    _delay_ms(3000); //Untebrechung der Schmierung

    }


    while(1)
    {

    }
    }
    Prinzipiell läuft das Programm, jedoch findet bei jedem zweiten Aufruf der ISR, schon nach ca. einer Sekunde ein Interrupt statt, wodurch PD6 wieder auf Low gesetzt wird.
    Sprich bei jedem ungeraden Interrupt findet der Overflow nach 4 Zählschritten statt und bei jedem geraden schon nach einem.
    Kann es mir nicht wirklich erklären?

    mfg
    Damnit

Ähnliche Themen

  1. Interrupt wird nicht ausgelöst.
    Von DarkSoldier im Forum C - Programmierung (GCC u.a.)
    Antworten: 1
    Letzter Beitrag: 28.04.2013, 14:42
  2. Interrupt wird nicht ausgelöst
    Von Michael_am32 im Forum C - Programmierung (GCC u.a.)
    Antworten: 4
    Letzter Beitrag: 02.08.2010, 00:37
  3. Es wird kein Interrupt ausgelöst
    Von MrTaco im Forum C - Programmierung (GCC u.a.)
    Antworten: 9
    Letzter Beitrag: 19.07.2010, 16:48
  4. Interrupt wird nicht ausgelöst
    Von einballimwas im Forum C - Programmierung (GCC u.a.)
    Antworten: 10
    Letzter Beitrag: 01.09.2009, 14:29
  5. Interrupt wird nicht ausgelöst
    Von PcVirus im Forum C - Programmierung (GCC u.a.)
    Antworten: 2
    Letzter Beitrag: 10.04.2008, 15:14

Berechtigungen

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

12V Akku bauen