clase antirebote y display 7 segmentos
TRANSCRIPT
5/16/2018 Clase Antirebote y Display 7 Segmentos - slidepdf.com
http://slidepdf.com/reader/full/clase-antirebote-y-display-7-segmentos 1/12
EJEMPLO 3
El manejo de los puertos como entrada y salida es la principal tarea en cualquier aplicación,pero en ocasiones es importante tener en cuenta los efectos de los pulsadores, cuando éstos
cumplen una función de acuerdo a la cantidad de veces que son presionados.
El tercer ejemplo consiste en un conmutador, es decir se enciende y se apaga un led
mediante un mismo pulsador. Se conectan tres pulsadores, todos con las mismas funciones.
Acá se ve el efecto que se hace para evitar el rebote de contactos, lo combatimos mediante
software con retardos.
Este rebote de contactos, como el pulsador tendrá dos funciones (encender y apagar), hace
funcionar inadecuadamente al circuito si no se controla adecuadamente.
Un código anti-rebote (llamando a una función de retardo de 20 milisegundos que elusuario implementa) es el siguiente:
cambie:
call delay20m ;retardo antirrebote
in r16,pind ;leer puertoD
cpi r16,0 ;comparar con cero, para asegurar que se soltó el pulsador
brne cambie ;si no se solto seguimos con el retardo
Acá tenemos el código del programa:;--------------------------------------------------------------------------------
; Programa: Led on/off con el mismo Pulsador On/Off, conmutación 3 puntos; Version: 0.0
; Autor: Lewin Lopez
;
; Dispositivo: ATmega16 Compilador: AVRASM2
; Entorno IDE: AVR Studio4.15 Simulador: Proteus 7.5sp3
;
; Notas: Este programa enciende un Led con un Pulsador, y lo apaga
; con el mismo pulsador, desde 3 puntos.
;
; Registros: r16 para almacenar la lectura del puertoD,
; r19 y r20 para el XOR, que cambia el estado del pin
; r17 y r18 para el retardo de 20ms antirrebote
;
; Conexiones: B1 -> Led
; D0 -> Pulsador1
; D1 -> Pulsador2
; D2 -> Pulsador3
;--------------------------------------------------------------------------------
;DIRECTIVAS EN ENSAMBLADOR
.include "m16def.inc" ;ATmega16
;reset-vector address $0000
.org $00
jmp inicio ;va a inicio
;PROGRAMA PRINCIPAL
5/16/2018 Clase Antirebote y Display 7 Segmentos - slidepdf.com
http://slidepdf.com/reader/full/clase-antirebote-y-display-7-segmentos 2/12
inicio:
;Cargar el puntero de pila
;-------------------------
ldi r16,high(ramend) ;Configuracion de...
out sph,r16
ldi r16,low(ramend)
out spl,r16 ;...la pila: Stack: $045F=RAMEND
;Configuración de los puertos a utilizar
;---------------------------------------
ser r16 ;r16 <- $FF
out ddrb,r16 ;portB salida por 1 bit
ldi r16,$F8 ;r16 <- $F8
out ddrd,r16 ;portD 3 entradas por 3LSB
;Valor Inicial
;-------------
ldi r19,2 ;cargar el valor para toggleclr r20
ciclo:
in r16,pind ;leer puertoD
sbrc r16,0 ;si el pin D0 es cero saltamos una instrucción
call cambie ;cambiamos estado del pin
sbrc r16,1 ;si el pin D1 es cero saltamos una instrucción
call cambie ;cambiamos estado del pin
sbrc r16,2 ;si el pin D2 es cero saltamos una instrucción
call cambie ;cambiamos estado del pin
jmp ciclo ;bucle infinito
cambie:
call delay20m ;retardo antirrebotein r16,pind ;leer puertoD
cpi r16,0 ;comparar con cero, para asegurar que se solto el pulsador
brne cambie ;si no se solto seguimos con el retardo
eor r20,r19 ;xor para cambio de estado una vez.
out portb,r20 ;salida al puertob
ret ;retorno de subrutina
; =============================
; delay loop generator
; 80000 cycles:
; -----------------------------
; delaying 79998 cycles:
delay20m:
ldi R17, $86WGLOOP0: ldi R18, $C6
WGLOOP1: dec R18
brne WGLOOP1
dec R17
brne WGLOOP0
; -----------------------------
; delaying 2 cycles:
nop
nop
ret
; =============================
5/16/2018 Clase Antirebote y Display 7 Segmentos - slidepdf.com
http://slidepdf.com/reader/full/clase-antirebote-y-display-7-segmentos 3/12
El esquema del circuito:
Apuntadores
Los apuntadores trabajan a través de registros pares. Para el caso del apuntador Z, trabaja
con los registro R30 y R31. Estos registros pueden trabajar conjuntamente o por separado a
través de ZL (Z Lower) y ZH (Z Higher). En tal caso, ZL puede almacenar los bits del 0 al
7 de un número de 16 bits y ZH almacena los bits del 8 al 15.
De igual manera el apuntador Y trabaja con los registros R28 y R29, mientras que el
apuntador X lo hace con R26 y R27.
Los apuntadores X, Y y Z tienen la flexibilidad de usar una dirección que se incremente o
decremente automáticamente cada vez que realiza una operación de carga y
almacenamiento de valores.
Ld reg, apuntador+
EJ: Ld r20, X+
Ld reg, apuntador+ permite cargar el contenido de la localidad de la memoria. En el código
anterior se carga el contenido de un apuntador X(R27-R26) en el registro r20,
posteriormente suma 1 al apuntador.
Ld reg, -apuntadorEJ: Ld r20, -X
5/16/2018 Clase Antirebote y Display 7 Segmentos - slidepdf.com
http://slidepdf.com/reader/full/clase-antirebote-y-display-7-segmentos 4/12
Ld reg, -apuntador decrementa uno al apuntador y posteriormente carga en un registro la
localidad de la memoria alojada en el apuntador. En el ejemplo se resta uno al apuntador X
y luego se carga el contenido del registro apuntado en r20.
Ldd reg, apuntador+ number
EJ: Ldd r17, Z+3
Carga la localidad de memoria del apuntador Y o Z en un registro y a continuación
adiciona el número que se indica al apuntador. Esta instrucción no funciona para el
apuntador X. Carga el valor del apuntador Z en r17 y posteriormente incrementa la
dirección de Z en 3 posiciones.
EJEMPLO 4
Es frecuente utilizador el apuntador para hacer búsqueda de datos y manejar tablas dedatos.
;-----------------------------------------------------------------
; Programa: Busqueda con puntero
; Version: 0.0
; Autor: Lewin Lopez
;
; Dispositivo: ATmega16 Compilador: AVRASM2
; Entorno IDE: AVR Studio4.15 Simulador: Proteus 7.5sp3
;
; Notas: Este programa hace un a busqueda de un dato 04 usando
; un registro apuntador Z para el direccionamiento. Cuando encuentra
; el dato, muestra por el puerto A el registro que contiene el dato.
; en todo momento se muestra por el puerto B los datos que guarda cada
; registro y se espera un segundo para continuar.
;
; Registros: r0-r12 -> Registros para almacenar datos.
; r16 -> registro temporal para pasar datos.
; r17 -> registro de busqueda.
; r30 -> registro apuntador.
; r22-r24 -> registros para retardo.
;
; Conexiones: Puerto A -> Displays BCD.
; Puerto B -> Displays DBCD.
;-----------------------------------------------------------------
;DIRECTIVAS EN ENSAMBLADOR
.include "m16def.inc" ;ATmega16
.device ATMEGA16
;reset-vector address $0000
.org $00
jmp inicio ;va al inicio con un RESET
;PROGRAMA PRINCIPAL
inicio:
;Cargar el puntero de pila
;-------------------------
ldi r16,high(ramend) ;Configuracion de...
out sph,r16
5/16/2018 Clase Antirebote y Display 7 Segmentos - slidepdf.com
http://slidepdf.com/reader/full/clase-antirebote-y-display-7-segmentos 5/12
ldi r16,low(ramend)
out spl,r16 ;...la pila: Stack: $045F=RAMEND
;Configuracion de los puertos a utilizar
ser r16
out ddra, r16 ;Puerto A salida
out ddrb, r16 ;Puerto B salida
;Cargar los valores de datos para realizar búsqueda
ldi r16, $01
mov r1,r16 ;Carga $01 en r1
ldi r16, $02
mov r2,r16 ;Carga $02 en r2
ldi r16, $03
mov r3,r16 ;Carga $03 en r3
ldi r16, $0F
mov r4,r16 ;Carga $0F en r4
ldi r16, $05mov r5,r16 ;Carga $05 en r5
ldi r16, $FF
mov r6,r16 ;Carga $FF en r6
ldi r16, $A1
mov r7,r16 ;Carga $A1 en r7
ldi r16, $48
mov r8,r16 ;Carga $48 en r8
ldi r16, $F2
mov r9,r16 ;Carga $F2 en r9
ldi r16, $04
mov r10,r16 ;Carga $04 en r10
ldi r16, $05
mov r11,r16 ;Carga $05 en r11
ldi r16, $FFmov r12,r16 ;Carga $FF en r12
;Valor Inicial del Apuntador Z (r31-r30)
ldi r30, $00
ldi r30, $00
;Etapa de búsqueda
busca:
ld R17, Z+ ; Carga en r17 el valor del registro apuntado por Z e
incrementa Z.
cpi R17,$04 ; Busca el valor $04
breq resultado ; Si lo encuentra va a resultado
out portb, r17 ; si no lo encuentra, muestra en el puerto B el dato que hay,call tiempo ; espera un tiempo
jmp busca ; y continua la busqueda
resultado:
dec r30 ; si lo encuentra decrementa el puntero para
conservar la direccion
; del registro que contiene el dato
out porta, r30 ; y muestra el valo del registro por el puerto A
fin:
jmp fin ; termina el programa y no hace más.
; =============================
; delay loop generator
5/16/2018 Clase Antirebote y Display 7 Segmentos - slidepdf.com
http://slidepdf.com/reader/full/clase-antirebote-y-display-7-segmentos 6/12
; 1000000 cycles:
; -----------------------------
; delaying 999999 cycles:
tiempo:
ldi R22, $09
WGLOOP0: ldi R23, $BC
WGLOOP1: ldi R24, $C4
WGLOOP2: dec R24
brne WGLOOP2
dec R23
brne WGLOOP1
dec R22
brne WGLOOP0
-----------------------------
; delaying 1 cycle:
nop
ret
; =============================
En el ejemplo anterior se usa el apuntador Z para encontrar el registro que contiene el dato
04. Los registros 0 al 12 contienen una serie de valores predeterminados.
El esquema del circuito:
5/16/2018 Clase Antirebote y Display 7 Segmentos - slidepdf.com
http://slidepdf.com/reader/full/clase-antirebote-y-display-7-segmentos 7/12
EJEMPLO 5
El ejemplo 5 es una solución efectiva para el ejercicio de clase 5 para rotar un LED a travésde pulsadores.
Código del programa:;-----------------------------------------------------------------
; Programa: Rotar un LED de acuerdo a 3 pulsadores
; Version: 0.0
; Autor: Lewin Lopez
;
; Dispositivo: ATmega16 Compilador: AVRASM2
; Entorno IDE: AVR Studio4.15 Simulador: Proteus 7.5sp3
;
; Notas: Este programa hace rotar un LED conectado en el puerto C
; de acuerdo al estado de 3 pulsadores.
; Pulsador 1: rota a la derecha.
; Pulsador 2: rota a la izquierda.
; Pulsador 3: detiene o pausa la rotación.
;
; Registros: r16 -> registro temporal para pasar datos.
; r17 -> registro para rotar
; r18 -> registro para leer los pulsadores
; r19 -> registro para activar rotaciones
; r22-r24 -> registros para retardo.
;
; Conexiones: A0 -> Pulsador 1
; A1 -> Pulsador 2
; A2 -> Pulsador 3
; Puerto C -> LEDs.;-----------------------------------------------------------------
;DIRECTIVAS EN ENSAMBLADOR
.include "m16def.inc" ;ATmega16
.device ATMEGA16
;reset-vector address $0000
.org $00
jmp inicio ;va al inicio con un RESET
;PROGRAMA PRINCIPAL
inicio:
;Cargo el puntero de pila
;------------------------
ldi r16,high(ramend) ;Configuracion de...out sph,r16
ldi r16,low(ramend)
out spl,r16 ;...la pila: Stack: $045F=RAMEND
;Configuro los puertos a usar
;y activo resistencias de pull-up necesarias
;----------------------------
ldi r16,0b11111000 ;3 LSB de entrada solamente
out ddra,r16
com r16
out porta,r16 ;activa 3 resistencias de pull-up
ser r16 ;Todo el puerto C de salida
out ddrc, r16
5/16/2018 Clase Antirebote y Display 7 Segmentos - slidepdf.com
http://slidepdf.com/reader/full/clase-antirebote-y-display-7-segmentos 8/12
;Cargo el valor inicial para rotar
;-------------------------------------------
ldi r17,$01 ;valor de rotación
ldi r19,$00 ;Valor 00:no se ha presionado ningun pulsador
;Evaluo el estado de los pulsadores
;----------------------------------
ciclo:
in r18, pina ; Leo el estado de los pulsadores
cpi r18, $06 ; estado 00000110 (presionado solo A0)
breq rotaDer ; si se presiona el primer pulsador va a rotaDer
cpi r18, $05 ; estado 00000101 (presionado solo A1)
breq rotaIzq ; si se presiona el segundo pulsador va a rotaIzq
cpi r18, $03 ; estado 00000011 (presionado solo A2)
breq pausa ; si se presiona va a pausa
cpi r19, $01 ; si antes se ha presionado A0 (R19=01)
breq rotaDer
cpi r19, $02 ; si antes se ha presionado A1 (R19=02)breq rotaIzq
jmp ciclo
rotaDer:
clc ; borra el carry
ldi r19,$01 ; Rotacion a la derecha activada (ya se presiono A0)
ror r17 ; Roto a la derecha una vez
brne sigue
sec ; activa el carry
ror r17 ; Roto a la derecha una vez
sigue:
out portc,r17 ; muestro por el puerto el resultado de rotar
call espera500ms ; espero medio segundo
jmp ciclo ; vuelvo a evaluar los pulsadores
rotaIzq:
clc ; borra el carry
ldi r19,$02 ; Rotacion a la izquierda activada (ya se presiono A1)
out portc,r17 ; muestro por el puerto C el valor del registro de rotacion
rol r17 ; Roto a la Izquierda una vez
brne dele
sec ; activa el carry
rol r17 ; Roto a la Izquierda una vez
dele:
call espera500ms ; espero medio segundo
jmp ciclo
pausa:ldi r19,$00 ; Rotacion desactivada
call espera500ms ; espero medio segundo
jmp ciclo
; =============================
; Retardo de 500 ms
; 2000000 cycles:
; -----------------------------
; delaying 1999998 cycles:
espera500ms:
ldi R22, $12
WGLOOP0: ldi R23, $BC
WGLOOP1: ldi R24, $C4
5/16/2018 Clase Antirebote y Display 7 Segmentos - slidepdf.com
http://slidepdf.com/reader/full/clase-antirebote-y-display-7-segmentos 9/12
WGLOOP2: dec R24
brne WGLOOP2
dec R23
brne WGLOOP1
dec R22
brne WGLOOP0
; -----------------------------
; delaying 2 cycles:
nop
nop
; =============================
ret
El esquemático del circuito es:
EJEMPLO 6
El ejemplo 6 es un programa para realizar un conteo ascendente/descendente de 0 a 9
periódico con incrementos cada segundo.
El código del programa es:;-----------------------------------------------------------------
; Programa: Contador 0 a 9 y 9 a 0 Infinito.
; Version: 0.0
; Autor: Lewin Lopez
;
; Dispositivo: ATmega16 Compilador: AVRASM2
; Entorno IDE: AVR Studio4.15 Simulador: Proteus 7.5sp3
;
5/16/2018 Clase Antirebote y Display 7 Segmentos - slidepdf.com
http://slidepdf.com/reader/full/clase-antirebote-y-display-7-segmentos 10/12
; Notas: Este programa hace un conteo de 0 a 9 con incrementos cada
; segundo usando un registro apuntador Z para el direccionamiento de datos
; para manejar el display de 7 segmentos. Una vez llega a 9, se devuelve a cero
; y vuelve a empezar.
;
; Registros: r5-r14 -> Registros para almacenar datos de displays.
; r16 -> registro temporal para pasar datos.
; r17 -> registro de carga de datos.
; r30 -> registro apuntador.
; r22-r24 -> registros para retardo.
;
; Conexiones: Puerto B -> Displas de 7 sgmentos de cátodo común.
;-----------------------------------------------------------------
;DIRECTIVAS EN ENSAMBLADOR
.include "m16def.inc" ;ATmega16
.device ATMEGA16
;reset-vector address $0000.org $00
jmp inicio ;va al inicio con un RESET
;PROGRAMA PRINCIPAL
inicio:
;Cargar el puntero de pila
;-------------------------
ldi r16,high(ramend) ;Configuracion de...
out sph,r16
ldi r16,low(ramend)
out spl,r16 ;...la pila: Stack: $045F=RAMEND
;Configuracion de los puertos a utilizar
;---------------------------------------ser r16
out ddrb, r16 ;solo puerto b de salida.
;Cargar los valores de datos para mostrar los datos en el display
ldi r16, $3F
mov r5,r16
ldi r16, $06
mov r6,r16
ldi r16, $5B
mov r7,r16
ldi r16, $4F
mov r8,r16
ldi r16, $66
mov r9,r16ldi r16, $6D
mov r10,r16
ldi r16, $7D
mov r11,r16
ldi r16, $07
mov r12,r16
ldi r16, $7F
mov r13,r16
ldi r16, $67
mov r14,r16
;Valor Inicial del apuntador
cero:
5/16/2018 Clase Antirebote y Display 7 Segmentos - slidepdf.com
http://slidepdf.com/reader/full/clase-antirebote-y-display-7-segmentos 11/12
ldi r30, $04
;Inicio del conteo ascendente
conteo:
ld r17, Z+
cpi r30,$0F
breq cero1
out portb,r17
call tiempo
jmp conteo
cero1:
ldi r30, $0F
;Inicio conteo descendente
conteo1:
ld r17,-Z
cpi r30, $04
breq ceroout portb, r17
call tiempo
jmp conteo1
tiempo:
; =============================
; delay loop generator
; 4000000 cycles:
; -----------------------------
; delaying 3999996 cycles:
ldi R22, $24
WGLOOP0: ldi R23, $BC
WGLOOP1: ldi R24, $C4
WGLOOP2: dec R24brne WGLOOP2
dec R23
brne WGLOOP1
dec R22
brne WGLOOP0
; -----------------------------
; delaying 3 cycles:
ldi R22, $01
WGLOOP3: dec R22
brne WGLOOP3
; -----------------------------
; delaying 1 cycle:
nop
RET; =============================
El esquemático del circuito es:
5/16/2018 Clase Antirebote y Display 7 Segmentos - slidepdf.com
http://slidepdf.com/reader/full/clase-antirebote-y-display-7-segmentos 12/12
EJERCICIO EN CLASE:a) Realizar el contador del ejercicio 6 utilizando apuntadores.
b) Realizar un contador ascendente de 0 a 20 con RESET usando apuntadores. Debe
tener un solo pulsador de incremento con antirebote por software, el conteo es
ascendente con incrementos cada 2 segundos y cuando la cuenta llega a 20 se
genera una señal que reinicia la cuenta.
NOTA: En caso de tener programas similares entre estudiantes, se solicitarásustentación individual y la nota será tomada de dicha sustentación sin tener encuenta que el programa funcione o no.