Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
sts ddr0,tempo
;activo timer2
ldi tempo,31
sts ocrra,tempo
ldi
tempo,0b00000001;modoctc,normal
sts tccrra,tempo
ldi tempo, 0b00000111;1:1024
sts tccrrb,tempo
ldi tempo,0b01100000;asincronico
sts assr,tempo
ldi
tempo,0b00000010;interrupciom
sts timsk2,tempo
sei
programa:
rjmp programa
segundo:
push r16
in r16,sreg
push r16
EJEMPLO 2
/*
* Contador_de_monedas.asm
*
* Created: 12/10/2013 8:21:02
* Author: vivia_000
*/
.DEF
.DEF
.DEF
.DEF
.DEF
.DEF
.DEF
.DEF
.DEF
.DEF
.DEF
.DEF
.DEF
TEMPO=R16
CONT1=R25
CONT2=R26
CONT3=R27
CONT4=R28
ANTE=R17
AUX=R18
AUX1=R19
NUMA=R20
NUMB=R21
DECENAS=R22
CENTENAS=R23
MILES=R24
.CSEG
.ORG
RJMP
0X00
INICIO
.ORG
RJMP
0X08
MONEDAS
INICIO:
LDI
OUT
LDI
OUT
OUT
OUT
LDI
OUT
TEMPO,0B00000000
DDRA,TEMPO
TEMPO,0B11111111
DDRC,TEMPO
DDRB,TEMPO
DDRD,TEMPO
TEMPO,0B11111111
PORTA,TEMPO
IN
ANDI
OUT
TEMPO,MCUCR
TEMPO,0B11101111
MCUCR,TEMPO
LDI
OUT
LDI
TEMPO,HIGH(RAMEND)
SPH,TEMPO
TEMPO,LOW(RAMEND)
OUT
SPL,TEMPO
LDI
STS
LDI
STS
SEI
TEMPO,0B00000001
PCICR,TEMPO
TEMPO,0B00111111
PCMSK0,TEMPO
IN
ANTE,PINA
LAZO:
OUT
OUT
OUT
RJMP
MONEDAS:
PUSH
IN
PUSH
IN
EOR
IN
SBRC
RJMP
SBRC
RJMP
SBRC
RJMP
SBRC
RJMP
SBRC
RJMP
SBRC
RJMP
RJMP
PORTB,CONT1
PORTC,CONT2
PORTD,CONT3
LAZO
R16
R16
R16,SREG
TEMPO,PINA
TEMPO,ANTE
ANTE,PINA
TEMPO,0
CENTAVOS_100
TEMPO,1
CENTAVOS_50
TEMPO,2
CENTAVOS_25
TEMPO,3
CENTAVOS_10
TEMPO,4
CENTAVOS_5
TEMPO,5
CENTAVOS_1
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
EJEMPLO 3
LDI
ADD
CLR
ADC
ADC
ADC
RJMP
AUX,50
CONT1,AUX
AUX
CONT2,AUX
CONT3,AUX
CONT4,AUX
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
RJMP
LDI
ADD
CLR
ADC
ADC
ADC
RJMP
PINA,4
RETORNO
AUX,5
CONT1,AUX
AUX
CONT2,AUX
CONT3,AUX
CONT4,AUX
RETORNO
CENTAVOS_1:
SBIC
RJMP
LDI
ADD
CLR
ADC
ADC
ADC
RJMP
PINA,5
RETORNO
AUX,1
CONT1,AUX
AUX
CONT2,AUX
CONT3,AUX
CONT4,AUX
RETORNO
RETORNO:
POP
OUT
POP
R16
SREG,R16
R16 ; RETI
/*
* Sensores_Impresora.asm
*
* Created: 13/10/2013 18:12:04
* Author: vivia_000
*/
.DEF
.DEF
.DEF
.DEF
TEMPO=R16
ANTE=R17
CONT=R18
AUX=R19
.ORG
RJMP
.ORG
RJMP
0X0
INICIO
0XC
SENSORES
INICIO:
LDI
TEMPO,0B00000000
OUT DDRB,TEMPO
OUT DDRC,TEMPO
OUT DDRD,TEMPO
LDI
TEMPO,0B00000011
OUT DDRA,TEMPO
LDI
TEMPO,0B11111111
OUT PORTB,TEMPO
OUT PORTD,TEMPO
LDI
OUT
LDI
OUT
TEMPO,HIGH(RAMEND)
SPH,TEMPO
TEMPO,LOW(RAMEND)
SPL,TEMPO
LDI
STS
LDI
STS
TEMPO,0B00000100
PCICR,TEMPO
TEMPO,0B00001111
PCMSK2,TEMPO
IN
SEI
ANTE,PINC
LAZO:
OUT PORTA,AUX
RJMP LAZO
SENSORES:
PUSH R16
IN
R16,SREG
PUSH R16
IN
ANTE,PINC
CPI
ANTE,0B00000001
BREQ VERIFICAR1
CPI
ANTE,0B00000011
BREQ VERIFICAR2
CPI
ANTE,0B00000111
BREQ VERIFICAR3
CPI
ANTE,0B00001110
BREQ VERIFICAR4
CPI
BREQ
CPI
BREQ
CPI
BREQ
RJMP
ANTE,0B00001100
VERIFICAR5
ANTE,0B00001000
VERIFICAR6
ANTE,0B00000000
VERIFICAR7
ERROR
VERIFICAR1:
INC
CONT
CPI
CONT,1
BRNE ERROR
BREQ CORRECTO
VERIFICAR2:
INC
CONT
CPI
CONT,2
BRNE ERROR
BREQ CORRECTO
VERIFICAR3:
INC
CONT
CPI
CONT,3
BRNE ERROR
BREQ CORRECTO
VERIFICAR4:
INC
CONT
CPI
CONT,4
BRNE ERROR
BREQ CORRECTO
VERIFICAR5:
INC
CONT
CPI
CONT,5
BRNE ERROR
BREQ CORRECTO
VERIFICAR6:
INC
CONT
CPI
CONT,6
BRNE ERROR
BREQ CORRECTO
VERIFICAR7:
INC
CONT
CPI
CONT,7
BRNE ERROR
BREQ CORRECTO1
CORRECTO:
LDI
AUX,0B00000010
RJMP RETORNO
ERROR:
LDI
TEMPO,0B00000000
STS
PCMSK2,TEMPO
LDI
AUX,0B00000001
RJMP RETORNO
CORRECTO1:
CLR CONT
LDI
AUX,0B00000010
RJMP RETORNO
RETORNO:
POP R16
OUT SREG,R16
POP R16
RETI
EJEMPLO 4
/*
* Automatizar__juego.asm
*
* Created: 14/10/2013 8:28:25
* Author: vivia_000
*/
.DEF
.DEF
.DEF
TEMPO=R16
AUX=R17
CONT=R18
.ORG
RJMP
.ORG
RJMP
0X0
INICIO
0X08
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
OUT
LDI
OUT
TEMPO,HIGh(RAMEND)
SPH,TEMPO
TEMPO,LOW(RAMEND)
SPL,TEMPO
LDI
STS
LDI
STS
TEMPO,0B00000001
PCICR,TEMPO
TEMPO,0B00000111
PCMSK0,TEMPO
LAZO:
CPI
BREQ
CPI
BREQ
CONT,9
TABLA2
CONT,10
TABLA3
TABLA1:
LDI
ZH,HIGH(TABLA<<1)
LDI
ADD
CLR
ADC
LPM
OUT
RJMP
ZL,LOW(TABLA<<1)
ZL,CONT
AUX
ZH,AUX
AUX,Z
PORTB,AUX
LAZO
TABLA2:
LDI
OUT
LDI
OUT
RJMP
AUX,0B11111111
PORTB,AUX
AUX,0B00000001
PORTD,TEMPO
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
SUBI
SBIS
SUBI
SBIS
SUBI
RJMP
PINA,3
CONT,-0
PINA,4
CONT,-1
PINA,5
CONT,-0
RETORNO
FILA2:
SBIS PINA,3
SUBI CONT,-0
SBIS PINA,4
SUBI CONT,-1
SBIS PINA,5
SUBI CONT,-0
RJMP RETORNO
FILA3:
SBIS
SUBI
SBIS
SUBI
SBIS
SUBI
RJMP
RETORNO:
POP R16
OUT SREG,R16
POP R16
RETI
PINA,3
CONT,-0
PINA,4
CONT,-1
PINA,5
CONT,-0
RETORNO
TABLA:
.DB
0B00000000,0B00000001
.DB
0B00000011,0B00000111
.DB
0B00001111,0B00011111
.DB
0B00111111,0B01111111
.DB
0B11111111
EJEMPLO
/*
* Clasificadora_de_huevos.asm
*
* Created: 13/10/2013 14:47:37
* Author: vivia_000
*/
.DEF
.DEF
.DEF
.DEF
.DEF
.DEF
.DEF
TEMPO=R16
PEQUENOS=R17
MEDIANOS=R18
GRANDES=R19
CUBETA1=R20
CUBETA2=R21
CUBETA3=R22
.DSEG
PEQUENOS1:
PEQUENOS2:
MEDIANOS1:
MEDIANOS2:
GRANDES1:
GRANDES2:
.CSEG
.ORG
RJMP
.ORG
RJMP
.ORG
RJMP
.ORG
RJMP
.BYTE
.BYTE
.BYTE
.BYTE
.BYTE
.BYTE
1
1
1
1
1
1
0X00
INICIO
0X02
HUEVOS_PEQUENOS
0X04
HUEVOS_MEDIANOS
0X06
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
OUT
LDI
OUT
TEMPO,HIGH(RAMEND)
SPH,TEMPO
TEMPO,LOW(RAMEND)
SPL,TEMPO
LDI
STS
LDI
OUT
OUT
SEI
TEMPO,0B00101010
EICRA,TEMPO
TEMPO,0B00000111
EIMSK,TEMPO
EIFR,TEMPO
LAZO:
OUT PORTA,R24
OUT PORTC,R26
RJMP LAZO
HUEVOS_PEQUENOS:
PUSH
IN
PUSH
INC
CPI
BREQ
POP
OUT
POP
RETI
R16
R16,SREG
R16
PEQUENOS
PEQUENOS,12
CUBETA_PEQUENOS
R16
SREG,R16
R16
CUBETA_PEQUENOS:
CLR
ADIW
STS
STS
POP
OUT
POP
RETI
PEQUENOS
R25:R24,1
PEQUENOS1,R24
PEQUENOS2,R25
R16
SREG,R16
R16
HUEVOS_MEDIANOS:
PUSH
IN
PUSH
INC
CPI
BREQ
POP
OUT
POP
RETI
R16
R16,SREG
R16
MEDIANOS
MEDIANOS,12
CUBETA_MEDIANOS
R16
SREG,R16
R16
CUBETA_MEDIANOS:
CLR MEDIANOS
ADIW R27:R26,1
STS
MEDIANOS1,R26
STS
MEDIANOS2,R27
POP
OUT
POP
RETI
R16
SREG,R16
R16
HUEVOS_GRANDES:
PUSH
IN
PUSH
INC
CPI
BREQ
POP
OUT
POP
RETI
R16
R16,SREG
R16
GRANDES
GRANDES,12
CUBETA_GRANDES
R16
SREG,R16
R16
CUBETA_GRANDES:
CLR GRANDES
ADIW R29:R28,1
STS
GRANDES1,R28
STS
GRANDES2,R29
POP R16
OUT SREG,R16
POP R16
RETI
EJEMPLO
/*
* Prueba_2__ejercicio1.asm
*
* Created: 07/10/2013 20:59:50
* Author: vivia_000
*/
.DEF
.DEF
.DEF
TEMPO=R16
AUX=R17
CONT=R18
.DSEG
DIG0:
DIG1:
DIG2:
DIG3:
DIG4:
DIG5:
BCD0:
BCD1:
BCD2:
BCD3:
BCD4:
BCD5:
.BYTE
.BYTE
.BYTE
.BYTE
.BYTE
.BYTE
.BYTE
.BYTE
.BYTE
.BYTE
.BYTE
.BYTE
1
1
1
1
1
1
1
1
1
1
1
1
.CSEG
.ORG 0X0000
LDI
OUT
OUT
LDI
OUT
OUT
OUT
LDI
OUT
TEMPO,0B00000000
DDRA,TEMPO
DDRB,TEMPO
TEMPO,0B11111111
DDRC,TEMPO
PORTA,TEMPO
PORTB,TEMPO
TEMPO,0B11111111
DDRD,TEMPO
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
OUT
LDI
OUT
TEMPO,HIGH(RAMEND)
SPH,TEMPO
TEMPO,LOW(RAMEND)
SPL,TEMPO
BCD_7SEG:
PUSH
PUSH
PUSH
PUSH
PUSH
PUSH
PUSH
PUSH
R16
R17
ZL
ZH
XL
XH
YL
YH
LDI
LDI
LDI
LDI
LDI
YH,HIGH(DIG0)
YL,LOW(DIG0)
XH,HIGH(BCD0)
XL,LOW(BCD0)
R17,6
BCD_7SEG1:
LDI
LDI
LD
ADD
CLR
ADC
LPM
ST
DEC
BRNE
ZH,HIGH(TABLA_7SEG<<1)
ZL,LOW(TABLA_7SEG<<1)
R16,Y+
ZL,R16
R16
ZH,R16
R16,Z
X+,R16
R17
BCD_7SEG1
POP
POP
POP
POP
POP
POP
POP
POP
YH
YL
XH
XL
ZH
ZL
R17
R16
RET
;BARRIDO
BARRIDO:
PUSH
PUSH
PUSH
PUSH
PUSH
R16
R17
R18
XH
XL
LDI
LDI
LDI
SEC
LDI
SER
OUT
R16,6
XH,HIGH(BCD0)
XL,LOW(BCD0)
R18,0B11111110
R17
PORTC,R17
OTRO_DIG:
OUT
LD
OUT
CALL
SER
OUT
ROL
DEC
BRNE
PORTD,R18
R17,X+
PORTC,R17
RETARDO
R17
PORTC,R17
R18
R16
OTRO_DIG
POP
POP
POP
POP
POP
XL
XH
R18
R17
R16
RET
RETARDO:
PUSH R16
LDI
R16,10
LAZO_RETARDO:
POP
RET
R16
TABLA_7SEG:
NOP
DEC
R16
BRNE LAZO_RETARDO
.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
EJEMPLO
.include "m164pdef.inc"
sei
.def
.def
.def
.def
.def
principal:
rjmp principal
tempo=r16
aux=r17
maxh=r18
maxl=r19
sal=r20
.cseg
.org 0x08
jmp seleccionar
.org 0x001A
jmp toggle
;CONFIGURACION DE PUERTOS
seleccionar:
in aux,pina
sbrc aux,0
ldi maxl,0b10011110
sbrc aux,0
ldi maxh,0b00101111
sbrc aux,1
ldi maxl,0b10000010
sbrc aux,1
ldi maxh,0b00101111
main:
ldi tempo,0b00000000
out ddra,tempo
ldi tempo,0b00000001
out ddrb,tempo
ldi tempo,0b00000000
sts eicra,tempo
ldi tempo,0b00000000
out eimsk,tempo
ldi tempo,0b00000001
out pcifr,tempo
ldi tempo,0b00111111
out pcmsk0,tempo
sbrc aux,2
ldi maxl,0b10010010
sbrc aux,2
ldi maxh,0b00011010
sbrc aux,3
ldi maxl,0b11101110
sbrc aux,3
ldi maxh,0b00010011
sbrc aux,4
ldi maxl,0b11100001
sbrc aux,4
ldi maxh,0b00001111
sbrc aux,5
ldi maxl,0b11010110
sbrc aux,5
ldi maxh,0b00001011
;modo ctc
ldi tempo,0b00000000
lds tccr1a,tempo
;prescaler=8
ldi tempo,0b00001010
lds tccr1b,tempo
ldi tempo, 0b00000010
lds timsk1,tempo
lds ocr1ah,maxh
lds ocr1al,maxl
out portb,sal
reti
toggle:
neg sal
reti
EJEMPLO
/*
* Prueba2_ejerccio2.asm
*
* Created: 13/10/2013 10:17:56
.DEF
.DEF
TEMPO=R16
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
OUT
OUT
LDI
OUT
OUT
OUT
OUT
TEMPO,0B00000000
DDRB,TEMPO
DDRD,TEMPO
TEMPO,0B11111111
PORTA,TEMPO
PORTB,TEMPO
PORTD,TEMPO
DDRC,TEMPO
IN
TEMPO,MCUCR
ANDI TEMPO,0B11101111
OUT MCUCR,TEMPO
INICIO:
LDI
TECLA,16
LDI
ANTE,16
BARRIDO:
BARRIDO_FILAS:
LDI
OUT
LDI
OUT
SBIS
LDI
SBIS
LDI
SBIS
LDI
SBIS
LDI
TEMPO,0B00001111
DDRA,TEMPO
TEMPO,0B11110000
PORTA,TEMPO
PINA,4
COLUMNA,0
PINA,5
COLUMNA,1
PINA,6
COLUMNA,2
PINA,7
COLUMNA,3
BARRIDO_COLUMNAS:
LDI
OUT
LDI
OUT
SBIS
LDI
SBIS
LDI
SBIS
LDI
SBIS
TEMPO,0B11110000
DDRA,TEMPO
TEMPO,0B00001111
PORTA,TEMPO
PINA,0
FILA,0
PINA,1
FILA,1
PINA,2
FILA,2
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
BREQ
MOV
CPI
BREQ
TECLA,ANTE
BARRIDO
ANTE,TECLA
TECLA,16
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
EJEMPLO
.include "m164pdef.inc"
.def tempo=r16
.def aux=r17
.def banda=r18
.def bajo=r19
.def alto=r20
.def fin=r21
ldi aux,0
.cseg
.org 0x00
jmp inicio
.org 0x2
jmp paso1
.org 0x4
jmp paso2
.org 0x30
jmp finad
ldi tempo,0b01100000
add tempo,aux
sts admux,tempo
ldi tempo,0b1101110
sts adcsra,tempo
espera:
sbrs fin,0
rjmp espera
inicio:
out porta,alto
out portb,bajo
ldi tempo,0b11111111
out ddrb,tempo
ldi tempo,0
out portb,tempo
ldi tempo,1
add banda,tempo
out portc,banda
rjmp despliegue
ldi tempo,0b00000011
out ddrd,tempo
ldi tempo,0
out portd,tempo
paso1:
ldi banda,0
reti
ldi tempo,0
out ddra,tempo
ldi tempo,1
out ddrc,tempo
ldi tempo,0
out portc,tempo
ldi tempo,0b00000011
sts didr0,tempo
ldi tempo,0b00001111
sts eicra,tempo
ldi tempo,0b00000011
out eimsk,tempo
sei
clr peso
despliegue:
sbrc banda,0
ldi aux,1
paso2:
ldi banda,1
reti
finad:
lds bajo,adcl
lds alto,adch
ldi fin,1
reti
EJEMPLO
.include
.def
.def
.def
.def
.def
.def
.def
XD :D
.cseg
.org
rjmp
.org
"m164pdef.inc"
tempo=R16
fijol=R17
fijoh=R18
OCH=R19
OCL=R20
conta=R21
leds=R22
0x00
inicio
0x02
rjmp
.org
rjmp
.org
rjmp
subir
0x04
bajar
0x06
prender_apagar
inicio:
clr
clr
clr
clr
ser
out
clr
out
com
out
ldi
out
ldi
out
OCH
OCL
conta
leds
tempo
ddra,tempo
tempo
ddrb,tempo
tempo
portb,tempo
tempo,0b00000011
ddrc,tempo
;
tempo,0b00100000
ddrd,tempo
;salida PD5 Fast PWM
ldi
tempo,0b11011111
out
portd,tempo
;aseguro pull up
in
andi
out
tempo,MCUCR
tempo,0b11101111
MCUCR,tempo
tempo,0b00101010
EICRA,tempo
tempo,0b00000111
EIMSK,tempo
EIFR,tempo
SEI
;configuro TIMER1
ldi
sts
ldi
sts
clr
sts
ldi
tempo,0b00000010 ;11
TCCR1A,tempo
tempo,0b00011101
TCCR1B,tempo
tempo
TCCR1C,tempo
tempo,0
; Inicio en 0 XD
sts
ldi
sts
OCR1AH,tempo
tempo,0
OCR1AL,tempo
leds,0
leds,1
leds,2
leds,3
leds,4
leds,5
leds,6
leds,7
leds,8
leds,9
leds,10
tempo,0
porta,tempo
portc,tempo
tempo,0b00000001
porta,tempo
tempo,0b00000010
porta,tempo
tempo,0b00000100
porta,tempo
ldi
out
rjmp lazo
cinco:
ldi
out
rjmp
seis:
ldi
out
rjmp
siete:
ldi
out
rjmp
ocho:
ldi
out
ldi
out
rjmp
nueve:
ldi
out
ldi
out
rjmp
diez:
ldi
out
ldi
out
lazo
RJMP
LAZO
tempo,0b00001000
porta,tempo
tempo,0b00010000
porta,tempo
tempo,0b00100000
porta,tempo
lazo
tempo,0
conti_bajar
leds
OCL,fijol
OCH,fijoh
OCR1AH,OCH
OCR1AL,OCL
r16
sreg,r16
r16
reti
tempo,0b01000000
porta,tempo
lazo
tempo,0b10000000
porta,tempo
tempo,0
portc,tempo
lazo
tempo,0
porta,tempo
tempo,0b00000001
portc,tempo
lazo
tempo,0
porta,tempo
tempo,0b00000010
portc,tempo
prender_apagar:
push
r16
in
push
r16
inc
cpi
breq
r16
apagar:
clr
ldi
sts
rjmp
encender:
ldi
sts
rjmp
conta
tempo,0b00000010 ;11
TCCR1A,tempo
conti_PA
tempo,0b10000010
TCCR1A,tempo
conti_PA
r16
sreg,r16
r16
reti
r16,SREG
r16
leds
OCL,fijol
OCH,fijoh
OCR1AH,OCH
OCR1AL,OCL
r16
sreg,r16
r16
reti
EJEMPLO
/*
* Contador_Radiacion.asm
*
.DEF
.DEF
.DEF
.DEF
.DEF
TEMPO=R17
NIVELL=R18
NIVELH=R19
SALIDA=R20
AUX=R21
.ORG
RJMP
.ORG
RJMP
0X00
INICIO
0X1A
DIEZMSEG
bajar:
push
in
push
lds
r16,SREG
conta
conta,1
encender
conti_PA:
pop
out
pop
subir:
push
in
push
inc
add
adc
sts
sts
pop
out
pop
cpi
breq
dec
sub
sbc
sts
sts
conti_bajar:
pop
out
pop
r16
r16,SREG
r16
tempo,OCR1AL
.ORG 0X24
RJMP DESBORDE
INICIO:
LDI
TEMPO,0B00000000
OUT DDRB,TEMPO
LDI
TEMPO,0B11111111
OUT DDRA,TEMPO
OUT PORTB,TEMPO
;ACTIVO PULL UP
IN
TEMPO,MCUCR
ANDI TEMPO,0B00010000
OUT MCUCR,TEMPO
;CONFIGURO STACK POINTER
LDI
TEMPO,HIGH(RAMEND)
OUT SPH,TEMPO
LDI
TEMPO,LOW(RAMEND)
OUT SPL,TEMPO
;CONFIGURO TIMER 0
LDI
TEMPO,0B00000000
;NO UTILIZO COMPA,COMPB, USO
MODO NORMAL
OUT TCCR0A,TEMPO
LDI
TEMPO,0B00000110
;110(CONTADOR)
OUT TCCR0B,TEMPO
CLR TEMPO
CLR NIVELL
CLR NIVELH
LDI
TEMPO,0B00000001
STS
TIMSK0,TEMPO
;CONFIGURO TIMER 1
LDI
TEMPO,0B00000000
;NO UTILIZO COMPA,COMPB, USO
MODO CTC HASTA OCR1A
STS
TCCR1A,TEMPO
LDI
TEMPO,HIGH(1249)
STS
OCR1AL,TEMPO
LDI
TEMPO,LOW(1249)
STS
OCR1AL,TEMPO
LDI
TEMPO,0B00001011
;NO FORZAR SALIDAS,MODO CTC
STS
TCCR1B,TEMPO
LDI
TEMPO,0B00000010
STS
TIMSK1,TEMPO
SEI
MAIN:
OUT PORTA,SALIDA
RJMP MAIN
DESBORDE:
PUSH R16
IN
PUSH R16
R16,SREG
LDI
ADD
CLR
ADC
POP
OUT
POP
RETI
AUX,1
NIVELL,AUX
AUX
NIVELH,AUX
R16
SREG,TEMPO
R16
DIEZMSEG:
PUSH R16
IN
R16,SREG
PUSH R16
COMPROBAR1:
CPI
NIVELH,HIGH(10000)
BRCC COMPROBAR2
CPI
NIVELL,LOW(10000)
BRCC COMPROBAR2
LDI
SALIDA,0B00000001
SALIR:
CLR NIVELL
CLR NIVELH
POP R16
OUT SREG,TEMPO
POP R16
RETI
COMPROBAR2:
CPI
NIVELH,HIGH(30000)
BRCC COMPROBAR3
CPI
NIVELL,LOW(30000)
BRCC COMPROBAR3
LDI
SALIDA,0B00000010
RJMP SALIR
COMPROBAR3:
LDI
SALIDA,0B00000100
RJMP SALIR
EJEMPLO
/*
* Diferencia_de_se?ales.asm
*
* Created: 16/11/2013 11:31:15
* Author: vivia_000
*/
.DEF
.DEF
.DEF
.DEF
.DEF
TEMPO=R16
DATO1=R17
DATO11=R18
DATO2=R19
DATO22=R20
.ORG 0X00
LDI
TEMPO,0B00000000
OUT
DDRA,TEMPO
;ENTRADA ADC0
LDI
TEMPO,0B00100000
OUT DDRD,TEMPO
;SALIDA DEL PWM
LDI
TEMPO,0B11111111
OUT PORTA,TEMPO
;CONFIGURO PULL UP
IN
TEMPO,MCUCR
ANDI TEMPO,0B00010000
OUT MCUCR,TEMPO
;CONFIGURO STACK POINTER
LDI
TEMPO,HIGH(RAMEND)
OUT SPH,TEMPO
LDI
TEMPO,LOW(RAMEND)
OUT SPL,TEMPO
;CONFIGURO A/D
LAZO:
RJMP LAZO
ESPERA:
LDS TEMPO,ADCSRA
SBRC TEMPO,6
RJMP ESPERA
RET
CANAL0:
LDI
TEMPO,0B01100000
STS
ADMUX,TEMPO
LDI
TEMPO,0B11000110
STS
ADCSRA,TEMPO
CALL ESPERA
LDS DATO1,ADCL
LDS DATO11,ADCH
CANAL1:
LDI
TEMPO,0B01100001
STS
ADMUX,TEMPO
LDI
TEMPO,0B11000110
STS
ADCSRA,TEMPO
CALL ESPERA
LDS DATO2,ADCL
LDS DATO22,ADCH
SUB
SBC
BRCS
RJMP
DATO1,DATO2
DATO11,DATO22
COMPLEMENTO
TIMER
COMPLEMENTO:
COM DATO1
COM DATO11
TIMER:
LDI
TEMPO,0B10000011
;CREAR UN PWM CUANDO
ESTA SUBIENDO 0L, PWM (0CR0A)
STS
TCCR1A,TEMPO
LDI
TEMPO,0B00010010
;10 MODO DE TRABAJO,010
PREESCAKER 1:8
STS
TCCR1B,TEMPO
STS
STS
OCR1AH,DATO1
OCR1AL,DATO11
EJEMPLO
/*
* POTENCIA_DE_UN_HORNO.asm
*
* Created: 17/11/2013 9:24:26
* Author: vivia_000
*/
.DEF
.DEF
.DEF
TEMPO=R16
TALTO=R17
TBAJO=R18
.ORG
RJMP
.ORG
RJMP
.ORG
RJMP
0X00
INICIO
0X02
SUBE_TALTA
0X04
BAJA_TBAJO
.ORG 0X06
RJMP ENCENDER_APAGAR
INCIO:
LDI
TEMPO,0B00100000
;SALIDA DE PWM
OUT DDRD,TEMPO
LDI
TEMPO,0B00000000
OUT DDRB,TEMPO
LDI
TEMPO,0B11111111
OUT PORTB,TEMPO
OUT PORTD,TEMPO
IN
TEMPO,MCUCR
ANDI TEMPO,0B00010000
OUT MCUCR,TEMPO
LDI
OUT
LDI
OUT
TEMPO,HIGH(RAMEND)
SPH,TEMPO
TEMPO,LOW(RAMEND)
SPL,TEMPO
; CONFIGURO TIMER1
SUBE_TALTA:
PUSH R16
IN
R16,SREG
PUSH R16
LDI
TEMPO,0B10000011
;MI SALIDA POR COMPA UN 1L
CUANDO TA ,FAST PWM
STS
TCCR1A,TEMPO
LDI
TEMPO,HIGH(31562)
STS
OCR1AH,TEMPO
LDI
TEMPO,LOW(31562)
STS
OCR1AL,TEMPO
LDI
TEMPO,0B00011101
STS
TCCR1B,TEMPO
LDI
TEMPO,
BAJA_ABAJ0:
EJEMPLO
/*
* Proyectil__Distancia.asm
.DEF
.DEF
.DEF
TEMPO=R16
TIEMPOL=R17
TIEMPOH=R18
.ORG
RJMP
.ORG
RJMP
.ORG
RJMP
.ORG
RJMP
0X00
INICIO
0X02
SUELTA
0X04
BORRAR_TIEMPO
0X18
CAPTURA
INICIO:
LDI
TEMPO,0B00000000
;ENTRADA DE LOS
PULSANTES
OUT DDRD,TEMPO
LDI
TEMPO,0B11111111
OUT
OUT
DDRA,TEMPO
DDRB,TEMPO
R16,SREG
LDI
TEMPO,0B11000101
;UTILIZO UN
CRISTAL DE 1MHZ PARA PODER OBTENER
UN TIEMPO MAS GRANDE,PREESCALER
1024
STS
TCCR1B,TEMPO
POP R16
OUT SREG,R16
POP R16
RETI
BORRAR_TIEMPO:
PUSH R16
IN
R16,SREG
PUSH R16
LDI
TEMPO,0B11000000
;DETENGO EL TIMER
STS
TCCR1B,TEMPO
CLR TEMPO
STS
TCNT1H,TEMPO
STS
TCNT1L,TEMPO
POP R16
OUT SREG,R16
POP R16
RETI
CAPTURA:
PUSH R16
IN
PUSH R16
R16,SREG
LDI
TEMPO,0B11000000
;DETENGO EL TIMER
STS
TCCR1B,TEMPO
CLR TEMPO
STS
TCNT1H,TEMPO
STS
TCNT1L,TEMPO
LDS TIEMPOL,ICR1L
;RECUPERO
EL TIEMPO
LDS TIEMPOH,ICR1H
OUT PORTA,TIEMPOL
OUT PORTB,TIEMPOH
POP R16
OUT SREG,R16
POP R16
RETI
EJEMPLO
/*
* Respuesta_de_un_chofer.asm
*
* Created: 16/11/2013 16:47:13
* Author: vivia_000
*/
.DEF
.DEF
.DEF
.DEF
TEMPO=R16
TIEMPOL=R17
TIEMPOH=R18
LED=R19
.DSEG
TLOW: .BYTE 1
THIGH:
.BYTE 1
.CSEG
.ORG
RJMP
.ORG
RJMP
0X00
INICIO
0X02
CONECTAR
.ORG 0X18
RJMP CAPTURA
INICIO:
LDI
TEMPO,0B0000000
OUT DDRD,TEMPO
LDI
TEMPO,0B0000001
OUT DDRC,TEMPO
LDI
TEMPO,0B11111111
OUT PORTD,TEMPO
OUT DDRB,TEMPO
OUT DDRA,TEMPO
;ACTIVO PULL UP
IN
TEMPO,MCUCR
ANDI TEMPO,0B00010000
OUT MCUCR,TEMPO
;CONFIGURO STACK POINTER
LDI
TEMPO,HIGH(RAMEND)
OUT SPH,TEMPO
LDI
TEMPO,LOW(RAMEND)
OUT SPL,TEMPO
;INTERRUPCION EXTERNA
LDI
TEMPO,0B00000010
STS
EICRA,TEMPO
LDI
TEMPO,0B00000001
OUT EIMSK,TEMPO
OUT EIFR,TEMPO
LDI
LDI
STS
POP
OUT
POP
RETI
LED,1
TEMPO,0B11000001
TCCR1B,TEMPO
R16
SREG,R16
R16
CAPTURA:
PUSH R16
IN
R16,SREG
PUSH R16
LDI
LED,0
LDI
TEMPO,0B11000000
STS
TCCR1B,TEMPO
CLR TEMPO
STS
TCNT1H,TEMPO
STS
TCNT1L,TEMPO
LDS TIEMPOL,ICR1L
LDS TIEMPOH,ICR1H
STS
TLOW,TIEMPOL
STS
THIGH,TIEMPOH
POP R16
OUT SREG,R16
POP R16
RETI
;CONFIGURO TIMER2
LDI
STS
LDI
STS
LDI
TEMPO,0B00000010
TCCR2A,TEMPO
TEMPO,0B00000001
TCCR2B,TEMPO
TEMPO,0B00100000
;CONFIGURO TIMER1
LDI
STS
LDI
STS
LDI
STS
SEI
MAIN:
OUT
OUT
OUT
RJMP
TEMPO,0B00000000
TCCR1A,TEMPO
TEMPO,0B11000000
TCCR1B,TEMPO
TEMPO,0B00100000
TIMSK1,TEMPO
PORTC,LED
PORTB,TIEMPOL
PORTA,TIEMPOH
MAIN
CONECTAR:
PUSH R16
IN
PUSH R16
R16,SREG
EJEMPLO
/*
* Sensor_Motor_Bujia.asm
*
* Created: 14/11/2013 13:18:09
* Author: vivia_000
*/
.DEF
.DEF
.DEF
TEMPO=R20
VECES=R17
SALIDA=R18
.ORG
RJMP
.ORG
RJMP
.ORG
0X00
INICIO
0X02
CONTEO
0X1A
;TIMER1 COMPARADOR A
RJMP UNSEG
INICIO:
LDI
OUT
LDI
OUT
LDI
OUT
LDI
OUT
TEMPO,0B00000000
DDRB,TEMPO
;ENTRADA
TEMPO,0B11111111
DDRA,TEMPO
TEMPO,HIGH(RAMEND)
SPH,TEMPO
TEMPO,LOW(RAMEND)
SPL,TEMPO
TEMPO,0B00000000
;MODO CTC ,NO UTILIZO
COMPA,COMPB
STS
TCCR1A,TEMPO
LDI
TEMPO,HIGH(31249)
STS
OCR1AH,TEMPO
LDI
TEMPO,LOW(31249)
STS
OCR1AL,TEMPO
LDI
TEMPO,0B00001100
;0
ELIMINO RUIDO,0 MODO DE
CAPTURA,MODO CTC,1:256
STS
TCCR1B,TEMPO
LDI
TEMPO,0B00000010
;CUANDO LA CUENTA LLEGA AL
MAX GENERA UNA INTERRUPCION
STS
TIMSK1,TEMPO
SEI
LAZO:
OUT PORTA,SALIDA
RJMP LAZO
UNSEG:
PUSH R16
IN
R16,SREG
PUSH R16
CPI
VECES,12
BRCS LED_AMARILLO
CPI
VECES,59
BRCS LED_VERDE
LED_ROJO:
LDI
SALIDA,0B00000100
RJMP SALIR
LED_VERDE:
LDI
SALIDA,0B00000010
RJMP SALIR
LED_AMARILLO:
LDI
SALIDA,0B00000001
RJMP SALIR
SALIR:
CLR VECES
POP R16
OUT SREG,R16
POP R16
RETI
CONTEO:
PUSH R16
IN
R16,SREG
PUSH R16
INC
VECES
POP R16
OUT SREG,R16
POP R16
RETI
EJEMPLO
/*
* Sensor_Motor_Bujia.asm
.DEF
.DEF
.DEF
.DEF
TEMPO=R20
VECES=R17
FRECH=R18
FRECL=R19
.ORG 0X00
RJMP INICIO
.ORG 0X1A
;TIMER1 COMPARADOR A
RJMP UNSEG
.ORG 0X24
;TIMER0 OVERFLOW
RJMP DESBORDE
INICIO:
LDI
OUT
TEMPO,0B00000000
DDRB,TEMPO
;ENTRADA
LDI
OUT
LDI
OUT
LDI
OUT
LDI
OUT
TEMPO,0B11111111
DDRA,TEMPO
TEMPO,0B11111111
DDRC,TEMPO
TEMPO,HIGH(RAMEND)
SPH,TEMPO
TEMPO,LOW(RAMEND)
SPL,TEMPO
;CONFIGURA TIMER0
LDI
TEMPO,0B00000000
;MANDO 0L NO UTILIZO COMPACOMPB, MODO NORMAL( SE DESBORDA Y
CONTINUA)
OUT TCCR0A,TEMPO
LDI
TEMPO,0B00000110
;0 NO
FORZAR SALIDAS, NORMAL,UTILIZO
CONTADOR (CUENTA FLANCOS
NEGATIVOS)
OUT TCCR0B,TEMPO
CLR TEMPO
CLR VECES
OUT TCNT0,TEMPO
LDI
TEMPO,0B00000001
;UTLIZAR EL BIT DE OVERFLOW
STS
TIMSK0,TEMPO;CONFIGURO
TIMER1
LDI
TEMPO,0B00000000
;MODO CTC ,NO UTILIZO
COMPA,COMPB
STS
TCCR1A,TEMPO
LDI
TEMPO,HIGH(31249)
STS
OCR1AH,TEMPO
LDI
TEMPO,LOW(31249)
STS
OCR1AL,TEMPO
LDI
TEMPO,0B00001100
;0
ELIMINO RUIDO,0 MODO DE
CAPTURA,MODO CTC,1:256
STS
TCCR1B,TEMPO
LDI
TEMPO,0B00000010
;CUANDO LA CUENTA LLEGA AL
MAX GENERA UNA INTERRUPCION
STS
TIMSK1,TEMPO
SEI
LAZO:
RJMP LAZO
DESBORDE:
PUSH R16
IN
R16,SREG
PUSH R16
INC
VECES
POP R16
OUT SREG,R16
POP R16
RETI
UNSEG:
PUSH R16
IN
R16,SREG
PUSH R16
MOV FRECH,VECES
IN
FRECL,TCNT0
OUT PORTC,FRECL
CPI
FRECL,12
BRLO LED_AMARILLO
CPI
FRECL,59
OUT PORTA,FRECL
BRLO LED_VERDE
LED_ROJO:
LDI
TEMPO,0B00000100
OUT PORTA,TEMPO
RJMP SALIDA
LED_VERDE:
LDI
TEMPO,0B00000010
OUT PORTA,TEMPO
RJMP SALIDA
LED_AMARILLO:
LDI
TEMPO,0B00000001
OUT PORTA,TEMPO
RJMP SALIDA
SALIDA:
CLR VECES
POP R16
OUT SREG,R16
POP R16
RETI
EJEMPLO
/*
* Ventanillas_de_banco.asm
.DEF TEMPO=R16
.DEF TECLA=R17
.DEF ANTE=R19
.DEF CONTA=R20
.ORG
RJMP
.ORG
RJMP
0X00
INICIO
0X30
INGUALDAD
INICIO :
LDI
OUT
LDI
OUT
LDI
OUT
TEMPO,0B00001111
DDRA,TEMPO
TEMPO,0B11111111
PORTA,TEMPO
TEMPO,0B11111111
DDRC,TEMPO
OUT
DDRD,TEMPO
LDI
TEMPO,HIGH(RAMEND)
OUT SPH,TEMPO
LDI
TEMPO,LOW(RAMEND)
OUT SPL,TEMPO
LDI
TECLA,16
LDI
ANTE,16
;CONFIGURO TIMER 0
OUT
PORTC,TECLA
LDI
TEMPO,124
OUT
OCR0A,TEMPO
LDI
TEMPO,0B00000010
OUT
TCCR0A,TEMPO
LDI
TEMPO,0B00000100
OUT
TCCR0B,TEMPO
LDI
TEMPO,0B00000010
STS
TIMSK0,TEMPO
LDI
CONTA,125
SEI
LAZO:
BARRIDO:
;HABILITO FILA 1
LDI
TEMPO,0B11111110
OUT
PORTA,TEMPO
SBIS PINA,4
LDI
TECLA,0
SBIS PINA,5
LDI
TECLA,1
SBIS PINA,6
LDI
TECLA,2
SBIS PINA,7
LDI
TECLA,3
;HABILITO FILA 2
LDI
TEMPO,0B11111101
OUT
PORTA,TEMPO
SBIS PINA,4
LDI
TECLA,4
SBIS PINA,5
LDI
TECLA,5
SBIS PINA,6
LDI
TECLA,6
SBIS PINA,7
LDI
TECLA,7
;HABILITO FILA 3
LDI
TEMPO,0B11111011
OUT
PORTA,TEMPO
SBIS PINA,4
LDI
TECLA,8
SBIS PINA,5
LDI
TECLA,9
SBIS PINA,6
LDI
TECLA,10
SBIS PINA,7
LDI
TECLA,11
;HABILITO FILA 4
LDI
TEMPO,0B11110111
OUT
PORTA,TEMPO
SBIS PINA,4
LDI
TECLA,12
SBIS PINA,5
LDI
TECLA,13
SBIS PINA,6
LDI
TECLA,14
SBIS PINA,7
LDI
TECLA,15
CP
TECLA,ANTE
BREQ BARRIDO
MOV
ANTE,TECLA
CPI
TECLA,16
BREQ BARRIDO
RJMP LAZO
INGUALDAD:
PUSH R16
IN
PUSH R16
DEC
BRNE SALIR
CLR
OUT
OUT
LDI
SALIR:
POP
OUT
POP
RETI
R16,SREG
CONTA
TEMPO
PORTC,TEMPO
PORTB,TEMPO
CONTA,125
R16
SREG,R16
R16
EJEMPLO
.include "m164pdef.inc"
.def
.def
.def
.def
.def
.def
tempo=r16
aux=r17
banda=r18
bajo=r19
alto=r20
fin=r21
.cseg
.org 0x00
jmp inicio
.org 0x2
jmp paso1
.org 0x4
jmp paso2
.org 0x30
jmp finad
rjmp espera
inicio:
out porta,alto
out portb,bajo
ldi tempo,0b11111111
out ddrb,tempo
ldi tempo,0
out portb,tempo
ldi tempo,1
add banda,tempo
out portc,banda
rjmp despliegue
ldi tempo,0b00000011
out ddrd,tempo
ldi tempo,0
out portd,tempo
paso1:
ldi banda,0
reti
ldi tempo,0
out ddra,tempo
ldi tempo,1
out ddrc,tempo
ldi tempo,0
out portc,tempo
ldi tempo,0b00000011
sts didr0,tempo
ldi tempo,0b00001111
sts eicra,tempo
ldi tempo,0b00000011
out eimsk,tempo
sei
clr peso
despliegue:
sbrc banda,0
ldi aux,1
ldi aux,0
ldi tempo,0b01100000
add tempo,aux
sts admux,tempo
ldi tempo,0b1101110
sts adcsra,tempo
espera:
sbrs fin,0
paso2:
ldi banda,1
reti
finad:
lds bajo,adcl
lds alto,adch
ldi fin,1
reti
EJEMPLO
/*
* Conversion_de_4_canales.asm
*
* Created: 26/10/2013 21:07:02
* Author: vivia_000
*/
.DEF
.DEF
TEMPO=R16
AUX=R17
.CSEG
.ORG 0X00
;CONFIGURO PUERTOS
LDI
OUT
LDI
OUT
LDI
OUT
TEMPO,0B00000000
DDRA,TEMPO
TEMPO,0B11111111
DDRB,TEMPO
TEMPO,0B00000011
DDRC,TEMPO
TEMPO,HIGH(RAMEND)
SPH,TEMPO
TEMPO,LOW(RAMEND)
SPL,TEMPO
;CONDIGURO A/D
LDI
STS
TEMPO,0B01000000
ADMUX,TEMPO
CANAL0:
LDI
TEMPO,0B11000110
STS
ADCSRA,TEMPO
EJEMPLO
/*
* DEBER_AD_BALANZA.asm
*
* Created: 26/10/2013 17:32:50
* Author: Compaq
*/
.include "m164pdef.inc"
.def tempo=r16
.DEF AUX=R17
.DEF canal1=R18
.DEF canal11=R19
.DEF canal2=R25
.DEF canal22=R20
.DEF canAl3=R21
.DEF canal33=R22
.DEF canal4=R23
.DEF canal44=R24
.def cont=r21
.def cont2=r22
.dseg
PESO: .BYTE 2
BCD0: .BYTE 1
BCD1: .BYTE 1
BCD2: .BYTE 1
BCD3: .BYTE 1
DIG0: .BYTE 1
DIG1: .BYTE 1
DIG2: .BYTE 1
DIG3: .BYTE 1
.CSEG
.ORG 0X00
LDI TEMPO,0B00000000
OUT DDRA,TEMPO
out porta,tempo
SER TEMPO ;DEFINO PUERTOS DE SALIDA
OUT DDRD,TEMPO
LDI TEMPO,0B00001111
OUT DDRB,TEMPO
;config puertos
;CONVERSOR AC DC
INICIO:
PESO1:
LDI
TEMPO,0B01000000
STS
ADMUX,TEMPO
LDI
TEMPO,0B11000110
STS
ADCSRA,TEMPO
ESPERA1:
LDS TEMPO,ADCSRA
SBRC TEMPO,6
RJMP ESPERA1
LDS CANAL1,ADCL
LDS CANAL11,ADCH
CALL BORRAR
PESO2:
LDI
TEMPO,0B01000001
STS
ADMUX,TEMPO
LDI
TEMPO,0B11000110
STS
ADCSRA,TEMPO
ESPERA2:
LDS TEMPO,ADCSRA
SBRC TEMPO,6
RJMP ESPERA2
LDS CANAL2,ADCL
LDS CANAL22,ADCH
CALL BORRAR
PESO3:
LDI
TEMPO,0B01000010
STS
ADMUX,TEMPO
LDI
TEMPO,0B11000110
STS
ADCSRA,TEMPO
ESPERA3:
LDS TEMPO,ADCSRA
SBRC TEMPO,6
RJMP ESPERA3
LDS CANAL3,ADCL
LDS CANAL33,ADCH
CALL BORRAR
PESO4:
LDI
TEMPO,0B01000011
STS
ADMUX,TEMPO
LDI
TEMPO,0B11000110
STS
ADCSRA,TEMPO
ESPERA4:
LDS TEMPO,ADCSRA
SBRC TEMPO,6
RJMP ESPERA4
LDS CANAL4,ADCL
LDS CANAL44,ADCH
CALL BORRAR
SUMA:
ADD CANAL1,CANAL2
ADC CANAL11,CANAL22
ADD CANAL1,CANAL3
ADC CANAL11,CANAL33
ADD CANAL1,CANAL4
ADC CANAL11,CANAL44
CLC
ROR CANAL11
ROR CANAL1
CLC
ROR CANAL11
ROR CANAL1
sts peso,CANAL1
sts peso+1,CANAL11
call bin_bcd
call bcd_7seg
call barrido
RJMP INICIO
BORRAR:
LDI
TEMPO,0B00000000
STS
ADMUX,TEMPO
STS
ADCSRA,TEMPO
STS
ADCL,TEMPO
STS
ADCH,TEMPO
RET
BIN_BCD:
PUSH R16
PUSH R17
PUSH R18
CLR R17
LDS R16,PESO ;TOMO LOS
PRIMEROS 8 BITS DEL DATO BINARIO A
CONVERTIR LSB
LDS R17,PESO+1 ;TOMO LOS
SIGUIENTES 8 BITS MSB (TOTAL 16 BITS)
CLR R18
MILES:
SUBI R16,LOW(1000)
SBCI R17,HIGH(1000)
BRCS CENTENAS
INC R18
RJMP MILES
CENTENAS:
STS BCD3,R18
CLR R18
SUBI R16,LOW(-1000)
SBCI R17,HIGH(-1000)
CENTENAS1:
;AHORA SE
RESTA 100
SUBI R16,LOW(100)
SBCI R17,HIGH(100)
BRCS DECENAS
INC R18
RJMP CENTENAS1
DECENAS:
STS BCD2,R18
CLR R18
SUBI R16,LOW(-100)
SBCI R17,HIGH(-100)
DECENAS1:
SUBI R16,LOW(10)
SBCI R17,HIGH(10)
BRCS UNIDADES
INC R18
RJMP DECENAS1
UNIDADES:
STS BCD1,R18
SUBI R16,LOW(-10)
SBCI R17,HIGH(-10)
STS BCD0,R16
POP R18
POP R17
POP R16
;AHORA TRANSFORMO A 7
SEGMENTOS
RET
BCD_7SEG:
PUSH
PUSH
PUSH
PUSH
PUSH
PUSH
PUSH
PUSH
R16
R17
ZH
ZL
YH
YL
XH
XL
LDI
LDI
LDI
LDI
LDI
YH,HIGH(BCD0)
YL,LOW(BCD0)
XH,HIGH(DIG0)
XL,LOW(DIG0)
R17,4
BCD7SEG1:
LDI
ZH,HIGH(TABLABCD7SEG<<1)
LDI
ZL,LOW(TABLABCD7SEG<<1)
LD
ADD
CLR
ADC
LPM
ST
DEC
BRNE
POP
POP
POP
POP
POP
POP
POP
POP
RET
BARRIDO:
R16,Y+
ZL,R16
R16
ZH,R16
R16,Z
X+,R16
R17
BCD7SEG1
XL
XH
YL
YH
ZL
ZH
R17
R16
PUSH R16
LDS
R16,DIG0
OUT
PORTD,R16
LDI
R16,0B11111110
OUT
PORTB,R16
CALL RETARDO
SER
R16
OUT
PORTB,R16
LDS
R16,DIG1
OUT
PORTD,R16
LDI
R16,0B11111101
OUT
PORTB,R16
CALL RETARDO
SER
R16
OUT
PORTB,R16
LDS
R16,DIG2
OUT
PORTD,R16
LDI
R16,0B11111011
OUT
PORTB,R16
CALL RETARDO
SER
R16
OUT
PORTB,R16
RETARDO:
LDS
R16,DIG3
OUT
PORTD,R16
LDI
R16,0B11110111
OUT
PORTB,R16
CALL RETARDO
SER
R16
OUT
PORTB,R16
POP
R16
RET
PUSH R16
LDI
R16,0B11111111
RETARDO1:
DEC
R16
BRNE RETARDO1
POP
R16
RET
TABLABCD7SEG:
.DB 0B10111111,0B10000110
;0,1
.DB 0B11011011,0B11001111
;2,3
.DB 0B11100110,0B11101101
;4,5
.DB 0B11111101,0B10000111
;6,7
.DB 0B11111111,0B11101111
;8,9
EJEMPLO
/*
* Medidor_de_frecuencia.asm
*
* Created: 12/11/2013 11:53:49
* Author: Rodrigo Crespo
*/
.def tempo=r16
.def aux1=r17
.def aux2=r18
.org 0x00
rjmp Inicio
.org 0x18
rjmp Capturar
Inicio:
ldi tempo, 0
out ddrD, tempo
ldi tempo, 255
out ddrA, tempo
out ddrC, tempo
;Configuracion TIMER1
ldi tempo, 0
sts TCCR1A, tempo
ldi tempo, 0b01000011
sts TCCR1B, tempo
ldi tempo, 0
sts TCCR1C, tempo
ldi tempo, 0b00100000
sts TIMSK1, tempo
;Stack pointer
ldi tempo, high(ramend)
out sph, tempo
ldi tempo, low(ramend)
out spl, tempo
sei
Main:
EJEMPLO
/*
* ECIO_2.asm
*
* Created: 11/17/2013 4:37:25 PM
* Author: Juan Fernando
*/
.include
"m164pdef.inc"
.def
tempo=R16
.def
fijol=R17
.def
fijoh=R18
.def
OCH=R19
.def
OCL=R20
.def
conta=R21
.def
leds=R22
;
XD :D
.cseg
.org
rjmp
.org
rjmp
.org
rjmp
.org
rjmp
0x00
inicio
0x02
subir
0x04
bajar
0x06
prender_apagar
inicio:
clr
clr
clr
clr
ser
out
clr
out
com
out
ldi
OCH
OCL
conta
leds
tempo
ddra,tempo
tempo
ddrb,tempo
tempo
portb,tempo
tempo,0b00000011
out
ldi
out
ddrc,tempo
;
tempo,0b00100000
ddrd,tempo
;salida PD5 Fast PWM
ldi
tempo,0b11011111
out
portd,tempo
;aseguro pull up
in
andi
out
tempo,MCUCR
tempo,0b11101111
MCUCR,tempo
tempo,0b00101010
EICRA,tempo
tempo,0b00000111
EIMSK,tempo
EIFR,tempo
SEI
;configuro TIMER1
ldi
sts
ldi
sts
clr
sts
ldi
tempo,0b00000010 ;11
TCCR1A,tempo
tempo,0b00011101
TCCR1B,tempo
tempo
TCCR1C,tempo
tempo,0
; Inicio en 0 XD
OCR1AH,tempo
tempo,0
OCR1AL,tempo
sts
ldi
sts
cero
leds,0
cpi
breq uno
cpi
breq dos
cpi
breq tres
cpi
breq cuatro
cpi
breq cinco
cpi
breq seis
cpi
breq siete
cpi
breq ocho
cpi
breq nueve
cpi
breq diez
cero:
ldi
out
out
rjmp lazo
uno:
ldi
out
rjmp lazo
dos:
ldi
out
rjmp lazo
tres:
ldi
out
rjmp lazo
cuatro:
ldi
out
rjmp lazo
cinco:
ldi
out
rjmp lazo
seis:
ldi
out
rjmp lazo
siete:
ldi
out
rjmp lazo
ocho:
ldi
out
ldi
out
leds,1
leds,2
leds,3
leds,4
leds,5
leds,6
leds,7
leds,8
leds,9
leds,10
tempo,0
porta,tempo
portc,tempo
tempo,0b00000001
porta,tempo
tempo,0b00000010
porta,tempo
tempo,0b00000100
porta,tempo
tempo,0b00001000
porta,tempo
tempo,0b00010000
porta,tempo
tempo,0b00100000
porta,tempo
tempo,0b01000000
porta,tempo
tempo,0b10000000
porta,tempo
tempo,0
portc,tempo
rjmp lazo
nueve:
ldi
out
ldi
out
rjmp lazo
diez:
ldi
out
ldi
out
RJMP LAZO
tempo,0
porta,tempo
tempo,0b00000001
portc,tempo
tempo,0
porta,tempo
tempo,0b00000010
portc,tempo
subir:
push
in
push
inc
add
adc
sts
sts
pop
out
pop
tempo,0b10000010
TCCR1A,tempo
conti_PA
r16
sreg,r16
r16
reti
r16
r16,SREG
r16
leds
OCL,fijol
OCH,fijoh
OCR1AH,OCH
OCR1AL,OCL
r16
sreg,r16
r16
bajar:
r16
r16,SREG
r16
tempo,OCR1AL
tempo,0
conti_bajar
leds
OCL,fijol
OCH,fijoh
OCR1AH,OCH
OCR1AL,OCL
r16
sreg,r16
r16
reti
prender_apagar:
push
r16
in
push
r16
inc
cpi
breq
conta
tempo,0b00000010 ;11
TCCR1A,tempo
conti_PA
EJEMPLO
reti
push
in
push
lds
cpi
breq
dec
sub
sbc
sts
sts
conti_bajar:
pop
out
pop
apagar:
clr
ldi
sts
rjmp
encender:
ldi
sts
rjmp
conti_PA:
pop
out
pop
r16,SREG
conta
conta,1
encender
/*
* Relacion_de_Trabajo_Variable.asm
*
* Created: 17/11/2013 12:05:55
* Author: vivia_000
*/
.DEF
.DEF
.DEF
.DEF
TEMPO=R17
THIGH=R18
TLOW=R19
AUX=R20
.ORG
RJMP
.ORG
RJMP
.ORG
RJMP
.ORG
RJMP
0X00
INICIO
0X02
AUMENTA
0X04
DISMINUYE
0X06
ONOFF
INICIO:
LDI
OUT
LDI
OUT
TEMPO,0B00000000
DDRB,TEMPO
TEMPO,0B00110000
DDRD,TEMPO
EICRA,TEMPO
TEMPO,0B00000111
OUT
EIMSK,TEMPO
OUT
EIFR,TEMPO
;CONFIGURO TIMER1
LDI
TEMPO,0B11000010
STS
TCCR1A,TEMPO
LDI
TEMPO,0B00011000
STS
TCCR1B,TEMPO
CLR TEMPO
STS
TCNT1H,TEMPO
STS
TCNT1L,TEMPO
LDI
TEMPO,HIGH(64843)
STS
ICR1H,TEMPO
LDI
TEMPO,LOW(64843)
STS
ICR1L,TEMPO
LDI
THIGH,HIGH(32421)
STS
OCR1AH,THIGH
LDI
TLOW,LOW(32421)
STS
OCR1AL,TLOW
SEI
MAIN:
RJMP MAIN
ONOFF:
PUSH R16
IN
R16,SREG
PUSH R16
COM AUX
CPI
AUX,255
BREQ ACTIVAR
LDI
TEMPO,0B00011000
STS
TCCR1B,TEMPO
RJMP SALIR
ACTIVAR:
LDI
TEMPO,0B00011101
STS
TCCR1B,TEMPO
SALIR:
POP R16
OUT SREG,R16
POP R16
RETI
AUMENTA:
PUSH R16
IN
R16,SREG
PUSH R16
LDI
TEMPO,LOW(3242)
ADD TLOW,TEMPO
LDI
TEMPO,HIGH(3242)
ADC THIGH,TEMPO
STS
OCR1AH,THIGH
STS
OCR1AL,TLOW
RJMP SALIR
DISMINUYE:
PUSH R16
IN
R16,SREG
PUSH R16
LDI
TEMPO,LOW(3242)
SUB TLOW,TEMPO
LDI
TEMPO,HIGH(3242)
SBC THIGH,TEMPO
STS
OCR1AH,THIGH
STS
OCR1AL,TLOW
RJMP SALIR
EJEMPLO
/*
* TIMER0_1SEG.asm
*
* Created: 11/17/2013 9:43:50 AM
* Author: Juan Fernando
*/
.include
"m164pdef.inc"
.def
tempo=r16
.def
conta=r17
.org
0x00
rjmp
inicio
.org
0x20
rjmp
um35
inicio:
ldi
out
ldi
out
ldi
out
tempo,0b00001000
ddrb,tempo
tempo,high(ramend)
sph,tempo
tempo,low(ramend)
spl,tempo
;configuracion de TIMER0
ldi
tempo,0b00000010
out
ldi
out
ldi
sts
ldi
out
ldi
SEI
lazo:
rjmp
TCCR0A,tempo
tempo,0b00000100
TCCR0B,tempo
tempo,0b00000010
TIMSK0,tempo
tempo,124
OCR0A,tempo
conta,125
lazo
um35:
push
in
push
dec
brne
ldi
in
com
out
rjmp
salir:
pop
out
pop
RETI
r16
r16
salir
salir
r16,SREG
conta
conta,125
r16,pinb
r16
portb,r16
EJEMPLO
r16
SREG,r16
r16
/*
* ECIO_1.asm
*
* Realizar un circuito que determine si la
frecuencia de la red es de 50 Hz o de 60
Hz, y si el semiciclo positivo
* dura los mismo que el negativo. Se
tiene un circuito que por la misma linea
da un pulso cuando el voltaje cruza de
subida y otro pulso
* cuando cruza de bajada. Debe
encender un LED si es de 50 Hz, y otro si
es de 60 Hz, y uno adicional si el
semiciclo positivo no dura lo
* mismo que el negativo. Usar
necesariamente Interrupciones y Timer.
Dibujar el circuito y escribir el programa
con comentarios.
* Author: Juan Fernando
*/
.include "m164pdef.inc"
.def
tempo=R16
.def
conta=R17
.def
frec=r18
.def
t1H=R19
.def
t1L=R20
.def
t2H=R21
.def
t2L=R22
.def
t3H=R23
.def
t3L=R24
; Timer0 para generar 1 seg
.org
0x00
rjmp
inicio
.org
0x18
rjmp
captura
.org
0x20
rjmp
un_seg
Inicio:
ldi
out
tempo,0b11100000
; Leds de salida
ddra,tempo
clr
tempo
out
ddrd,tempo
out
ddrb,tempo
out
ddrc,tempo
; Inicializo el Stack Pointer
ldi
tempo,high(ramend)
out
sph,tempo
ldi
tempo,low(ramend)
out
spl,tempo
clr
frec
; Configuracion del timer 0
; Objetivo generar 1 segundo
ldi
tempo,0b00000010
; Modo normal, CTC
out
TCCR0A,tempo
ldi
tempo,0b00000100
; No forzar salidas, CTC,
prescalador 256
out
TCCR0B,tempo
ldi
tempo,124
sts
OCR0A,tempo
ldi
tempo,0b00000010
; Interrupcion comparador
de A
sts
timsk0,tempo
ldi
conta,125
;Configuracion del TIMER1
ldi
tempo,0b00000000
sts
TCCR1A,tempo
ldi
tempo,0b11000010
sts
TCCR1B,tempo
ldi
tempo,0
sts
TCCR1C,tempo
ldi
tempo,0b00100000
sts
TIMSK1,tempo
SEI
main:
rjmp
main
; LOL :)
un_seg:
push
in
push
dec
brne
ldi
cpi
breq
cpi
breq
cpi
breq
cpi
breq
R16
R16
salir
R16,SREG
conta
conta,125
frec,60
frec60
frec60
frec50
frec50
frec,119
frec,50
frec,99
LDI
out
rjmp
RETI
salir
tempo,0
porta,tempo
frec60:
ldi
out
clr
rjmp salir
tempo,0b10000000
porta,tempo
frec
frec50:
ldi
out
clr
rjmp salir
tempo,0b01000000
porta,tempo
frec
salir:
pop
out
pop
captura:
push
in
push
inc
cpi
brcc
cpi
breq
cpi
breq
cpi
breq
R16
SREG,R16
R16
R16
R16,SREG
R16
frec
frec,3
continuar
frec,1
tiempo1
frec,2
tiempo2
frec,3
tiempo3
tiempo1:
lds
tempo,IL
mov
t1L,tempo
lds
tempo,TCNT1H
mov
t1H,tempo
rjmp continuar
tiempo2:
lds
tempo,TCNT1L
mov
t2L,tempo
lds
tempo,TCNT1H
mov
t2H,tempo
rjmp continuar
tiempo3:
lds
tempo,TCNT1L
mov
t3L,tempo
lds
tempo,TCNT1H
mov
t3H,tempo
rjmp continuar
continuar:
pop
out
pop
RETI
r16
SREG,r16
r16
EJEMPLO
Matriz led de munecos
.include"m164pdef.inc"
.def tempo=r19
.def a=r17
.def b=r18
.def as=r16
ser tempo
out ddra,tempo
out ddrc,tempo
;;activo STACK
ldi tempo,high(ramend) ;ACTIVANDO EL STACK
out sph,tempo
ldi tempo,low(ramend)
out spl,tempo
barrido:
ldi tempo,0b11111110
out portA,tempo
ldi tempo,0b00100100
out portC,tempo
ser tempo
call retardo
out porta,tempo
ldi tempo,0b11111101
out portA,tempo
ldi tempo,0b00010100
out portC,tempo
ser tempo
call retardo
out porta,tempo
ldi tempo,0b11111011
out portA,tempo
ldi tempo,0b00001000
out portC,tempo
ser tempo
call retardo
out porta,tempo
ldi tempo,0b11110111
out portA,tempo
ldi tempo,0b00111100
out portC,tempo
ser tempo
call retardo
out porta,tempo
ldi tempo,0b11101111
out portA,tempo
ldi tempo,0b00001010
out portC,tempo
ser tempo
call retardo
out porta,tempo
ldi tempo,0b11011111
out portA,tempo
ldi tempo,0b00011100
out portC,tempo
ser tempo
call retardo
out porta,tempo
ldi tempo,0b10111111
out portA,tempo
ldi tempo,0b00011100
out portC,tempo
ser tempo
call retardo
out porta,tempo
ldi tempo,0b01111111
out portA,tempo
ldi tempo,0b00011100
out portC,tempo
ser tempo
call retardo
out porta,tempo
call retardote
barrido2:
ldi tempo,0b11111110
out portA,tempo
ldi tempo,0b01001000
out portC,tempo
ser tempo
call retardo
out porta,tempo
;;;
ldi tempo,0b11111101
out portA,tempo
ldi tempo,0b00101000
out portC,tempo
ser tempo
call retardo
out porta,tempo
ldi tempo,0b11111011
out portA,tempo
ldi tempo,0b00001000
out portC,tempo
ser tempo
call retardo
out porta,tempo
ldi tempo,0b11110111
out portA,tempo
ldi tempo,0b00111100
out portC,tempo
ser tempo
call retardo
out porta,tempo
ldi tempo,0b11101111
out portA,tempo
ldi tempo,0b00001010
out portC,tempo
ser tempo
call retardo
out porta,tempo
ldi tempo,0b11011111
out portA,tempo
ldi tempo,0b00011100
out portC,tempo
ser tempo
call retardo
out porta,tempo
ldi tempo,0b10111111
out portA,tempo
ldi tempo,0b00011100
out portC,tempo
ser tempo
call retardo
out porta,tempo
ldi tempo,0b01111111
out portA,tempo
ldi tempo,0b00011100
out portC,tempo
ser tempo
call retardo
out porta,tempo
;;
call retardote
rjmp barrido
retardo:
push r16
ldi r16,255
retardo_1:
nop
dec r16
brne retardo_1
pop r16
ret
retardote:
Lazo0: ldi r16,10;(44)
Lazo1: ldi r17,20 ;(212)
Lazo2: ldi r18,133 ;(133)
retardo1:
dec r18
brne retardo1
dec r17
brne lazo2
dec r16
brne lazo1
ret
EJEMPLO
.include "m164pdef.inc"
.def tempo=r16
.def data=r17
.def cont=r18
.def con=r21
.dseg
num: .byte 1
mayor: .byte 1
menor: .byte 1
vector: .byte 1
N: .byte 1
veces: .byte 1
.cseg
.org 0x00
;configurar entrada
ldi tempo,0b11110000
out ddra,tempo
ldi tempo,0b11111111
out ddrb,tempo
inicio:
in data,pina
sts num,data
clr cont
;Inicio del programa
;PARA <> entre los numeros del vector
ldi xh,high(vector)
ldi xl,low(vector)
ldi zh,high(tabla<<1)
ldi zl,low(tabla<<1)
lpm tempo,z+
sts N,tempo
mov con,tempo
clr tempo
lazo:
mov r19,tempo
lpm tempo,z+
st -x,tempo
cp tempo,r19
brcs menor1
brne mayor1
cp tempo,data
breq incremento
lazo1:
dec con
brne lazo
lds cont,veces
out portb,cont
clr cont
rjmp inicio
menor1:
ldi yh,high(menor)
ldi yl,low(menor)
st y,tempo
cp tempo,data
breq incremento
rjmp lazo1
mayor1:
ldi yh,high(mayor)
ldi yl,low(mayor)
st y,tempo
cp tempo,data
breq incremento
rjmp lazo1
incremento:
inc cont
sts veces,cont
rjmp lazo1
tabla:
.db 5,1,2,3,4,5
EJEMPLO
Clasificadora_de_huevos.asm
.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
EJEMPLO
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
.db 0b01011011,0b01001111
.db 0b01100110,0b01101101
.db 0b01111101,0b00000111
.db 0b01111111,0b01101111
;0,1
;2,3
;4,5
;6,7
;8,9
EJEMPLO
SIRENA PRSIONO PRENDO APAGO
.include "m164pdef.inc"
.def tempo=r16
.def aux=r17
.org 0x0
rjmp inicio
.org 0x2
rjmp boton
inicio:
ldi tempo,0b00000000
out ddrd,tempo
out ddrb,tempo
ldi tempo,0b11111111
out ddra,tempo
ldi tempo,0b11111111
out ddrc,tempo
ldi tempo,low(ramend)
out spl,tempo
ldi tempo,high(ramend)
out sph,tempo
ldi tempo,0b00000010
sts eicra,tempo
ldi tempo,0b00000001
out eimsk,tempo
sei
clr aux
lazo:
out portc,aux
rjmp lazo
boton:
cpi aux,1
brne salir1
ldi tempo,0b00000000
out porta,tempo
rjmp salir
salir1:
inc aux
ldi tempo,0b00000001
out porta,tempo
salir:
pop r16
out sreg,r16
pop r16
reti
EJEMPLO
SEMAFORO
.include "m164pdef.inc"
.def tempo=r16
.def conta=r17
.def estado1=r19
.def estado2=r20
.def aux=r21
.org 0x0
rjmp inicio
.org 0x1a
rjmp segundo
inicio:
;CONFIGURACION DE PUERTOS
ldi tempo,0b11111111
out ddra,tempo
out ddrd,tempo
out ddrc,tempo
out ddrb,tempo
;ACTIVACION DEL STACK
ldi tempo,high(ramend)
out sph,tempo
ldi tempo,low(ramend)
out spl,tempo
;CONFIGURACION DE PUERTO B
COMO SALIDAS DE LOS PARLANTES
;UTILIZACION DE TIMER0
;modo desconectado al principio ctc
ldi tempo,0b00000010
out tccr0a,tempo
;modo ctc preescalador de 8 a 1
ldi tempo,0b00000010
out tccr0b,tempo
;relacion del ocr0a y ocr0b para
obtener frecuencia de 2KHz
ldi tempo,249
out ocr0a,tempo
out ocr0b,tempo
;UTILIZACION DEL TIMER1
;MODO TOGGLE Y CTC PARA
INTERRUPCION DE 1SEG
ldi tempo,0b01000000
sts tccr1a,tempo
;VALOR DEL 0CR1A QUE PRODUCE
EL RETARDO DE 1SEGUNDO
ldi tempo,low(65000)
sts ocr1al,tempo
ldi tempo,high(65000)
sts ocr1ah,tempo
;MODO CTC Y PREESCALADOR DE
RELACION 1:256
ldi tempo,0b00001101
sts tccr1b,tempo
;ACTIVASION DE INTERRUPCION EN
EL TIMER1
ldi tempo,0b00000010
sts timsk1,tempo
clr conta
clr zl
clr zh
;HABILITACION GLOBAL DE
INTERRUPCIONES
sei
lazo:
out portc,conta
;MOSTRAR ESTADO DE SEMAFORO1
out portd,estado2
;MOSTRAR ESTADO DE SEMAFORO2
out porta,estado1
rjmp lazo
segundo:
push r16
in r16,sreg
push r16
;APUNTO A LA TABLA DE
OPERACION DE FUNCIONAMIENTO
DEL PRIMER SEMAFORO
ldi zl,low(tabla_semaforo1<<1)
ldi zh,high(tabla_semaforo1<<1)
inc conta
mov aux,conta
;VERIFICO SI TRANSCURRERON LOS
60SEG DEL CICLO SI ES AS VUELVO
A APUNTAR AL INICIO
;Y SE REPITE EL CICLO
cpi conta,60
brne seguir
clr conta
mov aux,conta
;SI NO HE CULMINADO CON EL
CICLO SIGO AUMENTANDO
seguir:
add zl,aux
clr aux
adc zh,aux
lpm estado2,z
;APUNTO A LA TABLA DE
OPERACION DE FUNCIONAMIENTO
DEL SEGUNDO SEMAFORO
ldi zl,low(tabla_semaforo2<<1)
ldi zh,high(tabla_semaforo2<<1)
mov aux,conta
;VERIFICO SI TRANSCURRERON LOS
60SEG DEL CICLO SI ES AS VUELVO
A APUNTAR AL INICIO
;Y SE REPITE EL CICLO
cpi conta,60
brne seguir11
clr conta
mov aux,conta
seguir11:
add zl,aux
clr aux
adc zh,aux
;CARGO EL VALOR DEL ESTADO
lpm estado1,z
;AQUI SI VA A OBTENER EL ESTADO
DE LA ALARMA
;EN 56SEG ALARMA1 APAGADA
cpi conta,56
brne seguir1
ldi tempo,0b00010010
out tccr0a,tempo
;EN 57SEG ALARMA1 ENECENDIDA
seguir1:
cpi conta,57
brne seguir2
ldi tempo,0b00000010
out tccr0a,tempo
;EN 58SEG ALARMA1 APAGADA
seguir2:
cpi conta,58
brne seguir3
ldi tempo,0b00010010
out tccr0a,tempo
;EN 59SEG ALARMA1 ENECENDIDA
seguir3:
cpi conta,59
brne seguir7
ldi tempo,0b00000010
out tccr0a,tempo
;EN 27SEG ALARMA2 ENECENDIDA
seguir7:
cpi conta,27
brne seguir4
ldi tempo,0b01000010
out tccr0a,tempo
;EN 28SEG ALARMA2 APAGADA
seguir4:
cpi conta,28
brne seguir5
ldi tempo,0b00000010
out tccr0a,tempo
;EN 29SEG ALARMA2 ENECENDIDA
seguir5:
cpi conta,29
brne seguir6
ldi tempo,0b01000010
out tccr0a,tempo
;EN 30SEG ALARMA2 APAGADA
seguir6:
cpi conta,30
brne salir
ldi tempo,0b00000010
out tccr0a,tempo
salir:
pop r16
out sreg,r16
pop r16
reti
;A CONTINUACION SE TAN LAS
TABLAS QUE DESCRIBEN EL
COMPORTAMIENTO
;DE LOS SEMAFOROS EN EL TIEMPO
tabla_semaforo1:
.db
0b00001001,0b00001001;1seg,2se
g
.db
0b00001001,0b00001001;3seg,4se
g
.db
0b00001001,0b00010001;5seg,6se
g
.db
0b00010001,0b00010001;7seg,8se
g
.db
0b00010001,0b00010001;9seg,10s
eg
.db
0b00010001,0b00010001;11seg,12
seg
.db
0b00010001,0b00010001;13seg,14
seg
.db
0b00010001,0b00010001;15seg,16
seg
.db
0b00010001,0b00010001;17seg,18
seg
.db
0b00010001,0b00010001;19seg,20
seg
.db
0b00010001,0b00010001;21seg,22
seg
.db
0b00010001,0b00010001;23seg,24
seg
.db
0b00010001,0b00000001;25seg,26
seg
.db
0b00010001,0b00000001;27seg,28
seg
.db 0b00010001,0b00001001;
29seg,30seg
.db 0b00001100,0b00001100;
31seg,32seg
.db 0b00001100,0b00001100;
33seg,34seg
.db 0b00001100,0b00001100;
35seg,36seg
.db 0b00001100,0b00001100;
37seg,38seg
.db 0b00001100,0b00001100;
39seg,40seg
.db 0b00001100,0b00001100;
41seg,42seg
.db 0b00001100,0b00001100;
43seg,44seg
.db 0b00001100,0b00001100;
45seg,46seg
.db 0b00001100,0b00001100;
47seg,48seg
.db 0b00001100,0b00001100;
49seg,50seg
.db 0b00001100,0b00001100;
51seg,52seg
.db 0b00001100,0b00001100;
53seg,54seg
.db 0b00001100,0b00001010;
55seg,56seg
.db 0b00001010,0b00001010;
57seg,58seg
.db 0b00001010,0b00001010;
59seg 60seg
tabla_semaforo2:
.db
0b00001100,0b00001100;1seg,2se
g
.db
0b00001100,0b00001100;3seg,4se
g
.db
0b00001100,0b00001100;5seg,6se
g
.db
0b00001100,0b00001100;7seg,8se
g
.db
0b00001100,0b00001100;9seg,10s
eg
.db
0b00001100,0b00001100;11seg,12
seg
.db
0b00001100,0b00001100;13seg,14
seg
.db
0b00001100,0b00001100;15seg,16
seg
.db
0b00001100,0b00001100;17seg,18
seg
.db
0b00001100,0b00001100;19seg,20
seg
.db
0b00001100,0b00001100;21seg,22
seg
.db
0b00001100,0b00001100;23seg,24
seg
.db
0b00001100,0b00001010;25seg,26
seg
.db
0b00001010,0b00001010;27seg,28
seg
.db 0b00001010,0b00001010;
29seg,30seg
.db 0b00001001,0b00001001;
31seg,32seg
.db 0b00001001,0b00001001;
33seg,34seg
.db 0b00001001,0b00010001;
35seg,36seg
.db 0b00010001,0b00010001;
37seg,38seg
.db 0b00010001,0b00010001;
39seg,40seg
.db 0b00010001,0b00010001;
41seg,42seg
.db 0b00010001,0b00010001;
43seg,44seg
.db 0b00010001,0b00010001;
45seg,46seg
.db 0b00010001,0b00010001;
47seg,48seg
.db 0b00010001,0b00010001;
49seg,50seg
.db 0b00010001,0b00010001;
51seg,52seg
.db 0b00010001,0b00010001;
53seg,54seg
.db 0b00010001,0b00000001;
55seg,56seg
.db 0b00010001,0b00000001;
57seg,58seg
.db 0b00010001,0b00001001;
59seg 60seg
EJEMPLO
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
EJEMPLO
ONDA CUADRADA DE 100HZ
.include "m164pdef.inc"
.def tempo=r16
.def veces=r17
.org 0x0
rjmp inicio
.org 0x20
rjmp interrupcion
inicio:
ldi tempo,0b00000001
out ddra,tempo
ldi tempo,high(ramend)
out sph,tempo
ldi tempo,low(ramend)
out spl,tempo
ldi tempo,124
out ocr0a,tempo
ldi tempo,0b00000010
out tccr0a,tempo
ldi tempo,0b00000010
sts timsk0,tempo
sei
ldi veces,5
ldi tempo,0b00000011
out tccr0b,tempo
lazo: rjmp lazo
interrupcion:
push r16
in r16,sreg
push r16
dec veces
brne salir
in r16,pina
com r16
out porta,r16
ldi veces,5
salir:
pop r16
out sreg,r16
pop r16
reti
EJEMPLO
VOLTIMETRO
.include "m164pdef.inc"
.dseg
; Lugar donde se van a guardar los 4
dgitos
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
conversin
lds tempo,adcsra
sbrc tempo,adsc
rjmp espera1
otro:
;Puede realizar siguiente conversin
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
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 ctodo comn
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
EJEMPLO
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
TEMPO=R16
AUX=R17
CONT1=R18
CONT2=R19
CONT3=R20
.CSEG
.ORG 0X00
LDI
OUT
LDI
OUT
LDI
OUT
TEMPO,0B11111111
DDRC,TEMPO
TEMPO,0B00000000
DDRD,TEMPO
TEMPO,0B11111111
PORTD,TEMPO
IN
TEMPO,MCUCR
ANDI TEMPO,0B11101111
OUT MCUCR,TEMPO
LDI
OUT
LDI
OUT
TEMPO,HIGH(RAMEND)
SPH,TEMPO
TEMPO,LOW(RAMEND)
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
EJEMPLO
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
EJEMPLO
.DEF
.DEF
.DEF
.DEF
.DEF
TEMPO=R16
AUX=R17
CONT1=R18
CONT2=R19
CONT3=R20
.CSEG
.ORG 0X00
LDI TEMPO,0B01111111
OUT DDRC,TEMPO
LDI
OUT
LDI
OUT
TEMPO,HIGH(RAMEND)
SPH,TEMPO
TEMPO,LOW(RAMEND)
SPL,TEMPO
BARRIDO:
LDI ZH,HIGH(TABLA<<1)
LDI ZL,LOW(TABLA<<1)
LDI R16,4
SER AUX
OUT PORTC,AUX
OTRO:
LPM AUX,Z+
OUT PORTC,AUX
CALL RETARDO
DEC R16
BRNE OTRO
RJMP BARRIDO
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
TABLA:
.DB 0B00001001,0B01000000
.DB 0B01000111,0B00001000
/*
* Preparatorio_11.asm
*
* Created: 25/10/2013 17:13:34
* Author: vivia_000
*/
.DEF
.DEF
.DEF
.DEF
.DEF
.DEF
.DEF
.DEF
.DEF
TEMPO=R16
NUMAA=R17
NUMBB=R18
NUMA=R19
NUMB=R20
DECENAS=R21
CENTENAS=R22
MILES=R23
AUX=R24
.DSEG
DIG0: .BYTE
DIG1: .BYTE
DIG2: .BYTE
DIG3: .BYTE
SEG0: .BYTE
SEG1: .BYTE
SEG2: .BYTE
SEG3: .BYTE
1
1
1
1
1
1
1
1
.CSEG
.ORG 0X00
;CONFIGURO PUERTOS
LDI
OUT
OUT
OUT
LDI
OUT
LDI
OUT
LDI
OUT
TEMPO,0B00000000
DDRA,TEMPO
DDRB,TEMPO
PORTA,TEMPO
TEMPO,0B00001111
DDRD,TEMPO
TEMPO,0B01111111
DDRC,TEMPO
TEMPO,0B11111111
PORTB,TEMPO
;ACTIVO PULL UP
IN
TEMPO,MCUCR
ANDI TEMPO,0B11101111
OUT MCUCR,TEMPO
;CONFIGURO STACK POINTER
LDI
OUT
LDI
OUT
EJEMPLO
MAIN:
TEMPO,HIGH(RAMEND)
SPH,TEMPO
TEMPO,LOW(RAMEND)
SPL,TEMPO
SBIS PINB,0
RJMP TEMPERATURA
RJMP POTENCIOMETRO
ADC NUMB,NUMBB
DEC AUX
BRNE SUMA1
POTENCIOMETRO:
;CONFIGURO A/D
LDI
TEMPO,0B01000000
STS
ADMUX,TEMPO
LDI
TEMPO,0B11000110
STS
ADCSRA,TEMPO
ESPERA:
LDS TEMPO,ADCSRA
SBRC TEMPO,6
RJMP ESPERA
LDS NUMA,ADCL
LDS NUMB,ADCH
MOV NUMAA,NUMA
MOV NUMBB,NUMB
LDI
AUX,9
CALL
CALL
CALL
RJMP
SUMA:
ADD NUMA,NUMAA
ADC NUMB,NUMBB
DEC AUX
BRNE SUMA
CLC
ROR NUMB
ROR NUMA
CALL BINARIO_BCD
CALL BCD_7SEG
CALL BARRIDO
RJMP MAIN
TEMPERATURA:
;CONFIGURO CONVERSOR A/D
LDI
TEMPO,0B11000001
STS
ADMUX,TEMPO
LDI
TEMPO,0B11000110
STS
ADCSRA,TEMPO
ESPERA1:
LDS TEMPO,ADCSRA
SBRC TEMPO,6
RJMP ESPERA1
LDS NUMA,ADCL
LDS NUMB,ADCH
CLC
ROR NUMB
ROR NUMA
CLC
ROR NUMB
ROR NUMA
MOV NUMAA,NUMA
MOV NUMBB,NUMB
LDI
AUX,9
SUMA1:
ADD NUMA,NUMAA
BINARIO_BCD
BCD_7SEG
BARRIDO
MAIN
BINARIO_BCD:
CLR
CLR
CLR
DECENAS
CENTENAS
MILES
MILES1:
SUBI
SBCI
BRCS
INC
RJMP
NUMA,LOW(1000)
NUMB,HIGH(1000)
CENTENAS1
MILES
MILES1
CENTENAS1:
STS
SUBI
SBCI
DIG3,MILES
NUMA,LOW(-1000)
NUMB,HIGH(-1000)
CENTENAS2:
SUBI
SBCI
BRCS
INC
RJMP
NUMA,LOW(100)
NUMB,HIGH(100)
DECENAS1
CENTENAS
CENTENAS2
DECENAS1:
STS
SUBI
SBCI
DIG2,CENTENAS
NUMA,LOW(-100)
NUMB,HIGH(-100)
DECENAS2:
SUBI
BRCS
INC
RJMP
NUMA,10
UNIDADES1
DECENAS
DECENAS2
UNIDADES1:
STS
SUBI
STS
RET
DIG1,DECENAS
NUMA,-10
DIG0,NUMA
BCD_7SEG:
OUT
PUSH
PUSH
PUSH
PUSH
PUSH
PUSH
PUSH
PUSH
R16
R17
ZL
ZH
XL
XH
YL
YH
LDI
LDI
LDI
LDI
LDI
YH,HIGH(DIG0)
YL,LOW(DIG0)
XH,HIGH(SEG0)
XL,LOW(SEG0)
R17,4
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
POP
POP
POP
POP
POP
POP
POP
RET
YH
YL
XH
XL
ZH
ZL
R17
R16
BARRIDO:
PUSH R16
PUSH R17
PUSH R18
PUSH XH
PUSH XL
LDI
R16,4
LDI
XH,HIGH(SEG0)
LDI
XL,LOW(SEG0)
SEC
LDI
R18,0B11111110
SER R17
OUT PORTC,R17
OTRO_DIG:
OUT PORTD,R18
LD
R17,X+
OUT PORTC,R17
CALL RETARDO
SER R17
PORTC,R17
ROL R18
DEC R16
BRNE OTRO_DIG
POP
POP
POP
POP
POP
RET
XL
XH
R18
R17
R16
RETARDO:
PUSH R16
LDI
R16,255
LAZO_RETARDO:
NOP
DEC R16
BRNE LAZO_RETARDO
POP
RET
R16
TABLA_7SEG:
.DB
0B1000000,0B1111001
;0,1
.DB
0B0100100,0B0110000
;2,3
.DB
0B0011001,0B0010010
;4,5
.DB
0B0000011,0B1111000
;6,7
.DB
0B0000000,0B0010000
;8,9
.include "m164pdef.inc"
.def
.def
.def
.def
.def
.def
.def
conta1=r16
conta2=r17
conta3=r18
conta4=r19
tempo=r20
ante=r21
aux=r22
.dseg
numero1:
numero2:
numero3:
numero4:
.byte
.byte
.byte
.byte
1
1
1
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
EJEMPLO
;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
sbrc tempo,2
call jugador3
sbrc tempo,3
call jugador4
pop r16
out sreg,r16
pop r16
reti
;HABILITACION GLOBAL DE
INTERRUPCIONES
sei
jugador1:
clr
clr
clr
clr
sbrc ante,0
ret
inc conta1
ret
conta1
conta2
conta3
conta4
jugador2:
sbrc ante,1
ret
inc conta2
ret
jugador3:
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 ante,2
ret
inc conta3
ret
jugador4:
sbrc ante,3
ret
inc conta4
ret
brne retardo_1
pop r16
barrido:
ret
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
bcd_7seg:
push
push
push
push
push
push
push
push
push
push
push
xl
xh
yl
yh
zl
zh
conta1
conta2
conta3
conta4
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
retardo_1:
mov tempo,conta4
add zl,tempo
dec r16
lpm tempo,z
st x+,tempo
pop
pop
pop
pop
pop
pop
pop
pop
pop
pop
pop
ret
tempo
conta4
conta3
conta2
conta1
zh
zl
yh
yl
xh
xl
tabla:
.db 0b00111111,0b00000110
.db 0b01011011,0b01001111
EJEMPLO
CONVERSOR AD 10 LEDS
.include "m164pdef.inc"
.def tempo=r16
.def resh=r17
.def resl=r18
.org 0x0
ldi tempo,0b00000001
out ddra, tempo
ldi tempo,0b11111111
out ddrb,tempo
out ddrc,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
out portb,resh
out portc,resl
rjmp otro
EJEMPLO
Clave auto
.include "m164pdef.inc"
;=====================
========DEFINICION DE
VARIABLES===============
===========
.def tempo=r16
;Variable
temporal
.def pulsos=r17
;Variable
de conteo de pulsaciones
.def tempo2=r18
;Variable
temporal2
.def espera=r19
;Variable
de espera
.def veces=r20
;Variable
conteo numero de fallos
.def senal_paro=r21
;Variable que da la senal de
paro
.def boton=r22
;Variable
temporal del boton oprimido
.def clave=r23
;Variable
temporal de la secuencia correcta
.def flag=r24
;Variable
que indica si ha pasado 1 seg
.def conta_int=r25 ;Variable que
cuenta el numero de interrupciones
generadas por el timer0
;
======================
========ESPACIO EN LA
SRAM==================
=============
.dseg
PASSWORD: .byte 6
;
======================
========SALTOS A
PROGRAMAS==============
=================
.cseg
;INICIO DEL PROGRAMA PRINCIPAL
.org 0x00
rjmp principal
;INICIO DE SUBRUTINA DE
INTERRUPCION PARA PCINT0
.org 0x08
rjmp secuencia
;INICIO DE SUBRUTINA POR
INTERRUPCION DE DESBORDE DEL
TIMER0
.org 0x09
rjmp int_tmr0
;========CONFIGURACION DE
PORTICOS, INTERRUPCIONES Y
MEMORIA
RAM================
principal:
;STACK POINTER
ldi tempo,low(ramend)
out spl,tempo
ldi tempo,high(ramend)
out sph,tempo
;PORTICOS DE ENTRADA Y DE
SALIDA
ldi tempo,0b00000000
out ddra,tempo
;PULL UP
ldi tempo,255
out porta,tempo
ldi tempo,255
out ddrb,tempo
;CONFIGURACION DE
INTERRUPCIONES POR CAMBIO DE
ESTADO
ldi tempo,0b00000000
out eimsk,tempo
;HABILITACION DE INTERRUPCIONES
POR CAMBIO DE ESTADO EN PCINT0PCINT7
ldi tempo,0b00000001
sts pcicr,tempo
;CONFIGURACION DE MASCARAS DE
PCINT0-PCINT5 (PUERTO A:
PULSANTES)
ldi tempo,0b00011111
sts pcmsk0,tempo
ldi veces,3 ;contador para
bloquear luego de 3 intentos fallidos
;
======================
=====CONFIGURACION
INICIAL=================
==============
config_ini:
;PUNTERO AL ESPACIO DE
ALMACENAMIENTO DE LA
SECUENCIA
ldi xl,low(PASSWORD)
ldi xh,high(PASSWORD)
;INICIO VARIABLES
clr senal_paro
cli
;BORRADO DE LA BANDERA
DE INTERRUPCION
;NUMERO MAX DE PULSACIONES
ldi pulsos,6
;CONFIGURO ESPERA EN CERO PARA
BUCLE QUE TERMINA CON LA
PRIMERA INTERRUPCION
ldi espera,0
;
======================
=======INICIO DEL
PROGRAMA===============
================
espera_inicio:
;PRENDE EL LED AMARILLO
MIENTRAS ESPERA POR EL INGRESO
DE LA CLAVE
cli
;LED AMARILLO SE PRENDE EN PB0
ldi tempo,0b00000001
out portb,tempo
;LA ESPERA TERMINA SI SE PULSA
UNA TECLA (ESPERA=1)
sei
cpi espera,0
brne comprob_bloqueo
rjmp espera_inicio
;
==============COMPROBAC
ION DEL BLOQUEO POR NUMERO DE
INTENTOS================
==
comprob_bloqueo:
;LLAMADO AL RETARDO DE 5 SEG
CON TIMER
rcall timer_5
cpi veces,0
brne bloqueo_tempo
;
======================
=VERIFICACION DE LA
CLAVE==================
==============
;comprobar2:
;llamado al
led rojo en caso de que no se haya
ingresado la clave en los 5
sgeundos
;
rcall comprobar
;llamado a la rutina de
comprobacion de la secuencia
ingresada
;
rjmp inicio
;regreso para ingresar
nuevamente una secuencia
verif_clave:
;PUNTERO A LA SECUENCIA
CORRECTA
ldi zl,low(tabla_sec<<1)
ldi zh,high(tabla_sec<<1)
;CARGA DE PUNTEROS DE
SECUENCIA CORRECTA Y
SECUENCIA INGRESADA
ld clave,z+
ld boton,-x
;COMPARACION DE BOTON
APLASTADO Y CLAVE
cp boton,clave
brne bloqueo_tempo
ld boton,z+
ld clave,-x
cp boton,clave
brne bloqueo_tempo
ld boton,z+
ld clave,-x
cp boton,clave
brne bloqueo_tempo
ld boton,z+
ld clave,-x
cp boton,clave
brne bloqueo_tempo
ld boton,z+
ld clave,-x
cp boton,clave
brne bloqueo_tempo
rjmp sec_correcta
;
====================BL
OQUEO TEMPORAL ANTES DE 3
INTENTOS================
=======
bloqueo_tempo:
cli
;PRENDO EL LED ROJO QUE ESTA EN
EL SEGUNDO PIN DEL PORTICO B
ldi tempo,0b00000010
out portb,tempo
;LLAMO AL RETARDO DE 5 SEG
rcall timer_5
;DECREMENTO Y COMPARACION DEL
CONTADOR DEL NUMERO DE VECES
FALLIDAS
dec veces
cpi veces,0
;SALTO AL BLOQUEO PERMANENTE
DEL UC
breq bloqueo_perman
rjmp espera_inicio
;
==================BLOQ
UEO TEMPORAL DESPUES DE 3
INTENTOS================
=======
bloqueo_perman:
;PRENDO EL LED ROJO QUE ESTA EN
EL SEGUNDO PIN DEL PORTICO B
ldi tempo,0b00000010
out portb,tempo
;LLAMO AL RETARDO DE 5 SEG
rcall timer_5
;BUCLE INFINITO
rjmp bloqueo_perman
;
======================
========SECUENCIA
CORRECTA===============
================
sec_correcta:
cli
;PRENDO EL LED VERDE QUE ESTA
EN EL TERCER PIN DEL PORTICO B
ldi tempo,0b00000100
out portb,tempo
;LLAMO AL RETARDO DE 5 SEG
rcall timer_5
rjmp principal
;
======================
====IDENTIFICACION DE
PULSACION===============
===========
secuencia:
clr tempo2
;VERIFICO CUAL ES EL PIN QUE NO
ESTA SETEADO
sbis pina,0
rcall boton1
sbis pina,1
rcall boton2
sbis pina,2
rcall boton3
sbis pina,3
rcall boton4
sbis pina,4
rcall boton5
;VERIFICO QUE SE HAYA APLASTADO
UN BOTON
cpi tempo2,0
;SI NO SE HA APLASTADO UN BOTON
REGRESA A COMPROBAR LA CLAVE
breq regresar
dec pulsos
regresar:
cpi senal_paro,6
breq verif_clave
reti
;
==================SUBR
UTINAS DE ALMACENAMIENTO DE
SECUENCIA===============
=====
;SI EL BOTON 1 (PA0) SE HA
PRESIONADO
boton1:
;SE CARGA LOS DATOS EN EL
ESPACIO DE MEMORIA PASSWORD
ldi tempo2,1
st x+,tempo2
ldi espera,1
;SE AUMENTA LA SENAL DE PARO
QUE AL LLEGAR A 6 SALTA A
VERIFICAR LA SECUENCIA
inc senal_paro
ret
;SI EL BOTON 2 (PA1) SE HA
PRESIONADO
boton2:
;SE CARGA LOS DATOS EN EL
ESPACIO DE MEMORIA PASSWORD
ldi tempo2,2
st x+,tempo2
ldi espera,1
;SE AUMENTA LA SENAL DE PARO
QUE AL LLEGAR A 6 SALTA A
VERIFICAR LA SECUENCIA
inc senal_paro
ret
;SI EL BOTON 3 (PA2) SE HA
PRESIONADO
boton3:
;SE CARGA LOS DATOS EN EL
ESPACIO DE MEMORIA PASSWORD
ldi tempo2,3
st x+,tempo2
ldi espera,1
;SE AUMENTA LA SENAL DE PARO
QUE AL LLEGAR A 6 SALTA A
VERIFICAR LA SECUENCIA
inc senal_paro
ret
;SI EL BOTON 4 (PA3) SE HA
PRESIONADO
boton4:
;SE CARGA LOS DATOS EN EL
ESPACIO DE MEMORIA PASSWORD
ldi tempo2,4
st x+,tempo2
ldi espera,1
;SE AUMENTA LA SENAL DE PARO
QUE AL LLEGAR A 6 SALTA A
VERIFICAR LA SECUENCIA
inc senal_paro
ret
;SI EL BOTON 5 (PA4) SE HA
PRESIONADO
boton5:
;SE CARGA LOS DATOS EN EL
ESPACIO DE MEMORIA PASSWORD
ldi tempo2,5
st x+,tempo2
ldi espera,1
;SE AUMENTA LA SENAL DE PARO
QUE AL LLEGAR A 6 SALTA A
VERIFICAR LA SECUENCIA
inc senal_paro
ret
;
======================
=======RETARDO DE 5 SEG POR
TIMER==================
======
timer_5:
ldi veces,5
timer_51:
ldi tempo2,0
;COMPRUEBO SI HA PASADO 5
VECES LA RUTINA DE 1 SEGUNDO
cp veces, tempo2
;SI HAN PASADO 5 VECES REGRESO
DE LA SUBRUTINA
brne timer_1
ret
timer_1:
;PONEMOS A CERO LA BANDERA Y
EL CONTADOR
clr flag
clr conta_int
;CONFIGURO EL TIMER0 CON
PREESCALER=256
ldi tempo,4
out tccr0A,tempo
;CONFIGURO LA PRECARGA PARA
CONTAR SOLAMENTE 125 ESTADO
DE TIMER
ldi tempo,130
out tcnt0,tempo
loop:
;SE CONFIRMA SI HA PASADO 1 SEG
cpi flag,255
;SALTO A DECREMENTO DEL
CONTADOR
breq toggle
rjmp loop
toggle:
dec veces
clr flag
;REGRESO A COMPROBAR SI HAN
PASADO LOS 5 SEG
rjmp timer_51
;===============RUTINA DE
INTERRUPCION POR DESBORDE DEL
TIMER0=================
=
int_tmr0:
;INCREMENTO DEL CONTADOR
inc conta_int
;VERIFICAR SI HAN PASADO 125
INTERRUPCIONES
cpi conta_int,125
;SI NO, SALIR DE LA RUTINA
brne salir1
.def aux2=r18
.def datos_in=r19 ;datos de
seleccion de salidas adc
.def alta=r20
;bits altos de adc
.def baja=r21
;bits bajos de
adc
;configuro puerto a como entrada
adc
ldi tempo,0
out ddra,tempo
out porta,tempo
ldi tempo,254
sts didr0,tempo
;configuracion de puertob como
entrada de datos
config_in:
ldi tempo,0
out ddrb,tempo
out portb,tempo
ldi aux,0
.include "m164pdef.inc"
.def tempo=r16
.def aux=r17
par:
ror aux ;Divido para 2
brcs error ;Si el carry se setea es
impar
rol aux
cpi aux,0 ;Compruebo dato fuera de
rango
breq error
;Configuracion del portb como salida
de datos
config_out:
ldi tempo,1
out ddrb,tempo
ldi tempo,0
out portb,tempo
condicion: .byte 1
vmin: .byte 1
vmax: .byte 1
segmentos: .byte 4
.cseg
.org 0x00
rjmp principal
.org 0x06
rjmp cambio
principal:
ldi tempo,0b11111010
out ddra,tempo
com tempo
out porta,tempo
ldi tempo,0b00000000
out portc,tempo
com tempo
out ddrc,tempo
ldi tempo,0b00001111
out ddrd,tempo
com tempo
out portd,tempo
ldi tempo,0b00000000
out ddrb,tempo
com tempo
out portb,tempo
EJEMPLO
Voltimetro y termmetro prepa10
.include "m164pdef.inc"
.def tempo=r16
.dseg
numero1: .byte 1
numero2: .byte 1
numero3: .byte 1
numero4: .byte 1
numero5: .byte 1
digito: .byte 4
;Configuracion A/D
ldi tempo,0b01000000
sts admux,tempo
ldi tempo,0b00000101
sts didr0,tempo
ldi tempo,0b00100000
sts eicra,tempo
ldi tempo,0b00000100
out eimsk,tempo
sei
ldi tempo,0
sts condicion,tempo
pulsador:
lds r18,condicion
cpi r18,0
breq voltimetro
call termometro
retorno:
rjmp pulsador
sts numero3,r19
sts numero4,r24
call bin_bcd
call bcd_7seg
call barrido
rjmp retorno
bin_bcd:
voltimetro:
ldi tempo,0b11000110
sts adcsra,tempo
interrup11:
lds tempo,adcsra
sbrc tempo,6
rjmp interrup11
lds tempo,adcl
sts vmin,tempo
lds tempo,adch
sts vmax,tempo
lds r20,vmin
lds r21,vmax
ldi r22,low(9775)
ldi r23,high(9775)
mul r20,r22
mov r24,r0
mov r25,r1
mul r20,r23
mov r16,r0
mov r17,r1
ldi r18,0
add r25,r16
adc r17,r18
sts numero1,r24
mul r21,r22
mov r24,r0
mov r18,r1
add r25,r24
sts numero2,r25
adc r17,r18
clr r18
mul r21,r23
mov r19,r0
mov r24,r1
add r19,r17
adc r24,r18
push
push
push
push
push
push
push
push
push
push
push
push
push
push
r16
r17
r18
r19
r20
r21
r22
r23
r24
r25
xl
xh
zl
zh
clr R16
lds
r17,numero1
lds
r18,numero2
lds
r19,numero3
lds
r20,numero4
ldi
r21,4
ldi
xl,low(digito)
ldi
xh,high(digito)
ldi
zl,low(constantes<<1)
ldi
zh,high(constantes<<1)
bin_bcd0:
lpm
lpm
lpm
lpm
lpm
r22,z+
r22,z+
r23,z+
r24,z+
r25,z+
bin_bcd1:
sub
r17,r25
sbc
r18,r24
sbc
r19,r23
sbc
r20,r22
brcs bin_bcd2
inc
r16
rjmp bin_bcd1
bin_bcd2:
add
adc
adc
r17,r25
r18,r24
r19,r23
adc
r20,r22
st
x+,r16
clr
r16
dec
r21
brne bin_bcd0
ret
pop
pop
r17
r16
barrido:
pop
pop
pop
pop
pop
pop
pop
pop
pop
pop
pop
pop
pop
pop
zh
zl
xh
xl
r25
r24
r23
r22
r21
r20
r19
r18
r17
r16
push
push
push
push
push
ldi
ldi
ldi
ldi
ser
r16
out
portd,r16
ld
r16,x+
cpi
r17,4
brne punto
ori
r16,0b10000000
bcd_7seg:
ldi
ldi
ldi
ldi
ldi
r16
r17
xl
xh
yl
yh
zl
zh
punto:
out
portc,r16
out
portd,r18
call retardo_barrido
sec
ror
r18
dec
r17
brne barrido0
ser
r16
out
portd,r16
xh,high(segmentos)
xl,low(segmentos)
yh,high(digito)
yl,low(digito)
r17,4
bcd_7seg0:
ldi
zh,high(tabla_seg<<1)
ldi
zl,low(tabla_seg<<1)
ld
r16,y+
add
zl,r16
clr
r16
adc
zh,r16
lpm
r16,z
st
x+,r16
dec
r17
brne bcd_7seg0
pop
pop
pop
pop
pop
pop
zh
zl
yh
yl
xh
xl
r17,4
xh,high(segmentos)
xl,low(segmentos)
r18,0b11110111
barrido0:
ret
push
push
push
push
push
push
push
push
r16
r17
r18
xl
xh
ret
pop
pop
pop
pop
pop
xh
xl
r18
r17
r16
retardo_barrido:
push r16
ldi
r16,255
retardo0:
nop
dec
r16
brne retardo0
ret
pop r16
call barrido2
termometro:
ldi tempo,0b11000110
sts adcsra,tempo
interrup111:
lds tempo,adcsra
sbrc tempo,6
rjmp interrup111
lds tempo,adcl
sts vmin,tempo
lds tempo,adch
sts vmax,tempo
ret
barrido2:
push
push
push
push
push
push
push
push
push
push
push
lds r20,vmin
lds r21,vmax
ldi r22,low(25024)
ldi r23,high(25024)
mul r20,r22
mov r24,r0
mov r25,r1
mul r20,r23
mov r16,r0
mov r17,r1
barrido3:
ldi r18,0
add r25,r16
adc r17,r18
ldi
ldi
ldi
ldi
sts numero1,r24
mul r21,r22
mov r24,r0
mov r18,r1
add r25,r24
sts numero2,r25
adc r17,r18
clr r18
mul r21,r23
mov r19,r0
mov r24,r1
add r19,r17
adc r24,r18
sts numero3,r19
sts numero4,r24
call bin_bcd
call bcd_7seg
r16
r17
r18
r19
r20
r21
r22
xl
xh
yl
yh
xl,LOW(segmentos)
xh,HIGH(segmentos)
r18,0b11110111
r17,4
barrido4:
ser R16
out portd,R16
escan:
ld r16,X+
cpi r17,3
brne continua1
ori r16,0b10000000
continua1:
out SEGME,r16
out DISPL,r18
call retardo_barrido2
sec
ror r18
dec r17
brne barrido4
ser r16
out portd,r16
rjmp salto2
barrido1:
ret
cambio:
push r16
in r16,sreg
ldi xl,LOW(segmentos)
ldi xh,HIGH(segmentos)
ldi r18,0b11110111
ldi r17,4
push r17
push r18
push r19
clr r17
clr r18
clr r19
barrido5:
ser r16
out portd,r16
ld r16,x+
cpi r17,4
brne continua2
ori r16,0b10000000
lds r17,admux
sbrs r17,1
rjmp leer
ldi r19,0
ldi r18,0b01000000
rjmp salir
continua2:
out SEGME,r16
out DISPL,r18
call retardo_barrido2
sec
ror r18
dec r17
brne barrido5
ser r16
out portd,r16
leer:
ldi r19,1
ldi r18,0b11000010
salir:
salto2:
nop
ret
pop
pop
pop
pop
pop
pop
pop
pop
pop
pop
pop
brne salto
pop r16
sts condicion,r19
sts admux,r18
pop r19
pop R18
pop r17
out sreg,R16
pop R16
reti
yh
yl
xh
xl
r22
r21
r20
r19
r18
r17
r16
retardo_barrido2:
push r16
ldi r16,255
constantes:
.db 0b00000000, 0b00000000
.db 0b00001111, 0b01000010
.db 0b01000000, 0b00000000
.db 0b00000000, 0b00000001
.db 0b10000110, 0b10100000
.db 0b00000000 , 0b00000000
.db 0b00000000, 0b00100111
.db 0b00010000, 0b00000000
.db 0b00000000, 0b00000000
.db 0b00000011, 0b11101000
.db 0b00000000, 0b00000000
.db 0b00000000, 0b00000000
.db 0b01100100, 0b00000000
.db 0b00000000, 0b00000000
.db 0b00000000, 0b00001010
tabla_seg:
salto:
dec R16
.db 0b00111111,0b00000110
.db
.db
.db
.db
0b01011011,0b01001111
0b01100110,0b01101101
0b01111101,0b00000111
0b01111111,0b01101111
EJEMPLO
/*
* debertimer0.asm
*
* Created: 12/01/2015 17:30:49
* Author: Edder
*/
.include"m164pdef.inc"
.def tempo=r16
.def cont=r17
.def aux=r18
.def veces=r19
.def cont1=r20
.org 0x00
rjmp inicio
.org 0x02
rjmp encendido
.org 0x04
rjmp subir
.org 0x06
rjmp bajar
.org 0x20
rjmp tiempo
inicio:
ldi tempo,0b00000000
out ddrb,tempo
out ddrd,tempo
ldi tempo,0b11111111
out ddrc,tempo
out ddra,tempo
out portb,tempo
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
ldi tempo,0b00101010
sts EICRA,tempo
ldi tempo,0b00000111
out EIMSK,tempo
out EIFR,tempo
clr cont
SEI
apagado:
clr aux
out porta,aux
lazo:
cpi cont,0
breq apagado
cpi cont1,0
breq cuartoseg
cpi cont1,1
breq medioseg
cpi cont1,2
breq unseg
cpi cont1,3
breq dosseg
rjmp lazo
cuartoseg:
ldi tempo,0b01000010
out tccr0a,tempo
ldi tempo,124
out ocr0a,tempo
ldi veces,125
ldi tempo,0b00000101
sts tccr0b,tempo
ldi tempo,0b00000010
sts timsk0,tempo
sei
lazo1:
rjmp lazo1
medioseg:
ldi tempo,0b00000010
out tccr0a,tempo
ldi tempo,124
out ocr0a,tempo
ldi veces,125
ldi tempo,0b00000100
sts tccr0b,tempo
ldi tempo,0b00000010
sts timsk0,tempo
sei
rjmp lazo
unseg:
ldi tempo,0b00000010
out tccr0a,tempo
ldi tempo,249
out ocr0a,tempo
ldi veces,125
ldi tempo,0b00000100
sts tccr0b,tempo
ldi tempo,0b00000010
sts timsk0,tempo
sei
rjmp lazo
dosseg:
ldi tempo,0b00000010
out tccr0a,tempo
ldi tempo,249
out ocr0a,tempo
ldi veces,250
ldi tempo,0b00000100
sts tccr0b,tempo
ldi tempo,0b00000010
sts timsk0,tempo
sei
rjmp lazo
tiempo:
push r16
in r16,sreg
push r16
dec veces
brne salir
in r16,pina
com r16
out porta,tempo
cpi cont1,0
breq cuarto
cpi cont1,1
breq medio
cpi cont1,2
breq uno
cpi cont1,3
breq dos
cuarto:
ldi veces,125
rjmp salir
medio:
ldi veces,125
rjmp salir
uno:
ldi veces,125
rjmp salir
dos:
ldi veces,250
rjmp salir
salir:
pop r16
out sreg,r16
pop r16
reti
encendido:
push r16
in r16,sreg
push r16
inc cont
cpi cont,2
brne siga
ldi cont,0
siga:
pop r16
out sreg,r16
pop r16
RETI
subir:
push r16
in r16,sreg
push r16
inc cont1
cpi cont1,4
breq redefinir1
rjmp saltoo
redefinir1:
ldi cont1,3
saltoo:
pop r16
out sreg,r16
pop r16
reti
bajar:
push r16
in r16,sreg
push r16
cpi cont1,0
breq redefinir
dec cont1
rjmp saltoo1
redefinir:
ldi cont1,0
saltoo1:
pop r16
out sreg,r16
pop r16
reti
dato: .byte 1
valor_a: .byte 1
valor_b: .byte 1
valor_c: .byte 1
valor_x: .byte 1
respta: .byte 2
res0: .byte 1
res1: .byte 1
res2: .byte 1
binlow: .byte 1
binhigh: .byte 1
bcd0: .byte 1
bcd1: .byte 1
bcd2: .byte 1
bcd3: .byte 1
bcd4: .byte 1
dig0: .byte 1
dig1: .byte 1
dig2: .byte 1
dig3: .byte 1
.cseg
.org 0x000
rjmp inicio
.org 0x002
rjmp teclado
.org 0x040
inicio:
ldi tempo,0b00001111
out ddrb,tempo
ldi tempo,0
out ddrd,tempo
ldi tempo,255
out ddra,tempo
out ddrc,tempo
out portb,tempo
out portd,tempo
EJEMPLO
.include"m164pdef.inc"
.def tempo=r16
.def tecla=r17
.def catodo=r18
.def aux=r19
.def num1=r22
.def num2=r23
.def num3=r20
.def num4=r24
.def aux1=r21
.def display=r3
.dseg
ser tempo
out porta,tempo
sec
rol catodo
out porta,catodo
mov display, num3
call bin_7seg
out portc,display
call retardo
ser tempo
out porta,tempo
sec
rol catodo
out porta,catodo
mov display, num4
call bin_7seg
out portc,display
call retardo
ser tempo
out porta,tempo
rjmp lazo
datoa:
lds aux1,dato
sts valor_a,aux1
rjmp borrar
datob:
lds aux1,dato
sts valor_b,aux1
rjmp borrar
datoc:
lds aux1,dato
sts valor_c,aux1
rjmp borrar
datox:
lds aux1,dato
sts valor_x,aux1
rjmp borrar
resultado:
lds r18,valor_a
lds r19,valor_c
lds r20,valor_b
lds r21,valor_x
mul r21,r21; x por x
mov r5,r0 ;parte baja de x^2
mov r6,r1;parte alta de x^2
mov r7,r18;valor de a
mul r5,r7;a x parte baja de x^2
sts res2,r0
mov r8,r1
mul r7,r6
add r8,r0
sts res1,r8
ldi r22,0
adc r22,r1
sts res0,r22
mul r19,r21
lds r22,res2
lds r23,res1
lds r24,res0
add r22,r0
;adc r22,r20
adc r23,r1
ldi r18,0
adc r24,r18
adc r22,r20
adc r23,r18
add r24,r18
add r18,r19
add r20,r18
add r23,r20
ldi r23,0x10
ldi r23,0x27
cp r22,r23
cpc r23,r23
brcs rangovalido
ldi num1,16
ldi num2,16
ldi num3,16
ldi num4,16
ldi tecla,0xbb
rjmp barrido0
rangovalido:
sts binlow,r22
sts binhigh,r23
call binbcd
lds num4,bcd3
lds num3,bcd2
lds num2,bcd1
lds num1,bcd0
rjmp barrido0
ldi tecla,0xbb
rjmp lazo
teclado:
push r16
in r16,sreg
push r16
ldi tempo,0b00000111
out portb,tempo
sbis pinb,4// salta si esta en 1l
ldi tecla,0x1
sbis pinb,5
ldi tecla,0x4
sbis pinb,6
ldi tecla,0x7
sbis pinb,7
ldi tecla,0xD
ldi tempo,0b00001011
out portb,tempo
sbis pinb,4// salta si esta en 1l
ldi tecla,0x2
sbis pinb,5
ldi tecla,0x5
sbis pinb,6
ldi tecla,0x8
sbis pinb,7
ldi tecla,0x0
ldi tempo,0b00001101
out portb,tempo
sbis pinb,4// salta si esta en 1l
ldi tecla,0x3
sbis pinb,5
ldi tecla,0x6
sbis pinb,6
ldi tecla,0x9
sbis pinb,7
ldi tecla,0xE
ldi tempo,0b00001110
out portb,tempo
sbis pinb,4// salta si esta en 1l
ldi tecla,0xA
sbis pinb,5
ldi tecla,0xB
sbis pinb,6
ldi tecla,0xC
sbis pinb,7
ldi tecla,0xF
clr tempo
out portb,tempo
pop r16
out sreg,r16
pop r16
reti
bin_7seg:
ldi zh, high(tabla7<<1)
ldi zl, low(tabla7<<1)
add zl,display
lpm display,z
ret
binbcd:
push r17
push
push
push
push
r18
r19
r20
r21
lds r18,binlow
lds r19,binhigh
clr r17
otradecmil:
subi r18,16
sbci r19,39
brcs decmil
inc r17
rjmp otradecmil
decmil:
ldi r20,16
add r18,r20
ldi r20,39
adc r19,r20
sts bcd4,r17
clr r17
otramil:
subi r18,232
sbci r19,3
brcs cent
inc r17
rjmp otramil
cent:
ldi r20,232
add r18,r20
ldi r20,3
adc r19,r20
sts bcd3,r17
clr r17
otracent:
subi r18,100
sbci r19,0
brcs decenas
inc r17
rjmp otracent
decenas:
ldi r20,100
add r18,r20
ldi r20,0
adc r19,r20
sts bcd2,r17
clr r17
otrodec:
subi r18,10
sbci r19,0
brcs unidades
inc r17
rjmp otrodec
unidades:
ldi r20,10
add r18,r20
ldi r20,0
adc r19,r20
sts bcd1,r17
sts bcd0,r18
pop
pop
pop
pop
pop
r21
r20
r19
r18
r17
ret
retardo:
; ldi r23,10
;lazo3:
ldi r26,10
lazo2:
ldi r25,255; retardo
lazo1:
dec r25
brne lazo1
dec r26
brne lazo2
;dec r23
;brne lazo3
ret
tabla7:
.db 0b00111111,0b00000110 ;0,1
.db 0b01011011,0b01001111
.db 0b01100110,0b01101101
.db 0b01111101,0b00000111
.db 0b01111111,0b01101111
.db 0b01110111,0b01111100
(A),11 (b)
.db 0b10111001,0b01011110
(C),13 (d)
.db 0b01111001,0b01110001
(E),15 (F)
.db 0b01000000,0
;2,3
;4,5
;6,7
;8,9
;10
;12
;14
valor_b: .byte 1
valor_c: .byte 1
valor_x: .byte 1
respta: .byte 2
res0: .byte 1
res1: .byte 1
res2: .byte 1
binlow: .byte 1
binhigh: .byte 1
bcd0: .byte 1
bcd1: .byte 1
bcd2: .byte 1
bcd3: .byte 1
bcd4: .byte 1
dig0: .byte 1
dig1: .byte 1
dig2: .byte 1
dig3: .byte 1
.cseg
.org 0x000
rjmp inicio
.org 0x002
rjmp teclado
.org 0x040
inicio:
EJEMPLO
/*
* prepa8.asm
*
* Created: 12/15/2014 3:59:52 PM
* Author: Hector Naranjo
*/
.include"m164pdef.inc"
.def tempo=r16
.def tecla=r17
.def catodo=r18
.def aux=r19
.def num1=r22
.def num2=r23
.def num3=r20
.def num4=r24
.def aux1=r21
.def display=r3
.dseg
dato: .byte 1
valor_a: .byte 1
ldi tempo,0b00001111
out ddrb,tempo
ldi tempo,0
out ddrd,tempo
ldi tempo,255
out ddra,tempo
out ddrc,tempo
out portb,tempo
out portd,tempo
in tempo, mcucr ;activo las
resistencias del pullup
andi tempo, 0b11101111
out mcucr, tempo
ldi tempo,0b00000010 ;Cargo en
el registro EICRA
sts EICRA,tempo
ldi tempo,0b00000001
out EIMSK,tempo
sei
clr tempo
out portb,tempo
ldi tecla,0xbb
lazo:
cpi tecla, 0xbb ;compara si no se a
presionado ninguna tecla
breq barrido0 ;salta si es igual
cpi tecla,0xD
breq borrar
cpi tecla,0x0a
brne datoa1
rjmp datoa
datoa1:
cpi tecla,0x0b
brne datob1
rjmp datob
datob1:
cpi tecla,0x0c
brne datoc1
rjmp datoc
datoc1:
cpi tecla,0x0f
brne datox1
rjmp datox
datox1:
cpi tecla,0x0e
brne igual
rjmp resultado
igual:
ldi num3,0
mov num2,num1
mov num1,tecla
ldi aux,10
mul num2,aux
add r0,num1
sts dato,r0
ldi tecla,0xbb
rjmp barrido0
borrar:
clr num1
clr num2
clr num3
clr num4
ldi tecla,0xbb
barrido0:
ldi catodo,0b11111110
out porta,catodo
mov display, num1
call bin_7seg
out portc,display
call retardo
ser tempo
out porta,tempo
sec
rol catodo
out porta,catodo
mov display, num2
call bin_7seg
out portc,display
call retardo
ser tempo
out porta,tempo
sec
rol catodo
out porta,catodo
mov display, num3
call bin_7seg
out portc,display
call retardo
ser tempo
out porta,tempo
sec
rol catodo
out porta,catodo
mov display, num4
call bin_7seg
out portc,display
call retardo
ser tempo
out porta,tempo
rjmp lazo
datoa:
lds aux1,dato
sts valor_a,aux1
rjmp borrar
datob:
lds aux1,dato
sts valor_b,aux1
rjmp borrar
datoc:
lds aux1,dato
sts valor_c,aux1
rjmp borrar
datox:
lds aux1,dato
sts valor_x,aux1
rjmp borrar
resultado:
lds r18,valor_a
lds r19,valor_c
lds r20,valor_b
lds r21,valor_x
mul r21,r21; x por x
mov r5,r0 ;parte baja de x^2
mov r6,r1;parte alta de x^2
mov r7,r18;valor de a
mul r5,r7;a x parte baja de x^2
sts res2,r0
mov r8,r1
mul r7,r6
add r8,r0
sts res1,r8
ldi r22,0
adc r22,r1
sts res0,r22
mul r19,r21
lds r22,res2
lds r23,res1
lds r24,res0
add r22,r0
;adc r22,r20
adc r23,r1
ldi r18,0
adc r24,r18
adc r22,r20
adc r23,r18
add r24,r18
add r18,r19
add r20,r18
add r23,r20
ldi r23,0x10
ldi r23,0x27
cp r22,r23
cpc r23,r23
brcs rangovalido
ldi num1,16
ldi num2,16
ldi num3,16
ldi num4,16
ldi tecla,0xbb
rjmp barrido0
rangovalido:
sts binlow,r22
sts binhigh,r23
call binbcd
lds num4,bcd3
lds num3,bcd2
lds num2,bcd1
lds num1,bcd0
rjmp barrido0
ldi tecla,0xbb
rjmp lazo
teclado:
push r16
in r16,sreg
push r16
ldi tempo,0b00000111
out portb,tempo
sbis pinb,4// salta si esta en 1l
ldi tecla,0x1
sbis pinb,5
ldi tecla,0x4
sbis pinb,6
ldi tecla,0x7
sbis pinb,7
ldi tecla,0xD
ldi tempo,0b00001011
out portb,tempo
sbis pinb,4// salta si esta en 1l
ldi tecla,0x2
sbis pinb,5
ldi tecla,0x5
sbis pinb,6
ldi tecla,0x8
sbis pinb,7
ldi tecla,0x0
ldi tempo,0b00001101
out portb,tempo
sbis pinb,4// salta si esta en 1l
ldi tecla,0x3
sbis pinb,5
ldi tecla,0x6
sbis pinb,6
ldi tecla,0x9
sbis pinb,7
ldi tecla,0xE
ldi tempo,0b00001110
out portb,tempo
sbis pinb,4// salta si esta en 1l
ldi tecla,0xA
sbis pinb,5
ldi tecla,0xB
sbis pinb,6
ldi tecla,0xC
sbis pinb,7
ldi tecla,0xF
clr tempo
out portb,tempo
pop r16
out sreg,r16
pop r16
reti
bin_7seg:
ldi zh, high(tabla7<<1)
ldi zl, low(tabla7<<1)
add zl,display
lpm display,z
ret
binbcd:
push r17
push
push
push
push
r18
r19
r20
r21
lds r18,binlow
lds r19,binhigh
clr r17
otradecmil:
subi r18,16
sbci r19,39
brcs decmil
inc r17
rjmp otradecmil
decmil:
ldi r20,16
add r18,r20
ldi r20,39
adc r19,r20
sts bcd4,r17
clr r17
otramil:
subi r18,232
sbci r19,3
brcs cent
inc r17
rjmp otramil
cent:
ldi r20,232
add r18,r20
ldi r20,3
adc r19,r20
sts bcd3,r17
clr r17
otracent:
subi r18,100
sbci r19,0
brcs decenas
inc r17
rjmp otracent
decenas:
ldi r20,100
add r18,r20
ldi r20,0
adc r19,r20
sts bcd2,r17
clr r17
otrodec:
subi r18,10
sbci r19,0
brcs unidades
inc r17
rjmp otrodec
unidades:
ldi r20,10
add r18,r20
ldi r20,0
adc r19,r20
sts bcd1,r17
sts bcd0,r18
pop
pop
pop
pop
pop
ret
r21
r20
r19
r18
r17
retardo:
; ldi r23,10
;lazo3:
ldi r26,10
lazo2:
ldi r25,255; retardo
lazo1:
dec r25
brne lazo1
dec r26
brne lazo2
;dec r23
;brne lazo3
ret
tabla7:
.db 0b00111111,0b00000110 ;0,1
.db 0b01011011,0b01001111
.db 0b01100110,0b01101101
.db 0b01111101,0b00000111
.db 0b01111111,0b01101111
.db 0b01110111,0b01111100
(A),11 (b)
.db 0b10111001,0b01011110
(C),13 (d)
.db 0b01111001,0b01110001
(E),15 (F)
.db 0b01000000,0
;2,3
;4,5
;6,7
;8,9
;10
;12
;14
EJEMPLO
/*
* Manejo_de_interrupciones.asm
*
* Created: 30/12/2014 19:29:52
* Author: EDDERGAIBOR
*/
.include "m164pdef.inc"
.def tempo=r16
.def ante=r17
.def aux=r18
.def xpasos=r19
.def aux1=r20
.def antem=r21
.def anted=r22
ldi tempo,0b00101010
;habilitacion
interrupciones externas
sts eicra,tempo
ldi tempo,0b00000111
out eimsk,tempo
ldi tempo,0b00000111
out eifr,tempo
ldi tempo,0b00000100
;habilitacion de
interrupciones del puerto C
sts pcicr,tempo
ldi tempo,0b00000011
sts pcmsk2,tempo
ldi tempo,0b00000100
out pcifr,tempo
sei
ldi tempo,0b00000000
sts LEDS,tempo
ldi aux,0b11111111
ldi aux1,0b11110000
ldi xpasos,0b00000000
.dseg
LEDS: .BYTE 1
.cseg
.org 0x00
rjmp inicio
.org 0x02
rjmp modo
.org 0x04
rjmp tipo
.org 0x06
rjmp sentido
.org 0x0C
rjmp pasos
lazo:
lds ante,LEDS
lds tempo,LEDS
out porta,tempo
sbrc tempo,4
;determino que
modo de operacin se est ejecutando
call automatico
rjmp lazo
automatico:
lds tempo,LEDS
andi tempo,0b11110000
sbrc tempo,6
;determino el
sentido de giro
rjmp antihorario
horario:
sbrc tempo,5
;determino el tipo
de paso
rjmp dobleh
simple:
ori tempo,0b00000001
el led A
el led B
el led C
el led D
out porta,tempo
;se prende
call retardo
andi tempo,0b11110011
ori tempo,0b00001001
out porta,tempo
;se prende
el led D y A
ret
antihorario:
sbrc tempo,5
;determino el tipo
de paso
simplea:
call retardo
andi tempo,0b11111110
ori tempo,0b00000010
out porta,tempo
;se prende
el led D
call retardo
andi tempo,0b11111101
ori tempo,0b00000100
out porta,tempo
;se prende
el led C
call retardo
andi tempo,0b11111011
ori tempo,0b00001000
out porta,tempo
;se prende
el led B
call retardo
andi tempo,0b11110111
ret
dobleh:
el led A y B
el led B y C
el led C y D
rjmp doblea
ori tempo,0b00001000
out porta,tempo
;se prende
call retardo
andi tempo,0b11110111
ori tempo,0b00000100
out porta,tempo
;se prende
call retardo
andi tempo,0b11111011
ori tempo,0b00000010
out porta,tempo
;se prende
call retardo
andi tempo,0b11111101
ori tempo,0b00000001
out porta,tempo
;se prende
el led A
ori tempo,0b00000011
out porta,tempo
;se prende
call retardo
andi tempo,0b11110110
doblea:
call retardo
andi tempo,0b11111100
ori tempo,0b00000110
out porta,tempo
;se prende
el led D y A
call retardo
andi tempo,0b11111001
ori tempo,0b00001100
out porta,tempo
;se prende
el led C y D
call retardo
andi tempo,0b11111110
ret
ori tempo,0b00001001
out porta,tempo
;se prende
call retardo
andi tempo,0b11110110
ori tempo,0b00001100
out porta,tempo
;se prende
call retardo
andi tempo,0b11110011
ori tempo,0b00000110
el led B y C
el led A y B
out porta,tempo
;se prende
apagar:
call retardo
andi tempo,0b11111001
ori tempo,0b00000011
tipo:
out porta,tempo
;se prende
call retardo
andi tempo,0b11111100
ret
retardo:
lazo1:
lazo2:
lds r20,LEDS
cp ante,r20
brne salir
push r16
push r19
push r18
ldi r16,36
ldi r19,100
ldi r18,255
lazo3: dec r18
brne lazo3
dec r19
brne lazo2
dec r16
brne lazo1
pop r18
pop r19
pop r16
ret
salir: lds tempo,LEDS
andi tempo,0b11110000
sts LEDS,tempo
ldi xpasos,0b00000000
ldi aux1,0b11110000
rjmp lazo
modo:
push tempo
push ante
in tempo,sreg
push tempo
lds ante,LEDS
sbrc ante,4
rjmp apagar
ori ante,0b00010000
guardar:sts LEDS,ante
pop tempo
out sreg,tempo
pop ante
pop tempo
reti
andi ante,0b11101111
rjmp guardar
push tempo
push ante
in tempo,sreg
push tempo
lds ante,LEDS
sbrc ante,5
rjmp apagar1
ori ante,0b00100000
guardar1:sts LEDS,ante
pop tempo
out sreg,tempo
pop ante
pop tempo
reti
apagar1:
andi ante,0b11011111
rjmp guardar1
sentido:
push tempo
push ante
in tempo,sreg
push tempo
lds ante,LEDS
sbrc ante,6
rjmp apagar2
ori ante,0b01000000
guardar2:sts LEDS,ante
pop tempo
out sreg,tempo
pop ante
pop tempo
reti
apagar2:
andi ante,0b10111111
rjmp guardar2
pasos:
abandonar:
push tempo
in tempo,sreg
push tempo
lds tempo,LEDS
sbrc tempo,4
rjmp abandonar
in tempo,pinc
eor tempo,aux
sbrc tempo,0
rcall avanzar
sbrc tempo,1
rcall retroceder
pop tempo
out sreg,tempo
pop tempo
or tempo,xpasos
sts LEDS,tempo
ldi antem,0
lds anted,LEDS
reti
avanzar:
push tempo
lds tempo,LEDS
andi tempo,0b11110000
sbrc tempo,5
rjmp doblem
andi anted,0b00001111
cpi anted,0b00000000
breq normalmentes
ldi xpasos,0b00000000
normalmentes:
cpi xpasos,0b00000000
breq arreglo
clc
rol xpasos
continuar:
cpi xpasos,0b00010000
brne mostrar
rcall final
mostrar:
or tempo,xpasos
sts LEDS,tempo
lds antem,LEDS
ldi anted,0
pop tempo
ret
arreglo:
sec
rol xpasos
rjmp continuar
final:
ldi xpasos,0b00000001
andi tempo,0b11110111
ret
doblem:
normalmente:
continuard:
mostrard:
andi antem,0b00001111
cpi antem,0b00000000
breq normalmente
ldi xpasos,0b00000000
cpi xpasos,0b00000000
breq arreglod
clc
inc xpasos
cpi xpasos,0b00010010
brne continuard
rcall finaldd
cpi xpasos,0b00011000
brne mostrard
rcall finald
arreglod:
pop tempo
ret
ldi xpasos,0b00000011
rjmp continuard
finald:
finaldd:
ldi xpasos,0b00001001
ret
ldi xpasos,0b00000011
ret
retroceder:
push tempo
lds tempo,LEDS
andi tempo,0b11110000
sbrc tempo,5
rjmp doblemr
andi anted,0b00001111
cpi anted,0b00000000
breq normalmentesr
ldi xpasos,0b00000000
normalmentesr:
clc
ror xpasos
cpi xpasos,0b00000000
brne mostrar1
rcall final1
mostrar1:
or tempo,xpasos
sts LEDS,tempo
lds antem,LEDS
ldi anted,0
pop tempo
ret
final1:
ldi xpasos,0b00001000
andi tempo,0b11111110
ret
doblemr:
andi antem,0b00001111
cpi antem,0b00000000
breq normalmenter
ldi xpasos,0b00000000
normalmenter:
cpi xpasos,0b00000000
breq arreglodr
clc
ror xpasos
cpi xpasos,0b00000100
brne continuardr
rcall finalddr
continuardr:
mostrardr:
arreglodr:
out ddrd,tempo
ldi tempo,0b11111111
out portb,tempo
out portc,tempo
out portd,tempo
ldi tempo,0b01111111
out ddra,tempo
ldi tempo,0b10000000
out porta,tempo
in tempo,mcucr
andi tempo,0b11101111
out mcucr,tempo
cpi xpasos,0b00000001
brne mostrardr
rcall finaldr
or tempo,xpasos
sts LEDS,tempo
ldi antem,0
lds anted,LEDS
pop tempo
ret
ldi xpasos,0b00001001
rjmp continuard
finaldr:
finalddr:
EJEMPLO
ldi xpasos,0b00001001
ret
ldi xpasos,0b00001100
ret
/*
* Manejo_de_interrupciones.asm
*
* Created: 30/12/2014 19:29:52
* Author: EDDERGAIBOR
*/
.include "m164pdef.inc"
.def tempo=r16
.def ante=r17
.def aux=r18
.def xpasos=r19
.def aux1=r20
.def antem=r21
.def anted=r22
.dseg
.cseg
ldi tempo,high(ramend)
;definicin del Stack
out sph,tempo
ldi tempo,low(ramend)
out spl,tempo
ldi tempo,0b00101010
;habilitacion
interrupciones externas
sts eicra,tempo
ldi tempo,0b00000111
out eimsk,tempo
ldi tempo,0b00000111
out eifr,tempo
ldi tempo,0b00000100
;habilitacion de
interrupciones del puerto C
sts pcicr,tempo
ldi tempo,0b00000011
sts pcmsk2,tempo
ldi tempo,0b00000100
out pcifr,tempo
sei
ldi tempo,0b00000000
sts LEDS,tempo
ldi aux,0b11111111
ldi aux1,0b11110000
ldi xpasos,0b00000000
LEDS: .BYTE 1
.org 0x00
rjmp inicio
.org 0x02
rjmp modo
.org 0x04
rjmp tipo
.org 0x06
rjmp sentido
.org 0x0C
rjmp pasos
lazo:
lds ante,LEDS
lds tempo,LEDS
out porta,tempo
sbrc tempo,4
;determino que
modo de operacin se est ejecutando
call automatico
rjmp lazo
automatico:
lds tempo,LEDS
andi tempo,0b11110000
sbrc tempo,6
;determino el
sentido de giro
rjmp antihorario
horario:
sbrc tempo,5
;determino el tipo
de paso
rjmp dobleh
simple:
ori tempo,0b00000001
el led D y A
call retardo
andi tempo,0b11110110
ret
antihorario:
de paso
out porta,tempo
;se prende
el led A
el led B
el led C
el led D
simplea:
call retardo
andi tempo,0b11111110
ori tempo,0b00000010
out porta,tempo
;se prende
el led D
call retardo
andi tempo,0b11111101
ori tempo,0b00000100
out porta,tempo
;se prende
el led C
call retardo
andi tempo,0b11111011
ori tempo,0b00001000
out porta,tempo
;se prende
el led B
el led A
el led A y B
el led B y C
el led C y D
ori tempo,0b00001000
out porta,tempo
;se prende
call retardo
andi tempo,0b11110111
ori tempo,0b00000100
out porta,tempo
;se prende
call retardo
andi tempo,0b11111011
ori tempo,0b00000010
out porta,tempo
;se prende
out porta,tempo
;se prende
doblea:
call retardo
andi tempo,0b11111100
ori tempo,0b00000110
out porta,tempo
;se prende
el led D y A
call retardo
andi tempo,0b11111001
ori tempo,0b00001100
out porta,tempo
;se prende
el led C y D
call retardo
andi tempo,0b11110011
ori tempo,0b00001001
rjmp doblea
call retardo
andi tempo,0b11111110
ret
ori tempo,0b00000011
out porta,tempo
;se prende
sbrc tempo,5
;determino el tipo
call retardo
andi tempo,0b11111101
ori tempo,0b00000001
call retardo
andi tempo,0b11110111
ret
dobleh:
out porta,tempo
;se prende
el led B y C
ori tempo,0b00001001
out porta,tempo
;se prende
call retardo
andi tempo,0b11110110
ori tempo,0b00001100
out porta,tempo
;se prende
call retardo
andi tempo,0b11110011
ori tempo,0b00000110
out porta,tempo
;se prende
call retardo
andi tempo,0b11111001
ori tempo,0b00000011
out porta,tempo
;se prende
el led A y B
retardo:
lazo1:
call retardo
andi tempo,0b11111100
ret
lds r20,LEDS
cp ante,r20
brne salir
push r16
push r19
push r18
ldi r16,36
ldi r19,100
lazo2:
ldi r18,255
lazo3: dec r18
brne lazo3
dec r19
brne lazo2
dec r16
brne lazo1
pop r18
pop r19
pop r16
ret
salir: lds tempo,LEDS
andi tempo,0b11110000
sts LEDS,tempo
ldi xpasos,0b00000000
ldi aux1,0b11110000
rjmp lazo
modo:
push tempo
push ante
in tempo,sreg
push tempo
lds ante,LEDS
sbrc ante,4
rjmp apagar
ori ante,0b00010000
guardar:sts LEDS,ante
pop tempo
out sreg,tempo
pop ante
pop tempo
reti
apagar:
andi ante,0b11101111
rjmp guardar
tipo:
push tempo
push ante
in tempo,sreg
push tempo
lds ante,LEDS
sbrc ante,5
rjmp apagar1
ori ante,0b00100000
guardar1:sts LEDS,ante
pop tempo
out sreg,tempo
pop ante
pop tempo
reti
apagar1:
andi ante,0b11011111
rjmp guardar1
sentido:
push tempo
push ante
in tempo,sreg
push tempo
lds ante,LEDS
sbrc ante,6
rjmp apagar2
ori ante,0b01000000
guardar2:sts LEDS,ante
pop tempo
out sreg,tempo
pop ante
pop tempo
reti
apagar2:
andi ante,0b10111111
rjmp guardar2
pasos:
push tempo
in tempo,sreg
push tempo
lds tempo,LEDS
sbrc tempo,4
rjmp abandonar
in tempo,pinc
eor tempo,aux
sbrc tempo,0
rcall avanzar
sbrc tempo,1
rcall retroceder
abandonar:
pop tempo
out sreg,tempo
pop tempo
reti
lds anted,LEDS
avanzar:
push tempo
lds tempo,LEDS
andi tempo,0b11110000
sbrc tempo,5
rjmp doblem
andi anted,0b00001111
cpi anted,0b00000000
breq normalmentes
ldi xpasos,0b00000000
normalmentes:
cpi xpasos,0b00000000
breq arreglo
clc
rol xpasos
continuar:
cpi xpasos,0b00010000
brne mostrar
rcall final
mostrar:
or tempo,xpasos
sts LEDS,tempo
lds antem,LEDS
ldi anted,0
pop tempo
ret
arreglo:
sec
rol xpasos
rjmp continuar
final:
ldi xpasos,0b00000001
andi tempo,0b11110111
ret
doblem:
normalmente:
continuard:
mostrard:
andi antem,0b00001111
cpi antem,0b00000000
breq normalmente
ldi xpasos,0b00000000
cpi xpasos,0b00000000
breq arreglod
clc
inc xpasos
cpi xpasos,0b00010010
brne continuard
rcall finaldd
pop tempo
ret
arreglod:
finald:
ldi xpasos,0b00001001
ret
finaldd:
retroceder:
ldi xpasos,0b00000011
ret
push tempo
lds tempo,LEDS
andi tempo,0b11110000
sbrc tempo,5
rjmp doblemr
andi anted,0b00001111
cpi anted,0b00000000
breq normalmentesr
ldi xpasos,0b00000000
normalmentesr:
clc
ror xpasos
cpi xpasos,0b00000000
brne mostrar1
rcall final1
mostrar1:
or tempo,xpasos
sts LEDS,tempo
lds antem,LEDS
ldi anted,0
pop tempo
ret
final1:
ldi xpasos,0b00001000
andi tempo,0b11111110
ret
doblemr:
andi antem,0b00001111
cpi antem,0b00000000
breq normalmenter
ldi xpasos,0b00000000
normalmenter:
cpi xpasos,0b00000000
breq arreglodr
clc
ror xpasos
cpi xpasos,0b00000100
brne continuardr
rcall finalddr
cpi xpasos,0b00011000
brne mostrard
rcall finald
or tempo,xpasos
sts LEDS,tempo
ldi antem,0
ldi xpasos,0b00000011
rjmp continuard
continuardr:
cpi xpasos,0b00000001
mostrardr:
brne mostrardr
rcall finaldr
or tempo,xpasos
sts LEDS,tempo
ldi antem,0
lds anted,LEDS
pop tempo
ret
arreglodr:
finaldr:
ldi xpasos,0b00001001
rjmp continuard
ldi xpasos,0b00001001
ret
finalddr:
EJEMPLO
ldi xpasos,0b00001100
ret
*
* PWM_1Hz_Timer1.asm
*
* Created: 15/01/2015 23:49:51
* Author: usuario
*/
.include "m164pdef.inc"
.def tempo=r16
.cseg
.org 0x0
ldi tempo,0b00100000
out ddrd,tempo
ldi tempo,0b01000000
sts tccr1a,tempo
ldi tempo,0b00001100
sts tccr1b,tempo
ldi tempo,high(15624)
sts ocr1ah,tempo
ldi tempo,low(15624)
sts ocr1al,tempo
fin:
rjmp fin
EJEMPLO
/*
* ConversorAD.asm
*
* Created: 08/01/2015 7:10 PM
* Author: Pablo
*/
.include "m164pdef.inc"
.def tempo=r16
.def cont=r17
.dseg
NUM1H:
.byte
NUM2H:
.byte
NUM3H:
.byte
NUM4H:
.byte
NUM1L:
.byte
NUM2L:
.byte
NUM3L:
.byte
NUM4L:
.byte
bcd5:
.byte 1
bcd4:
.byte 1
bcd3:
.byte 1
bcd2:
.byte 1
bcd1:
.byte 1
nx5:
.byte 1
nx4:
.byte 1
nx3:
.byte 1
nx2:
.byte 1
nx1:
.byte 1
.cseg
.org 0X00
ldi
tempo,0xFF
out ddrb,tempo
out ddrd,tempo
ldi
tempo,0x00
1
1
1
1
1
1
1
1
out ddra,tempo
ldi
tempo,high(ramend)
out sph,tempo
ldi
tempo,low(ramend)
out spl,tempo
ldi
tempo,0x0F
sts didr0,tempo
again:
ldi
XH,high(NUM1L)
ldi
XL,low(NUM1L)
ldi
YH,high(NUM1H)
ldi
YL,low(NUM1H)
ldi
tempo,0b01000000
;Referencias y AX
sts admux,tempo
;Referencias
ldi
cont,0
;;
otro:
ldi
tempo,0b01000000
;;
add tempo,cont
;;
sts admux,tempo
;;
ldi
tempo,0b11000110
sts adcsra,tempo
espera:
lds tempo,adcsra
sbrc tempo,adsc
rjmp espera
lds tempo,adcl
st
x+,tempo
lds tempo,adch
andi tempo,0b00000011
st
y+,tempo
CALL MOSTRAR
inc cont
;;
cpi cont,4
;;
breq again
rjmp otro
RETARDO:
push r16
in
r16,sreg
Push r16
push r17
ldi
r16,255
lazret:
ldi
r17,1
lazret2:
dec r17
brne lazret2
dec r16
brne lazret
pop
pop
out
pop
r17
r16
sreg,r16
r16
RET
MOSTRAR:
Push r16
push r17
Push r18
push r19
push r20
push xl
push xh
push yl
push yh
lds r16,NUM1L
lds r17,NUM1H
lds r18,NUM2L
lds r19,NUM2H
add r16,r18
adc r17,r19
lds r18,NUM3L
lds r19,NUM3H
clc
add r16,r18
adc r17,r19
lds r18,NUM4L
lds r19,NUM4H
clc
add r16,r18
adc r17,r19
mov r18,r16
mov r19,r17
ldi r20,0x00
dec5:
ldi r16,low(10000)
ldi r17,high(10000)
sub r18,r16
sbc r19,r17
brcs st5
inc r20
rjmp dec5
st5:
sts nx5,r20
clr r20
add r18,r16
adc r19,r17
dec4:
ldi r16,low(1000)
ldi r17,high(1000)
sub r18,r16
sbc r19,r17
brcs st4
inc r20
rjmp dec4
st4:
sts nx4,r20
clr r20
add r18,r16
adc r19,r17
dec3:
ldi r16,low(100)
ldi r17,high(100)
sub r18,r16
sbc r19,r17
brcs st3
inc r20
rjmp dec3
st3:
sts nx3,r20
clr r20
add r18,r16
adc r19,r17
dec2:
ldi r16,low(10)
ldi r17,high(10)
sub r18,r16
sbc r19,r17
brcs st2
inc r20
rjmp dec2
st2:
sts nx2,r20
clr r20
add r18,r16
adc r19,r17
sts nx1,r18
ldi xh,high(nx5)
ldi xl,low(nx5)
ldi r20,5
ldi r19,0b11101111
BCD_lazo:
ldi zh,high(display<<1)
ldi zl,low(display<<1)
ld r18,x+
add zl,r18
lpm r18,z
out portb,r18
out portd,r19
call retardo
ldi r18,0xFF
out portd,r18
sec
ror r19
dec r20
breq fin
rjmp BCD_lazo
fin:
pop yh
pop yl
pop xh
pop xl
pop r20
pop r19
pop r18
pop r17
pop r16
RET
display:
.db
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x
7D,0x7,0x7F,0x67,0x77,0x7C,0x39,
0x5E,0x79,0x71