INTRODUCCIÓN
los microcontroladores AVR, en específico los ATMega16 y ATMega8. Lo primero
que debemos de conocer es la estructura externa de los MCU y la estructura
interna. A continuación, se observan 4 figuras en las cuales se pude ver la
estructura de los ATmega16 y 8, así como una imagen con la estructura interna
básica de ambas. En la última imagen se muestra la estructura de la memoria de
datos, esto tenemos que conocerlo bien pues esos registros que la conforman son
los que se utilizaran con mucha frecuencia:
DESARROLLO
Ejercicios 3.7
1. Emule el circuito combinacional mostrado en la figura 3.21, utilice un AVR
programado en lenguaje Ensamblador. Sugerencia: Mueva cada bit a la posición
menos significativa de un registro y aplique las operaciones lógicas sobre los
registros. El resultado debe quedar en el bit menos significativo
Ante cambios en las entradas ¿Cuál es el tiempo de respuesta si el MCU está
operando a 1 MHz?
/*
* _3.asm
*
* Created: 03/11/2021 08:55:30 p. m.
* Author: crisl
*/
.INCLUDE "M8DEF.INC"
.CSEG
.ORG 0
;STACK POINTE¨R*************************************************
LDI R16, LOW(RAMEND)
OUT SPL, R16
LDI R16, HIGH(RAMEND)
OUT SPH, R16
;***************************************************************
LDI R16, 0b0000_0001
OUT DDRD, R16
LEER_PULSADOR:
IN R16, PINB
MASCARA:
ANDI R16, 0b0000_0111
;PRENDIDO*********************************
COMPARACION_000:
CPI R16, 0b0000_0000
BREQ PRENDER_LED
RJMP COMPARACION_100
;PRENDIDO*********************************
COMPARACION_100:
CPI R16, 0b0000_0001
BREQ PRENDER_LED
RJMP COMPARACION_010
;PRENDIDO*********************************
COMPARACION_010:
CPI R16, 0b0000_0010
BREQ PRENDER_LED
RJMP COMPARACION_110
;APAGADO*********************************
COMPARACION_110:
CPI R16, 0b0000_0011
BREQ APAGAR_LED
RJMP COMPARACION_001
;PRENDIDO*********************************
COMPARACION_001:
CPI R16, 0b0000_0100
BREQ PRENDER_LED
RJMP COMPARACION_101
;PRENDIDO*********************************
COMPARACION_101:
CPI R16, 0b0000_0101
BREQ PRENDER_LED
RJMP COMPARACION_011
;PRENDIDO*********************************
COMPARACION_011:
CPI R16, 0b0000_0011
BREQ PRENDER_LED
RJMP COMPARACION_111
;PRENDIDO*********************************
COMPARACION_111:
CPI R16, 0b0000_0111
BREQ APAGAR_LED
RJMP LEER_PULSADOR
;*******************************************
PRENDER_LED:
LDI R16,0b0000_0001
OUT PORTD, R16
RJMP LEER_PULSADOR
APAGAR_LED:
LDI R16,0b0000_0000
OUT PORTD, R16
RJMP LEER_PULSADOR
2. Construya un comparador de 2 datos (A y B) de 4 bits leídos en el puerto B del
microcontrolador, A en PB[3:0] y B en PB[7:4]. El comparador debe generar 3
salidas en el puerto C para indicar si: A > B (PC0), A = B (PC1) o A < B (PC2).
Codigo del programa
; contador.asm
;
; Created: 03/12/2021 0:26:13
; Author : crisl
.dseg
.def a=r16
.def b=r17
.def c=r18
.def an=R19
.cseg
ldi a,0x00
out ddrd,a
ldi a,0x00
out portd,a
out portd,b
ldi c,0x07
out ddrb,c
ldi an,0x0f
read:
in a,pind
and a,an
in b,pind
swap b
and b,an
;verifica si son estados iguales
comparo:
cp a,b
brsh define
comparo2:
cp a,b
brlo menor
cp a,b
breq igual
define:
cp a,b
brne mayor
rjmp comparo2
mayor:
ldi b,0
ldi c,0
ldi a,0b00000001
out portb,a
rjmp read
;verifica si son estados iguales
igual:
ldi a,0
ldi b,0
ldi c,0b00000010
out portb,c
rjmp read
;verifica los estados menores
menor:
ldi a,0
ldi c,0
ldi b,0b00000100
out portb,b
rjmp read
5. Implemente un sistema que maneje 2 semáforos con los 3 colores básicos
(Rojo, Amarillo y Verde), siguiendo la secuencia de tiempos mostrada en la tabla
3.28
Para el parpadeo en el color verde, considere medio segundo encendido y medio
segundo apagado.
Codigo de la practica
/*
* main.c
*
* Created: 12/16/2021 8:14:10 AM
* Author: crisl
*/
#include <avr/io.h>
#define F_CPU 4000000
#include<util/delay.h>
int main(void)
{
while(1)
{
DDRC |=((1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<5));
PORTC&=-((1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<5));
while(1)
{
PORTC|=((1<<0)|(1<<5));
_delay_ms (10000);
PORTC&=-(1<<5);
PORTC|=(1<<4);
_delay_ms(1000);
PORTC&=-(1<<4);
PORTC|=(1<<4);
_delay_ms(1000);
PORTC&=-(1<<4);
PORTC|=(1<<4);
_delay_ms(1000);
PORTC&=-((1<<4)|(1<<0));
PORTC|=((1<<2)|(1<<3));
_delay_ms(1000);
PORTC&=-(1<<2);
PORTC|=(1<<1);
_delay_ms(1000);
PORTC&=-(1<<1);
PORTC|=(1<<1);
_delay_ms(1000);
PORTC&=-(1<<1);
PORTC|=(1<<1);
_delay_ms(1000);
PORTC&=-((1<<1)(1<<3));
}
return 0;
}