Hola estoy iniciándome en el mundo de los AVR, y pues leí algunas cosas por acá y por la web y decidí usar el AVR STUDIO 4 y el WINAVR para asm y para c respectivamente. Y por motivos de gusto usaré un ATmega8 para empezar, ya que creo estará incluido en un pedido que pronto lo haré
Simularé con el mismo AVR STUDIO y con Proteus. Y estoy consiguiendo el IAR Embedded Workbench, que tengo entendido sirve para simulaciones también? o para que sirve?
Sobre el grabador, usaré mi GTP-USB+ recién adquirido
y uno llamado Elcipse, quizá lo conozcan, es freeware, he tenido algunos problemas en el funcionamiento, pero si resulta lo usaré también.
Quiero empezar como lo hice con los PIC, comenzando con assembler y después con C. Y vi algunos ejemplos acá en ambos lenguajes, y comencé con
este de vsZener, que era para el ATmega16, pero creo que es fácilmente adaptable al ATmega8 que es mi elegido, este el código para el parpadeo de un led cada 500ms aproximadamente por el pin B1:
;--------------------------------------------------------------------------------
; Programa: Led on/off
;
; Dispositivo: ATmega8 Compilador: AVRASM2
; Entorno IDE: AVR Studio4.15 Simulador: Proteus 7.5sp3
;
; Notas: Este programa hace parpadear un led conectado al pin RB1 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 "m8def.inc" ;ATmega8
;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,$02 ;r16 <- $02 -> Iluminar led conectado pin RB1
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
El esquema de la simulación:
Y adjunto el .asm y el archivo de proteus.
Seguiré leyendo y haciendo las mismas practicas que hice con PIC's cuando me inicie. Todavía falta la prueba física.
saludos