Está en la página 1de 42

Un ATmega164 se usa clasificación de huevos.

Detecta el peso del huevo y lo envía por una de


3 bandas transportadoras correspondientes a huevos pequeños, medianos y grandes. Estas
bandas llevan los huevos a una máquina que los ubica en cubetas de 12 huevos. Hay un sensor
en cada banda conectado a las entradas de interrupción del micro da un pulso cuando pasa un
huevo. El micro va llevando la cuenta de esos valores y cuando la cuenta de uno de ellos llega a
12 envia una señal por un pin diferente para que la maquina cambie de cubeta. La memoria
SRAM del micro debe llevar la cuenta (en 16 bits cada cuenta). Del total de cubetas de cada una
de las clases de huevos. Usar interrupciones externas para los sensores. Escribir el programa en
forma modular y con comentarios

/*
* Clasificadora_de_huevos.asm
*
* Created: 13/10/2013 14:47:37
* Author: vivia_000
*/

.DEF TEMPO=R16
.DEF PEQUENOS=R17
.DEF MEDIANOS=R18
.DEF GRANDES=R19
.DEF CUBETA1=R20
.DEF CUBETA2=R21
.DEF CUBETA3=R22

.DSEG
PEQUENOS1: .BYTE 1
PEQUENOS2: .BYTE 1
MEDIANOS1: .BYTE 1
MEDIANOS2: .BYTE 1
GRANDES1: .BYTE 1
GRANDES2: .BYTE 1

.CSEG
.ORG 0X00
RJMP INICIO
.ORG 0X02
RJMP HUEVOS_PEQUENOS
.ORG 0X04
RJMP HUEVOS_MEDIANOS
.ORG 0X06
RJMP HUEVOS_GRANDES

INICIO:
LDI TEMPO,0B11111111
OUT DDRA,TEMPO
OUT DDRC,TEMPO
OUT PORTB,TEMPO
OUT PORTD,TEMPO
LDI TEMPO,0B00000000
OUT DDRB,TEMPO
OUT DDRD,TEMPO

IN TEMPO,MCUCR
ANDI TEMPO, 0B1110111
OUT MCUCR,TEMPO

LDI TEMPO,HIGH(RAMEND)
OUT SPH,TEMPO
LDI TEMPO,LOW(RAMEND)
OUT SPL,TEMPO

LDI TEMPO,0B00101010
STS EICRA,TEMPO
LDI TEMPO,0B00000111
OUT EIMSK,TEMPO
OUT EIFR,TEMPO
SEI

LAZO:

OUT PORTA,R24
OUT PORTC,R26
RJMP LAZO

HUEVOS_PEQUENOS:

PUSH R16
IN R16,SREG
PUSH R16
INC PEQUENOS
CPI PEQUENOS,12
BREQ CUBETA_PEQUENOS
POP R16
OUT SREG,R16
POP R16
RETI

CUBETA_PEQUENOS:
CLR PEQUENOS
ADIW R25:R24,1
STS PEQUENOS1,R24
STS PEQUENOS2,R25
POP R16
OUT SREG,R16
POP R16
RETI

HUEVOS_MEDIANOS:

PUSH R16
IN R16,SREG
PUSH R16
INC MEDIANOS
CPI MEDIANOS,12
BREQ CUBETA_MEDIANOS
POP R16
OUT SREG,R16
POP R16
RETI

CUBETA_MEDIANOS:
CLR MEDIANOS
ADIW R27:R26,1
STS MEDIANOS1,R26
STS MEDIANOS2,R27
POP R16
OUT SREG,R16
POP R16
RETI

HUEVOS_GRANDES:

PUSH R16
IN R16,SREG
PUSH R16
INC GRANDES
CPI GRANDES,12
BREQ CUBETA_GRANDES
POP R16
OUT SREG,R16
POP R16
RETI

CUBETA_GRANDES:
CLR GRANDES
ADIW R29:R28,1
STS GRANDES1,R28
STS GRANDES2,R29
POP R16
OUT SREG,R16
POP R16
RETI

Una maquina contadora de monedas en un banco tiene una clasificadora mecánica. Las
monedas ya clasificadas caen por uno de los 6 tubos disponibles, y que corresponden a: un dólar
(100 centavos), 50 centavos, 25 centavos, 10 centavos, 5 centavos y un centavo. Cada uno de
los tubos tiene un sensor que baja momentáneamente a 0L cuando pasa por allí una moneda.
Escribir un programa que lleve cuenta en binario 32 bits el monto total en centavos todas las
monedas que han pasado. Este valor se almacenara en 4 localidades consecutivas de la SRAM.
Usar interrupciones

/*
* Contador_de_monedas.asm
*
* Created: 12/10/2013 8:21:02
* Author: vivia_000
*/

