Programación del PIC 24FJ en pcb real con CCS.

Programación del PIC 24FJ en pcb real(no de desarollo) con CCS.
Hola a todos compañieros.
Mi disculpa por la idioma, pero no soy español ni mi idioma nativa es española.
Me llamo Kostadin Hristov, soy un Ingeniero Electronica y Automatica y trabajo como Ingeniero HW 23 años ya en Madrid y Londres.
El tema es, hasta ahora manejaba los 8 bit PICs hasta 18F4550, que es al limite de los 8 bits antes de los 16 bits. Bien, ahora necesito expander la gama de los micros con 16 bits incluso con los de 32 bits, pero antes de nada necesito una consulta sobre los de 16 bits. El caso concreto es PIC 24FJ128GA010. Me costo un monton de tiempo, hasta que lo pongo funcionar en una pcb real. Despues resulta que los principios de los 8bits no son 100% validos para los PICs de 16 bits.
Por ejemplo una simple comunicacion entre un tablet y un PIC de 8 bits, mediante un HC-06 Bluetooth modulo funciona perfecto, pero cuando cambie el 18F4550 con el 24FJ128GA010, resulta que la comunicacion entre el tablet y el PIC 24FJ se cumple, pero al revez el PIC 24FJ manda vasura al tablet. No es del modulo HC-06, porque aunque es de 8bits el modulo, eso no importa, simplemente acepta strings hasta 8 digitos mandados a la vez y los modulos BT de Microchip de 16 bits pueden duplicar la longuitud del string, pero el HC-06 es compatible con el PIC 16 bits. Lo estraño es, porque en retorno recibo una vasura, que incluye distintos signos estraños. Los FUSES, el clock externo de 32MHz estan bien definidos, porque resto de instrucciones se cuplen bien. Otra vez repito, hablo de pruebas en PCB real, que no son tarjetas de desarollo, son PCB, hechas desde el cerro de mi mismo..toda la electronica, periferia, el PIC y todo.
Decidi a involucrar un 8 bits entre el tablet y el 24FJ PIC.
Cuando hecho un simple comunicacion UART entre el 18F4550 y el 24FJ128GA010, enviando numeros de 0 hasta 99 por un contador con FOR cicle todo funcionaba tambien perfecto, la comunicacion se cumplia sin problemas ni retrasos. El ultimo paso era a hacer la comunicacion entre el Tablet y el PIC 24FJ , pasando por el PIC 18F4550. Resulta que con muchisima dificultad cuando pulsas un numero unico, que no es ningun string, el 24FJ lo recibe, algunas veces es necesario para pulsar el mismo digito dos veces en el tablet para que el 24FJ se entera que has pulsado un digito por ejemplo "3" y lo recibe y activa un pin de algun puerto de salida, eso bien, pero despues de intentar a transferir un string de 8 digitos, o por lo menos de mas de un digito, eso nunca pasa, incluso dejo a recibir el unico numero, que desde el principio recibia aunque no siempre desde la primera vez.
Al final, no entiendo, porque el pic de 16 bits no cumple comandos simples, que funcionan en pics de 8 bits?
Intente a pasar variables de 8bits a 16bits y al revez, pero en realidad no es necesario, porque el pic 24FJ recibe exacto lo mismo que manda el pic 8bit, tratando se mandar deigitos de un contador. Cuando debe que captar una variable sea char o int del UART RX, el tema cambia totalmente, capta cualquier cosa, solo no el digito, que pulsaba desde el tablet.
Donde puede estar escondido el problema del pic 24FJ128GA010, ejecutando programas faciles y simples de comunicacion entre PICs.
EL primer pic 18F lo tengo comunicado con el tablet por BT y el pic 24FJ con el 18F por cables. Hablando para el nivel de la amplitud del señal, aqui cuando el pic 24F alimentado por 3.3V manda un señal por el TX, lo manda con una ampitud de 3V, que es totalmente suficiente para el RX del pic 18F, porque cualquier amplitud mayor de 0.75V forma una logica "1". Al revez, cuando el pic 18F alimentado por 5V manda de su TX señal al RX del 24FJ alimentado con 3.3V, aqui hay que reducir la amplitud ya a 3V, porque puedes dañar el 24FJ. Eso lo hago con un devisor de resistencias.
Entonces el MAX232, no es necesario, porque este max sirve solo para compensar linias de comunicacion muy largos donde hay bajada de la amplitud de la tension. En este caso la comunicacion se hace con distancia de unos centimetros.
Estoy alimentando el HC-06 directo con 5V, primero que eso es aceptable, segundo que con 3V no da resultados satisfactorias.
He hecho en el primer pic 18F dos UART salidas , una por HW y la otra por SW, para que se comunica no solo con el HC-06, si no que con el 24FJ, tambien.
Llevo con este problema ya 10 dias, sin que puedo avanzar y esto me perjudica muchisimo el proyecto que hago, porque me pagan por horas.
Aparte , porque cuando mando una char directo del tablet al 24FJ, en la LCD no se recibe la misma char, si no cualquier cifra, que no es ni ASCII, ni HEXdecimal, no es una cosa aleatoria, las cifras recibidas como 112, 65512..... siempre corresponden a alguana enitida por el tablet pero nunca coincide con la que mando exactamente. Como debo que convertir la variable recibida para que la veo bien en la LCD?
Aqui abajo publico el SW con C, hecho por PIC C (PCWHD V.5). En PROTEUS simulo solamente circuitos simples, porque este simulador no funciona bien con esquemas grandes y con PICs mas de uno en una esquema, especialmente cuando debes que comunicar los por alguna manera. Algunas veces te simula bien, luego no, un rollo grande con el proteus, por eso estoy trabajando directo en practica.
Si alguien tiene mas experiencia con los PICs 16 bits, por favor indica me donde puedo equivocar me con mi proyecto!
Gracias
K.Hristov

