ENSAMBLADORES E INTERPRETES.
Alumna: Estefanía Rodríguez Sánchez.
Facilitador: Elsa Viveros Galván.
Carrera: Ingeniería en sistemas computacionales.
Ciclo:10.
Tarea 8. Instrucciones de Entrada-Salida.
Fecha: 26 de noviembre del 2023.
Instrucciones de Entrada-Salida.
Diseña, captura, ensambla, depura (si es necesario) y ejecuta un programa en
ensamblador que realice la siguiente función:
Lea el estado de un interruptor conectado a uno de los pines del puerto D.
Si el pin está en 0, que se envíe al puerto B un “bit caminante” hacia la
derecha, es decir, que primero active por un cierto tiempo sólo el pin 7 del
puerto, después que desactive el pin 7 y se active por un tiempo sólo el pin 6,
después que desactive el pin 6 y se active por un tiempo sólo el pin 5, y así
sucesivamente hasta que se active el pin 0. Después de la activación del pin 0,
se repite el ciclo iniciando desde el pin 7 nuevamente.
Si el pin del puerto D está en 1, que se envíe al puerto B un “bit caminante”
hacia la izquierda.
Codigo AVR
;
; [Link]
;
; Created: 26/11/2023 [Link] PM
; Author : Fanny Rodriguez
;
.include "[Link]"
.def TEMP = r16
.def INDEX = r17
.def DELAY_LOW = r18
.def DELAY_HIGH = r19
.equ PORTB_ADDR = 0x18 ; Dirección del registro de datos del puerto B en
ATmega325P
.equ PORTD_ADDR = 0x11 ; Dirección del registro de entrada del puerto D en
ATmega325P
.equ DELAY_COUNT = 10000 ; Ajusta este valor para controlar la velocidad del bit
caminante
.org 0x0000 ; Dirección de inicio de la memoria de programa
rjmp main ; Salta a la etiqueta main al inicio
main:
ldi TEMP, (1 << PD2) ; Configura el pin PD2 como entrada (interruptor)
out DDRD, TEMP ; Establece el bit correspondiente en el registro DDRD
bit_walker_loop:
sbis PIND, PD2 ; Salta si el interruptor está en 1 (no presionado)
rcall bit_walker_right ; Llama a la rutina si el interruptor está en 0
rjmp bit_walker_left ; Salta a la rutina de caminante a la izquierda
bit_walker_right:
ldi TEMP, 0x01 ; Inicializa el registro con el bit más bajo activado
ldi INDEX, 7 ; Inicializa el índice del bit más alto a activar
bit_walker_right_loop:
out PORTB, TEMP ; Envía el contenido de TEMP al puerto B
call delay ; Llama a la rutina de espera
lsl TEMP ; Desplaza el bit hacia la izquierda
dec INDEX ; Decrementa el índice del bit
brne bit_walker_right_loop ; Salta al bucle mientras el índice no sea cero
ret
bit_walker_left:
ldi TEMP, 0x80 ; Inicializa el registro con el bit más alto activado
ldi INDEX, 0 ; Inicializa el índice del bit más bajo a activar
bit_walker_left_loop:
out PORTB, TEMP ; Envía el contenido de TEMP al puerto B
call delay ; Llama a la rutina de espera
lsr TEMP ; Desplaza el bit hacia la derecha
inc INDEX ; Incrementa el índice del bit
cpi INDEX, 8 ; Compara el índice con 8 (número total de bits en el puerto B)
brne bit_walker_left_loop ; Salta al bucle mientras el índice no sea 8
ret
delay:
ldi DELAY_LOW, (DELAY_COUNT & 0xFF) ; Carga el byte menos significativo de
DELAY_COUNT
ldi DELAY_HIGH, (DELAY_COUNT >> 8) ; Carga el byte más significativo de
DELAY_COUNT
delay_loop:
dec DELAY_LOW ; Decrementa el contador de espera (byte menos significativo)
brne delay_loop ; Salta al bucle mientras el byte menos significativo no sea
cero
dec DELAY_HIGH ; Decrementa el contador de espera (byte más significativo)
brne delay_loop ; Salta al bucle mientras el byte más significativo no sea
cero
ret
Captura de pantalla del programa compilando correctamente
En resumen, el programa crea un efecto visual en el puerto B del
ATmega325P, donde un patrón de bits se desplaza hacia la derecha o hacia la
izquierda en función del estado de un interruptor conectado al pin PD2. La
velocidad del desplazamiento está controlada por la constante
DELAY_COUNT.
Referencias
Convertronic., P. T. (5 de mayo de 2020). Microcontroladores AVR y sus funciones de
seguridad funcional para control en tiempo real, conectividad y AP. Obtenido de
[Link]
Portal., R. H. (2020). Supervisión y gestión del Estado y el rendimiento del sistema.
Obtenido de
[Link]
html-single/monitoring_and_manag
Wendy, G. (2023). Instrucciones y modos de direccionamiento ATMEGA328P.
Obtenido de [Link]
direccionamiento-atmega328p