lunes, 23 de febrero de 2015

Contador 0 a 9 con el Atmega164p en assembler



El siguiente código muestra la implementación de un contador módulo 9 en lenguaje assembler editado en el AVR studio 6.1 


*  Created: 23/02/2015 16:44:03
 *   Author: David Torres Herrera
 */

 .include"m164pdef.inc"
 .def  tempo = r16                ;defino el r16 como tempo
 .def  contador = r17             ;defino el r17 como contador

 .cseg                                  ;comienza el segmento de codigo
 .org  0x000                      ;empieza el program en 0x00 si hay se aplasta el reset

 //configuro el puertoA como salida
 inicio:

 ldi   tempo,255    ; carga el valor de 255 en el ddra
 out   ddra,tempo  
 ldi   tempo,0             ; carga cero para que el display este apagado
 out   porta,tempo 

 //lazo infinito para el contador de 0 a 9 con un retardo
 lazo:
 call  retardo                    ; con esta instruccion me permite llamar a una subrutina
 inc   contador            ; incrmementa el contador
 out   porta,contador      ; muestra el valor de contador por el puerto A
 call  retardo                    ; llama de nuevo a la subrutina
 cpi   contador,9          ;compara si la variable esta encero
 breq  encero              ; verifica si la ultima operacion fue cero si es asi salta a encero
 rjmp  lazo               ; regresa al inicio


 // en esta subrutina se  hace el retardo para la demora y asi ver el cambio
 retardo:
 ldi         r20,0x09     ;cargo r20 con valor de nueve
 salto0:
 ldi         r21,0xbc     ; carga r21,r22 con estos numeros para retardos
 salto1:
 ldi         r22,0xc4
 salto2:
 dec         r22                 ; decrmenta c4 veces
 brne  salto2      
 dec         r21                 ; decrementa bc* c4 veces
 brne  salto1
 dec         r20                 ; decrementa 9 veces +(bc*c4)
 brne  salto0
 nop                             ; da un ciclo de gasto
 ret  

 // aqui se encera la variable una ves que llega al valo de 9
 encero:
 ldi   contador,0          ;carga contador con cero
 out   porta,contador      ;saca el valor de cero por el puerto A
 rjmp  lazo                ;regresa al lazo principal


Imágenes del circuito implementado en Proteus:









No hay comentarios.:

Publicar un comentario