Introduccion de varios paquetes de 8 bits a un pin del pic

hola, mira, tengo varias ideas para vos...

el receptor infrarrojo, cuando detecta un tren de pulsos a 40kHz, tira la salida a 0, o a 1, no se. Pero la verdadera información del control remoto tiene una frecuencia de unos 800Hz aprox. VER IMAGEN ADJUNTA

entonces lo que vos vas a tener a la entrada de tu micro es una señal de aprox. 800Hz.

como hacer para detectar que el control remoto empezo a emitir?

1. si usas el PORTA, no te queda otra que hacer una encuesta constantemente al puerto hasta que cambie del estado de reposo.

2. si usas el PORTB, podes usar tanto la linea RB0 como las lineas RB4;RB7. Con estas usas las interrupciones como detector de cambio de estado.

tanto en una como en otra vamos a tener un problema... como detectar un cero al principio? y si, porque si ya en reposo tenes un cero, que cagada...
bueno, como lo que vos necesitas es todo un byte de información, miras la tabla de codigos dl control y te fijas cuando va a haber un 1. apenas lo haya contas cuantos ceros te comiste y despues simplemente los metes al final del byte. esa es una idea qe tengo.

ahora... el gran problema... como leo 8 bits por una sola linea? tenes qe generar por software tu propia comunicacion serie.

mi idea, y seguro la de muchos:

esperas a tener un uno, cuando lo tenes damos por empezado la recepcion de codigo del control.
primer bit SIEMPRE: 1
qe hago? seteo el CARRY y lo desplazo con el comando "rrf" en un reigstro cualquiera, sea el W o uno que hayas definido vos.
despues de desplazar el bit leido, procedes a leer el proximo bit del control (a todo esto tenes qe esperar 1/800Hz para tener la certeza de qe cambie de estado... por las dudas, en el primer bit yo esperaria un poco mas, y despues si esperaria 1/800Hz). si el proximo bit da uno de nuevo, volvemos a setear el carry y desplazarlo en el mismo registro anterior, ahora, si te da cero, borramos el carry y lo desplazamos...

este proceso lo tenemos qe repetir 8 veces para leer los 8 bits.

ejemplo:

Código:
	CBLOCK
	Codigo
	BCont_A
	ENDC

		movlw	.8
		movwf	BCont_A
Byte		btfss	ENTRADA
		goto	EsCero1
EsUno1		bsf	STATUS,C
		goto	Fin
EsCero1		bcf	STATUS,C
Fin		rrf	Codigo,F
		call	RetardoX
		decfsz	BCont_A
		goto	Byte

bueno... despues de que termine de leer el codigo, lo comparas con tu lista, o haces un salto indexado como dijo Meta y listo...

espero que te haya servido...
cualquier cosa pregunta por aca.

salu2,
mano.
 

Adjuntos

  • onda_control_remoto_472.jpg
    onda_control_remoto_472.jpg
    16.7 KB · Visitas: 16
Oh, creo que tengo lo que necesitas.

Primera alternativa:
Están usando el protovolo RC5 de señales infrarrojas de Philipps? (ya sé que están usando Sony, pero a veces es el mismo). Dime "Si", y te mando un código en assembler que lo lee, vía una sola pata. Pero no te prometo que funcione, ya que está hecho perfectamente según lo teórico, pero nunca ha sido probado.

Segunda alternativa:
Nada de I2C y nada de eso. Lo que interesa es algo que escribiste por allí: "ya saben cómo son los bits de cada tecla". Y además, que son 8 bits?
La cosa es que debes saber cuánto tiempo hay entre cada bit, para hacer lo siguiente (leyendo una sola pata):

Do
Leer pata
Guardar estado de la pata (1 o 0)
Esperar (esperar el tiempo entre bit y bit)
Loop

En assembler se vería parecido a esto:

"
Dato equ 0X0C

