Diferencia entre revisiones de «Preguntas Frecuentes Demoqe»
(→Rebotes en Pulsadores o Interruptores) |
(→Rebotes en Pulsadores o Interruptores) |
||
Línea 5: | Línea 5: | ||
¿Qué son los rebotes? | ¿Qué son los rebotes? | ||
− | |||
+ | [[Image:Rebotes_en_pulsadores.jpg|right|]] | ||
Al pulsar algún botón o interruptor, no se realiza una conexión perfecta e instantánea como nosotros esperamos. Un pulsador se compone de dos partes de metal que entran en contacto (choca una con la otra) al accionarlo. Este choque genera unos rebotes realmente pequeños que suceden tan rápido que son imperceptibles para nosotros (aunque no para el DEMOQE128) hasta que finalmente se consigue un contacto firme. | Al pulsar algún botón o interruptor, no se realiza una conexión perfecta e instantánea como nosotros esperamos. Un pulsador se compone de dos partes de metal que entran en contacto (choca una con la otra) al accionarlo. Este choque genera unos rebotes realmente pequeños que suceden tan rápido que son imperceptibles para nosotros (aunque no para el DEMOQE128) hasta que finalmente se consigue un contacto firme. |
Revisión del 19:21 12 mar 2013
Contenido
- 1 Rebotes en Pulsadores o Interruptores
- 2 Manejo y programación de Timers.
- 3 Macros en el HC9S08
- 4 Interrupciones anidadas
- 5 Configuración del IRQ
- 6 ¿Se puede colocar el generador de funciones como entrada a la tarjeta y escuchar esa onda a través del buzzer?
- 7 Comunicación entre microcontroladores
- 8 ¿Cual seria la base para configurar correctamente el control de una matriz de leds nxn con el micro?
- 9 Según tengo entendido, el giroscopio de la tarjeta es digital y su activación es diferente a la mostrada en el manual de referencia, pues éste hace mención al modelo analógico. ¿Como puedo trabajar con él?
Rebotes en Pulsadores o Interruptores
¿Qué son los rebotes?
Al pulsar algún botón o interruptor, no se realiza una conexión perfecta e instantánea como nosotros esperamos. Un pulsador se compone de dos partes de metal que entran en contacto (choca una con la otra) al accionarlo. Este choque genera unos rebotes realmente pequeños que suceden tan rápido que son imperceptibles para nosotros (aunque no para el DEMOQE128) hasta que finalmente se consigue un contacto firme.
Los rebotes pueden ocasionarnos molestos inconvenientes como lo son las falsas interrupciones o las interrupciones no deseadas. Entonces, ¿cómo corregir este problema?
La solución es sencilla y consta de dos aproximaciones. La primera es por hardware, adaptando a la entrada del interruptor de nuestra tarjeta un circuito simple con resistores y capacitores tal que los rebotes sean absorbidos por el capacitor. No nos centraremos en esta aproximación.
Ya que no siempre disponemos de los componentes electrónicos, la aproximación más práctica suele ser por software y es la que vamos a implementar. Basta con añadir un pequeño retardo en nuestro programa desde que se detecta el primer pulso hasta que se vuelve a leer la entrada del pulsador. Dicho retardo debe ser suficientemente largo para asegurar que cuando finalice ya se hayan extinguido los rebotes, pero también lo suficientemente corto para que sea imperceptible para nosotros.
El siguiente es un posible código en ensamblador, usando el módulo KBI, para llevar esto acabo:
; Include derivative-specific definitions
INCLUDE 'derivative.inc'
;
; export symbols
;
XDEF _Startup
ABSENTRY _Startup
;
; variable/data section
;
ORG RAMStart ;; Insert your data definition here
contador: DS.B 1 ;; Variable a usar para incrementar y mostrar en los leds
PermisoLeer: DS.B 1 ;; Variable a usar para autorizar el incremento del contador
;
; code section
;
ORG ROMStart
_Startup:
LDA #$43
STA SOPT1
LDHX #RAMEnd+1 ;; Inicializamos el Stack Pointer
TXS
CLRA
STA contador ;; Inicializamos el contador
LDA #$1
STA PermisoLeer ;; Damos inicialmente autorización para incrementar el contador la
;; la primera vez que se ejecuta el programa.
BSR Configurar_GPIO
BSR Configurar_RTC
BSR Configurar_KBI
CLI ;; Habilitamos interrupciones
mainLoop:
BRA mainLoop
;**************************************************************
;* Subrutinas de Configuracion
;**************************************************************
Configurar_KBI:
LDA #$06
STA KBI1SC ;; KBACK=1 (1 se borran los pedidos de interrupcion),KBIE=1 (habilita las interrupciones)
LDA #$04
STA KBI1PE ;; Habilitando pin PTA2 como KBI
LDA #$00
STA KBI1ES ;; Pines detectan una caída de voltaje (PTA2)
RTS
Configurar_RTC:
LDA #%00011000 ;; RTIF=0, RTCLKS6=0 RTCLKS5=0, RTIE=1, RTCPS3=1, RTCPS2=0, RTCPS1=0, RTCPS0=0
STA RTCSC ;; Fuente reloj interna 1khz. Interrupciones habilitadas. Reloj configurado a 1s.
LDA #1 ;; Definimos el valor del registro modulo del RTC
STA RTCMOD
LDA SCGC2 ;; Deshabilitamos el Clock Gate para el RTC
EOR #%00000100
STA SCGC2
RTS
Configurar_GPIO: ;; General Port Input/Output
LDA #%00111111
STA PTCDD ;; 6Bits (LSB) PTC - habilitados como salida colocando 1 (PTC0 a PTC5)
LDA #%11000000
STA PTEDD ;; 2Bits (MSB) PTE - habilitados como salida colocando 1 (PTE6 Y PTE7)
LDA #%00111111
STA PTCD ;; Cero a la salida (logica negada): se apagan los leds
LDA #%11000000
STA PTED ;; Cero a la salida (logica negada): se apagan los leds
LDA #%00000100 ;; Se habilita la resistencia de pull-up para el interruptor
STA PTAPE ;; PTA2. Esto significa que si se presiona el botón, el valor lógico es 0,
;; si no se presiona, el valor lógico es 1.
LDA #%11111011 ;; Se habilita PTADD2 como entrada
STA PTADD
RTS
;**************************************************************
;* Rutinas de interrupcion *
;**************************************************************
Interrupcion_KBI:
LDA %11111101 ;; Deshabilito interrupciones del KBI
AND KBI1SC
STA KBI1SC
LDA PermisoLeer ;; Verifico si tengo permiso para incrementar contador
CMP #$1
BEQ IncContador
BRA FinKBI
IncContador:
LDA #$0
STA PermisoLeer
LDA SCGC2 ;; Habilitamos el Clock Gate para el RTC
ORA #%00000100
STA SCGC2
LDA contador
INCA
STA contador ;; Incremento el contador
LDA #%00111111 ;; Mascara con el contador
AND contador ;; para pasar por PTC
COMA
STA PTCD
LDA #%11000000 ;; Mascara con el contador
AND contador ;; para pasar por el PTE
COMA
STA PTED
FinKBI:
LDA #%00000110 ;; Habilito interrupciones del KBI y limpia la bandera
STA KBI1SC
RTI
Int_RTC:
LDA #$80
ORA RTCSC
STA RTCSC
LDA #$1
STA PermisoLeer
LDA SCGC2 ;; Deshabilitamos el Clock Gate para el RTC
EOR #%00000100
STA SCGC2
RTI
;**************************************************************
;* spurious - Spurious Interrupt Service Routine. *
;* (unwanted interrupt) *
;**************************************************************
spurious: ; placed here so that security value
NOP ; does not change all the time.
RTI
;**************************************************************
;* Interrupt Vectors *
;**************************************************************
ORG $FFCE
DC.W Int_RTC ;; RTC
ORG $FFDA
DC.W Interrupcion_KBI ;; Keyboard
ORG $FFFA
DC.W spurious ;; IRQ
DC.W spurious ;; SWI
DC.W _Startup ;; Reset
¿Cómo se ve a nivel de hardware el problema de las falsas interrupciones y el BSET IRQSC_IRQACK?
Manejo y programación de Timers.
Un Timer o Temporizador en el DEMOQE es un circuito digital que generalmente contiene las siguientes partes:
- Un contador digital de 16 bits
- Este contador es un registro. Este registro se puede leer y también se puede escribir. Por lo que se puede iniciar con un valor diferente de 0.
- El contador puede ir desde 0 hasta 65536
- El contador se puede configurar para que funcione de forma incremental o decremental
- Se incrementa o disminuye el contador en cada pulso de reloj
- Una fuente de reloj que define la frecuencia a la que se va a incrementar el contador.
- Pueden existir diferentes fuentes de reloj
- Esta fuente de reloj se puede Preescalar lo cual significa que se puede crear un reloj mas lento a partir del reloj fuente. Este nuevo reloj se utiliza para incrementar al contador.
- Un comparador de Módulo
- Es un registro del mismo tamaño que el contador
- Este registro se puede configurar por el usuario
- Si el valor del contador es igual en algún instante al registro de módulo, el contador se reinicia.
- Una interrupción por desbordamiento
- Cuando el Timer llega a su valor máximo se produce una interrupción
- También se puede producir una interrupción si el Timer se reinició debido a que llegó al valor del registro Módulo
En el Demoqe se tiene un módulo llamado RTC (real time counter) y varios módulos llamados TPM, los cuales son dispositivos Temporizadores.
En líneas generales para programar cada uno de ellos el usuario debe realizar las siguientes configuraciones iniciales de sus registros:
- Seleccionar Fuente de Reloj
- Seleccionar preescalador para la frecuencia en la que se quiere incrementar/decrementar el contador
- Seleccionar si el contador va a ser incremental o decremental
- Configurar el registro del contador a su valor inicial
- Configurar el registro de Módulo si es necesario
- Habilitar/deshabilitar las interrupciones por desbordamiento
Para la configuración del RTC se puede servir de guía del artículo correspondiente al RTC
Para la configuración del TPM se puede servir de guía del artículo correspondiente al TPM
Cuales serian los pasos necesarios para configurar y trabajar con varios cloks? Ejm: Cada led que "encienda y apague" a una determinada frecuencia.
Macros en el HC9S08
Los Macros son una secuencia de líneas de texto que puede incluir Opcodes y Directivas con variables y constantes. Una vez que se define un macro se puede utilizar su nombre para ejecutar esas líneas de texto. Cuando el ensamblador procesa el nombre del macro, lo reemplaza con las líneas de texto asociadas a ese macro y las ejecuta como si estuvieran escritas en el código fuente.
Los macros permiten que un programa complejo y extenso se vea mas condensado y ordenado, haciendo énfasis principalmente en la funcionalidad y no en el detalle de la ejecución. Esto permite un nivel de abstracción superior y la reutilización de código común. Adicionalmente permiten la inclusión de parámetros.
Definición de un Macro
En el HC9S08 la definición de un Macro consiste en 4 partes:
- El encabezado del Macro (la directiva .MACRO)
- El cuerpo del Macro. Una lista secuencial de líneas de ensamblador, algunas de ellas pueden usar parámetros.
- La directiva de finalización (.ENDM)
- Eventualmente pueden tener una instrucción llamad .MEXIT la cual detiene la expansión del Macro
El cuerpo del macro puede contener:
- Instrucciones de ensamblador
- Directivas de ensamblador
- Llamadas a Macros que se definieron anteriormente
NO se pueden definir Macros dentro de un Macro.
El formato para realizar la llamada a un macro es:
[<label>:] <name>[.<sizearg>] [<argument> [,<argument>]...]
Parametros
Se pueden utilizar hastsa 36 parámetros en los Macros. Estos parámetros son reemplazados por el argumento correspondiente cuando se ejecuta el Macro. Para designar un parámetro se utiliza el caracter \ seguido de un número (0-9) o una letra en mayúsculas (A-Z).
El parámetro \0 corresponde a un argumento de tamaño que sigue al nombre del macro separado por un punto (.)
Ejemplo, dado el siguiente Macro:
MyMacro: MACRO
DC.\0 \1, \2
ENDM
La utilización en un programa podría ser:
MyMacro.B $10, $56
Y el ensamblador lo convierte en:
DC.B $10, $56
Como se puede ver en el ejemplo los argumentos $10 y $56 corresponden al parámetro \1 y \2 respectivamente. A los argumentos se les asigna un número de parámetro según el orden en que se coloquen luego del nombre del Macro, empezando desde \1 hasta \9 y luego \A hasta \Z.
Etiquetas en los Macros
Cuando se programa con Macros a cualquier línea se le puede asignar una etiqueta. Si se tienen múltiples definiciones de Macros puede surgir el problema de que dos Macros diferentes utilicen el mismo nombre de etiqueta dando como resultado comportamientos indefinidos.
Para resolver esta situación se definen etiquetas que son únicas para cada Macro. Al utilizar la directiva \@ el ensamblador genera un etiqueta única (una String de 5 dígitos de la forma nnnnn). Cada vez que se utiliza \@ se genera un String de 5 dígitos de manera incremental. Se le pueden agregar caracteres adicionales para entender mejor el código:
Definición de un Macro con etiquetas.
clear: MACRO
LDX #\1
LDA #16
\@LOOP: CLR 0,X
INCX
DECA
BNE \@LOOP
ENDM
Si llamamos al Macro Clear dos veces:
clear temporal
clear data
El ensamblador expande este código de la siguiente manera:
clear temporal
LDX #temporal
LDA #16
_00001LOOP: CLR 0,X
INCX
DECA
BNE _00001LOOP
clear data
LDX #data
LDA #16
_00002LOOP: CLR 0,X
INCX
DECA
BNE _00002LOOP
Interrupciones anidadas
- ¿Qué ocurre si en medio de mi programa ocurre una interrupción justo antes de realizar un salto luego de una comparación?, ¿Cuando regrese mis banderas pueden estar modificadas?¿Debo recrearlas?¿Como?
- Yo me pregunto si es posible modelar con el debugger (sin la tarjeta) alguna de las interrupciones con las que hemos trabajado y si es así, ¿cómo?
Configuración del IRQ
¿Se puede colocar el generador de funciones como entrada a la tarjeta y escuchar esa onda a través del buzzer?
Comunicación entre microcontroladores
- ¿Como podría conectar en paralelo los micros?
- ¿Si quisiera colocar un arduino para que trabaje en conjunto a mc9s08, seria un procedimiento parecido a colocar 2 mc9s08 en conjunto?
- Puerto Serial