TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: manongo123 en 30 de Agosto de 2007, 01:29:39
-
hola, he buscado informacion de como comunicar de un teclado a un pic, pero en los ejemplos en todos los casos utilizan la interrupcion INT/RB0, para el proyecto, y si ese pin lo estoy utilizando y lo tengo ocupado? no habria problemas con utilizar este codigo que es un ejemplo:
(http://picmania.garcia-cuervo.com/images/PRJ_PS2_kbd2host.gif)
dato EQU 03
clock EQU 02
AUXA equ 22h
AUXB equ 23h
rxbuf equ 24h
count equ 26h
ORG 000H
GOTO MAIN
Banksel TRISA
MAIN: Clrf PORTA ; limpia el puerto A, salidas
Movlw 0x07 ; Comparadores desactivados,
Movwf CMCON ; i/o digitales.
BSF STATUS,RP0
Movlw b'00000000' ; Movwf PORTB
movlw b'00001100'
Movwf PORTA
BCF STATUS,RP0
goto INICIO
;.....................................................
INICIO clrf PORTB
movlw b'11111111'
movwf PORTB
call START
movf rxbuf,w ;saco el dato por el puerto b para ver cada tecla
movwf PORTB ; y dejo a un lado los pulsos de reloj y el stop l
call retardo ; o q viene con un retardo de 1s
goto INICIO
;.....................................................
;.....................................................
START
btfsc PORTA,clock ;aqui es donde llega la bajada de pulso de reloj
goto START
btfsc PORTA,dato
goto INICIO
call RELOJ
call RX ; con esto ya tengo el dato
return
;....................................................
;....................................................
RELOJ
btfss PORTA,clock
goto RELOJ
nop
nop
nop
N1 btfsc PORTA,clock
goto N1
return
;....................................................
RX clrf rxbuf
movlw .8
movwf count
bcf STATUS,0
RXPL rlf rxbuf,f
call RELOJ
call BITIN
decfsz count,f
goto RXPL
return
;.....................................................
BITIN btfss PORTA,dato
return
bsf rxbuf,0
return
end
no medi tiempos ni nada, les agradeceria si hay informacion de otra manera de sacar los codigos del teclado para el pic en asm.
-
lo mejor es dejarlo dedicado y acomodar el resto en otrs pines, que mas vas a usar?
-
manongo123, el uso de la interrupción te evita tener que andar haciendo un muestreo contante al pin del puerto, pero por supuesto lo puedes resolver con otro pin solo que lo deberás hacer por software.
En pics con módulo CCP puedes usar el flanco del modo captura para hacer lo mismo.
Saludos
-
si te fuera posible puedes aprovechar que en el portb los pines 4 al 7 tambien tiene interrupcion en sus pines solo verifica en cual de ellos ha sucedido el cambio y ejecutas
-
si te fuera posible puedes aprovechar que en el portb los pines 4 al 7 tambien tiene interrupcion en sus pines solo verifica en cual de ellos ha sucedido el cambio y ejecutas
La única diferencia es que esa interrupción es por Nivel, siendo que la del RB0 y de los CCP es por flanco, eso habría que cambiar la forma de interpretar los resultados.
-
¿Puedes explicar mejor eso de la "interrupción por nivel"?
Yo las he usado ambas, la externa, y la del puerto B, y ambas se me disparan cuando el PIN cambia de estado. No sé si internamente hay una diferencia y es a eso a lo que te refieres.
-
¿Puedes explicar mejor eso de la "interrupción por nivel"?
Yo las he usado ambas, la externa, y la del puerto B, y ambas se me disparan cuando el PIN cambia de estado. No sé si internamente hay una diferencia y es a eso a lo que te refieres.
Una interrupción por Flanco, es la que actua cuando la señal SUBE o BAJA (durante la acción de subir o bajar).
Una interrupción por nivel es la que se activa cuando la tensión logra un cierto valor, sin importar si lo hizo en 1 useg o en 2 horas.
Desde el punto del software tal vez no tenga mucha relevancia pero lo aclaré por las dudas.
-
Suponiendo entonces que la configuramos para que salte en flanco ascendente, ¿quieres decir que la interrupción por flanco salta incluso aunque no se llegue a un 1 lógico y basta con que suba un poco?
-
Suponiendo entonces que la configuramos para que salte en flanco ascendente, ¿quieres decir que la interrupción por flanco salta incluso aunque no se llegue a un 1 lógico y basta con que suba un poco?
No, no basta eso, seria al revés, es probable que si sube "lento" no se detecte el flanco como tal. Hablo de electrónica elemental, no lo he probado con los pics, solo advierto de ello por si la rutina es muy dependiente del flanco habría que 'probar' realmente si funciona así sin pocos retoques en la interrupción del puerto B.
-
Como se configura una interrupcion por nivel??
Es similar al Treshold que tienen los MCP25050 en su conversor A/D ?? :shock:
-
yo tambien estoy de acuerdo con usar la interrupcion para este proyecto, pero en mi programa esa patita la estoy usando para otro fin (tambien interrupcion), y le estoy adicionando un teclado y por lo q veo q es casi como leer una memoria epron serial, no se ve complicado,lo q quiero es reconocer cada tecla y darle un valor o una funcion en mi programa tipo caja registradora (nada de codigo ascii y pasar a computadora) algo simple.y espero terminarlo.
-
Como se configura una interrupcion por nivel??
Es similar al Treshold que tienen los MCP25050 en su conversor A/D ?? :shock:
No conozco ese conversor, pero siendo más general es como cuando tenes usas las entradas comparador de los pics... tenes por un lado un voltaje de referencia y por el otro tenes la salida. Si lo supera se activa, sino, no se activa. Estos 'comparadores' no son más que operacionales de gran ganancia que amplifican cualquier pequeña diferencia.
En los pics, no hay nada que te lo configure de esa forma, simplemente en electrónica se definen un par de formas de activar una compuerta lógica.
por nivel : cuando al tensión llega a un cierto valor
por flanco: cuando la tensión cambia abruptamente de un valor a otro.
En esto es importante ese 'graduación' con que cambia la señal se denomina 'slew rate' y mide la pendiente en que varía la tensión con respecto al tiempo.
El tema de los cambios por nivel es que suele haber zonas 'no permitidas' , valores de voltaje para los cuales el valor no es 0 ni 1. Las entradas schmitt trigger vienen a solucionar este problema, son operacionales con gran ganancia que se van a los 5V o a los 0V con un salto rápido de tensión a pesar que la entrada varíe lentamente. Si uno lo arma, le puede configurar el rango del SI y del NO digamos,
Por ejemplo.
1) Superados los 2.7V que la señal se haga 5V
2) Cuando la señal sea menor que 2.3V que la señal se haga 0V.
A esa región y tipo de comportamiento se le llama 'histéresis' y evita que si la señal es 2.69V la salida esté variando de 5V a 0V constantemente.
Entonces una secuencia sería:
1. cuando la señal de entrada sube lentamente de 0 hasta 2.69V , la salida es 0V
2. cuando la señal de entrada llega a 2.7V, la salida es 5V
3. si la señal de entrada varía entre 2.7V y 5V, la salida es 5V
4. la señal de entrada comienza a descender su valor, y al llegar a 2.7V la salida sigue siendo 5V.
5. la señal de entrada sigue bajando hasta 2.31 y la salida sigue siendo 5V.
6. la señal de entrada es 2.30V entonces la salida pasa a ser 0V.
Con eso logramos que si la entrada tiene cierta fluctuación la salida no variará. Este es el comportamiento básico de un schmitt trigger. También son muy útiles para evitar las zonas 'no válidas', por ejemplo si usamos compuertas donde la salida tenga un comportamiento impredecible cuando la entrada está entre 1.2V y 2.3V, es un lugar perfecto para poner un schmitt trigger.
Hay señales que se detectan por un cambio abrupto de su entrada y otras que no, es allí donde vienen las señales que se denominan activas por nivel y activas por flanco.
Al final ambas llegan a un nivel de tensión, el tema es saber en qué tiempo lo hacen. Con las señales por nivel solamente nos interesa eso, el nivel de voltaje alcanzado, pero en una de flanco se nos pide y se nos está 'diciendo' que el cambio sea rápido y no que sea algo lento.
El comportamiento de un teclado, es en general por flanco ya que la señal cambia abruptamente.
En general, trato de evitar las señales 'por nivel' y trato de que las mismas cambien de forma rápida, ya que si sucede algo raro en el pic, no se, alguna interferencia o lo que sea, no me gustaría estar en una zona indeterminada.
-
Gracias por la explicacion!! :-/ :-/