Autor Tema: Comunicación serie de 2 Pic a Diferente Frecuencia  (Leído 7940 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Comunicación serie de 2 Pic a Diferente Frecuencia
« Respuesta #15 en: 08 de Abril de 2017, 16:20:30 »
Como crear y manejarse bandera:

Código: C
  1. #include <stdbool.h>
  2. bool bandera;
  3.  
  4. void Timer(void){
  5.         //Recargo Timer
  6.         //Borro Bandera de interrupcion
  7.         if(bandera){
  8.                 //Manejo de error en caso que reentre (si es que queres), sino omitis este if
  9.         }
  10.         bandera=true;
  11. }
  12.  
  13.  
  14. void main(void){
  15.         while(1){
  16.                 if(bandera){
  17.                         bandera = false;
  18.                         //Aca envio los datos
  19.                 }
  20.         }
  21. }
CSS Posee el int1. en ves de bool y usar el stdbool.h

Desconectado Abner_emanuel

  • PIC16
  • ***
  • Mensajes: 159
Re:Comunicación serie de 2 Pic a Diferente Frecuencia
« Respuesta #16 en: 16 de Abril de 2017, 19:08:22 »
 ;- :-)
« Última modificación: 01 de Junio de 2017, 09:49:15 por Abner_emanuel »
El señor es mi pastor,  nada me faltará.

Desconectado Abner_emanuel

  • PIC16
  • ***
  • Mensajes: 159
Re:Comunicación serie de 2 Pic a Diferente Frecuencia
« Respuesta #17 en: 25 de Mayo de 2017, 03:37:17 »
Que tal amigos del foro.

Estoy trabajando con el pic18f8722 y ahora veo algo muy raro en este pic.
No se por que pero los pines a los cuales no tengo conectado nada me dan un voltaje entre 1.5 volts y 0.8V. (El pic lo alimento con 5V)

Me di cuenta al momento de desconectar un sensor de corriente conectado al pin AN0; desconecte el sensor y observe una lectura en la lcd,  :shock:raro no  :shock:, después que observe que seguia midiendo sin tener el sensor conectado en esa patilla medí con mi volmetro y observe esa lectura de 1.5V.

Alguien me podría decir que pasa, esto es en todos los pines que no conecto algo, pensaría que es la impedancia de entrada que necesita o que?. También no se por que este pic tiene tantas conexiones a vc y gnd de alimentación.
« Última modificación: 25 de Mayo de 2017, 03:40:42 por Abner_emanuel »
El señor es mi pastor,  nada me faltará.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Comunicación serie de 2 Pic a Diferente Frecuencia
« Respuesta #18 en: 25 de Mayo de 2017, 15:04:13 »
Esta flotando el pin, no esta conectado a nada. Cuando esta como entrada no tenes nada que lo tenga a GND o VCC (como si ocurre en una salida ), por eso mismo cuando se quiere asegurar que una entrada se encuentre en un estado definido se necesita de un pull-up o pull-down externo.

Desconectado Abner_emanuel

  • PIC16
  • ***
  • Mensajes: 159
Re:Comunicación serie de 2 Pic a Diferente Frecuencia
« Respuesta #19 en: 25 de Mayo de 2017, 16:33:59 »
Entonces tengo que asignar el estado de los pines del pic con set_tris_a(0b11100000);   dependiendo de las necesidades
output_a(0x00); ......  Para si no tenerlo flotando?.
« Última modificación: 25 de Mayo de 2017, 16:38:56 por Abner_emanuel »
El señor es mi pastor,  nada me faltará.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Comunicación serie de 2 Pic a Diferente Frecuencia
« Respuesta #20 en: 25 de Mayo de 2017, 16:54:36 »
No, si es una entrada del sensor, no los desconectes o si pensas desconectarlo ponele un pull-down. Ya que no sabes cuando es que esta desconectado para ponerlo como salida al pin.

De esa forma si lo desconectas detectas 0.
« Última modificación: 25 de Mayo de 2017, 17:07:27 por KILLERJC »

Desconectado Abner_emanuel

  • PIC16
  • ***
  • Mensajes: 159
