Sunteți pe pagina 1din 10

OBJETIVO Familiarizar al estudiante con el uso de los programas BASCOM-AVR e Isis Profesional TRABAJO PREPARATORIO 1.

- Realizar diagrama circuital completo, el diagrama de flujo y el programa de control utilizando lenguaje ensamblador, para el microcontrolador Atmega164, y un programa en lenguaje Basic, que realice las siguientes actividades: Leer 8 sw colocados en el PORTC Escribir la lectura de los sw en 8 leds colocados en el PORTB y en tres displays de 7 segmentos colocados en el PUERTO D. En los displays se debe mostrar en decimal o hexadecimal, el cambio de formato se realiza con un pulsador.

SOFTWARE Assembler
.INCLUDE "m164pdef.inc" ;==============DEFINO VARIABLES================== .DEF .DEF .DEF .DEF .DEF .DEF .DEF .DEF AUX PULSA =R17 TEMP =R18 DATO =R19 CENTENAS DECENAS UNIDAD CONTROL =R16

=R20 =R21 =R22 =R23

;==============DEFINO PUNTOS DE SALTO============ .ORG .ORG 0X0000 RJMP 0X0004 RJMP PULSADOR INICIO

;==============INICIALIZO VARIABLES=============== INICIO: CLR CLR CLR CLR PULSA TEMP DATO CONTROL

;==============DEFINO PUERTOS E/S================= CLR OUT SER OUT OUT LDI OUT AUX DDRC,AUX AUX DDRB,AUX DDRA,AUX AUX,0b11110111 DDRD,AUX

LDI OUT LDI OUT

AUX,0b00001000 PORTD,AUX CONTROL,0b11111000 PORTA,CONTROL

;==============INICIALIZO STACK POINTER============ LDI OUT LDI OUT AUX,HIGH(RAMEND) SPH,AUX AUX,LOW(RAMEND) SPL,AUX

;==============CONFIGURO INTERRUPCIONES============ LDI AUX,0b00101010 STS EICRA, AUX LDI AUX,0b00000010 OUT EIMSK,AUX SEI ;==============PROGRAMA PRINCIPAL============ MAIN: IN OUT CPI BRNE CALL CALL CALL CALL RJMP Most_disp: MOV CALL CALL CALL CALL RJMP DATO,PINC PORTB,DATO PULSA,0 Most_disp BIN_HEX Most_CENT Most_DECE Most_UNI MAIN TEMP,DATO BIN_BCD Most_CENT Most_DECE Most_UNI MAIN

;Habilito INT0,INT1 e INT2

;==========SUBRUTINAS DE INTERRUPCION========= PULSADOR: IN PUSH COM POP OUT RETI AUX,SREG AUX PULSA AUX SREG,AUX

;==========SUBRUTINAS DE CONVERTIR HEXADECIMAL========= BIN_HEX: CLR CLR CLR MOV ANDI MOV ANDI SWAP RET CENTENAS DECENAS UNIDAD UNIDAD,DATO UNIDAD,0b00001111 DECENAS,DATO DECENAS,0b11110000 DECENAS

;======================== Subrutina Mostrar Display ============================== Most_CENT: MOV CALL SBR OUT CALL CBR OUT CALL RET Most_DECE: MOV CALL SBR OUT CALL CBR OUT CALL RET Most_UNI: MOV CALL SBR OUT CALL CBR OUT CALL RET TEMP,UNIDAD MOSTRAR_BCD CONTROL,0b00000100 PORTA,CONTROL retardo CONTROL,0b00000100 PORTA,CONTROL retardo TEMP,DECENAS MOSTRAR_BCD CONTROL,0b00000010 PORTA,CONTROL retardo CONTROL,0b00000010 PORTA,CONTROL retardo TEMP,CENTENAS MOSTRAR_BCD CONTROL,0b00000001 PORTA,CONTROL retardo CONTROL,0b00000001 PORTA,CONTROL retardo

;======================== Subrutina Binario a BCD ============================== BIN_BCD: CLR CLR CLR CENT: CPI BRSH RJMP MAYOR_A_100: SUBI DECE: BRSH MAYOR_A_10: SUBI UNID: MOV RET UNIDAD,TEMP INC TEMP,10 RJMP DECE DECENAS CPI MAYOR_A_10 RJMP UNID TEMP,10 INC TEMP,100 RJMP CENT CENTENAS TEMP,100 MAYOR_A_100 DECE CENTENAS DECENAS UNIDAD