.DEF TEMPO=R16
.DEF CONT1=R25
.DEF CONT2=R26
.DEF CONT3=R27
.DEF CONT4=R28
.DEF ANTE=R17
.DEF AUX=R18
.DEF AUX1=R19
.DEF NUMA=R20
.DEF NUMB=R21
.DEF DECENAS=R22
.DEF CENTENAS=R23
.DEF MILES=R24

.CSEG
.ORG 0X00
RJMP INICIO
.ORG 0X08
RJMP MONEDAS

INICIO:
LDI TEMPO,0B00000000
OUT DDRA,TEMPO
LDI TEMPO,0B11111111
OUT DDRC,TEMPO
OUT DDRB,TEMPO
OUT DDRD,TEMPO
LDI TEMPO,0B11111111
OUT PORTA,TEMPO

IN TEMPO,MCUCR
ANDI TEMPO,0B11101111
OUT MCUCR,TEMPO

LDI TEMPO,HIGH(RAMEND)
OUT SPH,TEMPO
LDI TEMPO,LOW(RAMEND)
OUT SPL,TEMPO

LDI TEMPO,0B00000001
STS PCICR,TEMPO
LDI TEMPO,0B00111111
STS PCMSK0,TEMPO
SEI

IN ANTE,PINA

LAZO:

OUT PORTB,CONT1
OUT PORTC,CONT2
OUT PORTD,CONT3
RJMP LAZO

MONEDAS:
PUSH R16
IN R16,SREG
PUSH R16
IN TEMPO,PINA
EOR TEMPO,ANTE
IN ANTE,PINA
SBRC TEMPO,0
RJMP CENTAVOS_100
SBRC TEMPO,1
RJMP CENTAVOS_50
SBRC TEMPO,2
RJMP CENTAVOS_25
SBRC TEMPO,3
RJMP CENTAVOS_10
SBRC TEMPO,4
RJMP CENTAVOS_5
SBRC TEMPO,5
RJMP CENTAVOS_1
RJMP RETORNO
CENTAVOS_100:
SBIC PINA,0
RJMP RETORNO
LDI AUX,100
ADD CONT1,AUX
CLR AUX
ADC CONT2,AUX
ADC CONT3,AUX
ADC CONT4,AUX
RJMP RETORNO

CENTAVOS_50:
SBIC PINA,1
RJMP RETORNO
LDI AUX,50
ADD CONT1,AUX
CLR AUX
ADC CONT2,AUX
ADC CONT3,AUX
ADC CONT4,AUX
RJMP RETORNO

CENTAVOS_25:
SBIC PINA,2
RJMP RETORNO
LDI AUX,25
ADD CONT1,AUX
CLR AUX
ADC CONT2,AUX
ADC CONT3,AUX
ADC CONT4,AUX
RJMP RETORNO

CENTAVOS_10:
SBIC PINA,3
RJMP RETORNO
LDI AUX,10
ADD CONT1,AUX
CLR AUX
ADC CONT2,AUX
ADC CONT3,AUX
ADC CONT4,AUX
RJMP RETORNO

CENTAVOS_5:
SBIC PINA,4
RJMP RETORNO
LDI AUX,5
ADD CONT1,AUX
CLR AUX
ADC CONT2,AUX
ADC CONT3,AUX
ADC CONT4,AUX
RJMP RETORNO

CENTAVOS_1:
SBIC PINA,5
RJMP RETORNO
LDI AUX,1
ADD CONT1,AUX
CLR AUX
ADC CONT2,AUX
ADC CONT3,AUX
ADC CONT4,AUX
RJMP RETORNO

RETORNO:
POP R16
OUT SREG,R16
POP R16
RETI

Para la junta de beneficencia de Guayaquil se necesita un display gigante de 6


digitos para mostrar los resultados de los sorteos. Realizar con el ATMega164p un
programa que realice el barrido de los 6 display de 7 segmentos. La electrónica
ya esta construida, y los dígitos se activan con un OL, y los segmentos se
encienden con 1L. la información para ser mostrada en 6 localidades consecutivas
de la SRAM.

/*
* Prueba_2__ejercicio1.asm
*
* Created: 07/10/2013 20:59:50
* Author: vivia_000
*/

.DEF TEMPO=R16
.DEF AUX=R17
.DEF CONT=R18

.DSEG

DIG0: .BYTE 1
DIG1: .BYTE 1
DIG2: .BYTE 1
DIG3: .BYTE 1
DIG4: .BYTE 1
DIG5: .BYTE 1
BCD0: .BYTE 1
BCD1: .BYTE 1
BCD2: .BYTE 1
BCD3: .BYTE 1
BCD4: .BYTE 1
BCD5: .BYTE 1

.CSEG

.ORG 0X0000

LDI TEMPO,0B00000000
OUT DDRA,TEMPO
OUT DDRB,TEMPO
LDI TEMPO,0B11111111
OUT DDRC,TEMPO
OUT PORTA,TEMPO
OUT PORTB,TEMPO
LDI TEMPO,0B11111111
OUT DDRD,TEMPO