Leer_pata
btfsc PortA,0
bsf Dato,0
rlf Dato,F
call delay
goto Leer_pata

"
Y esto 8 veces, para que hayas leído 8 bits.
Y todo este paquete, tienes que hacer que se ejecute varias veces, todo el rato, para que lea los 8 bits sea cuando sea que vengan. Esto lamentablemente obliga a que el primer bit leído siempre sea 1, para que sepas cuál es el primero de los 8, obligándote a usar un protocolo de comunicación, y donde sospecho que es el RC5.

El secreto está en el "rlf Dato,F". Revisa el Datasheet, allí sale qué es y cómo se usa.

Esta explicación fue bastante vaga, pero espero que te haya servido para encontrar un rumbo en tu investigación. Espero que te haya servido.

Si quieres más, solo pregunta. Nosotros te responderemos.
Saludos!
 
Ok, ningún problema. Sólo quiero recordarles, que NUNCA la probé, nunca la he visto funcionando. Estoy bastante seguro, que según teoría, está bien hecha.

Me sería muy muy grato, que el que la pruebe, me cuente si le funcionó, o qué errores pilló, y qué cambios tuvo que hacer en el programa.

Para nuestro amigo que comenzó con este Post, creo que es esto lo que necesita para leer los datos de un control remoto IR. Es el protocolo RC5.

Descripción de variables:
DATA_IN no me acuerdo bien que era
ERROR_PIN: va conectado un LED a esta pata y este se prende si la lectura fue errónea.
SYSTEM: variable que guarda el byte de Sistema que llega dentro del paquete binario que tira el control.
COMMAND: variable que guarda el comando -----
DATO: Variable que guarda el dato que viene dentro de la cadena de bits del protocolo.
CONTADOR: Usado para el programa nomás,
PDel0, es esado por la rutina de demora nada más.

Ojalá se entienda, lo comenté lo mejor posible.
Saludos!

Código:
list		p=16F84A		; list directive to define processor
#include	<p16F84A.inc>		; processor specific variable definitions
	
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

DATA_IN		EQU	D'0'
ERROR_PIN	EQU	D'1'
SYSTEM		EQU	0x0C
COMMAND	EQU	0x0D
DATO		EQU	0x0E
CONTADOR	EQU	0x0F
PDel0		EQU	0x10

;*******Inicialización del microcontrolador y ;variables***********************************************
	bsf	STATUS,RP0	;Pasar al banco 1
	movlw	B'0000001'
	movwf	TRISA		;1-7 = salida, 0 = entrada
	movlw	B'0000000'
	movwf	TRISB		;=salida, =entrada
	bcf	STATUS,RP0	;Volver al banco 0

	clrf	PORTA		;Limpiar puertos
	clrf	PORTB
;*******Fin inicialización del ;microcontrolador*******************************************************

MAIN
	call	LEER

LEER
	btfss	PORTA, DATA_IN	;Esperar a que entre el primer dato para comenzar
	goto	LEER
	call	DELAY14		;Retraso de 1/4 de bit
				;Una vez comenzada la lectura, comprobar el comienzo de la cadena
	btfss	PORTA, DATA_IN	;Probar si primer start bit es 1
	goto	BAD_DATA	;Ir a BAD_DATA si el primer start bit resulta ser cero
	call	DELAY12		;Esparar por medio bit
	btfsc	PORTA, DATA_IN	;Probar si entre 1er y 2do Start bit hay un 0
	goto	BAD_DATA	;Ir a BAD_DATA si el segundo start bit resulta ser cero
	call	DELAY12		;Esparar por medio bit
	btfss	PORTA, DATA_IN	;Probar si segundo start bit es 1
	goto	BAD_DATA	;Ir a BAD_DATA si el segundo start bit resulta ser cero
	bcf	PORTA, ERROR_PIN;Apagar pin de error si tod o está bien, y en caso de que esté activo
			;Si está malo el comienzo de la cadena, será Bad_Data
			;Ahora se comienza con la decodificación de datos útiles

	clrf	SYSTEM		;Borrar SYSTEM, COMMAND y DATO para empezar con variables limpias
	clrf	COMMAND
	clrf	DATO

	movlw	D'6'		;Cargar contador para leer 6 bits para leer la parte de SYSTEM
	movwf	CONTADOR
