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

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

Desconectado Abner_emanuel

  • PIC16
  • ***
  • Mensajes: 160
Comunicación serie de 2 Pic a Diferente Frecuencia
« en: 24 de Marzo de 2017, 09:42:53 »
Un saludo compañeros del foro.

Resulta que tengo dos microcontroladores a Diferente frecuencia que quiero comunicar por que mi proyecto así lo requiere el PIC18F8722 (trabajo máximo = 40 Mhz) y el PIC18F4550 (trabajo máximo = 48 Mhz)). El PIC18f4550 tiene que trabajar a 48Mhz forzosamente por que con el controlare una pantalla TFT y requiero esa velocidad.

Mi pregunta es, si es posible hacer la comunicación serie de ellos a  pesar de la diferencia velocidad de operación.

Agradecería su ayuda.
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 #1 en: 24 de Marzo de 2017, 14:41:12 »
Es posible.

Las comunicaciones series que tenes usualmente son:

UART
SPI
I2C


La UART requiere que ambos tengan el mismo baudrate configurado. Lo vas a poder lograr con ambos
El SPI utiliza el Clock generado por el Maestro. Por lo cual si respetas los tiempos minimos que debe poseer el reloj del SPI del micro esclavo funcionaria correctamente.
El I2C por otra parte utiliza frecuencias fijas, 100KHz 400KHz y 1Mhz son las mas usuales,  lo que seria un "equivalente" a lo que tenes en la UART.

En todos podes, seguramente alguno es mejor que otro. Segun la aplicacion que le deseas dar.

Desconectado Abner_emanuel

  • PIC16
  • ***
  • Mensajes: 160
Re:Comunicación serie de 2 Pic a Diferente Frecuencia
« Respuesta #2 en: 26 de Marzo de 2017, 21:47:11 »
Gracias por responder. La comunicación que pretendo es uart entre los pic.

En alguna ocasión había leído en la red que los microcontroladores deberían de trabajar a la misma velocidad para tener una correcta comunicación uart. Por eso hará mi pregunta killerjc.
El señor es mi pastor,  nada me faltará.

Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2211
Re:Comunicación serie de 2 Pic a Diferente Frecuencia
« Respuesta #3 en: 27 de Marzo de 2017, 03:49:57 »
No tiene porqué. Tu configura ambas UART a la misma frecuencia y funcionará bien. Lo único que tienes que tener en cuenta es no enviar datos más rápido de lo que se puedan recibir y procesar (en ambos sentidos) pero esto no depende sólo de la frecuencia de reloj, yo diría que depende más de la cantidad de cosas que estén haciendo cada unos de ellos "al mismo tiempo" que envian/reciben.

Saludos!
Ojo por ojo y todo el mundo acabará ciego - Mahatma Gandhi -

Desconectado Abner_emanuel

  • PIC16
  • ***
  • Mensajes: 160
Re:Comunicación serie de 2 Pic a Diferente Frecuencia
« Respuesta #4 en: 27 de Marzo de 2017, 09:01:50 »

Entonces lo mejor sera desarrollar una interrupción UART para ambos microcontroladores tratando de no perder datos. Les comento que los 48 Mhz del PIC18F4550 los requiero para controlar una pantalla TFT de NEXTION ya que el PIC18F8722 no tiene esa velocidad. Sin embargo con el 4550 no me alcanzaron los recursos de memoria por eso es que no hice el code en el 8722.

Ahora pienso hacerlo así, el 8722 le trasmite los valores vía UART al 4550 y esta los recibe y los envía a la TFT.
El señor es mi pastor,  nada me faltará.

Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2211
Re:Comunicación serie de 2 Pic a Diferente Frecuencia
« Respuesta #5 en: 27 de Marzo de 2017, 09:29:58 »
Ummm porqué no pones un PIC32MX que son más rápidos y también tienen más memoria¿?. Además me da a mi que uno con más memoria va a ser más barato que el 8722...
Ojo por ojo y todo el mundo acabará ciego - Mahatma Gandhi -

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Comunicación serie de 2 Pic a Diferente Frecuencia
« Respuesta #6 en: 27 de Marzo de 2017, 14:25:55 »
Como dijo manwewe, la velocidad de la UART estra prefijada en ambos micros y deben ser la misma.