; HABILITAR RESISTENAS INTERNAS

IN TEMPO,MCUCR
ANDI TEMPO,0B11101111
OUT MCUCR,TEMPO

; CARGAR VALORES EN LA SRAM

INICIO:
LDI TEMPO,4
STS DIG0,TEMPO
LDI TEMPO,3
STS DIG1,TEMPO
LDI TEMPO,9
STS DIG2,TEMPO
LDI TEMPO,0
STS DIG3,TEMPO
LDI TEMPO,1
STS DIG4,TEMPO
LDI TEMPO,6
STS DIG5,TEMPO
CALL BCD_7SEG
CALL BARRIDO
RJMP INICIO
; CONFIGURAR STACK POINTER

LDI TEMPO,HIGH(RAMEND)
OUT SPH,TEMPO
LDI TEMPO,LOW(RAMEND)
OUT SPL,TEMPO

BCD_7SEG:

PUSH R16
PUSH R17
PUSH ZL
PUSH ZH
PUSH XL
PUSH XH
PUSH YL
PUSH YH

LDI YH,HIGH(DIG0)
LDI YL,LOW(DIG0)
LDI XH,HIGH(BCD0)
LDI XL,LOW(BCD0)
LDI R17,6

BCD_7SEG1:

LDI ZH,HIGH(TABLA_7SEG<<1)
LDI ZL,LOW(TABLA_7SEG<<1)
LD R16,Y+
ADD ZL,R16
CLR R16
ADC ZH,R16
LPM R16,Z
ST X+,R16
DEC R17
BRNE BCD_7SEG1

POP YH
POP YL
POP XH
POP XL
POP ZH
POP ZL
POP R17
POP R16

RET

;BARRIDO

BARRIDO:

PUSH R16
PUSH R17
PUSH R18
PUSH XH
PUSH XL

LDI R16,6
LDI XH,HIGH(BCD0)
LDI XL,LOW(BCD0)
SEC
LDI R18,0B11111110
SER R17
OUT PORTC,R17

OTRO_DIG:

OUT PORTD,R18
LD R17,X+
OUT PORTC,R17
CALL RETARDO
SER R17
OUT PORTC,R17
ROL R18
DEC R16
BRNE OTRO_DIG

POP XL
POP XH
POP R18
POP R17
POP R16

RET

RETARDO:

PUSH R16
LDI R16,10

LAZO_RETARDO:

NOP
DEC R16
BRNE LAZO_RETARDO
POP R16
RET

TABLA_7SEG:
.db 0b1000000,0b1111001 ;0,1
.db 0b0100100,0b0110000 ;2,3
.db 0b0011001,0b0010010 ;4,5
.db 0b0000010,0b1111000 ;6,7
.db 0b0000000,0b0010000 ;8,9

Realizar con un ATMega 164p el barrido de un teclado de 3x4, por el método


alternativo (poner primero todas las filas en OL, leer las columnas y luego poner
las columnas en OL y leer las filas). El valor de la tecla presionad
(0,1,2,3,4,5,6,7,8,9,a,b) debe aparecer en un display de 7 segmentos, y se
mantendrá hasta que se presione una nueva tecla.
/*
* Prueba2_ejerccio2.asm
*
* Created: 13/10/2013 10:17:56
* Author: vivia_000
*/

.DEF TEMPO=R16
.DEF TECLA=R17
.DEF ANTE=R18
.DEF COLUMNA=R19
.DEF FILA=R20
.DEF AUX=R21
.DEF AUX1=R22
.DSEG
DIG0: .BYTE 1

.CSEG

.ORG 0X00

LDI TEMPO,0B00000000
OUT DDRB,TEMPO
OUT DDRD,TEMPO
LDI TEMPO,0B11111111
OUT PORTA,TEMPO
OUT PORTB,TEMPO
OUT PORTD,TEMPO
OUT DDRC,TEMPO

IN TEMPO,MCUCR
ANDI TEMPO,0B11101111
OUT MCUCR,TEMPO
INICIO:
LDI TECLA,16
LDI ANTE,16

BARRIDO:

BARRIDO_FILAS:

LDI TEMPO,0B00001111
OUT DDRA,TEMPO
LDI TEMPO,0B11110000
OUT PORTA,TEMPO
SBIS PINA,4
LDI COLUMNA,0
SBIS PINA,5
LDI COLUMNA,1
SBIS PINA,6
LDI COLUMNA,2
SBIS PINA,7
LDI COLUMNA,3

BARRIDO_COLUMNAS:

LDI TEMPO,0B11110000
OUT DDRA,TEMPO
LDI TEMPO,0B00001111
OUT PORTA,TEMPO
SBIS PINA,0
LDI FILA,0
SBIS PINA,1
LDI FILA,1
SBIS PINA,2
LDI FILA,2
SBIS PINA,3
LDI FILA,3