LEER_SYSTEM
	call	DELAY1		;Esperar un bit para empezar a leer SYSTEM BITS
	btfsc	PORTA, DATA_IN	;Leer MostSignificantBit SYSTEM BIT
	bsf	SYSTEM,CONTADOR	;Poner en 1 la variable SYSTEM,bit_corespondiente si fuese necesario
	decfsz	CONTADOR,F	;Decrementar CONTADOR en 1 y saltar próximo paso si es 0
	goto	LEER_SYSTEM	;Volver para leer el siguiente bit, si CONTADOR no es cero
			;Terminada la lectura de esta cadena de datos
			;Seguir con la lectura de COMMAND

	call	DELAY1		;Antes, esperar primer bit de SPACE
	call	DELAY1		;Esperar segundo bit de SPACE

	movlw	D'6'		;Cargar contador para leer 6 bits
	movwf	CONTADOR
LEER_COMMAND
	call	DELAY1		;Esperar un bit para empezar a leer COMMAND
	btfsc	PORTA, DATA_IN	;Leer MostSignificantBit COMMAND BITS
	bsf	COMMAND,CONTADOR;Poner en 1 la variable COMMAND,bit_corespondiente si fuese necesario
	decfsz	CONTADOR,F	;Decrementar CONTADOR en 1 y saltar próximo paso si es 0
	goto	LEER_COMMAND	;Volver para leer el siguiente bit
			;Terminada la lectura de esta cadena de datos
			;Seguir con lo que sigue

	movlw	D'6'		;Cargar contador para leer 6 bits
	movwf	CONTADOR
LEER_DATO
	call	DELAY1		;Esperar un bit para empezar a leer DATA
	btfsc	PORTA, DATA_IN	;Leer MostSignificantBit DATA BIT
	bsf	DATO,CONTADOR	;Poner en 1 la variable DATO,bit_corespondiente si fuese necesario
	decfsz	CONTADOR,F	;Decrementar CONTADOR en 1 y saltar próximo paso si es 0
	goto	LEER_DATO	;Volver para leer el siguiente bit
			;Terminada la lectura de esta cadena de datos
			;Seguir con lo que sigue

	rrf	SYSTEM,F	;Como estos registros han sido grabdos desde bits 1 hasta 6,
	rrf	COMMAND,F	;deben ser movidos una vez hacia la derecha para que los datos
	rrf	DATO,F		;que contienen estén grabados en los bits entre 0 y 5.

	return			;La lectura de datos está terminada, ahora volver.

BAD_DATA
	bsf	PORTA, ERROR_PIN;Avisar que hay error
	goto	MAIN		;Volver al inicio, o salir de LEER

DELAY1	call	DELAY14		;Llamar 4 veces al DELAY de 1/4 de Bit para que sea 1 Bit
	call	DELAY14		;Todos los DELAYs son para 4MHz, y DELAY1 = 1,778 ms
	call	DELAY14
	call	DELAY14
	return

DELAY12	call	DELAY14		;Llamar 2 veces al DELAY de 1/4 de Bit para que sea 1/2 de Bit
	call	DELAY14
	return

DELAY14	movlw     .110      ; 1 set numero de repeticion 
        movwf     PDel0     ; 1 |
PLoop0  clrwdt              ; 1 clear watchdog
        decfsz    PDel0, 1  ; 1 + (1) es el tiempo 0  ?
        goto      PLoop0    ; 2 no, loop
        return              ; 2+2 Fin.

END
 
Atrás
Arriba