Clase Antirebote y Display 7 Segmentos

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 el usuario 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: ; ; : / /, 3 ; : 0.0 ; A: ; ; D: A16 C: AA2 ; E IDE: A 4.15 : 7.53 ; ; : E , ; , 3 . ; ; : 16 D, ; 19 20 , ; 17 18 20 ; ; C: B1 > ; D0 > 1 ; D1 > 2 ; D2 > 3 ; ;DIECIA E EABAD . "16." ;A16 ; $0000 . $00   ; ;GAA ICIA

Transcript of Clase Antirebote y Display 7 Segmentos

Page 1: Clase Antirebote y Display 7 Segmentos

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

Page 2: Clase Antirebote y Display 7 Segmentos

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

; =============================

Page 3: Clase Antirebote y Display 7 Segmentos

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

Page 4: Clase Antirebote y Display 7 Segmentos

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

Page 5: Clase Antirebote y Display 7 Segmentos

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

Page 6: Clase Antirebote y Display 7 Segmentos

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:

Page 7: Clase Antirebote y Display 7 Segmentos

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

Page 8: Clase Antirebote y Display 7 Segmentos

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

Page 9: Clase Antirebote y Display 7 Segmentos

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

;

Page 10: Clase Antirebote y Display 7 Segmentos

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:

Page 11: Clase Antirebote y Display 7 Segmentos

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:

Page 12: Clase Antirebote y Display 7 Segmentos

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.