Autor Tema: Prob. aleatorios comunicacion dsPIC--Linux  (Leído 4493 veces)

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

Desconectado israelgarcia86

  • PIC10
  • *
  • Mensajes: 1
Prob. aleatorios comunicacion dsPIC--Linux
« en: 23 de Diciembre de 2006, 20:52:27 »
Hola, somos un grupo que estamos haciendo un proyecto sobre un selector de rumbo para un simulador de vuelo en un dsPIC4013, tampoco me enrollo mucho contando el proyecto q es bastante complejo, si quereis un día lo contamos. El problema que nos lleva de cabeza desde hace dos semanas es el siguiente:

Todo funciono bastante bien en el conjunto del esquematico, y en las pruebas del protoboard, todo también muy bien, al fabricar el pcb, en las pruebas de continuidad y demás, pero cuando ponemos a funcionar...No llegan la mayoria de los datos por la UART, hemos revisado de todo, solo nos queda algun fallo en la inicialización, alguno en el conexionado(auqnue seria extraño al haber funcionado en la protoboard todo bien), también hemos escuchado de todo sobre todo respecto alñ conexionado, así por eso lo hemos pensado traer aquí, porque ni los expertos con los que hemos hablado se aclaran sobre los aspectos más básicos, así hemos pensado en ver aquí.

Datos más tecnicos:

-Utilizamos un dsPIC4013, sin reloj externo, pq utilizamos uno interno a 7,37 MHZ pq poniedolo mas rapido se reseteaba continuamente.

-Utilizamos un programa(creado por nosotros) que corremos en Kubuntu Linux con el kernel 2.6-14, utilizamos el puerto serie para contactar con el dsPIC, al parecer envia cosas coherentes las primera sveces pero despues algo falla y empieza a enviar basura, este programa tiene la funcion de recibir los datos del simulador por el protocolo UDP, enviar los datos al dspIC por el puerto serie y recibir los resultados del dsPIC.

-Para programar en el ordenador hemos usado g++ para el programa de conexion simulador-dsPIC, y para el programa del dsPIC usamos C30.

El esquematico lo podeis ver aquí:(Está en PostScript):http://personales.ya.com/israelgarcia86/APC.ps

y los codigos de incializacion son:

/* Iniciar:
  Función de inicialización del dispositivo. Configura los pines de I/O, 
    temporizadores, módulo de conversión analógico/digital, LCD, UART y botón*/
void Iniciar(void)
{
    /* Deshabilita los módulos a utilizar por precaución.
      La función de inicialización de los módulos pueden no funcionar si 
      por defecto están activados */
    CloseTimer1();
    CloseTimer2();
    CloseTimer3();
    CloseADC12();
    CloseUART1();
 
    /* Configuración de los puertos */
     
    /* TRISB: Los puertos RB8, RB10 y RB11 se utilizan como entradas analógicas. (1=In, 0=Out)
        Por una parte, en TRISB se configuran como entradas, y en ADPCFG como analógicas */
    TRISB=( 1<<9 | 1<<10 | 1<<11);
    ADPCFG=~( 1<<9 | 1<<10 | 1<<11); 
    LATB=0;
 
    /* No se usa ningún puerto RCx */
    TRISC=0; LATC=0;
    /* El puerto RD8 se configura como entrada por precacución */
    TRISD=1<<8; LATD=0;
    OpenUART1(UART_EN & UART_IDLE_CON & UART_ALTRX_ALTTX & UART_DIS_WAKE & UART_DIS_LOOPBACK & UART_DIS_ABAUD & UART_NO_PAR_8BIT & UART_1STOPBIT,
                UART_INT_TX & UART_TX_PIN_NORMAL & UART_TX_ENABLE & UART_INT_RX_CHAR & UART_ADR_DETECT_EN & UART_RX_OVERRUN_CLEAR, 23);
    ConfigIntUART1(UART_RX_INT_DIS & UART_TX_INT_DIS);
    ConfigIntADC12(ADC_INT_ENABLE & ADC_INT_PRI_2);
 
    OpenADC12(ADC_MODULE_ON & ADC_IDLE_CONTINUE & ADC_FORMAT_INTG & ADC_CLK_AUTO & ADC_AUTO_SAMPLING_ON& ADC_SAMP_ON,
                ADC_VREF_AVDD_AVSS &  ADC_SCAN_ON & ADC_SAMPLES_PER_INT_3 & ADC_ALT_BUF_OFF & ADC_ALT_INPUT_OFF,
                ADC_SAMPLE_TIME_31 & ADC_CONV_CLK_SYSTEM & ADC_CONV_CLK_32Tcy,
                ENABLE_ALL_DIG & ENABLE_AN9_ANA & ENABLE_AN10_ANA & ENABLE_AN11_ANA,
                SCAN_ALL & SKIP_SCAN_AN0 & SKIP_SCAN_AN1 & SKIP_SCAN_AN2& SKIP_SCAN_AN3& SKIP_SCAN_AN4& SKIP_SCAN_AN5& SKIP_SCAN_AN6& SKIP_SCAN_AN7& SKIP_SCAN_AN8& SKIP_SCAN_AN12 & SKIP_SCAN_AN13& SKIP_SCAN_AN14& SKIP_SCAN_AN15);
}

y esto la iniciacion del pic:

/* Bits de configuración del dispositivo: Configurado para utilizar el 
    oscilador RC interno con PLL x4, con lo que se consiguen 7.37MIPS */
_FOSC (CSW_FSCM_OFF & FRC_PLL4);
 
/* Se deshabilita el Watchdog temporalmente para facilitar la depuración */
_FWDT (WDT_OFF);
 