Re:Comunicación serie de 2 Pic a Diferente Frecuencia
« Respuesta #21 en: 25 de Mayo de 2017, 17:03:21 »
Ok, pull-down como la de la imagen que anexo?. Algo mas, si este voltaje esta presente en todos los pines, al asignarles un estado de salida en 0 conectado a tietta servirá?. Por que también la lectura del sensor brinca mucho por lo que implemente un filtro de media móvil y me ayudo, pero creo que también hay ruido en las patas del pic. Gracias tu pronta respuesta amigo.
El señor es mi pastor,  nada me faltará.

Desconectado Abner_emanuel

  • PIC16
  • ***
  • Mensajes: 159
Re:Comunicación serie de 2 Pic a Diferente Frecuencia
« Respuesta #22 en: 26 de Mayo de 2017, 09:13:35 »
Quiero compartir la solucion , a esto del voltaje presente en pines no utilizados del pic. Como bien dice killer nunca hay que dejar los pines al aire, se puede solucionar con una resistencia pull o configurando los Set_tris para asignarles un estado.

En mi caso opte por poner en cero las salidas no utilizadas configurando los set_tris y eureka.. :P, se soluciono, pues el voltaje que había en los s pines no utilizados desapareció.

También importante, en el pic 18f8722 la entrada analógica an4 o LVDIN, no lo pude configurar como un adC por que siempre mostró un voltaje a su salida a pesar de ponerle su set_tris.
« Última modificación: 26 de Mayo de 2017, 09:18:10 por Abner_emanuel »
El señor es mi pastor,  nada me faltará.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Comunicación serie de 2 Pic a Diferente Frecuencia
« Respuesta #23 en: 26 de Mayo de 2017, 13:43:47 »
Exacto, como en la imagen.

El problema de ponerlo como salida siguiendo el ejemplo que pasaste pero sin la resistencia, es si por ejemplo el sensor lo pusiste, esta activado lo cual pasarian los 5V al pin, y vos tenes la salida en 0V, haria que fluya una corriente grande por el pin, posiblemente quemando el pin/puerto.

Desconectado Abner_emanuel

  • PIC16
  • ***
  • Mensajes: 159
Re:Comunicación serie de 2 Pic a Diferente Frecuencia
« Respuesta #24 en: 27 de Mayo de 2017, 10:13:50 »
Respecto a lo del PIN LVDIN que esta en la patilla 33 del PIC18F8722 por e leído que es para probar la detección de baja tensión.

Pero tengo muchas dudas,por que yo quería utilizar este pin como lectura del ADC AN4 pero me daba lectura de 1.5v mas o menos aun sin tener conectado mi sensor en ese pin del ADC. Me podrían ayudar a utilizar esa entrada correctamente como ADC?. O me podrían explicar mas acerca de ese pin?.




El señor es mi pastor,  nada me faltará.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Comunicación serie de 2 Pic a Diferente Frecuencia
« Respuesta #25 en: 27 de Mayo de 2017, 14:51:11 »
Ese pin como decis tiene 2 posiblidades...

- Digital para el GPIO
- Analogico para el ADC y el HLVD


El modulo HLVD esta desactivado.. Si queres usar estos modulos los dejas en analogico, si no pasas a digital. De querer usar el HLVD lo dejas en ananlogico y activas el modulo, En el modulo tenes que seleccionar que la tension proviene de esa entrada. Eso se compara con una referencia de 1.2V

Desconectado Abner_emanuel

  • PIC16
  • ***
  • Mensajes: 159
Re:Comunicación serie de 2 Pic a Diferente Frecuencia
« Respuesta #26 en: 28 de Mayo de 2017, 18:55:04 »
Entiendo killer, gracias por compartir. Referente al filtro del lectura media móvil tomo 20 muestras mas sin embargo en la LCD aun salta mucho los valores decimales. Cuantas muestras serán necesarias tomar sin que afecte o retarde mi programa?. Actualmente lo tengo a 4mhz del clock.
El señor es mi pastor,  nada me faltará.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Comunicación serie de 2 Pic a Diferente Frecuencia
« Respuesta #27 en: 28 de Mayo de 2017, 19:10:04 »
Por que haces una media movil?, por que no hacer directamente un promediado de 16 muestras? 16 en el sentido que la division sea un simple shift, ademas con 8 deberia ser suficiente.

