Attiny10 löst keinen Timer-Überlauf-Interrupt während der Simulation aus (Atmel Studio 6)

Ich habe Probleme beim Simulieren des Timer-Überlaufs in Atmel Studio 6. Der Code ist für einen Attiny10 und sieht wie folgt aus. Soweit ich weiß, habe ich alle notwendigen Bits gesetzt, um den Zähler (der in der Simulation funktioniert) und den Interrupt (der in der Simulation nicht funktioniert) zu aktivieren.

Ich denke, es ist nur ein dummer Fehler und ich brauche einen kleinen Hinweis, also würde ich mich sehr freuen, wenn mir jemand sagen könnte, was ich falsch mache.

;======================
;   device  attiny10
;======================
;.include   tn10def.inc
;            _____________
;           /1 °         6|
;       O--|PB0        PB3|--O RESET
;          |      t10     |
;       O--|GND        VCC|--O
;          |              |
;       O--|PB1        PB2|--O
;          |______________|

;======================
; defines
;======================
.def    temp    = r16

;======================
; reset / int. vecs
;======================
.org 0x0000
    rjmp    reset           ; Reset Handler
.org 0x0004
    rjmp    TIM0_OVF        ; Timer0 Overflow Handler
.org 0x000A

;======================
; reset / setup
;======================
reset:
    in      temp,   TCCR0B          ; turn timer on
    ori     temp,   (1<<CS00)
    out     TCCR0B, temp

    in      temp,   TIMSK0          ; turn overflow interrupt on
    ori     temp,   (1<<TOIE0)
    out     TIMSK0, temp

    ldi     0xff
    out     DDRB,   temp
    ldi     0x00
    out     PORTB,  temp

    ldi     temp,   0xff
    out     TCNT0H, temp
    ldi     temp,   250
    out     TCNT0L, temp

    ldi     temp,   0xff

    sei

;======================
; main loop
;======================
main:
    rjmp    main            ; while(1);

; overflow interrupt
;====================== 
TIM0_OVF:
    com     temp
    out     PORTB,  temp
    reti

EDIT: Gelöst: Sie können nicht in / über eine ISR treten. (Danke an Golaž)

Antworten (1)

Wenn Sie beim Versuch, genau den von Ihnen geposteten Code zu kompilieren, keinen Compilerfehler erhalten haben, haben Sie ein größeres Problem.

Ihr Code funktioniert einwandfrei (ignoriert die Tatsache, dass Sie die Registernamen in Ihrem 3. Block unter Reset-Label verpasst haben). Allerdings würde ich einige Änderungen vornehmen:

;======================
;   device  attiny10
;======================
;.include   tn10def.inc
;            _____________
;           /1 °         6|
;       O--|PB0        PB3|--O RESET
;          |      t10     |
;       O--|GND        VCC|--O
;          |              |
;       O--|PB1        PB2|--O
;          |______________|

;======================
; defines
;======================
.def    temp    = r16

;======================
; reset / int. vecs
;======================
.org 0x0000
    rjmp    reset           ; Reset Handler
; Replace : .org 0x0004 with:
.org OVF0addr
    rjmp    TIM0_OVF        ; Timer0 Overflow Handler
; Replace: .org 0x000A with:
.org INT_VECTORS_SIZE ; End of vector table.

;======================
; reset / setup
;======================
reset:
    ; Initialize stack:
    ldi r16, HIGH(RAMEND)
    out SPH, r16
    ldi r16, LOW(RAMEND)
    out SPL, r16        

    in      temp,   TCCR0B          ; turn timer on
    ori     temp,   (1<<CS00)
    out     TCCR0B, temp

    in      temp,   TIMSK0          ; turn overflow interrupt on
    ori     temp,   (1<<TOIE0)
    out     TIMSK0, temp

    ; You forgot to specify the regsiter here:
    ldi     temp,   0xff
    out     DDRB,   temp
    ldi     temp,   0x00
    out     PORTB,  temp

    ldi     temp,   0xff
    out     TCNT0H, temp
    ldi     temp,   250
    out     TCNT0L, temp

    ldi     temp,   0xff

    sei

;======================
; main loop
;======================
main:
    rjmp    main            ; while(1);

; overflow interrupt
;====================== 
TIM0_OVF:
    com     temp
    out     PORTB,  temp
    reti

Sie finden die Include-Dateien für Geräte und alle ihre Besonderheiten (wie OVF0addr, INT_VECTORS_SIZE, RAMEND, ...) in:

C:\Programme (x86)\Atmel\Atmel Toolchain\AVRAssembler\Native\2.1.1117\avrassembler\include

Ich bin mir nicht sicher, was Ihr genaues Ziel hier war. Wenn Sie TCNT0Register eingestellt haben, haben Sie ihren Wert nur für einen (aktuellen) Zyklus eingestellt. Wenn der Timer seinen Maximalwert erreichen würde, wird er von 0 neu gestartet.

Was war Ihr Ziel mit TIM0_OVFISR, ich bin mir nicht sicher.

Stack wird benötigt, damit die MCU weiß, zu welcher Adresse sie zurückkehren soll, nachdem der Aufruf der Unterfunktion oder ISR ausgeführt wurde.

Nun, der Stapelzeiger wird RAMENDstandardmäßig (vom Simulator) initialisiert, er ändert nichts mit oder ohne ihn manuell zu initialisieren. Ich möchte eine Zeitbasis haben. Wenn Sie diesen Wert einstellen TCNT0, wird er in einigen Ticks überlaufen, und ich muss nicht F11 ~60000mal drücken, um zu sehen, dass er überläuft. Ich stelle fest, dass der Timer von MAXbis überläuft 0, aber wenn das passiert, sollte er den Überlauf ausführen, ISRaber er tut es nicht und das ist das Problem. Ohne initialisierten Stackpointer sollte der Simulator zwar zumindest in den eintreten, ISRtut es aber nicht.
@ user3097432 Wie kommst du zu dem Schluss, dass der ISR nicht gefeuert wird? Hast du dort einen Bremspunkt gesetzt...?
@ user3097432 Sie müssen nicht 60000 Mal manuell auf F11 tippen, setzen Sie einfach einen Bremspunkt neben eine der Anweisungen in ISR und klicken Sie auf Ausführen. Auch das manuelle Setzen des Stapelzeigers sorgt für eine bessere Portabilität.
Ich weiß, dass ich nicht 60000 Mal tippen muss, F11wenn ich das Timer-Register nahe an dem voreingestellt habe, MAXwas ich getan habe. Ich kann sagen, dass es nicht in die ISR eintritt, weil ich in die ( -Taste) eintreten F11und alle Register und die tatsächliche Programmzählerposition beobachten kann. Ich lasse die Simulation nicht im freien Modus laufen, ich lasse sie Schritt für Schritt laufen, also lasse ich das Programm Op-Code für Op-Code laufen. Und der Code in der ISR, der den Wert von invertieren soll PORTB, ändert sich nicht PORTB.
@user3097432 Bitte gehen Sie wie oben beschrieben vor.
Ok wow! Jetzt tritt es im Freilaufmodus in die ISR ein, aber warum kann ich nicht sehen, wie es Schritt für Schritt einsteigt?
@ user3097432 Weil Sie nicht in/über eine ISR treten können.