CALCULO:
LDI AUX1,4
MUL FILA,AUX1
MOV FILA,R0
ADD COLUMNA,FILA
MOV TECLA,COLUMNA
STS DIG0,TECLA

CP TECLA,ANTE
BREQ BARRIDO
MOV ANTE,TECLA
CPI TECLA,16
BREQ BARRIDO

DESPLIEGUE:
LDI ZH,HIGH(TABLA<<1)
LDI ZL,LOW(TABLA<<1)
ADD ZL,TECLA
CLR TECLA
ADC ZH,TECLA
LPM AUX,Z
OUT PORTC,AUX
CLR TECLA
RJMP INICIO

TABLA:

.DB 0b00111111,0b00000110
.DB 0b01011011,0b01001111
.DB 0b01100110,0b01101101
.DB 0b01011111,0b00000111
.DB 0b01111111,0b01100111
.DB 0b01110111,0b01111100
.DB 0b00111001,0b01011110
.DB 0b01111001,0b01110001
En un salón de juego de bolos se desea construir una maquina que determine
cuantos bolos (pines) han quedado en pie. El juego tiene diez bolos y luego de
lanzada la bola baja un dispositivo con un interruptor que se cierra si el bolo
quedo parado(enviando un 1La una entrada en un ATMega164p), o permanece abierto
enviando un 0L si esta caído. Escribir el programa que cuente cuantos bolos han
quedado de pie y lo muestre en un display de 7 segmentos si el numero es entre 0
y 9, o enciende un LED y presente el cero en el display si han quedado los diez
bolos de pie. Los diez interruptores están conectados de la siguiente manera:
ocho en el puertoA, y dos en los bits menos significativos del puerto B. El
display esta conectado en los 7 bits menos significativos del puertoC, y el LED
en el bit mas significativo del mismo puerto.

/*
* Automatizar__juego.asm
*
* Created: 14/10/2013 8:28:25
* Author: vivia_000
*/

.DEF TEMPO=R16
.DEF AUX=R17
.DEF CONT=R18

.ORG 0X0
RJMP INICIO
.ORG 0X08
RJMP JUEGO

INICIO:
LDI TEMPO,0B00000000
OUT DDRA,TEMPO
LDI TEMPO,0B11111111
OUT DDRB,TEMPO
OUT DDRD,TEMPO
OUT PORTA,TEMPO

IN TEMPO,MCUCR
ANDI TEMPO,0B11101111
OUT MCUCR,TEMPO

LDI TEMPO,HIGh(RAMEND)
OUT SPH,TEMPO
LDI TEMPO,LOW(RAMEND)
OUT SPL,TEMPO

LDI TEMPO,0B00000001
STS PCICR,TEMPO
LDI TEMPO,0B00000111
STS PCMSK0,TEMPO

LAZO:

CPI CONT,9
BREQ TABLA2
CPI CONT,10
BREQ TABLA3

TABLA1:

LDI ZH,HIGH(TABLA<<1)
LDI ZL,LOW(TABLA<<1)
ADD ZL,CONT
CLR AUX
ADC ZH,AUX
LPM AUX,Z
OUT PORTB,AUX
RJMP LAZO

TABLA2:

LDI AUX,0B11111111
OUT PORTB,AUX
LDI AUX,0B00000001
OUT PORTD,TEMPO
RJMP LAZO

TABLA3:
LDI AUX,0B11111111
OUT PORTB,AUX
LDI AUX,0B00000011
OUT PORTD,AUX
RJMP LAZO
JUEGO:
PUSH R16
IN R16,SREG
PUSH R16
SBIS PINA,0
RJMP FILA1
SBIS PINA,1
RJMP FILA2
SBIS PINA,2
RJMP FILA3
RJMP RETORNO

FILA1:
SBIS PINA,3
SUBI CONT,-0
SBIS PINA,4
SUBI CONT,-1
SBIS PINA,5
SUBI CONT,-0
RJMP RETORNO

FILA2:
SBIS PINA,3
SUBI CONT,-0
SBIS PINA,4
SUBI CONT,-1
SBIS PINA,5
SUBI CONT,-0
RJMP RETORNO

FILA3:
SBIS PINA,3
SUBI CONT,-0
SBIS PINA,4
SUBI CONT,-1
SBIS PINA,5
SUBI CONT,-0
RJMP RETORNO

RETORNO:
POP R16
OUT SREG,R16
POP R16
RETI

TABLA:
.DB 0B00000000,0B00000001
.DB 0B00000011,0B00000111
.DB 0B00001111,0B00011111
.DB 0B00111111,0B01111111
.DB 0B11111111

LETRERO LUMINOSO

.DEF TEMPO=R16

.DEF AUX=R17

