- fchao-Sinus-Wechselrichter AliExpress         
Ergebnis 1 bis 9 von 9

Thema: Timer0-Int: TOV0 wird nicht gesetzt

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    14.04.2005
    Ort
    Freiberg
    Alter
    41
    Beiträge
    311

    Timer0-Int: TOV0 wird nicht gesetzt

    Hallo zusammen,

    ich versuche mich mal mit den Grundlagen der ASM-Programmierung und bin auf ein Problem gestoßen. In Anlehnung an ein Video-Tutorial für ein atmega8 versuche ich mit einem atmega32 nun per Timer0-Overflow-Int eine LED auf dem RNControl 1.4 zu schalten. Der Code ist eigentlich copy&paste. Dennoch tut es nicht - weder im AVRstudio-Debugger, noch in Hardware. Im Debugger wird TOV0 trotz Overflow von TCNT0 nicht gesetzt (AVRstudio-Einstellung: Mask Interrupts While Stepping=false).

    Ich bin für jede Hilfe dankbar!

    Grüß
    NRicola

    Code:
    .include "m32def.inc"
    .org 0x000
    begin:
    ;--------------------------------------------------
    rjmp main           ; RESET External Pin, Power-on Reset, Brown-out Reset, Watchdog Reset, and JTAG AVR Reset
    reti                ; INT0 External Interrupt Request 0
    reti                ; INT1 External Interrupt Request 1
    reti                ; INT2 External Interrupt Request 2
    reti                ; TIMER2 COMP Timer/Counter2 Compare Match
    reti                ; TIMER2 OVF Timer/Counter2 Overflow
    reti                ; TIMER1 CAPT Timer/Counter1 Capture Event
    reti                ; TIMER1 COMPA Timer/Counter1 Compare Match A
    reti                ; TIMER1 COMPB Timer/Counter1 Compare Match B
    reti                ; TIMER1 OVF Timer/Counter1 Overflow
    reti                ; TIMER0 COMP Timer/Counter0 Compare Match
    rjmp timer_int      ; TIMER0 OVF Timer/Counter0 Overflow
    reti                ; SPI, STC Serial Transfer Complete
    reti                ; USART, RXC USART, Rx Complete
    reti                ; USART, UDRE USART Data Register Empty
    reti                ; USART, TXC USART, Tx Complete
    reti                ; ADC ADC Conversion Complete
    reti                ; EE_RDY EEPROM Ready
    reti                ; ANA_COMP Analog Comparator
    reti                ; TWI Two-wire Serial Interface
    reti                ; SPM_RDY Store Program Memory Ready
    ;--------------------------------------------------
    
    main:
    
    ldi    r16, high(RAMEND)
    out    SPH, r16
    ldi    r16, low(RAMEND)
    out    SPL, r16
    
    ldi    r16, 0b11111111      ; Ausgänge=1 Eingänge=0
    out    DDRC, r16            ; Ausgeben
    
    ldi    r16, 0x00
    out    PortC, r16
    
    ; Timer und Interrupt konfigurieren
    ldi    r16, 6              ; 8bit-Timer-Register vorladen
    out    TCNT0, r16          ; so sind nur 256-6 / (16MHz/64) = 1ms zu zählen 
    ldi    r16, 0b00000011     ; CS00 & CS01 setzen: Clock/64
    out    TCCR0, r16
    ldi    r16, 0b00000001     ; TOIE0 (Timer0-Overflow-Int) setzen 
    out    TIMSK, r16
    
    sei                        ; Interrupts aktivieren
    
    mainloop:
        nop
        rjmp   mainloop
    
    timer_int:
        rcall  LEDswitch
        ldi    r16, 6
        out    TCNT0, r16
        reti
    
    LEDswitch:
        in     r16, PortC
        ldi    r17, 0b10000000     ; Bit 7 (LED)
        eor    r16, r17            ; invertieren
        out    PortC, r16
        ret
    Geändert von NRicola (18.04.2016 um 20:24 Uhr)
    Gurken schmecken mir nicht, wenn sie Pelz haben!

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.703
    Blog-Einträge
    133
    Hallo,
    ich kann keinen Fehler im Programm feststellen. Ich nutze kein AVR-Studio, habe aber schon öfter gelesen, daß es gewisse Einstellungen gibt, um im Simulator erfolgreich Interrupts zu simulieren.

    In der HW sollte es laufen. Wie stellst du fest, daß kein Interrupt kommt?

    Nach Schaltplan zum RN-Control gibt es switches vor den LEDs. Ist der für PC7 geschlossen und auch nichts anderes an PC7 angeschlossen (außer dem Eingang vom L293)?

    Die LED blinkt mit 500Hz (wenn ich richtig gerechnet habe) - da sieht man eigentlich nur ein Glimmen aber kein EIN/AUS.

    Irgendwas Besonderes bei den Fuses? JTAG abgeschaltet?

    Gruß
    Searcher
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    14.04.2005
    Ort
    Freiberg
    Alter
    41
    Beiträge
    311
    Hallo Searcher,

    bei den Fuses gibt es (gefühlt) nichts besonderes, JTAG ist aktiviert. Im davorigen Turorial mit wait-Funktionen blinkte die LED fleißig vor sich hin. Auch hier kann ich beim Initialisieren die LEDs nach Belieben an- und aus schalten. Bei dem Code oben ist die auf Bit7 erstmal aus. Würde der Interrupt auslösen, wäre sie zumindest sichtbar. Leider bleibt das aus.
    Ich habe gerade auch mal (nur, um auch ganz sicher zu gehen) auch den atmega getauscht. Das hat allerdings auch nichts gebracht.

    Dass der TOV0 nicht gesetzt wird, habe ich dem Debugger entnommen, bzw. der springt dann nicht in die LEDswitch-Funktion. Dass es in Hardware dann den gleichen Grund hat, warum die LED nicht an geht, das vermute ich jetzt lediglich.
    Dieses Flag in Hardware zu überprüfen könnte etwas kniffelig werden, oder?
    Ich hatte jetzt mal die mainloop zu folgendem abgeändert
    Code:
    mainloop:
        in    r16, TCNT0
        ldi   r17, 128
        cp    r16,r17
        brcs  LEDswitch
        clc
        rjmp  mainloop
    Aber ich zweifle gerade noch daran, dass das überhaupt korrekt ist, um TCNT0 auszulesen. Nimmt r17 Grenzwerte an (10 oder 240), dann sehe ich keine Helligkeitsunterschiede der LED.

    Hast du/habt ihr noch eine Idee, wie man das in Hardware überprüfen kann, was der so treibt?

    Vielen Dank und Grüß
    NRicola


    Fuses:
    Code:
    OCDEN    
    JTAGEN   x
    SPIEN    x
    CKOPT    
    EESAVE   
    BOOTSZ1  
    BOOTSZ0  
    BOOTRST  
    BODLEVEL x
    BODEN    x
    SUT1     x
    SUT0     
    CKSEL3   
    CKSEL2   x
    CKSEL1   x
    CKSEL0
    (hfuse: 9F, lfuse: 19)


    Ergänzung: In dem Tutorial (https://www.youtube.com/watch?v=-Rnt...qWof0Z&index=9) funktioniert das auch im Simulator von AVRstudio problemlos. Sehr merkwürdig, wie ich finde...
    Geändert von NRicola (18.04.2016 um 21:09 Uhr)
    Gurken schmecken mir nicht, wenn sie Pelz haben!

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    13.01.2014
    Beiträge
    454
    Blog-Einträge
    3
    Ich hab mir den Code nicht durchgeguckt, aber ich hatte mal genau das gleiche Verhalten: Im Simulator liefs, in Echt nicht.
    Grund war die falsch Reihenfolge des Register-Setzens. Erst musste der entsprechende Bereich enabled werden, damit dieser bestromt wurde und so für die weiteren Register-Setzbefehle empfänglich war.

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.703
    Blog-Einträge
    133
    Hi,
    möglicherweise steht der Interruptvektor für TIMER0 OVF nicht an der richtigen Stelle. An .org 0x000, Programmadresse $000 steht der rjmp zu main. Es folgen viele RETI, die aber jeweils auch nur 2 Byte belegen. Also nur einer Erhöhung des Programmcounters um eins bedürften. Nach der Interruptvectortabelle im Datenblatt zum Mega32 sollte der TIMER0 OVF auf Program Address $016 stehen. Nach deiner Tabelle im Programm komme ich nur auf Program Address $00A.

    Jetzt kenne ich den AVR Studio/Assembler nicht und folgende Syntax könnte nicht stimmen . Um den Vector sicher auf die richtige Speicheradresse zu bringen könntest Du die Tabelle eventuell so aufbauen:

    Code:
    .org 0x000 
    begin:
    ;--------------------------------------------------
    rjmp main           ; RESET External Pin, Power-on Reset, Brown-out Reset, Watchdog Reset, and JTAG AVR Reset
    .org 0x002
    reti                ; INT0 External Interrupt Request 0
    .org 0x004
    reti                ; INT1 External Interrupt Request 1
    .org 0x006
    reti                ; INT2 External Interrupt Request 2
    .org 0x008
    reti                ; TIMER2 COMP Timer/Counter2 Compare Match
    .org 0x00A
    reti                ; TIMER2 OVF Timer/Counter2 Overflow
    .org 0x00C
    reti                ; TIMER1 CAPT Timer/Counter1 Capture Event
    .org 0x00E
    reti                ; TIMER1 COMPA Timer/Counter1 Compare Match A
    .org 0x010
    reti                ; TIMER1 COMPB Timer/Counter1 Compare Match B
    .org 0x012
    reti                ; TIMER1 OVF Timer/Counter1 Overflow
    .org 0x014
    reti                ; TIMER0 COMP Timer/Counter0 Compare Match
    .org 0x016
    rjmp timer_int      ; TIMER0 OVF Timer/Counter0 Overflow
    Gruß
    Searcher
    Geändert von Searcher (19.04.2016 um 09:58 Uhr)
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  6. #6
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    14.04.2005
    Ort
    Freiberg
    Alter
    41
    Beiträge
    311
    Hallo zusammen,

    @Sisor: ich hatte dann gestern noch mit den Reihenfolgen herumgespielt. Leider brachten alle möglichen Anordnungen keinerlei Besserung.
    @Searcher: jup, das war's tatsächlich! Mit dem Code zu
    Code:
    .include "m32def.inc"
    .org 0x000            ; Interruptstartposition: 0x000
    begin:
    ;--------------------------------------------------
    rjmp main             ; RESET External Pin, Power-on Reset, Brown-out Reset, Watchdog Reset, and JTAG AVR Reset
    .org 0x016
    rjmp timer_int        ; TIMER0 OVF Timer/Counter0 Overflow
    ;--------------------------------------------------
    umgeschrieben läuft es nun. Das wirft natürlich die folgende Fragen auf: Woher weiß ich wieviel Speicher ein Befehl einnimmt? Dem Datenblatt konnte ich jetzt erstmal nur entnehmen, wieviele Clock cycles er benötigt. Benötigen alle Befehle 2 Bytes oder gibt es da Unterschiede?

    Sehr toll erstmal, hab vielen Dank!

    Grüß
    NRicola
    Gurken schmecken mir nicht, wenn sie Pelz haben!

Ähnliche Themen

  1. Timer triggert DMA, aber Overflow Flag wird nicht zurück gesetzt
    Von erik_wolfram im Forum C - Programmierung (GCC u.a.)
    Antworten: 3
    Letzter Beitrag: 22.08.2014, 13:33
  2. Ausgang wird nicht richtig gesetzt
    Von TobiasBlome im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 8
    Letzter Beitrag: 18.09.2006, 21:02
  3. PORTD,4 wird nicht auf HIGH gesetzt
    Von Pitt1986 im Forum PIC Controller
    Antworten: 15
    Letzter Beitrag: 25.02.2006, 20:23
  4. Antworten: 8
    Letzter Beitrag: 18.05.2005, 22:21
  5. welches bit wird bei... gesetzt
    Von pebisoft im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 1
    Letzter Beitrag: 19.02.2005, 18:07

Berechtigungen

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

LiFePO4 Speicher Test