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

2

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. Por lo que sé, puse 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 que alguien me dijera lo que 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 puedes ingresar a / sobre un ISR. (Gracias a Golaž)

    
pregunta milkpirate

1 respuesta

2

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

Su código está funcionando bien (ignorando el hecho de que perdió los nombres de registro en su tercer bloque bajo la etiqueta de restablecimiento). Sin embargo yo 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 configurado TCNT0 registros, solo ha establecido su valor para un ciclo (actual), cuando el temporizador alcanzaría su valor máximo, se reiniciará desde 0 .

¿Cuál fue tu objetivo con TIM0_OVF ISR? No estoy seguro.

Se necesita una pila para que la MCU sepa a qué dirección volver después de que se haya ejecutado la llamada a la subfunción o ISR.

    
respondido por el Golaž

Lea otras preguntas en las etiquetas