.DEF CONT1=R18

.DEF CONT2=R19

.DEF CONT3=R20

.CSEG

.ORG 0X00

LDI TEMPO,0B11111111

OUT DDRC,TEMPO

LDI TEMPO,0B00000000

OUT DDRD,TEMPO

LDI TEMPO,0B11111111

OUT PORTD,TEMPO

IN TEMPO,MCUCR

ANDI TEMPO,0B11101111

OUT MCUCR,TEMPO

LDI TEMPO,HIGH(RAMEND)

OUT SPH,TEMPO
LDI TEMPO,LOW(RAMEND)

OUT SPL,TEMPO

INICIO:

SBIS PIND,0

RJMP COMPROBAR

RJMP COMPROBAR1

COMPROBAR:

SBIC PIND,1

RJMP FLECHA_DERECHA

RJMP APAGADO

COMPROBAR1:

SBIC PIND,1

RJMP PRENDE_APAGA

RJMP FLECHA_IZQUIERDA

APAGADO:

CLR TEMPO

OUT PORTC,TEMPO

RJMP INICIO

FLECHA_DERECHA:

LDI TEMPO,0B10111110

OUT PORTC,TEMPO

CALL RETARDO

CLR TEMPO

OUT PORTC,TEMPO

CALL RETARDO

RJMP INICIO
FLECHA_IZQUIERDA:

LDI TEMPO,0B01111101

OUT PORTC,TEMPO

CALL RETARDO

CLR TEMPO

OUT PORTC,TEMPO

CALL RETARDO

RJMP INICIO

PRENDE_APAGA:

SER TEMPO

OUT PORTC,TEMPO

CALL RETARDO

CLR TEMPO

OUT PORTC,TEMPO

CALL RETARDO

RJMP INICIO

RETARDO:

PUSH R16

LDI CONT1,2

LAZO1:

LDI CONT2,255

LAZO2:

LDI CONT3,255

LAZO3:

NOP

DEC CONT3

BRNE LAZO3

DEC CONT2
BRNE LAZO2

DEC CONT1

BRNE LAZO1

POP R16

RET

MEDIDOR DE FRECUENCIA

MEDIDOR DE FRECUENCIA

.include "m164pdef.inc"

.def tempo=r16

.def frec=r17

.def aux=r18

.dseg

unidad: .byte 1

decena: .byte 1

.cseg

.org 0x0

rjmp inicio

.org 0x2

rjmp capturar

.org 0x1a

rjmp segundo

inicio:

ldi tempo,low(ramend)

out spl,tempo

ldi tempo,high(ramend)

out sph,tempo

clr tempo

out ddrd,tempo

ser tempo
out ddra,tempo

out ddrc,tempo

out ddrb,tempo

ldi tempo,0b00000010

sts eicra,tempo

ldi tempo,0b00000001

out eimsk,tempo

ldi tempo,0b00000000

sts tccr1a,tempo

ldi tempo,0b00001100

sts tccr1b,tempo

ldi tempo,high(31249)

sts ocr1ah,tempo

ldi tempo,low(31259)

sts ocr1al,tempo

ldi tempo,0b00000010

sts timsk1,tempo

ldi tempo,0b01000010

out tccr0a,tempo

ldi tempo,0b00000100

out tccr0b,tempo

ldi tempo,1

out ocr0a,tempo

sei

lazo:

rjmp lazo

capturar:

push r16

in r16,sreg

push r16

inc frec
pop r16

out sreg,r16

pop r16

reti

segundo:

push r16

in r16,sreg

push r16

subi frec,10

out ocr0a,frec

ldi zl,low(tabla_equivalente<<1)

ldi zh,high(tabla_equivalente<<1)

add zl,frec

clr frec

adc zh,frec

lpm aux,z

clr tempo

decenas:

subi aux,10

brcs seguir1

inc tempo

rjmp decenas

seguir1:

sts decena,tempo

clr tempo

subi aux,-10

unidades:

subi aux,1

brcs seguir2

inc tempo

rjmp unidades
seguir2:

sts unidad,tempo

ldi zl,low(tabla<<1)

ldi zh,high(tabla<<1)

lds tempo,unidad

add zl,tempo

clr tempo

adc zh,tempo

lpm tempo,z

out portc,tempo

ldi zl,low(tabla<<1)

ldi zh,high(tabla<<1)

lds tempo,decena

add zl,tempo

clr tempo

adc zh,tempo

lpm tempo,z

out porta,tempo

clr frec

clr aux

pop r16

out sreg,r16

pop r16

reti

tabla:

.db 0b00111111, 0b00000110

.db 0b01011011, 0b01001111

.db 0b01100110, 0b01101101

.db 0b01111101, 0b00000111

.db 0b01111111, 0b01101111

tabla_equivalente:
.db 0,5;0,1

.db 10,15;2,3