Si ya salta puede ser que la entrada no sea del todo correcta, o es que estas midiendo mal por que el tiempo de adquisicion no es el adecuado, o tal ves sea la misma operacion para pasarlo a flotante lo que lo causa.

Desconectado Abner_emanuel

  • PIC16
  • ***
  • Mensajes: 159
Re:Comunicación serie de 2 Pic a Diferente Frecuencia
« Respuesta #28 en: 29 de Mayo de 2017, 08:59:18 »
Brevemente, así es como tomo las lecturas del adc, sin la media móvil los valores variaban de 3 a 4 volts dentro del protoboard. Yo pensaba que era el ruido pero al parecer es otra la causa.

Ahora con esta media móvil los valores se mueven mucho solo en decimales. Quizás estén mal declaradas las variables Killer, tu me dirás..

Código: C#
  1. #include <18F8722.h>
  2.          #device ADC=10
  3.          #device *=16
  4.          #FUSES NOWDT                    //No Watch Dog Timer
  5.          #FUSES MCLR                     //No Watch Dog Timer
  6.          #FUSES XT                       //Crystal osc <= 4mhz
  7.          #FUSES PUT                      //Power Up Timer
  8.          #FUSES NOPROTECT                //Code not protected from reading
  9.          #FUSES BROWNOUT                 //Reset when brownout detected
  10.          #FUSES NOLVP                    //No low voltage programing, B3(PIC16) or B5(PIC18) used for I/O
  11.          #FUSES NOCPD                    //No EE protection
  12.          #FUSES NOWRT                    //Program memory not write protected
  13.          #FUSES NODEBUG                  //No Debug mode for ICD
  14.  
  15.          float Volt_AC_F1,Volt_AC_F2,volt_DC_12,valor_lm35,temp_lm35,ADC_CTE_DC_12,CTE_DC_12;
  16.          unsigned int16 ADC_F1,ADC_F2,ADC_CD_12;
  17.  
  18.           int16 filtro_medida_movil(void)
  19.          {
  20.          int j=0,k=0,x,t,w;                                                                            
  21.          int Muestras = 20;                                                                    
  22.          
  23.          set_adc_channel(0);                                                                            
  24.          for(j=0; j<Muestras;j++)                                                                
  25.          { ADC_F1+= read_adc(); delay_us(20); }                                                        
  26.          ADC_F1 /= Muestras+1;                                                                    
  27.          Volt_AC_F1 = ADC_F1*0.48875855327468230694037145650049;                                        
  28.          
  29.          set_adc_channel(1);                                                                            
  30.          for(k=0; k<Muestras;k++)                                                                  
  31.          { ADC_F2+= read_adc(); delay_us(20); }                                                        
  32.          ADC_F2 /= Muestras+1;                                                                  
  33.          Volt_AC_F2 = ADC_F2*0.48875855327468230694037145650049;                                        
  34.                  
  35.          set_adc_channel(2);                                                                            
  36.          for(x=0; x<Muestras;x++)                                                                  
  37.          { ADC_CD_12+= read_adc(); delay_us(20); }                                                      
  38.          ADC_CD_12 /= Muestras+1;                                                                
  39.          volt_DC_12 = ADC_CD_12*0.04887585532746823069403714565005;                                  
  40.          
  41.          set_adc_channel(3);                                                                            
  42.          for(t=0; t<Muestras;t++)                                                                
  43.          { valor_lm35+= read_adc(); delay_us(20); }
  44.          valor_lm35 /= Muestras+1;                                                                
  45.          temp_lm35 = valor_lm35*0.48875855327468230694037145650049;                                    
  46.          
  47.          set_adc_channel(5);                                                                            
  48.          for(w=0; w<Muestras;w++)                                                                
  49.          { ADC_CTE_DC_12+= read_adc(); delay_us(20); }
  50.          ADC_CTE_DC_12 /= Muestras+1;                                                            
  51.          CTE_DC_12 = ADC_CTE_DC_12*0.06109481915933528836754643206256;                                  
  52.          return((int16)(Volt_AC_F2,Volt_AC_F1,volt_DC_12,temp_lm35,CTE_DC_12));
  53.          }


