TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: chacruna en 14 de Febrero de 2009, 21:08:02
-
Hola amigos, aqui estoy de nuevo, cada paso de mi proyecto es un problema.
El tema es asi, tengo dos receptores IR integrados, uno sacado de una TV y el otro es el receptor de una sintonizadora de TV para PC). El resultado con ambos receptores fue el mismo.
Cuando leo con el osciloscopio, al presionar algun boton de emisor puedo leer el tren de pulsos correctamente.
El tema es que cuando pruebo con el PIC, la entrada siempre la tengo en alto. Me fijo el voltimetro y la salida del receptor esta siempre en +4v. (raro). Deberia estar en 0 si no estoy apretando ningun boton. Tambien es raro que con los dos receptores que son muy diferentes pase lo mismo.
(http://img511.imageshack.us/img511/660/28355956ff0.jpg)
-
Si puedes sube el esquemático y el código del pic porque puede ser tanto problema de software como de hardware. De otra manera va a ser difícil ayudarte
-
Perdón se me fue un "pon" de más, esto me pasa por no darle a previsualizar antes de enviar el mensaje :lol:
-
Hola pablo!, siempre presente vos!.
Adjunto el codigo, una foto del circuito montado en el protoboard y una imagen con el esquematico (además hay 2 LEDs en RA2 y RA3 que los uso como control). Nota: en el circuito montado se está usando el puerto B4 como entrada.
(http://img27.imageshack.us/img27/2405/pic16f84ti7.jpg)
(http://img382.imageshack.us/img382/4796/protoit6.jpg)
El código básicamente lo que hace es leer los primeros dos bits del tren y mostrarlos con los dos LEDs. El sensor está conectado al pin RB4.
Es un código de prueba, luego lo voy a hacer con interrupción externa.
#include <16F84A.h>
#fuses XT,NOWDT,NOPROTECT,PUT
#use delay (clock=4000000)
#use fast_io(a)
#use fast_io(b)
void main() {
int i=0, bit[2];
set_tris_a(0);
set_tris_b(1);
while(1) {
if(input(PIN_B4)) {
delay_us(1000);
if(input(PIN_B4)) {
bit[i]=1;
while(input(PIN_B4));
}else{
bit[i]=0;
}
i++;
}
if(i==2) {
output_bit(PIN_A2,bit[0]);
output_bit(PIN_A3,bit[1]);
delay_ms(2000);
output_bit(PIN_A2,0);
output_bit(PIN_A3,0);
delay_ms(1000);
i=0;
}
}
}
Saludos!
-
Primero que nada, decime que no tenés nada conectado a RB4 o o si está que esté a través de una resistencia porque cuando inicias el programa lo configuras como salida.
La mayoría de las veces cuando conectas algo a un pin del pic configurado como entrada debes tratar de colocarle una resistencia limitadora, porque en caso de que configures por error ese pin como salida se te va a quemar el micro o lo que tengas conectado a ese pin.
No se que función cumple RB4
En tu código la, única forma de que las salidas se pongan en alto es cuando está en alto RB0 y RB4. Pero RB4 lo tienes como salida.
Si querés que RB4 se te configure como entrada debes poner
set_tris_b(0x11);
No te olvides de colocar una resistencia limitadora a la salida del sensor por las dudas.
-
Veo en la foto que agregaste que tenés los leds conectados directamente a la salida de los pines del pin, Si o sí colocale una resistencia a cada led de alrededor de 220 a 1K porque sino lo vas a quemar. Una pregunta, el cable azul del sensor lo tenés conectado a positivo? porque no se ve bien
-
Observando la foto nuevamente, Te comento lo que veo. El cable naranja del sensor lo tenés conectado al pin RB4 que como te dije está configurado como salida por un error en el código. por eso siempre te da un voltaje fijo. Espero no hayas quemado nada. Prueba con un solo sensor por vez y acomoda el código para que funcione correctamente con un slo sensor y luego le agregás el otro
-
Hola pablo, al parecer viste una version antigua de mi post, ya que lo habia editado porque noté unos errores.
Fijate que uso el pin B4 como entrada (set_tris_b(1)).
Lo de la resistencia ahora lo voy a probar, de todos modos lo raro es que el tester me tire siempre +4v, quizas no puede resfrecar tan rapido, pero
cuando no apreto ningún botón no debería haber +4v, o si?.
Una pregunta, el cable azul del sensor lo tenés conectado a positivo? porque no se ve bien
Yo sabía que alguíen lo iba a notar, en la foto parece que estan los dos conectados al mismo polo, debe ser el celular y el ángulo :z)
Nota: blanco=gnd y azul=+5v.
---
#include <16F84A.h>
#fuses XT,NOWDT,NOPROTECT,PUT
#use delay (clock=4000000)
#use fast_io(a)
#use fast_io(b)
void main() {
int i=0, bit[2];
set_tris_a(0);// TODO A COMO SALIDAS
set_tris_b(1);// TODO B COMO ENTRADAS
while(1) {
if(input(PIN_B4)) {// PIN_B4
delay_us(1000);
if(input(PIN_B4)) {// PIN_B4
bit[i]=1;
while(input(PIN_B4));//PIN_B4
}else{
bit[i]=0;
}
i++;
}
if(i==2) {
output_bit(PIN_A2,bit[0]);
output_bit(PIN_A3,bit[1]);
delay_ms(2000);
output_bit(PIN_A2,0);
output_bit(PIN_A3,0);
delay_ms(1000);
i=0;
}
}
}
-
Si, vi que cambiaste el código, pero para configurar el RB4 como entrada y los demás como salida debes poner
set_tris_b(16)
que en binario sería 000010000
el bit 4 debe estar en uno para ser entrada
y no set_tris_b(1)
que en binario es 000000001
que corresponde a RB0 como entrada
Por eso es que te sigue dando un voltaje fijo.
-
Hola pablo, mirá volvi a usar el pin B0 como entrada (esquema original). Estube probando que funcionara con un pulsador y todo bien.
El tema es que el sensor me está dando ~+4V TODO EL TIEMPO, deberia fluctuar entre 0V y ~+4V.
El código funciona, debe ser un problema de hard.
#include <16F84A.h>
#fuses XT,NOWDT,NOPROTECT,PUT
#use delay (clock=4000000)
#use fast_io(a)
#use fast_io(b)
void main() {
int i=0, bit[2];
set_tris_a(0);
set_tris_b(1);
while(1) {
if(input(PIN_B0)) {
delay_us(1000);
if(input(PIN_B0)) {
bit[i]=1;
while(input(PIN_B0));
}else{
bit[i]=0;
}
i++;
}
if(i==2) {
output_bit(PIN_A2,bit[0]);
output_bit(PIN_A3,bit[1]);
delay_ms(1500);
output_bit(PIN_A2,0);
output_bit(PIN_A3,0);
delay_ms(500);
i=0;
}
}
}
(http://img514.imageshack.us/img514/4632/150209002834ii5.jpg)
----
set_tris_b(16)
que en binario sería 000010000
el bit 4 debe estar en uno para ser entrada
Imagino que quisiste decir: "el bit 5 debe estar en uno para ser entrada"
Y ya que estamos esto tambien :P.
Si querés que RB4 se te configure como entrada debes poner
set_tris_b(0x11);
Imagino que quisiste decir: set_tris_b(0x10);
Saludos!!!
-
Ahora si estamos en problemas, parece que el programa y las conexiones están bien. Probaste el sensor con el osciloscopio sin conectar el pic como lo hiciste antes para ver si ahora la falla no es de éste?. Se me hace que no está funcionando el sensor.
No me hiciste caso de colocar resistencias a los leds, hacelo porque estás consumiendo toda la corriente que puede entregar el puerto del pic y no se que le puede pasar al pic en estos casos.
Una vez que te asegures que el sensor funciona deberías intercalar entre el sensor y el pic alguna compuerta Schmitt trigger para adaptar bien los niveles de entrada al pic (ALto 5V bajo 0V), porque el sensor puede que no te de bien los valores de umbral de disparo de la entrada del pic. O sino conectarlo a pin RA4 que si es Schmitt trigger (configurándolo como entrada por supuesto)
-
jajaja tenés razón no te hice caso, ahora les agrego unas resistencias de 220Ohm a los LEDs.
Probe con mi tester pedorro el receptor de la TV y cuando no envio ningun comando con el control me tira +3.80V y cuando apreto algun boton oscila entre +3.82V y +3.83V. Esto no deberia ser asi SEGUN tengo entendido. Con el otro receptor sucede lo mismo.
-
El tema de los valores extraños se debe a que el tester mide voltaje eficaz, y no tiene la velocidad de respuesta para tomar la lectura a la frecuencia que la entrega el control remoto. Prueba de apagar las luces y con una linterna o algo ilumina el sensor y fijate si tenés cambio o no en lo que indica el tester con luz y sin luz. No se como vas a mirar el tester con la luz apagada pero bueno es problema tuyo :D
-
Con respecto a lo que sigue:
Cita de: pablomanieri en 14 de Febrero de 2009, 10:27:57 pm
set_tris_b(16)
que en binario sería 000010000
el bit 4 debe estar en uno para ser entrada
Imagino que quisiste decir: "el bit 5 debe estar en uno para ser entrada"
Los bits de los puertos y registros se comienzan a contar desde cero por eso bit 4
Y ya que estamos esto tambien .
Cita de: pablomanieri en 14 de Febrero de 2009, 09:50:33 pm
Si querés que RB4 se te configure como entrada debes poner
set_tris_b(0x11);
Imagino que quisiste decir: set_tris_b(0x10);
Di por sentado que RB0 también era entada
-
Perfecto, ahora si todo tiene sentido :D.
----
Hice la prueba de la "linterna" y nada, no cambiaban nada los valores.
De todos modos es un circuito integrado que deberia filtrarme solo la frecuencia del control remoto.
-
Si, efectivamente tiene un filtro centrado a una frecuencia de creo 38khz. Además es más sensible a los infrarojos que a la luz normal. Probalo con el osciloscopio así nos sacamos la duda de si funciona y luego conectalo a RA4 que es schmitt trigger.
-
Resultados:
Midiendo con el osciloscopio sin el circuito conectado:
Esto me tira cuando no estoy presionando ningún botón. Parece 0V pero si conecto a 5V CC tambien me tira eso (raya de constante).
(http://img22.imageshack.us/img22/4125/90950704pq8.jpg)
Esto tira cuando presiono un botón:
(http://img18.imageshack.us/img18/3563/30751085sb1.jpg)
-----
Probé conectando el RB4 pero es lo mismo. Pongo el código por las dudas :P
#include <16F84A.h>
#fuses XT,NOWDT,NOPROTECT,PUT
#use delay (clock=4000000)
#use fast_io(a)
#use fast_io(b)
void main() {
int i=0, bit[2];
set_tris_a(0);
set_tris_b(0x10);
while(1) {
if(input(PIN_B4)) {
delay_us(1000);
if(input(PIN_B4)) {
bit[i]=1;
while(input(PIN_B4)); //SE QUEDA CLAVADO ACÁ
}else{
bit[i]=0;
}
i++;
if(i==2) {
output_bit(PIN_A2,bit[0]);
output_bit(PIN_A3,bit[1]);
delay_ms(1500);
output_bit(PIN_A2,0);
output_bit(PIN_A3,0);
delay_ms(500);
i=0;
}
}
}
(http://img23.imageshack.us/img23/795/150209014657gl9.jpg)
-
Yo me refería al puerto A, el pin RA4 es schmitt trigger.
La tarjeta de sonido no puede leer voltajes de continua porque tiene un ancho de banda de 20hz hasta 20Khz. por eso te muestra 0 cuando no presionas ningún botón.
-
Yo creo que el problema es el receptor IR. Lo que me inquieta es que a los dos le suceda lo mismo y eso que nada que ver uno con el otro.
De todos modos quizas andan bien y necesito un integradito que me convierta lo que me tira a 0V y +5V. Existe algo como eso??
-
El circuito para adaptar los niveles lo podés hacer con un comparador. Alguno que funcione con fuente simple solamente, para esto puedes usar también un operacional. En la entrada + del comparador pones la salida del sensor. luego haces un divisor resistivo para tener 2,5V y lo conectas a la pata -, La salida del comparador la pones al pin de entrada del pic.
O sino alguna compuerta con schmitt trigger.
-
Uff, por algun motivo lei que el Schmitt Trigger era el pin B4.
---
Haciendo mejor las cosas probé con A4 como entrada pero lamentablemente es la misma historia.
El led que está en B0 se prende y no se apaga nunca. (ver comentarios en codigo).
#include <16F84A.h>
#fuses XT,NOWDT,NOPROTECT,PUT
#use delay (clock=4000000)
#use fast_io(a)
#use fast_io(b)
void main() {
int i=0, bit[2];
set_tris_b(0);
set_tris_a(0x10);
while(1) {
if(input(PIN_A4)) {
delay_us(1000);
if(input(PIN_A4)) {
bit[i]=1;
while(input(PIN_A4)) {
output_high(PIN_B0); // LED CONTROL
}
output_low(PIN_B0); // SI NO SE APAGA ES QUE NO SALE DEL BUCLE
}else{
bit[i]=0;
}
i++;
}else {
output_low(PIN_B0);
}
if(i==2) {
output_bit(PIN_B2,bit[0]);
output_bit(PIN_B3,bit[1]);
delay_ms(1500);
output_bit(PIN_B2,0);
output_bit(PIN_B3,0);
delay_ms(500);
i=0;
}
}
}
-
Debe ser un problema con los niveles de voltaje. sería ideal un osciloscopio de verdad para saber que es lo que hay a la salida del sensor. Con el osciloscopio de la placa de sonido se puede ver si hace algo pero no la amplitud de los pulsos ya que ésta está limitada a +-1V y lo que en teoría le está metiendo es de 0 a 5V, por lo que no podemos ver si llega esos valores. Va a ser mejor que te des un respiro y luego lo agarras con mas paciencia. Suerte. Hasta pronto
-
¿Estarás conectando bien el sensor, tenes el datasheet con la indicación de los pines?
-
No encontre el datasheet de ninguno, pero era bastante intuitivo (aparte el osciloscopio algo concreto muestra).
Uno de los sensores era asi:
Cable rojo = +5V
Cable pelado = Gnd
Cable Blanco = Datos.
El otro:
Un cable violeta separado = Datos
De los dos cables unidos: Blanco = +5V y pelado = GND
-
EL tema de que muestre algo en el osciloscopio no se si es indicio de que funcione correctamente. En que escala lo tenías porque si anduviese bien te tendría que haber recortado la onda en +-1V. ya que le estás metiendo de 0 a 5v que sería un valor medio de 2.5, por lo tanto la placa vería +-2.5V. Si vés valores menores en amplitud de +-1 vas a tener que tratar de medir bien con algún osciloscopio prestado. Y adaptar bien los niveles con un comparador.
El control remoto que usas tiene las pilas bien cargadas?
-
Además cuando hiciste las primeras pruebas los conectaste al RB4 configurado como salida y no se que puede haber pasado. Si puedes, consigue otro sensor.
-
Voy a comprar un sensor conocido y probar.
Hasta pronto pablo, gracias!!
-
5:17am, la obsesion ganó de nuevo pablo!!
Soy un pelotu**, me puse a mirar imagenes en internet y decidí arriesgar un sensor. Puse a Vcc el que estaba en datos y viceversa. FUNCO!!! ajjajajaja
Mil gracias pablo!
-
Bien :-/ . Es el problema de no contar con las hojas de datos. Y dar por sentado cosas que parecen evidentes pero no. Lo que es loco es que le chingaste en los dos sensores. Si algo tiene que salir mal va a salir mal. :).
-
Hola gente, vuelvo al tema. Ya solucionado el tema de la adquisicion de datos del sensor, paso a comentarles mi nuevo problemita :P
Arme un codigo que prende 7 leds segun la señal que reciba, el problema q tengo es que muchos botones reciben el mismo codigo y muchas veces el mismo boton genera codigos diferentes.
Dejo una imagen con dos señales de botones diferentes (osciloscopio / placa de sonido).
(http://img24.imageshack.us/img24/6974/59539650mm9.jpg)
Mi idea sería que la señal de arriba sea: 00110001000 y la de abajo: 01010001000 (ya se que son mas bits que la cantidad de LEDs q tengo conectados, pero por el momento estoy probando.
Nota: el sensor invierte la señal.
#include <16F84A.h>
#fuses XT,NOWDT,NOPROTECT,PUT
#use delay (clock=4000000)
#use fast_io(a)
#use fast_io(b)
void main() {
int i=0, bit[7];
set_tris_a(0);
set_tris_b(0x10);
while(1) {
do {
while(input(PIN_B4));
delay_us(900);
if(!input(PIN_B4)) {
bit[i]=1;
}else {
bit[i]=0;
}
i++;
}while(i<7);
if(i==7) {
output_bit(PIN_A2,bit[0]);
output_bit(PIN_A3,bit[1]);
output_bit(PIN_B0,bit[2]);
output_bit(PIN_B1,bit[3]);
output_bit(PIN_B2,bit[4]);
output_bit(PIN_A1,bit[5]);
output_bit(PIN_A0,bit[6]);
delay_ms(500);
output_bit(PIN_A2,0);
output_bit(PIN_A3,0);
output_bit(PIN_B0,0);
output_bit(PIN_B1,0);
output_bit(PIN_B2,0);
output_bit(PIN_A1,0);
output_bit(PIN_A0,0);
i=0;
}
}
}
-
hola nuevamente yo. ¿Como sabes cuando hay varios ceros seguidos o cuando hay varios unos seguidos? Mi consejo es que realices el chequeo de los bits por interrupción, es decir detectas que hay un cambio en la salida del sensor y contas que tiempo esta en ese estado, luego te fijas en el ancho del pulso que te da el control remoto (T) entonces si tienes en uno la señal por un tiempo 2T entonces son dos unos seguidos. El tiempo de cada bit que te da el control remoto lo tienes que calcular con el osciloscopio o mirar si conseguis la hoja de datos de dicho control, para saber el ancho de los pulsos. Una vez que tienes la tabla con todos los botones puedes codificar con el pic y usar tu propia codificación para indicarlo on leds o con lo que sea. Ya que la cantidad de botones que tiene un control remoto no utiliza todas las combinaciones.
-
Hola pablo!!, tanto tiempo jajaja.
Ya solucioné el problema, que basicamente era entender la bizarra forma de codificar de este remoto (muy distinto a RC5). Es el control de una sintonizadora de tv PCI que evidentemente tiene su propio protocolo.
Hay que admitir que el osciloscopio / placa de sonido es una pedorrada, pero me salva la vida.
-
Me alegro que lo hayas solucionado. Estaría bueno que vayas posteando tus avances tanto de software como de hardware aunque no tengas más dudas porque seguro nos va a servir a muchos
-
Hola pablo, justamente estaba armando una imagen y ajustando un poco el código para postear los resultados.
(http://img179.imageshack.us/img179/5176/94974933xq2lk5ze1.jpg)
En ésta imagen se pueden ver dos señales que son del mismo botón, cada vez que apreto un botón alternan unos bits del principio (rectángulo amarillo). Me explico mejor: si apreto el botón una vez aparece la primer señal, si apreto de nuevo aparece la siguiente, si apreto de nuevo vuelve a la primer señal y así sucesivamente (creo que se llaman bits de toggle).
Como notarán cada ciclo son 2 bits (raro), esto creo que es así ya que en algunos botones lo único que cambia en la señal es la duración de algún semiciclo (por ejemplo: en el asterisco azul de la imagen hay un bit (1 en este caso), pero hay otro botón que lo único que cambia es la duración de ese semiciclo.
La barrita verde marca que de ese bit para adelante son los comandos (bit 11). Del bit 11 para atras lo único que cambia son los bits de "toggle".
En la imagen se puede ver que la señal tiene 21bits, sin embargo la mitad de los botones tienen 19bits. (el control remoto es de la placa "Asus My Cinema 7131").
(http://www.royalsystel.com.ar/Fotos/asus%20my%20cinema%203.jpg)
Éste código funciona CASI bien leyendo botones que emiten señales de 19bits (se come el ultimo bit). También lee los de 21bits pero se come los ultimos tres bits.
#include <16F84A.h>
#fuses XT,NOWDT,NOPROTECT,PUT
#use delay (clock=4000000)
#use fast_io(a)
#use fast_io(b)
int bit[21], i;
void main() {
set_tris_a(0);
set_tris_b(0x10);
for(i=0;i<21;i++) {
bit[i]=0;
}
i=0;
while(1) {
do {
while(input(PIN_B4));
delay_us(1200);
if(!input(PIN_B4)) {
bit[i]=1;
}else {
bit[i]=0;
}
i++;
while(!input(PIN_B4));
delay_us(950);
if(input(PIN_B4)) {
bit[i]=1;
}else {
bit[i]=0;
}
i++;
}while(i<18); // no se porque si pongo i<19 no sale en la primer pulsada del botón, como q lee un bit menos
if(i==18) {
output_bit(PIN_A2,bit[11]); // primer bit del comando
output_bit(PIN_A3,bit[12]);
output_bit(PIN_B0,bit[13]);
output_bit(PIN_B1,bit[14]);
output_bit(PIN_B2,bit[15]);
output_bit(PIN_A1,bit[16]);
output_bit(PIN_A0,bit[17]);
output_bit(PIN_B7,bit[18]); // siempre en 0 pq el while es i<18 y no i<19
output_bit(PIN_B6,bit[19]); // siempre en 0 pq el while es i<18 y no i<21 (en este codigo no leeo los comandos de 21bits enteros)
output_bit(PIN_B5,bit[20]); // siempre en 0 pq el while es i<18 y no i<21 (en este codigo no leeo los comandos de 21bits enteros)
delay_ms(250);
output_bit(PIN_A2,0);
output_bit(PIN_A3,0);
output_bit(PIN_B0,0);
output_bit(PIN_B1,0);
output_bit(PIN_B2,0);
output_bit(PIN_A1,0);
output_bit(PIN_A0,0);
output_bit(PIN_B5,0);
output_bit(PIN_B6,0);
output_bit(PIN_B7,0);
for(i=0;i<21;i++) {
bit[i]=0;
}
i=0;
}
}
}
Éste es el código que debería leer tanto 19bits como 21bits, pero no funciona (por algún motivo no sale de un while).
#include <16F84A.h>
#fuses XT,NOWDT,NOPROTECT,PUT
#use delay (clock=4000000)
#use fast_io(a)
#use fast_io(b)
long ticks=0;
int bit[21], i, seconds=0;
#INT_TIMER0
void int_timer() {
set_timer0(156);
if (++ticks == 10000) {
seconds++;
ticks=0;
}
}
void main() {
set_tris_a(0);
set_tris_b(0x10);
setup_counters(RTCC_INTERNAL,RTCC_DIV_1);
set_timer0(156);
enable_interrupts(GLOBAL);
enable_interrupts(INT_TIMER0);
for(i=0;i<21;i++) {
bit[i]=0;
}
i=0;
while(1) {
while(input(PIN_B4));
do {
delay_us(1200);
if(!input(PIN_B4)) {
bit[i]=1;
}else {
bit[i]=0;
}
i++;
while(!input(PIN_B4));
delay_us(950);
if(input(PIN_B4)) {
bit[i]=1;
}else {
bit[i]=0;
}
i++;
ticks=0;
seconds=0;
set_timer0(156);
while(input(PIN_B4) || seconds < 1); // aparentemente no sale nunca de éste while
if(seconds >= 1) {
bit[19]=0;
bit[20]=0;
i=21;
}
}while(i<21);
if(i==21) {
output_bit(PIN_A2,bit[11]); // primer bit del comando
output_bit(PIN_A3,bit[12]);
output_bit(PIN_B0,bit[13]);
output_bit(PIN_B1,bit[14]);
output_bit(PIN_B2,bit[15]);
output_bit(PIN_A1,bit[16]);
output_bit(PIN_A0,bit[17]);
output_bit(PIN_B7,bit[18]);
output_bit(PIN_B6,bit[19]);
output_bit(PIN_B5,bit[20]);
delay_ms(250);
output_bit(PIN_A2,0);
output_bit(PIN_A3,0);
output_bit(PIN_B0,0);
output_bit(PIN_B1,0);
output_bit(PIN_B2,0);
output_bit(PIN_A1,0);
output_bit(PIN_A0,0);
output_bit(PIN_B5,0);
output_bit(PIN_B6,0);
output_bit(PIN_B7,0);
for(i=0;i<21;i++) {
bit[i]=0;
}
i=0;
}
}
}
-
Bueno, voy avazando de poco.
Con éste nuevo código puedo leer las señales de 19bits ENTERAS, y las de 20bits pero sin los últimos 2bits.
#include <16F84A.h>
#fuses XT,NOWDT,NOPROTECT,PUT
#use delay (clock=4000000)
#use fast_io(a)
#use fast_io(b)
int bit[21], i;
void main() {
set_tris_a(0);
set_tris_b(0x10);
for(i=0;i<21;i++) {
bit[i]=0;
}
i=0;
while(1) {
do {
while(input(PIN_B4));
delay_us(1200);
if(!input(PIN_B4)) {
bit[i]=1;
}else {
bit[i]=0;
}
i++;
if(i<19) {
while(!input(PIN_B4));
delay_us(950);
if(input(PIN_B4)) {
bit[i]=1;
}else {
bit[i]=0;
}
i++;
}
}while(i<19);
if(i==19) {
output_bit(PIN_A2,bit[11]);
output_bit(PIN_A3,bit[12]);
output_bit(PIN_B0,bit[13]);
output_bit(PIN_B1,bit[14]);
output_bit(PIN_B2,bit[15]);
output_bit(PIN_A1,bit[16]);
output_bit(PIN_A0,bit[17]);
output_bit(PIN_B7,bit[18]);
output_bit(PIN_B6,bit[19]);
output_bit(PIN_B5,bit[20]);
delay_ms(250);
output_bit(PIN_A2,0);
output_bit(PIN_A3,0);
output_bit(PIN_B0,0);
output_bit(PIN_B1,0);
output_bit(PIN_B2,0);
output_bit(PIN_A1,0);
output_bit(PIN_A0,0);
output_bit(PIN_B5,0);
output_bit(PIN_B6,0);
output_bit(PIN_B7,0);
for(i=0;i<21;i++) {
bit[i]=0;
}
i=0;
}
}
}
-
Hola gente, despues de leer un poco cai en la cuenta de que el protocolo del control si era RC5 :S.
Hice el algoritmo para decoficarlo usando delay_us, pero despues de un par de bits leidos correctamente empieza a "saltar error" (el codigo verifica que los bits sean correctos).
#include <16F84A.h>
#fuses XT,NOWDT,NOPROTECT,PUT
#use delay (clock=4000000)
#use fast_io(b)
#define IR_IN (!input(PIN_B4))
int8 bit[14], i, error;
void main() {
set_tris_a(0);
set_tris_b(0x10);
delay_ms(250);
while(1) {
while(IR_IN==0);
delay_us(444);
if(IR_IN==0) {
error=1;
}else {
bit[0]=1;
error=0;
}
for(i=1;i<14;i++) {
delay_us(889);
if(IR_IN==0) {
delay_us(889);
if(IR_IN==1) bit[i]=1; else error=1; // despues de un par de bits empieza a leer mal
}else {
delay_us(889);
if(IR_IN==0) bit[i]=0; else error=1;
}
}
if(error==1) {
output_bit(PIN_A2,1);
output_bit(PIN_A3,1);
output_bit(PIN_B0,1);
output_bit(PIN_B1,1);
output_bit(PIN_B2,1);
output_bit(PIN_A1,1);
output_bit(PIN_A0,1);
output_bit(PIN_B7,1);
output_bit(PIN_B6,1);
output_bit(PIN_B5,1);
delay_ms(1000);
output_bit(PIN_A2,0);
output_bit(PIN_A3,0);
output_bit(PIN_B0,0);
output_bit(PIN_B1,0);
output_bit(PIN_B2,0);
output_bit(PIN_A1,0);
output_bit(PIN_A0,0);
output_bit(PIN_B7,0);
output_bit(PIN_B6,0);
output_bit(PIN_B5,0);
}else {
output_bit(PIN_A2,bit[0]);
output_bit(PIN_A3,bit[1]);
output_bit(PIN_B0,bit[2]);
output_bit(PIN_B1,bit[3]);
output_bit(PIN_B2,bit[4]);
output_bit(PIN_A1,bit[5]);
output_bit(PIN_A0,bit[6]);
output_bit(PIN_B7,bit[7]);
output_bit(PIN_B6,bit[8]);
output_bit(PIN_B5,bit[9]);
delay_ms(250);
output_bit(PIN_A2,0);
output_bit(PIN_A3,0);
output_bit(PIN_B0,0);
output_bit(PIN_B1,0);
output_bit(PIN_B2,0);
output_bit(PIN_A1,0);
output_bit(PIN_A0,0);
output_bit(PIN_B7,0);
output_bit(PIN_B6,0);
output_bit(PIN_B5,0);
}
for(i=0;i<14;i++) {
bit[i]=0;
}
}
}
-
Bueno, creo que voy a llorar... AL FIN FUNCIONA!!!!!!!!!!!!
Lo terminé haciendo como se debe, con interrupcion externa y timer para los retrasos.
#include <16F84A.h>
#fuses XT,NOWDT,NOPROTECT,PUT
#use delay (clock=4000000)
#use fast_io(b)
#define IR_IN (!input(PIN_B4))
int8 bit[14], i, error, state=0;
#int_rb
void RC5Decoder() {
error=0;
while(IR_IN==0);
bit[0] = 1;
set_timer0(0);
while(get_timer0()<111);
for(i=1;i<14;i++) {
set_timer0(0);
while(get_timer0()<222);
if(IR_IN==0) {
set_timer0(0);
while(get_timer0()<222);
if(IR_IN==1) bit[i]=1; else error=1;
}else {
set_timer0(0);
while(get_timer0()<222);
if(IR_IN==0) bit[i]=0; else error=1;
}
}
state=1;
disable_interrupts(INT_RB);
}
void main() {
set_tris_a(0);
set_tris_b(0x10);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_4);
ext_int_edge(H_TO_L);
enable_interrupts(INT_RB);
enable_interrupts(GLOBAL);
delay_ms(500);
while(1) {
if(state==1) {
if(error==0) {
output_bit(PIN_A2,bit[0]);
output_bit(PIN_A3,bit[1]);
output_bit(PIN_B0,bit[2]);
output_bit(PIN_B1,bit[3]);
output_bit(PIN_B2,bit[4]);
output_bit(PIN_A1,bit[5]);
output_bit(PIN_A0,bit[6]);
output_bit(PIN_B7,bit[7]);
output_bit(PIN_B6,bit[8]);
output_bit(PIN_B5,bit[9]);
delay_ms(250);
output_bit(PIN_A2,0);
output_bit(PIN_A3,0);
output_bit(PIN_B0,0);
output_bit(PIN_B1,0);
output_bit(PIN_B2,0);
output_bit(PIN_A1,0);
output_bit(PIN_A0,0);
output_bit(PIN_B7,0);
output_bit(PIN_B6,0);
output_bit(PIN_B5,0);
state=0;
}else {
output_bit(PIN_A2,1);
output_bit(PIN_A3,1);
output_bit(PIN_B0,1);
output_bit(PIN_B1,1);
output_bit(PIN_B2,1);
output_bit(PIN_A1,1);
output_bit(PIN_A0,1);
output_bit(PIN_B7,1);
output_bit(PIN_B6,1);
output_bit(PIN_B5,1);
delay_ms(250);
output_bit(PIN_A2,0);
output_bit(PIN_A3,0);
output_bit(PIN_B0,0);
output_bit(PIN_B1,0);
output_bit(PIN_B2,0);
output_bit(PIN_A1,0);
output_bit(PIN_A0,0);
output_bit(PIN_B7,0);
output_bit(PIN_B6,0);
output_bit(PIN_B5,0);
}
enable_interrupts(INT_RB);
}
}
}
-
Hola,
por casualidad, en otro comentario del foro, he visto que hay sensores para el protocolo RC5 que tienen la salida negada, es decir, tienen un nivel alto (podrían ser tus 4V) en ausencia de señal.
Busca el tema de recepción de códigos RC5.
hacen eso mismo que tu quieres hacer.
Saludos,