.db 20,25;4,5

.db 30,35;6,7

.db 40,45;8,9

.db 50,55;10,11

.db 60,65;12,13

.db 70,75;14,15

.db 80,85;16,17

.db 90,95;18,19

.db 100,100

VOLTIMETRO

VOLTIMETRO

.include "m164pdef.inc"

.dseg

; Lugar donde se van a guardar los 4 dígitos

entero: .byte 1

decimal1: .byte 1

decimal2: .byte 1

decimal3: .byte 1

.cseg

.def tempo=r16

.def resh=r17

.def resl=r18

.def ls=r19

.def ms=r20

.def cinco=r22

.def diez=r23

.org 0x0
;Constante 5 de referencia de voltaje de 5 voltios

ldi cinco,5

;Constante 10 para poder hacer divisiones con decimales con restas sucesivas

ldi diez,10

;Entrada CAD

ldi tempo,0b00000001

out ddra, tempo

;Salidas BARRIDO

ldi tempo,0b11111111

out ddrb,tempo

out ddrd,tempo

out ddrc,tempo

;Habilito converso ADC0

ldi tempo,0b00000001

sts didr0,tempo

;Adlar en cero ajuste a la derecha

ldi tempo,0b01000000

sts admux,tempo

espera1:

;Espera si es que ya se hizo la conversión

lds tempo,adcsra

sbrc tempo,adsc

rjmp espera1

otro:

;Puede realizar siguiente conversión Habilito referencia AVCC

ldi tempo,0b11000110

sts adcsra,tempo

espera2:

;Reliza nueva conversion y sigue con el programa

lds tempo,adcsra

sbrc tempo,adsc
rjmp espera2

;Almaceno datos mas y menos significativos de conversión

lds resl,adcl

lds resh,adch

;Multiplico por cinco por la referencia de voltaje

mul resl,cinco

;Almaceno bits mas y menos significativos resultado de la multiplicación por 5

mov ls,r0

mov ms,r1

mul resh,cinco

add ms,r0

clr tempo

cont_unidades:

;Con restas sucesivas voy a dividir el resultado de la multiplicación para 1023

subi ls,low(1023)

sbci ms,high(1023)

brcs salir

;Tempo valor del cociente

inc tempo

rjmp cont_unidades

salir:

;Almaceno en la RAM el valor del cociente

ldi zl,low(tabla<<1)

ldi zh, high(tabla<<1)

add zl,tempo

clr tempo

add zh,tempo

lpm tempo,z

sts entero,tempo

clr tempo

cont_decimal1:
;Con restas sucesivas calcular el valor del primer decimal

subi ls,low(-1023)

sbci ms,high(-1023)

call mult10

clr tempo

cantidad_decimal1:

;Se encuentra el valor del primer decimal

subi ls,low(1023)

sbci ms,high(1023)

brcs salir1

inc tempo

rjmp cantidad_decimal1

salir1:

;Almaceno en la RAM el valor del primer decimal

ldi zl,low(tabla<<1)

ldi zh, high(tabla<<1)

add zl,tempo

clr tempo

add zh,tempo

lpm tempo,z

sts decimal1,tempo

clr tempo

cont_decimal2:

;Con restas sucesivas calcular el valor del segundo decimal

subi ls,low(-1023)

sbci ms,high(-1023)

call mult10

clr tempo

cantidad_decimal2:

;Se encuentra el valor del segundo decimal

subi ls,low(1023)
sbci ms,high(1023)

brcs salir2

inc tempo

rjmp cantidad_decimal2

salir2:

;Almaceno en la RAM el valor del segundo decimal

ldi zl,low(tabla<<1)

ldi zh, high(tabla<<1)

add zl,tempo

clr tempo

add zh,tempo

lpm tempo,z

sts decimal2,tempo

clr tempo

cont_decimal3:

;Con restas sucesivas calcular el valor del tercer decimal

subi ls,low(-1023)

sbci ms,high(-1023)

call mult10

clr tempo

cantidad_decimal3:

;Se encuentra el valor del segundo decimal

subi ls,low(1023)

sbci ms,high(1023)

brcs salir3

inc tempo

rjmp cantidad_decimal3

salir3:

;Almaceno en la RAM el valor del tercer decimal

ldi zl,low(tabla<<1)

ldi zh, high(tabla<<1)


add zl,tempo

clr tempo

add zh,tempo

lpm tempo,z

sts decimal3,tempo

clr tempo

;Llamo a barrido de displays

call barrido

rjmp otro

;Tabla de equivalencia de 7segmentos cátodo común

tabla:

.db 0b00111111,0b00000110 ;0,1

.db 0b01011011,0b01001111 ;2,3

.db 0b01100110,0b01101101 ;4,5

.db 0b01111101,0b00000111 ;6,7

.db 0b01111111,0b01101111 ;8,9

;Rutina Que llama al barrido

