Sei sulla pagina 1di 6

Motor con Interrupciones

.include "m8def.inc"
.cseg
.org 0x0000
rjmp inicio
.org 0x0001
rjmp int_ext0
.org 0x0002
rjmp int_ext1
int_ext0:
sbic pind, 2
rjmp int_ext0
ldi r19, 20
cpi r19, 20
breq parar
int_ext1:
sbic pind, 3
rjmp int_ext1
ldi r19, 255
cpi r19, 20
breq parar
inicio:
ldi r16, high(ramend)
out sph, r16
ldi r16, low(ramend)
out spl, r16
sbi ddrb, 0
sbi ddrb, 1
cbi ddrd, 1
cbi ddrd, 2
sei
ldi r16, 0b00001010
out mcucr, r16
ldi r16, 0b11000000

out gicr, r16


accion:
cpi r19, 255
breq girar
cpi r19, 20
breq parar
rjmp accion
girar:
ldi r17, 0b00000001
out portb, r17
rcall delay
ldi r17, 0b00000010
out portb, r17
rcall delay
rjmp girar
parar:
ldi r17, 0b00000000
out portb, r17
rjmp parar
delay:
ldi r18, 95
x3:
ldi r19, 82
x2:
ldi r20, 50
x1:
dec r20
brne x1
dec r19
brne x2
dec r18
brne x1
ret

Contador 0 -99 Up\Down con interrupciones


