;--------------------------------------------------------------------------------
; VsZeNeR'06
; 05/Julio/06
; vszener@gmail.com
;
; Programa: Led on/off
; Version: 0.0
;
; Dispositivo: ATmega16 Compilador: AVRASM2
; Entorno IDE: AVR Studio4.12sp2 Simulador: Proteus 6.7sp3
;
; Notas: Este programa hace parpadear un led conectado al pin RB0 del puerto
; B durante aprox. 0.5seg.
;
; Registros: r0 -> sirve para el parpadeo del led al aplicarle un eor
; r16 -> On/Off led
;
; Conexiones: B0 -> Led
;--------------------------------------------------------------------------------
;DIRECTIVAS EN ENSAMBLADOR
.include "m16def.inc" ;ATmega16
;DEFINICION DE REGISTROS
.def led_cambio=r0 ;registro para parpadeo del led
;reset-vector address $0000
.org $0000
rjmp main ;ve al main
;PROGRAMA PRINCIPAL
main:
ldi r16,$04 ;Configuracion de...
out sph,r16
ldi r16,$5F
out spl,r16 ;...la pila: Stack: $045F=RAMEND
ser r16 ;r16 <- $FF
out ddrb,r16 ;portB salida
ldi r16,$01 ;r16 <- $01 -> Iluminar led conectado pin RB0
mov led_cambio,r16 ;led_cambio <- r16 :variable para el parpadeo
loop:
out portb,r16 ;actuamos sobre el led(conectado al pin RB0)
eor r16,led_cambio ;cambiamos estado on/off
rcall delay ;retraso de 0.5seg
rjmp loop ;bucle infinito
;************************************
; Subrutina: Delay
;
; Genera un retardo via software de
; aproximadamente 0.5seg
;
; Tiempo= 0.75us + 1.5us + 0.75us +
; 490.8875ms + 0.5us + 1.5us
; + 1us = 490.8935ms
;
; Se conserva todo
;*************************************
delay: ;llamada a subrutina -> 3#clocks -> 0.75seg
push r16 ;apilamos... : 0.5us
push r1 ; : 0.5us
push r2 ;registros r16,r1,r2 : 0.5us --> 3·0.5 = 1.5us
ldi r17,$0A ;Cargamos retardo : 0.25us
clr r1 ;r1 <- 0 : 0.25us
clr r2 ;r2 <- 0 : 0.25us --> 3·0.25 = 0.75us
delay_1:
dec r1 ;r1-- : 255·(0.25us + 0.5us)=191.25us
brne delay_1 ;cuando es cierto : 0.5us
dec r2 ;r2-- : 255·(191.75us + 0.5us + 0.25us)=49.0875ms
brne delay_1 ;cuando es cierto : 0.5us
dec r17 ;r17-- : 10(49.088ms + 0.5us + 0.25us)=490.8875ms
brne delay_1 ;cuando es cierto : 0.5us
pop r16 ;desapilamos... : 0.5us
pop r1 ; : 0.5us
pop r2 ;...registros : 0.5us --> 3·0.5 = 1.5us
ret ;fin subrutina delay : 1us