Microcontrolador Atmega8 Primeros Pasos
LABORATORIO No1: Programación atMega8 y manejo de los puertos E/S
Nota: Para todos los casos considerar un cristal de 4MHz
1. Escriba un programa para escribir en las posiciones pares de la memoria de datos (RAM) el valor de 55H y en las posiciones impares el valor AAH.
.include "m8def.inc"
.cseg
.org 0x0
INICIO:
clr r27 ;r27 = 0x00
ldi r26,0x60;r26 = 0x60
ldi r25,0x55 ;R25 = 0x55
ldi r24,0xAA ;R24 = 0xAA
ldi r16,0 ;veces1=256
LAZO1:
ldi r17,2 ;veces2=2
LAZOS2:
st X+,r25
st X+,r24
dec r17
brne LAZOS2
dec r16
brne LAZO1
rjmp PC ;FIN DEL PROGRAMA
2. Escriba un programa para enviar el siguiente mensaje almacenado en la memoria de programa como una tabla: UNIVERSIDAD PERUANA DE CIENCIASAPLICADAS a la memoria de datos en la dirección: 0x0200H
.include "m8def.inc"
.cseg
.org 0x0
INICIO:
;Hacemos que Z apunte ala TABLA
ldi ZH,HIGH(MENSAJE<<1)
ldi ZL,LOW(MENSAJE<<1)
;Hacemos que X apunte a la memoria de datos
ldi r27,0x02
clr r26
;Hacemos un bucle de 41 veces
ldi r16,41
LAZO:
lpm r0,Z+
st X,r0
dec r16
brne LAZOrjmp PC
MENSAJE:
.db "UNIVERSIDAD PERUANA ************ "
3. Se tiene una tabla de datos con los siguientes valores:
13, 56, 76, 12, 67, 25, 11, 13, 95, 12
Se le pide construir un programa que realice la suma de todos estos valores y que almacene el resultado en los registros del CPU.
.include "m8def.inc"
.cseg
.org 0x0
INICIO:
;Carga de la TABLA en el puntero Zldi ZH,HIGH(TABLA<<1)
ldi ZL,LOW(TABLA<<1)
ldi r20,0x60
ldi r22,0x63
ldi r20,10
clr r14
clr r15
clr r16
clr r21
clr r23
LAZO:
lpm
adiw Z,2
st X+,r0
add r14,r0
adc r15,r0
st Y,r14
sts 0x0061,r15
lds r16,0x0061
sub r16,r14
sts 0x0062,r16
dec r20
brne LAZO
rjmp PC;Hexadecimal
TABLA:
.db 0x0D ;13
.db 0x38 ;56
.db 0x4C ;76
.db 0x0C ;12
.db 0x43 ;67
.db 0x19 ;25
.db 0x0B ;11
.db 0x0D ;13
.db 0x5F ;95
.db 0x0C ;12
4. Implementar una rutina llamada: SEG que permita realizar un retardo de tantos segundos como lo indique el registro r20. Ejemplo:
; multiplos para que el retraso se de en un segundo.equ veces1 = 250
.equ veces2 = 4
.equ veces3 = 250
.equ veces4 = 4
SEG: ;se apilan los registros a usar para
push R16 ;salvar los valores originales
push R17
push R18
push R19
push R20
;R20 decide cuantos segundos se haran de retardo
LAZO5:
ldi R19,veces4 ;se abre el LAZO4
LAZO4:
ldi R18,veces3 ;se abre el LAZO3
LAZO3:
ldi R16,veces1 ;se abreel LAZO2
LAZO2:
nop
ldi R17,veces2 ;se abre el LAZO1
LAZO1:
dec R17
brne LAZO1 ;se cierra el LAZO1
dec R16
brne LAZO2 ;se cierra el LAZO2
dec R18
brne LAZO3 ;se cierra el LAZO3
dec R19
brne LAZO4 ;se cierra el LAZO4
dec R20
brne LAZO5 ;se cierra el LAZO5
pop R20 ;se recuperan los valores originales
pop R19 ;de los registrospop R18
pop R17
pop R16
ret
5. Implementar el programa para que rote los bits de izquierda a derecha y de derecha a izquierda del PORTB.
10000000
01000000
……..
00000010
00000001
.include "m8def.inc"
.cseg
.org 0x0
inicio:
ser r16 ; r16 = 11111111
out DDRB,r16; ya es slaida
;clr r17;10000000
ldi r17,0x80
out PORTB,r17;cargovalor
lazo1:
ROR r17;corre
out PORTB,r17
ldi r18,PB1
brne lazo1
lazo2:
ROL r17;corre
out PORTB,r17
ldi r19,PB6
brne lazo2
rjmp lazo1
6. Implemente el programa para generar la siguiente secuencia en el PORTB.
10000001
01000010
00100100
00011000
00100100
01000010
.include "m8def.inc"
.cseg
.org 0x0
inicio:
ldi...
Regístrate para leer el documento completo.