barrido:

;Muestro Digito Entero

lds tempo,entero

ori tempo,0b10000000

out portb,tempo

ldi tempo,0b11110111

out portd,tempo

call retardo

ldi tempo,0b11111111

out portd,tempo

;Muestro Decimal1

lds tempo,decimal1

out portb,tempo

ldi tempo,0b11111011
out portd,tempo

call retardo

ldi tempo,0b11111111

out portd,tempo

;Muestro Decimal2

lds tempo,decimal2

out portb,tempo

ldi tempo,0b11111101

out portd,tempo

call retardo

ldi tempo,0b11111111

out portd,tempo

;Muestro Decimal3

lds tempo,decimal3

out portb,tempo

ldi tempo,0b11111110

out portd,tempo

call retardo

ldi tempo,0b11111111

out portd,tempo

ret

;Esta rutina sirve para multiplicar por 10 un numero de 16 bits, la misma que
será utilizada para encontrar valor de decimales

mult10:

mul ls,diez

mov r2,r0

mov r3,r1

mul ms,diez

add r3,r0

mov ls,r2

mov ms,r3
ret

;Retardo para el barrido

retardo:

push r16

in r16,sreg

push r16

ldi tempo,255

lazo_retardo:

dec tempo

breq salir_retardo

rjmp lazo_retardo

salir_retardo:

pop r16

out sreg,r16

pop r16

ret

RETARDO 5S
RETARDO5 SEGUNDOS

.include "m164pdef.inc"

.def tempo1=r16

.def tempo2=r17

.def tempo3=r18

.def aux=r19

.def tempo=r20

.def conta=r21

ldi tempo,0b11111111

out ddra,tempo

clr tempo

lazo0: ldi tempo1,215

lazo1: ldi tempo2,30


lazo2: ldi tempo3,255

lazo3: dec tempo3

brne lazo3

dec tempo2

brne lazo2

dec tempo1

brne lazo1

in tempo,pina

com tempo

out porta,tempo

rjmp lazo0

VOLTIMETRO 7 LEDS

voltimetro7 led

.include "m164pdef.inc"

.def tempo=r16

.def resh=r17

.def resl=r18

.def tempo1=r19

.def tempo2=r20

.def cont=r21

.def ls=r23

.def ms=r24

.dseg

mil: .byte 1

cien: .byte 1

decen: .byte 1

unid: .byte 1

digmil: .byte 1
digcien:.byte 1

digdec: .byte 1

diguni: .byte 1

.cseg

ldi tempo,0b11111111

out ddra, tempo

out ddrc,tempo

ldi tempo,0b11111111

out ddrb,tempo

out ddrd,tempo

ldi tempo,low(ramend)

out spl,tempo

ldi tempo,high(ramend)

out sph,tempo

ldi tempo,0b00000001

sts didr0,tempo

ldi tempo,0b01100000

sts admux,tempo

espera1:

lds tempo,adcsra

sbrc tempo,adsc

rjmp espera1

otro:

ldi tempo,0b11000110

sts adcsra,tempo

espera2:

lds tempo,adcsra

sbrc tempo,adsc

rjmp espera2

lds resl,adcl

lds resh,adch
ldi tempo1,20

mul resh,tempo1

call bin_bcd_mul

call bcd_dig_mult

call barrido_mult

lds tempo,digdec

out portc,tempo

rjmp otro

bin_bcd_mul:

mov ls,r0

mov ms,r1

clr tempo

cont_miles:

subi ls,low(1000)

sbci ms,high(1000)

brcs cont_mil1

inc tempo

rjmp cont_miles

cont_mil1:

sts mil,tempo

clr tempo

subi ls,low(-1000)

sbci ms,high(-1000)

cont_cien:

subi ls,low(100)

sbci ms,high(100)

brcs cont_cien1

inc tempo

rjmp cont_cien

cont_cien1:

sts cien,tempo
clr tempo

subi ls,low(-100)

sbci ms,high(-100)

cont_dec:

subi ls,low(10)

sbci ms,high(10)

brcs con_dec1

inc tempo

rjmp cont_dec

con_dec1:

sts decen,tempo

clr tempo

subi ls,low(-10)

mov tempo,ls

sts unid,tempo

clr tempo

ret

bcd_dig_mult:

push zh

push zl

push xh

push xl

push yh

push yl

push tempo

push cont

ldi xl,low(mil)

ldi xh,high(mil)

ldi yl,low(digmil)

ldi yh,high(digmil)

ldi cont,4
bcd_dig_mult0:

ldi zl,low(tabla<<1)

ldi zh,high(tabla<<1)

ld tempo,x+

add zl,tempo

clr tempo

adc zh,tempo

lpm tempo,z

st y+,tempo

dec cont

brne bcd_dig_mult0

pop cont

pop tempo

pop yl

pop yh

pop xl

pop xh