MASTER:
C:
#include <18F4550.h>


  #include <stdio.h>

  #include <stdlib.h>

  #include <string.h>



#FUSES HS



#define BUFFER_SIZE 32// #define BUFFER_SIZE 32            0x10              // Range 0-VrefH


#define reset pin_MCLR 1

  

#use delay(clock=8000000)


#use fast_io(a)

#use fast_io(b)

#use fast_io(c)   

#use fast_io(d)

#use fast_io(e)


#byte porta=0xF80

#byte trisa=0x00

#byte portb=0xF81     ////////////////////////////////////////

#byte trisb=0x01      ////////////////////////////////////////

#byte portc=0xF82     ////////////////////////////////////////

#byte trisc=0x02      ////////////////////////////////////////

#byte portd=0xF83     ////////////////////////////////////////

#byte trisd=0x03      ////////////////////////////////////////

#byte porte=0xF84     ////////////////////////////////////////

#byte trise=0x04

#byte porta = 0x00 // Asignamos PortA.

#byte portb = 0x01 // Asignamos PortB.

#byte portc = 0x02 // Asignamos Portc.

#byte portd = 0x03 // Asignamos Portd.

#byte porte = 0x04 // Asignamos Porte.


///////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////

//**************************** start DRIVERS***********************************/

//**************************** start DRIVERS***********************************/

//**************************** start DRIVERS***********************************/

//**************************** start DRIVERS***********************************/

//**************************** start DRIVERS***********************************/

#include <lcd.c>


/////////////////////////////////GLOBAL VARIABLES///////////////////////////

//////////////////////////////////GLOBAL VARIABLES//////////////////////////


//*********************** start GLOBAL FUNCTIONS***************************

//*********************** start GLOBAL FUNCTIONS***************************

void serial_isr();


void main ();

//*********************** end GLOBAL FUNCTIONS***************************

//*********************** end GLOBAL FUNCTIONS***************************

//*********************** end GLOBAL FUNCTIONS***************************

//10,300,600,1200,2400,4800,9600,14400,19200,38400,57600,115200,128000,256000

#use rs232(baud=9600, xmit=PIN_C6,rcv=PIN_C7,stream=PC,parity=N, bits=8)

#use rs232(baud=9600,xmit=PIN_B1,rcv=PIN_B2,stream=PIC, parity=N, bits=8)


char c;


#INT_RDA

void serial_isr()

{

  c=fgetc(PC);

  fprintf(PC,"%c",c);

  fprintf(PIC,"%c",c);

}

void main()

{


set_tris_c(0x11111101);

set_tris_b(0x01000000);

set_tris_d(0x00);

set_tris_e(0x00);

 

OUTPUT_A(0);

OUTPUT_B(0);

OUTPUT_C(0);

OUTPUT_D(0);

OUTPUT_E(0);

delay_ms(1);


enable_interrupts(INT_RDA);

enable_interrupts(GLOBAL);


lcd_init();



lcd_gotoxy(1,1);

printf(lcd_putc,"M_3 PC 18F4550");


  while(TRUE)

{

for(c=0;c<99;c++)

{

delay_ms(3000);

fprintf(PIC,"%c",c);


lcd_putc("\f");

lcd_gotoxy(1,3);

printf(lcd_putc,"SENDING: %c",c);


}

}

}


SLAVE:


#include <24FJ128GA010.h>

//#device ADC=10



#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <stdint.h>


#FUSES HS // Speed Oscilator Select

#FUSES OSCIO //OSC2 is general purpose output

#FUSES CKSFSM //Clock Switching is enabled, Fail Safe clock monitor is enabled

#FUSES PR    // Enable Primery  Oscilator

#FUSES FRC   //Internal Fast RC Oscillator

//#FUSES FRC_PLL  //Internal Fast RC oscillator with PLL

#FUSES IESO  //Internal External Switch Over mode enabled

#FUSES WPOSTS16   //Watch Dog Timer PostScalar 1:32768    16 era

#FUSES WDT128  //WDT PRESCALER 1:128

#FUSES NOWINDIS //Watch Dog Timer in NON-Window mode

//#FUSES NOWDT  //No Watch Dog Timer


#FUSES NOPROTECT //Code not protected from reading

#FUSES NOWRT  //Program memory not write protected

#FUSES NOJTAG //JTAG disabled