;======================== Subrutina de Retardo ==============================

retardo: retardo1: repetir:

ldi ldi dec brne dec brne ret

r28,20 r29,100 r29 repetir r28 retardo1

;==================== ===========Mostrar a BCD =============================== MOSTRAR_BCD: LDI LDI ADD CLR ADC LPM OUT RET TEMP,Z PORTD,TEMP TEMP ZH,TEMP ZH,HIGH(TABLA<<1) ZL,LOW(TABLA<<1) ZL,TEMP

;==========TABLA PARA DISPLAY CATODO COMUN========= ; -GFEDCBA TABLA: .DB .DB .DB .DB .DB .DB .DB .DB 0b10001000,0b11111001 0b01001100,0b01101000 0b00111001,0b00101010 0b00001010,0b11111000 0b00001000,0b00101000 0b00011000,0b00001011 0b10001110,0b01001001 0b00001110,0b00011110

Basic $regfile = "m164pdef.dat" $crystal = 8000000

' declaracin de entradas y salidas Config Portc = Input Config Porta = Output Porta = &B00000000 Config Portb = Output Config Portd = Output Config Portd.3 = Input 'declaracin de variables Dim Cont As Byte Dim Centena As Byte

Dim Decena As Byte Dim Unidad As Byte Dim Residuo As Byte Dim Limite As Byte Dim Aux As Byte Cont = 0 Centena = 0 Decena = 0 Unidad = 0 Residuo = 0 Aux = 0 'configuraciones Config Int1 = Rising On Int1 Pulsante0 Enable Int1 Enable Interrupts

' Programa principal Main: Limite = Pinc Portb = Limite If Aux = 0 Then Goto Salir Centena = 0 Unidad = Limite And &B00001111 Decena = Limite And &B11110000 Swap Decena Centena = Lookup(centena , Tabla) Decena = Lookup(decena , Tabla) Unidad = Lookup(unidad , Tabla) Porta = &B00000001 Portd = Centena Waitus 500 Porta = &B00000000 Waitus 500 Porta = &B00000010 Portd = Decena Waitus 500 Porta = &B00000000 Waitus 500 Porta = &B00000100 Portd = Unidad Waitus 500 Porta = &B00000000 Waitus 500 Goto Main Salir: Centena = Limite / 100

Residuo = Limite Mod 100 Decena = Residuo / 10 Unidad = Residuo Mod 10 Centena = Lookup(centena , Tabla) Decena = Lookup(decena , Tabla) Unidad = Lookup(unidad , Tabla) Porta = &B00000001 Portd = Centena Waitus 500 Porta = &B00000000 Waitus 500 Porta = &B00000010 Portd = Decena Waitus 500 Porta = &B00000000 Waitus 500 Porta = &B00000100 Portd = Unidad Waitus 500 Porta = &B00000000 Waitus 500 Goto Main

Pulsante0: Aux = Not Aux Return

Tabla: Data &H88 , &HF9 , &H4C , &H68 , &H39 , &H2A , &H0A , &HF8 , &H08 , &H28 , &H18 , &H0B , &H8E , &H49 , &H0E , &H1E HARDWARE:

Diagrama de Flujo:

INICIO

Inicializo Variables Defino Puntos de Salto Configuro Interrupciones

MAIN

Config_entrada

NO PULSA = 0 =30 SI Defino Puerto B como Salida Retardo

Encienddo los Leds Apago los Display

Most_led

MAIN

Defino Puerto B como Salida BIN_BCD

RETARDO
Apago los Leds Enciendo los Display

Most_Cent Most_Dece Most_Uni

MAIN

MOST_LED

PORTB(DATO) QUITAR LE PONER LE RET

MOST_CENT

MOSTRAR_BCD PORTB(DATO) QUITAR LE PONER LE RET MOSTRAR_BCD

LDI

Z + temp LPM

Out PORTB,Z

RET

BIN_BCD

In R18,PinA In R19,PinB R18 + R19

SI Carry = 1 NO

Mov c, R18 R18 x 0F c x F0 Swap c (Intercambio los nibbles)

BIN1

Z + R18 LPM Out PortD, R18

Z+c LPM Out PortC, c

RET

S-ar putea să vă placă și