El transmisor no va a poder enviar mas rapido de lo que hace la UART, asi que la unica que le queda por mas rapido que vaya es esperar que se termine de enviar. Si la espera resulta contraproducente, deberas tener una interrupcion de TX y un buffer circular, aseurandote que siempre se pueda vaciar.

El receptor si o si no lo vas a hacer por poll a los datos de la UART sino por interrupcion. Y luego dependiendo del tipo de datos pasara por una maquina de estados o ira a un buffer que luego se vaciara cuando posea tiempo el PIC.

Tambien coincido con manwewe, de buscar un micro que pueda hacer todo, especialmente si posee una interfaz TFT.. El gasto deberia ser casi comparable y tedrias un micro con muchas mas prestaciones.

Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2211
Re:Comunicación serie de 2 Pic a Diferente Frecuencia
« Respuesta #7 en: 27 de Marzo de 2017, 14:52:17 »
No había leido bien lo del TFT jeje. Con ese PIC por pequeño que sea el TFT no va a funcionar fluido. Vete a un PIC32MX o un PIC32MZ.

Saludos!
Ojo por ojo y todo el mundo acabará ciego - Mahatma Gandhi -

Desconectado Abner_emanuel

  • PIC16
  • ***
  • Mensajes: 160
Re:Comunicación serie de 2 Pic a Diferente Frecuencia
« Respuesta #8 en: 29 de Marzo de 2017, 23:13:04 »
Gracias por sus comentarios, e estado leyendo sobre los  Pic32 y veo que no es ccs exactamente el lenguaje, es c pero varían las instrucciones.

Veo mas fácil implementar en el código ya realizado lo que comenta killerjc. Implementado  interrupción uart y veo que este pic18f8722 trae 2 de ellas.

Ahora me surge una duda, y espero me ayuden por favor.

Para el 18f8722, cuales son los fuses correctos para obtener los 40Mhz(velocidad más alta de este pic) y con un cristal de cuarzo externo de 4 Mhz(ya que es el unico que tengo).

En verdad agradezco su ayuda.
 
El señor es mi pastor,  nada me faltará.

Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2211
Re:Comunicación serie de 2 Pic a Diferente Frecuencia
« Respuesta #9 en: 30 de Marzo de 2017, 04:44:25 »
Un apunte CCS y XC32 ambos son C. Otra cosa diferente es que en CCS tengas funciones precompilados que hagan ciertas cosas. En XC32 tienes librerías equivalentes.  Saludos.
Ojo por ojo y todo el mundo acabará ciego - Mahatma Gandhi -

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Comunicación serie de 2 Pic a Diferente Frecuencia
« Respuesta #10 en: 30 de Marzo de 2017, 14:32:16 »
Citar
Para el 18f8722, cuales son los fuses correctos para obtener los 40Mhz(velocidad más alta de este pic) y con un cristal de cuarzo externo de 4 Mhz(ya que es el unico que tengo).

