Attiny10 no activa la interrupción de desbordamiento del temporizador durante la simulación (Atmel Studio 6)

Tengo problemas para simular el desbordamiento del temporizador en Atmel Studio 6. El código es para un Attiny10 y se ve a continuación. Hasta donde sé, configuré todos los bits necesarios para habilitar el contador (que funciona en simulación) y la interrupción (que no funciona en simulación).

Supongo que es solo un error estúpido y necesito una pequeña pista, así que realmente agradecería si alguien pudiera decirme qué estoy haciendo mal.

;======================
;   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

EDITAR: Resuelto: no puede ingresar o pasar por encima de un ISR. (Gracias a Golaž)

Respuestas (1)

Si no tiene un error de compilación al intentar compilar el código exacto que publicó, tiene un problema mayor.

Su código funciona bien (ignorando el hecho de que se perdió los nombres de registro en su tercer bloque bajo la etiqueta de reinicio). Sin embargo, haría algunos cambios:

;======================
;   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

Puede encontrar los archivos de inclusión para dispositivos y todos sus detalles (como OVF0addr, INT_VECTORS_SIZE, RAMEND, ...) en:

C:\Archivos de programa (x86)\Atmel\Atmel Toolchain\AVRAssembler\Native\2.1.1117\avrassembler\include

No estoy seguro de cuál era su objetivo exacto aquí, cuando ha establecido TCNT0registros, solo ha establecido su valor para un ciclo (actual), cuando el temporizador alcance su valor máximo, se reiniciará desde 0.

¿Cuál era su objetivo con TIM0_OVFISR? No estoy seguro.

La pila es necesaria para que la MCU sepa a qué dirección regresar después de que se haya ejecutado la llamada a la subfunción o ISR.

Bueno, el puntero de la pila se inicializa de RAMENDmanera predeterminada (por el simulador), no cambia nada con o sin inicializarlo manualmente. Quiero tener una base de tiempo. Establecer TCNT0ese valor hace que se desborde en algunos ticks y no tengo que presionar F11 ~60000veces para verlo desbordarse. Noto que el temporizador se desborda de MAXa 0, pero cuando eso sucede, debería ejecutar el desbordamiento ISR, pero no lo hace y ese es el problema. Aunque sin un puntero de pila inicializado, el simulador debería al menos ingresar ISRpero no lo hace.
@ user3097432 ¿Cómo llegaste a la conclusión de que el ISR no es despedido? ¿Pusiste un punto de freno ahí...?
@user3097432 No tiene que tocar manualmente F11 60000 veces, solo coloque un punto de freno junto a una de las instrucciones dentro de ISR y haga clic en ejecutar. Además, si nada más, configurar manualmente el puntero de la pila garantiza una mejor portabilidad.
Sé que no tengo que tabular F1160000 veces si preconfiguro el registro del temporizador cerca de lo MAXque hice. Puedo decir que no está ingresando al ISR porque puedo ingresar ( F11tecla -) y ver todos los registros y la posición real del contador del programa. No dejo que la simulación se ejecute en modo libre. Dejo que se ejecute paso a paso, así que dejo que el programa se ejecute código de operación por código de operación. Y el código en el ISR, que se supone que invierte el valor de PORTB, no cambia PORTB.
@user3097432 Haga lo que se describe arriba.
Vale guau! Ahora sí ingresa al ISR en modo de ejecución libre, pero ¿por qué no puedo verlo ingresando paso a paso?
@ user3097432 Porque no puede ingresar o pasar por encima de un ISR.