.include "m8def.inc"; Directiva del microcontrolador Atmega8
.cseg; Directiva donde se reserva memoria
.def bandera = r19; definimos el registro r19 como bandera
.equ unidades = $60; declaramos como constante unidades
.equ decenas = $61; declaramos como constante decenas
.org 0x0000; vector reset
rjmp inicio; si se presiona el reset, salto a inicio
.org 0x0001; vector interrupcion int0
rjmp int_ext0; si se produce la interrupcion, salta a int_ext0
.org 0x0002; vector interrupcion int1
rjmp int_ext1; si se produce la interrupcion, salta a int_ext1
display:; etiqueta donde definiremos los digitos del display
; "DB" reserva espacio de memoria
.db 0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90; digitos del display(
0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
int_ext0:; interrupcion externa 0
ser bandera; ponemos a 1 el regsitro bandera, lo cargamos con 255
reti; retorno, habilitando el bit I del SREG
int_ext1:; interrupcion externa 1
ldi bandera, 20; cargo el registro bandera con 20
reti; retorno, habilitando del bit I del SREG
;.....PROGRAMA PRINCIPAL......
inicio:; etiqueta
ldi r16, high(ramend);habilito la pila del atmega 8...
out sph, r16
ldi r16, low(ramend)
out spl, r16;... direccionamiento a la posicion de memoria STACK, habilito los
retardos
ser r16; pongo a 1 el registro r16
out ddrb, r16; configuro el puerto B como salida de datos
out ddrc, r16; configuro el puerto C como salida de datos
cbi ddrd, 2; configuro el PIND2 como entrada de datos
cbi ddrd, 3; configuro el PIND3 como entrada de datos
ldi r16, 0b00001010; cargo r16 con 10
out mcucr, r16; lo configuro en flanco de bajada
ldi r16, 0b11000000; cargo r16 con 0b11000000
out gicr, r16; activamos la mascara de las interrupciones
clr r16; limpio r16, o sea, lo pongo a 0
out gifr, r16; limpiamos los flag de interrrupcion INTF0 e INTF1
sts unidades, r16; guarda directamente en la SRAM la constante unidades
sts decenas, r16; guarda directamene en la SRAM la constante decenas
clr bandera; flag para identificar la interrupcion
sei; pongo a uno el bit I del SREG, habilitando asi las interrupciones globales
ldi r31, high(display);cargo en Z
ldi r30, low(display); los datos del display y de esta manera realizo la decodificacion
ldi r16, 0b00000011; cargo r16 con 2
add r30, r16; lo sumo para que el puntero de memoria apunte a bits
bucle:; etiqueta
cpi bandera, 255; si presiono int0, se incrementara la cuenta
breq incremento; si r19 = a 255, salto a incremento, si no, sigo leyendo la siguiente
linea
cpi bandera, 20; si presiono int1, se decrementa la cuenta
breq decremento; si r19 = a 20, salto a decremento, si no, sigo leyendo la siguiente
linea
mostrar:; etiqueta en la cual se mostrara en el display los datos almacenados en
unidades y decenas
rcall multiplexar; llamada a subrutina relativa "multiplexar"
rjmp bucle; salto a bucle, para seguir analizando si decremento o incremento

incremento:; etiqueta
rcall delay25m; delay antirrebote
rcall multiplexar; llamada a subrutina relativa "multiplexar"
sbic pind, 2; si presiono el PINB2, salto a la siguiente linea
rjmp incremento; si no presiono PINB2, salto a incremento
lds r16, unidades; cargar r16 con el contenido de la constante "unidades"
lds r17, decenas; cargar r17 con el contenido de la constante "decenas"
inc r16; incremento en una unidad el registro r16
cpi r16, 10; comparo, si r16 < 10
brmi salir; si cumple la condicion anterior, salimos, si no...
clr r16; unidades a cero
inc r17; incremento en una unidad el registro r17
cpi r17, 10; analizo si r17 < 10
brmi salir; si cumple la condicion anterior, salimos, si no...
clr r17; decenas a cero
rjmp salir; salimos
decremento:; etiqueta
rcall delay25m; delay antirrebote
rcall multiplexar; llamada a subrutina relativa "multiplexar"
sbic pind, 3; si presiono PIND3, salto a la siguiente linea
rjmp decremento; si no presiono PIND3, salto a "decremento"
lds r16, unidades; cargo en r16 los datos almacenados en la constante "unidades"
lds r17, decenas; cargo en r17 los datos almancenados en la constante "decenas"
cpi r16,0; comparo r16 con 0
breq dec_unidades; salto si las unidades llegan a ser cero; si no...
dec r16; decremento en una unidad el registro r16
rjmp salir;si es mayor que cero, salimos
dec_unidades:;cada vez que las unidades lleguen a cero
ldi r16, 9; se hace 9 las unidades
cpi r17, 0; comparo r17 con 0
breq dec_decenas; salto si las decenas llegan a ser cero, si no...
dec r17; decremento en una unidad el registro r17
rjmp salir; si es mayor que cero, salimos
dec_decenas:; cada vez que las decenas lleguen a cer
ldi r17, 9; se hace 9 las decenas
rjmp salir; salimos
salir:; cuando salimos
sts unidades, r16; almaceno en SRAM
sts decenas, r17; almanceno en SRAm
clr bandera; limpio el registro R19, para volver a analizar las interrupciones
rjmp mostrar; muestro los nuevos datos en los displays
multiplexar:;para multiplexar los displays
sbi portc, 0; deshabilito ambos
sbi portc, 1; displays
lds r16, unidades; cargo en los datos almacenados en r16
lds r15, decenas; cargo los datos almacenados en r15
mov r28, r30; copiamos la direccion donde estan los datos del display
mov r29, r31; copiamos la direccion donde estan los datos del display
add r30, r16; se suma el valor de unidades, para desplazarse en a la tabla "display"
lpm r16, z; cargo z en r16
mov r30, r28; copio r28 en r30
add r30, r15; se suma el valor de decenas, para desplazarse en la tabla "display"
lpm r15, z; cargo z en r15
mov r30, r28; copio r28 en r30
out portb, r16; se muestra en el display unidades el valor correspondiente
cbi portc, 1; prendo el display unidades
rcall delay1m; tiempo de retardo para que sea visible al ojo
sbi portc, 1; apago el display unidadess
nop nop nop nop nop nop nop nop; el display requiere de un tiempo para apagarse
out portb, r15; se muestra en el display decenas el valor correspondiente

cbi portc, 0; prendo el display decenas


rcall delay1m; tiempo de retardo para que sea visible al ojo
sbi portc, 0; apago el display decenas
ret; retorno a la siguiente linea luego de llamar a "multiplexar"
delay25m:; retardo antirrebote de 25 milisegundos aproximadamente
ldi r22,4
zz:
ldi r23,188
yy:
ldi r24,6
xx:
dec r24
brne xx
dec r23
brne yy
dec r22
brne zz
ret; regreso de subrutina delay
delay1m:; retardo de 1 milisegundo aproximadamente
ldi r22,4
zzz:
ldi r23,188
yyy:
ldi r24,6
xxx:
dec r24
brne xxx
dec r23
brne yyy
dec r22
brne zzz
ret; regreso de subrutina delay

Parpadeo Paralelo, con y sin Interrupciones


.include "m8def.inc"
.cseg
.org 0x0000
rjmp inicio
.org 0x0001
rjmp int_ext0
inicio:
ldi r16, high(ramend)
out sph, r16
ldi r16, low(ramend)
out spl, r16
sbi ddrc, 0
sbi ddrc, 1
cbi ddrd, 2
sei
ldi r16, 0b00001010
out mcucr, r16
ldi r16, 0b11000000
out gicr, r16
bucle:
sbi portc, 0
rcall delay
cbi portc, 0
rcall delay
rjmp bucle
prender:
sbi portc, 1
sbi portc, 0
rcall delay
rcall analisis
cbi portc, 1

cbi portc, 0
rcall delay
rcall analisis1
analisis:
sbic pind, 2
ret
rjmp apagar
analisis1:
sbic pind, 2
rjmp prender
rjmp apagar
apagar:
cbi portc, 1
rjmp inicio
delay:
ldi r17, 255
x2:
ldi r18, 255
x1:
dec r18
brne x1
dec r17
brne x2
ret
int_ext0:
sbic pind, 2
rjmp int_ext0
ldi r19, 255
cpi r19, 255
breq prender

Potrebbero piacerti anche