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ž)
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 TCNT0
registros, 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_OVF
ISR? 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.
lechepirata
RAMEND
manera predeterminada (por el simulador), no cambia nada con o sin inicializarlo manualmente. Quiero tener una base de tiempo. EstablecerTCNT0
ese valor hace que se desborde en algunos ticks y no tengo que presionarF11
~60000
veces para verlo desbordarse. Noto que el temporizador se desborda deMAX
a0
, pero cuando eso sucede, debería ejecutar el desbordamientoISR
, pero no lo hace y ese es el problema. Aunque sin un puntero de pila inicializado, el simulador debería al menos ingresarISR
pero no lo hace.Golaž
Golaž
lechepirata
F11
60000 veces si preconfiguro el registro del temporizador cerca de loMAX
que hice. Puedo decir que no está ingresando al ISR porque puedo ingresar (F11
tecla -) 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 dePORTB
, no cambiaPORTB
.Golaž
lechepirata
Golaž