En el main tengo lo siguiente:

         setup_adc_ports(AN0_TO_AN5|VSS_VDD);
         setup_adc(ADC_CLOCK_INTERNAL);

Y como veras en el code, con 20 muestras apenas estabilice un poco, ahora se mueven mucho las decimales.


Podrías decirme que es lo que causa que se mueva mucho el adc?.

Algo mas el pic lo tengo a 4mhz
« Última modificación: 29 de Mayo de 2017, 09:33:27 por Abner_emanuel »
El señor es mi pastor,  nada me faltará.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Comunicación serie de 2 Pic a Diferente Frecuencia
« Respuesta #29 en: 29 de Mayo de 2017, 17:21:14 »
Hay un par de cosas que no entiendo a que queres llegar, pienso que queres que te devuelva todos los valores, pero te debe estar devolviendo 1 solo ( por el return como lo tenes).
Ademas por que devolver un entero... ¿cuando vos buscas decimales ?..

Este numero:

0.48875855327468230694037145650049

Es irrealizable en un micro. Lo maximo que se le aproxima es:
0.48875856399536133 expresado en un float como 0x3efa3e90 segun la IEEE 754.

Asi que ahi ya tenes un pequeño error.

Por otro lado esto:

Código: C
  1. return((int16)(Volt_AC_F2,Volt_AC_F1,volt_DC_12,temp_lm35,CTE_DC_12));

Si no falla mi C, quiere decir que va a castear cada uno de los valores, pero el unico que va a devolver casteado es el CTE_DC_12, los demas no.

Si lo haria y pudiera ponerle una variable dentro del set_adc_channel seria asi:


Código: C
  1. #define MUESTRAS (1<<3)
  2.  
  3. float ADC_Values[5];
  4. const int8 ADC_Channels[5] = {0,1,2,3,5,0xFF};
  5. const float ADC_Coef[5] = {0.48875855327468230694037145650049,0.48875855327468230694037145650049,0.48875855327468230694037145650049,0.48875855327468230694037145650049,0.06109481915933528836754643206256};
  6.  
  7.  
  8. void filtro_promediado(float * ADC_Val)
  9. {
  10.  
  11.       int8 i,j;
  12.       for(i=0; i!=0xFF ; i++)
  13.       {
  14.             set_adc_channel(ADC_Channels[i]);
  15.             delay_us(20);
  16.             for(j=0; j<MUESTRAS;j++) {
  17.                   ADC_Val[i] = read_adc();
  18.             }
  19.             ADC_Val[i] /= MUESTRAS;
  20.             ADC_Val[i] *= ADC_Coef[i];
  21.       }
  22. }

Tambien buscaria como configurar el ADC para que use 20 TAD para el tiempo de adquisición.

Citar
Podrías decirme que es lo que causa que se mueva mucho el adc?.

- Que el tiempo de adquisicion no sea el correcto lo cual tendrias una lectura erronea. Esto depende del circuito.
- Errores al codificar en 32 bits algun numero con muchos decimales como comente arriba. y al hacer la operacion arroja un resultado que no es el adecuado comparado con usar todos los numeros.
- Que la tension realmente varie demasiado en la entrada del pin del ADC
- Que fluctue la alimentacion al momento de medir
- No cuento errores que pueda tener el mismo ADC.

En si, si todo esta correcto, VDD se mantiene constante, La tension de entrada al pin del ADC igual, y se cumple los tiempos deberia fluctuar a lo sumo 1 bit o 2 como maximo, con lo cual un promediado de 8 muestras ya te lo limpiaria.
Hay que tratar de determinar cual es el problema en realidad. Podrias mostrar primero los valores obtenidos por el ADC para ver si es ahi donde cambia tanto.