/* El dispositivo se reinicia automáticamente cuando el nivel de tensión 
    baja de 2V, además, espera 64ms a que se estabilice el nivel de tensión */
_FBORPOR(MCLR_EN & PBOR_ON & BORV_20 & PWRT_64);
 
/* No es necesario proteger el código */
_FGS (CODE_PROT_OFF);

Creo q con eso se pueden hacer una idea,seguramnete se nos olviden datos importantes para poder investigar, sin duda cualquier cosa que nos pidais os las ponemos practicamente de inmediato, agradeceriamos un monton cualquier minima idea para seguir investigando, no queremos ningun trabajo hecho, pero ya se nos acabo todo por donde buscar. Múchas gracias.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: Prob. aleatorios comunicacion dsPIC--Linux
« Respuesta #1 en: 24 de Diciembre de 2006, 02:52:24 »
En otro hilo del subforo surgió un problema con un comportamiento aleatorio de un programa, aunque relacionado con la interrupción del Timer en lugar de la USART.

El caso es que el maestro Sisco recomendaba guardar los acumuladores al entrar en la interrupción porque se corre el riesgo de que la misma altere sus valores y en la devolución el micro haga cosas raras.

Podríais probar, a ver qué tal. Se trata de colocar esto:
void __attribute__((__interrupt__,__shadow__)) 

justo delante de la cabecera de la función de Interrupción.

Supongo que la solución no será tan sencilla, porque ya decís que lleváis tiempo investigando, pero tiro la idea por si sirve de algo.

Suerte con el proyecto.

Desconectado amn3s1a

  • PIC10
  • *
  • Mensajes: 1
Re: Prob. aleatorios comunicacion dsPIC--Linux
« Respuesta #2 en: 24 de Diciembre de 2006, 10:46:25 »
Hola nocturno,

Ahora mismo estamos utilizando sólo interrupciones de los Timers y del ADC, así que es bastante probable que tu pista nos ayude. ¿Puedes darme algun detalle sobre el tipo de fallo que tenías y sobre lo que hace __shadow__? En nuestro caso perdemos continuamente datos de la UART,a veces llegan, otras veces no. Al principio utilizábamos el FRC del dspic con PLL16, pero cuando añadimos la LCD y unos potenciómetros.. comenzó a reiniciarse continuamente (no lo hacía hasta una instrucción concreta, simplemente de forma aleatoria), posteriormente, al azar probé con PLL4 y comenzó a funcionar correctamente, sólo que ahora, es cuando pierde datos del PC, que es justamente lo que mas necesitamos. Aparentemente no hay razón para que se resetee con PLL16, ¿es necesario tener alguna precaución adicional (tanto en el circuito como a la hora de escribir en los registros etc..)?

Muchas gracias por tu ayuda.

Un saludo desde Sevilla.
Miguel A.


Desconectado zer0

  • PIC12
  • **
  • Mensajes: 57
Re: Prob. aleatorios comunicacion dsPIC--Linux
« Respuesta #3 en: 05 de Enero de 2007, 09:21:36 »
Yo la inicializo asi y ningun problema

   // Almacena el valor del registro de baudios.
   unsigned int U1baudvalue;
   // Almacena el valor del registro de configuración de la UART.
   unsigned int U1MODEvalue;
   // Almacena la información de la UART TX & RX modos de interrupción.
   unsigned int U1STAvalue;
 


   // Cierro la UART1.    

   CloseUART1();

   

   // Configura la interrupcion de recepción y transmisión de la UART1.
   ConfigIntUART1(UART_RX_INT_EN & UART_RX_INT_PR7 & UART_TX_INT_DIS);
   // Configura el módulo de la UART1 para transmitir 8 bits de datos con un bit de stop y 9600 bps.
   // Además habilita el modo loopback mode
   // Muy importante UART_DIS_LOOPBACK no enabled sino micro se "satura"
   U1MODEvalue = UART_EN & UART_IDLE_CON &   UART_DIS_WAKE & UART_DIS_LOOPBACK & UART_DIS_ABAUD & UART_NO_PAR_8BIT & UART_1STOPBIT;
   U1STAvalue = UART_INT_TX & UART_TX_PIN_NORMAL & UART_TX_ENABLE & UART_INT_RX_CHAR & UART_RX_INT_EN & UART_ADR_DETECT_DIS & UART_RX_OVERRUN_CLEAR;
   U1baudvalue = 25; //39; // Equivale a 384000 bps   
   OpenUART1(U1MODEvalue, U1STAvalue, U1baudvalue);

}

Desconectado jbcano

  • PIC10
  • *
  • Mensajes: 2
Re: Prob. aleatorios comunicacion dsPIC--Linux
« Respuesta #4 en: 10 de Enero de 2007, 13:28:48 »
Hola

La mayoria de los problemas que he tenido en mi experiencia con pics y el reseteo ha sido por una mala protección contra el emi en el montaje.

Normalmente lo soluciono teniendo cuidado con los condensadores de desacoplo (condensadores de 0.1uf cerámico y 1uf electrolitico puestos entre Vcc y tierra cercanos a todos y cada uno de los integrados del circuito), además a la hora de hacer el PCB poniendo buenos plano tierra, separando alimentaciones análogas y digitales y utilizando fuentes bien reguladas (ojo, las fuentes swicheadas como las del computador generan bastantes problemas).

Incluso una vez, utilizando un montaje en protoboard se me reseteaba el pic cuando colocaba varios LM555 para comprobar una medición de frecuencia, hice lo mismo ya en el PCB y teniendo cuidado con todo y funcionó perfecto.


 

anything