#FUSES ICSP1  //ICD uses PGC1/PGD1 pins     

#FUSES NODEBUG //No Debug mode for ICD


#define BUFFER_SIZE 64// #define BUFFER_SIZE 32


#define reset pin_MCLR 13


#use delay(clock=32000000)



#use fast_io(B)

#use fast_io(C)

#use fast_io(D)

#use fast_io(E)

#use fast_io(F)

#use fast_io(G)


#byte porta=0xF80

#byte trisa=0x00

#byte portb=0xF81

#byte trisb=0x01

#byte portc=0xF82

#byte trisc=0x02

#byte portd=0xF83

#byte trisd=0x03

#byte porte=0xF84

#byte trise=0x04

#byte portf=0xF85

#byte trisf=0x05

#byte portg=0xF86

#byte trisg=0x06


#define input_drive(PIN_F2);

#define output_drive(PIN_F3);

///////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////



//**************************** start DRIVERS***********************************

//**************************** start DRIVERS***********************************

//**************************** start DRIVERS***********************************

//**************************** start DRIVERS***********************************

//**************************** start DRIVERS***********************************



//*********************** start GLOBAL FUNCTIONS***************************

//*********************** start GLOBAL FUNCTIONS***************************

void serial_isr();

char c[12]={0,1,2,3,4,5,6,7,8,9};

int i;


#use rs232(baud=9600, xmit=PIN_F3, rcv=PIN_F2, PARITY=N, BITS=8, STOP=1, ERRORS,STREAM=PIC)



#INT_RDA

void serial_isr()

{

for(i=0;i<9;i++)

{

c=fgetc(PIC);

fpriintf(PC,"%s",c);

lcd_gotoxy(1,2);

printf(lcd_putc,"fgetc:  %s",c);

}

}


void main()

{ 

set_tris_a(0x000000110011);

set_tris_b(0x0001100000000000);

set_tris_c(0x00001001);

set_tris_d(0x0000000000000000);     

set_tris_e(0x0000000000);

set_tris_f(0x11101111111);

set_tris_g(0x000000000000);

 

OUTPUT_A(0);

OUTPUT_B(0);

OUTPUT_C(0);

OUTPUT_D(0);

OUTPUT_E(0);

OUTPUT_F(0);

OUTPUT_G(0);

delay_ms(1);



enable_interrupts(INT_RDA);

enable_interrupts(GLOBAL);


lcd_init();

lcd_putc("\f");

lcd_gotoxy(1,1);

printf(lcd_putc,"S_3 PC 24FJ");

while(true)

{





fprintf(PIC,"%s",c);

//putc(c);

delay_ms(100);


}

}
 
Hola.

Los normal sería verificar si los dos PIC intercambian datos en ambos sentidos sin problemas.

Si no lo hacen pueden ser problemas con el hardware (conexión y oscilador), configuración del PIC y luego el mismo programa.

Entonces si estás seguro del hardware, buena conexión, oscila a la frecuencia adecuada, etc...

Revisa las configuraciones del PIC, puertos, el USART, etc.
En el peor de los casos tendrás que revisar el archivo lst para ver el asm que se genera... esto último en caso extremo por si el CCS no tiene un soporte completo para el PIC24 que has elegido.

Ahora del programa del PIC18F, me llama la atención estas líneas:

1. #use rs232(baud=9600, xmit=PIN_C6,rcv=PIN_C7,stream=PC,parity=N, bits=8)
2. #use rs232(baud=9600,xmit=PIN_B1,rcv=PIN_B2,stream=PIC, parity=N, bits=8)

Que recuerde, el PIC18F4550 tiene un solo USART, por lo que si se quiere usar más ya serían por software, para eso se debe indicar en la segunda línea que el rs232 (stream=PIC) sea por software.

En fin, revisa por separado, comprueba paso a paso el funcionamiento, has pruebas básicas uno por uno luego ambos PIC.

Saludos
 
Ahora del programa del PIC18F, me llama la atención estas líneas:

1. #use rs232(baud=9600, xmit=PIN_C6,rcv=PIN_C7,stream=PC,parity=N, bits=8)
2. #use rs232(baud=9600,xmit=PIN_B1,rcv=PIN_B2,stream=PIC, parity=N, bits=8)

Que recuerde, el PIC18F4550 tiene un solo USART, por lo que si se quiere usar más ya serían por software, para eso se debe indicar en la segunda línea que el rs232 (stream=PIC) sea por software.
En las dos configuraciones se está usando RS-232 por software.
Para indicar que se use algún módulo EUSART se tendría que mencionar.
Por ejemplo: #use RS232 (UART1, etc...)
Lo correcto sería usar el módulo USART y si se requieren más serían por software...

#use rs232(UART1)
#use rs232(xmit = PIN_B1, rcv = PIN_B2, stream = PIC)
Omito la configuración porque por defecto es la que se está usando: 9600, N, 8, 1

Lo que se debe tener en cuenta es que gets, getc, puts, putc y printf serán para el módulo EUSART y fgets, fgetc, fputs, fputc y fprintf serán por software con su respectivo stream.
 
Atrás
Arriba