Los FUSES van a depender del compilador que uses (en el sentido de como deben escribirse.

Con cristal de 4Mhz, No podes, por que el PLL es fijo de 4x, deberias poner un cristal de 10Mhz para obtener los 40Mhz y elegir HSPLL

La otra que te queda es usar el oscilador interno y pasarlo por el PLL, FUSE: INTOSCIO67, en el cual vas a poder llegar a los 32Mhz. Pero no solo los FUSES tenes que modificar, ya que eso solo indica la fuente del oscilador, sino que tambien deberas corregir los bits del registro OSCCON seleccionando la frecuencia a 8Mhz (porque default es 1Mhz) y luego el registro OSCTUNE para habilitar el PLL.

Es util mencionar que si tenes el PIC y no lo borraste, al final tenes el valor de calibracion que va en OSCTUNE para que cumpla los parametros del datasheet con los 8Mhz.

Desconectado Abner_emanuel

  • PIC16
  • ***
  • Mensajes: 160
Re:Comunicación serie de 2 Pic a Diferente Frecuencia
« Respuesta #11 en: 01 de Abril de 2017, 00:15:02 »
Creo que esto funcionará. En fuses H4  y un cristal externo de 10 Mhz como lo dice Killerjc para consegir los 40Mhz.

En el pic 18F8722 seria:

#use delay(clock=40000000)

Código: C++
  1. #FUSES NOWDT,WDT128,H4,NOPROTECT,NOIESO,NOBROWNOUT,NOPUT,NOCPD,noSTVREN,nODEBUG,NOLVP,NOWRT,NOCPB,NOEBTRB,NOEBTR,CCP2C1,NOWRTD,NOWRTC,NOWRTB,NOFCMEN,LPT1OSC,MCLR,NOXINST,MCU

« Última modificación: 01 de Abril de 2017, 02:05:23 por Abner_emanuel »
El señor es mi pastor,  nada me faltará.

Desconectado Abner_emanuel

  • PIC16
  • ***
  • Mensajes: 160
Re:Comunicación serie de 2 Pic a Diferente Frecuencia
« Respuesta #12 en: 08 de Abril de 2017, 10:58:43 »
Ahora estoy con el envío de datos a la TFT Nextion, solo que me encontre con un Warning que dice: interrupts disabled during call to prevent re-entrancy y es debido a la función que tengo a continuación:

Bueno, lo que hago es enviar los datos de las variables hacia la pantalla TFT cada 200ms (este tiempo puede variar) pero lo quise poner con un timer1 por que quiero que el envió sea temporizado y me tope con ese warning. Alguien a encontrado una solución a esto?.

#use delay(crystal=4000000) 

int desborde_tmr1=0;
char string_str[1];

Código: C
  1. #INT_timer1
  2.          void interrupcion_tmr1(void)
  3.          {  
  4.          set_timer1(40536);
  5.          desborde_tmr1++;  
  6.          if (desborde_tmr1==1)
  7.          {
  8.          
  9.          desborde_tmr1=0;
  10.          }
  11.          }

         setup_timer_1 (T1_INTERNAL | T1_DIV_BY_8);                  // Configuracion del Timer1 para clock interno = 1E6 dividido por 8
         enable_interrupts(INT_TIMER1);                                          // Habilita interrupción timer1
         enable_interrupts(GLOBAL);
« Última modificación: 01 de Junio de 2017, 09:36:22 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 #13 en: 08 de Abril de 2017, 11:04:51 »
Tal ves y mas que seguro es porque el tiempo consumido para :

- Generar el string que pedis, esto incluye pasar valores float a string que no es algo liviano ni rapido.
- Enviar todo el texto y encima quedarte en la interrupcion enviandolo, por que el fputs se queda encerrado alli hasta que se termine de enviar TODOS los datos que le pusiste.

Supera o posiblemente supere a la interrupcion del timer, es decir que podrian ocurrir 2 interrupciones mientras esta haciendose eso, de ocurrir esto apenas termine volveria a entrar a la interrupcion y seria algo de nunca terminar, jamas ejecutaria la parte de tu programa principal, por eso deshabilita las interrupciones.

Resumen:
Nunca pongas funciones bloqueantes y/o que consuman demasiado tiempo en una interrupcion. Para eso activa una flag y hacelo desde el programa principal.
Aclaro una cosa, no digo que no se pueda hacer, pero hay que tener cuidado.

La parte del envio si no queres que te bloquee el programa principal (por el fputs), lo podes hacer con la interrupcion del TX Y enviar desde un buffer.
Otro tema no hace falta que escribas TODO el texto cuando la mayoria son datos fijos:

Código: [Seleccionar]
"h0.val=%1.0f%c%c%c h1.val=%1.0f h2.val=%1.0f h3.val=%1.0f h4.val=%1.0f"Tenes 4 datos en fomato float, lo demas es fijo... porque darle todo el laburo de escribir todo de nuevo?
« Última modificación: 08 de Abril de 2017, 11:09:09 por KILLERJC »

Desconectado Abner_emanuel

  • PIC16
  • ***
  • Mensajes: 160
Re:Comunicación serie de 2 Pic a Diferente Frecuencia
« Respuesta #14 en: 08 de Abril de 2017, 11:57:19 »
Como podría utilizar esas banderas que me decis?.  Lo intento con int flag bandera; pero no se donde colocarlas.
El señor es mi pastor,  nada me faltará.


 

anything