- Labornetzteil AliExpress         
Ergebnis 1 bis 10 von 19

Thema: Timer1, Interrupt wird nur einmal ausgeführt

Baum-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.703
    Blog-Einträge
    133
    Hallo Helmut1234,
    es gibt eine Menge Macken in Deinem Code. Zunächst solltest Du ihn in die CODE Tags einschließen. Dann bleibt die Formatierung erhalten und ist viel besser lesbar.. Code Tags erreichbar in der "Erweitert" bzw "Vorschau" Ansicht mit dem # Zeichen oder [ CODE] ...prg... [ /CODE] ohne die Leerzeichen in den Klammern schreiben.

    Zum Programm selbst:
    Zum Nachschlagen im Datenblatt gehe ich mal von einem ATmega32 als µC auf dem RN-Control aus.


    main: ; main programm

    ;;; Timer Counter
    ;; Control Register A
    LDI temp, 0x00 ; normal & Clear Timer on Compare Match (CTC) Mode -> own overflow value
    OUT TCCR1A, temp ; Control Register A
    ;; Control Register B
    LDI temp, 0b00011101 ; Timer prescaler of 1024 & Clear Timer on Compare Match (CTC) Mode -> self adjust overflow

    value
    OUT TCCR1B, temp ; Control Register B

    Mit dem Bitmuster 0b00011101 wird zwar CTC aber mit ICR1 als TOP Wert eingestellt.
    Das 16Bit Register ICR1 hat einen Initialwert von 0 und Du schreibst keinen anderen Wert hinein
    Der Timer wird also nach Setzen des Prescalers los laufen und immer wegen ICR1=0 den TCNT1 gleich wieder rücksetzen.
    Warum ein Interrupt einmal ausgeführt wird möchte ich ertsmal nicht versuchen zu erklären, da Du auch die 16Bit Register in der falschen Reihenfolge beschreibst.


    ;; Output Compare Register 1 A for CTC
    ; write value 15625 -> 15625 * 1024 = 16MHz -> 1 second count
    LDI temp, 0b00001001
    OUT OCR1AL, temp
    LDI temp, 0b00111101
    OUT OCR1AH, temp
    ;; Output Compare Register 1 B for CTC
    ; write value 31,250 -> 31,250 * 1024 = 32MHz -> 2 seconds count
    LDI temp, 0b00010010
    OUT OCR1BL, temp
    LDI temp, 0b01111010
    OUT OCR1BH, temp

    Werte nicht nachgerechnet aber beide Register werden in der falschen Reihenfolge beschrieben. Auszug aus dem Datenblatt, Abschnitt "Accessing 16-bit Registers":
    To do a 16-bit write, the high byte must be written before the low byte. For a 16-bit read, the low
    byte must be read before the high byte



    ;;; PORTC set as output
    LDI temp, 0xFF ; Register komplett auf 1 setzen / LDI geht nur von R16 bis R31
    OUT DDRC, temp ; durch DDRC wird festgelegt ob die Pins von PORTC als Ausg. (1) oder Eing. (0) definiert werden
    ; DDRC wird nun mit den Werten aus R16 befüllt

    ;;; Interrupt handling
    ;; for timer 1
    LDI temp, 0x08 ; Bit 4 – OCIE1A: Timer/Counter1, Output Compare A Match Interrupt Enable
    OUT TIMSK, temp ; Timer/Counter Interrupt Mask Register
    ;; global

    Anders als im Kommentar ist der Wert 0x8 das Bit 3 und setzt das OCIE1B Bit - deshalb geht die LED auch aus.
    Compare A Interrupt wird nie enabled.


    sei ; set global interruptenable


    loop:
    rjmp loop ; endless loop



    ;-------------------------------------------------------------------------------------------
    ; interrupts

    interrupt_compare_A: ; interrupt routine for compare register 1 B
    IN temp_1, SREG ; save status register

    Kommentar irreführend.
    Kein Fehler aber Sichern des SREG und Wiederherstellen ist nicht notwendig, da die nachfolgenden Kommandos bis reti das Statusregister nicht ändern.

    LDI temp, 0x00
    OUT PORTC, temp ; LEDs on
    OUT SREG, temp_1 ; restore status register
    reti

    interrupt_compare_B: ; interrupt routine for compare register 1 A
    IN temp_1, SREG ; save status register

    Kommentar irreführend.
    Kein Fehler aber Sichern des SREG und Wiederherstellen ist nicht notwendig, da die nachfolgenden Kommandos bis reti das Statusregister nicht ändern.

    LDI temp, 0xFF
    OUT PORTC, temp ; LEDs off
    OUT SREG, temp_1 ; restore status register
    reti

    ;--------------------------------------------------------------------------
    Geändert von Searcher (21.03.2019 um 07:09 Uhr) Grund: Erläuterungen etwas ergänzt
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

Ähnliche Themen

  1. Warten auf Tastendruck -> Interrupt wird nicht mehr ausgeführt
    Von Amri im Forum C - Programmierung (GCC u.a.)
    Antworten: 4
    Letzter Beitrag: 04.12.2012, 13:10
  2. If-Schleife wird nicht ausgeführt
    Von Knipser-14 im Forum C - Programmierung (GCC u.a.)
    Antworten: 11
    Letzter Beitrag: 08.10.2010, 12:26
  3. Antworten: 1
    Letzter Beitrag: 03.08.2010, 18:37
  4. Programm wird bei geänderter Frequenz nicht mehr ausgeführt
    Von cesupa im Forum AVR Hardwarethemen
    Antworten: 3
    Letzter Beitrag: 19.08.2007, 00:50
  5. Anweisung wird nicht richtig ausgeführt
    Von Foooob im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 7
    Letzter Beitrag: 20.02.2006, 18:11

Stichworte

Berechtigungen

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

Labornetzteil AliExpress