pop zl

pop zh

ret

barrido_mult:

lds tempo,diguni

out portb,tempo

ldi tempo,0b11111110

out portd,tempo

call retardo

ldi tempo,0b11111111

out portd,tempo

lds tempo,digdec

out portb,tempo

ldi tempo,0b11111101
out portd,tempo

call retardo

ldi tempo,0b11111111

out portd,tempo

lds tempo,digcien

out portb,tempo

ldi tempo,0b11111011

out portd,tempo

call retardo

ldi tempo,0b11111111

out portd,tempo

lds tempo,digmil

ori tempo,0b10000000

out portb,tempo

ldi tempo,0b11110111

out portd,tempo

call retardo

ldi tempo,0b11111111

out portd,tempo

ret

retardo:

ldi tempo,255

lazo_retardo:dec tempo

breq salir_retardo

rjmp lazo_retardo

salir_retardo:ret

tabla:

.db 0b00111111,0b00000110 ;0,1

.db 0b01011011,0b01001111 ;2,3

.db 0b01100110,0b01101101 ;4,5

.db 0b01111101,0b00000111 ;6,7


.db 0b01111111,0b01101111 ;8,9

HOLA

.include "m164pdef.inc"

.def conta1=r16

.def conta2=r17

.def conta3=r18

.def conta4=r19

.def tempo=r20

.def ante=r21

.def aux=r22

.dseg

numero1: .byte 1

numero2: .byte 1

numero3: .byte 1

numero4: .byte 1

.cseg

.org 0x0

jmp inicio

;Apunto al puerto b interrupciones con cambio de estado para jugadores


.org 0xA

jmp jugadores

inicio:

;HABILITACION DEL STACK

ldi tempo,low(ramend)

out spl,tempo

ldi tempo,high(ramend)

out sph,tempo

;SALIDAS DE DISPLAYS

ldi tempo,0b11111111

out ddra,tempo

out ddrc,tempo

out ddrd,tempo

;HABILITACION DE INTERRUPCION POR CAMBIO DE ESTADO AL PUERTO B

ldi tempo,0b00000010

sts pcicr,tempo

ldi tempo,0b00001111

sts pcmsk1,tempo

;HABILITACION GLOBAL DE INTERRUPCIONES

sei
clr conta1

clr conta2

clr conta3

clr conta4

;LEER ESTADO ANTERIOR PARA COMPARACION

in ante,pinb

programa:

out portd,conta1

call bcd_7seg

call barrido

rjmp programa

jugadores:

push r16

in r16,sreg

push r16

in tempo,pinb

eor tempo,ante

in ante,pinb

sbrc tempo,0

call jugador1

sbrc tempo,1

call jugador2
sbrc tempo,2

call jugador3

sbrc tempo,3

call jugador4

pop r16

out sreg,r16

pop r16

reti

jugador1:

sbrc ante,0

ret

inc conta1

ret

jugador2:

sbrc ante,1

ret

inc conta2

ret

jugador3:
sbrc ante,2

ret

inc conta3

ret

jugador4:

sbrc ante,3

ret

inc conta4

ret

barrido:

lds tempo,numero1;A

out portc,tempo

ldi tempo,0b11111110

out porta,tempo

call retardo

ldi tempo,0b11111111

out porta,tempo

lds tempo,numero2;L

out portc,tempo
ldi tempo,0b11111101

out porta,tempo

call retardo

ldi tempo,0b11111111

out porta,tempo

lds tempo,numero3;O

out portc,tempo

ldi tempo,0b11111011

out porta,tempo

call retardo

ldi tempo,0b11111111

out porta,tempo

lds tempo,numero4;H

out portc,tempo

ldi tempo,0b11110111

out porta,tempo

call retardo

ldi tempo,0b11111111

out porta,tempo

ret

retardo:

push r16

ldi r16,255

retardo_1:
dec r16

brne retardo_1

pop r16

ret

bcd_7seg:

push xl

push xh

push yl

push yh

push zl

push zh

push conta1

push conta2

push conta3

push conta4

push tempo

ldi xl,low(numero1)

ldi xh,high(numero1)

ldi zl,low(tabla<<1)

ldi zh,high(tabla<<1)

mov tempo,conta1

add zl,tempo

lpm tempo,z
st x+,tempo

mov tempo,conta2

add zl,tempo

lpm tempo,z

st x+,tempo

mov tempo,conta3

add zl,tempo

lpm tempo,z

st x+,tempo

mov tempo,conta4

add zl,tempo

lpm tempo,z

st x+,tempo

pop tempo

pop conta4

pop conta3

pop conta2

pop conta1

pop zh

pop zl

pop yh

pop yl

pop xh

pop xl

ret
tabla:

.db 0b00111111,0b00000110

.db 0b01011011,0b01001111

VENTANILLAS DEL BANCO

También podría gustarte