Comunicação serial entre o PIC18F4620 e o PIC16F913

Enviado:
16 Abr 2012 19:24
por Daniel dos Santos Costa
Estou tentando comunicar via serial usando a lib. do C18 usart.h o pic18F4620 e o pic16F913.
Usando o 4620 envio o comando ASCII para o 913 usando o putcUSART();, para ler os dados uso a função getcUSART();
Estou usando o baud rate de 9600.
Já consegui comunicar o 4620 com o PC, além do 913 e esta funcionando corretamente no PC, entretanto os dois pics não recebo os dados.
Vou anexar o código espero que possam ajudar.

Enviado:
16 Abr 2012 19:27
por Daniel dos Santos Costa
- Código: Selecionar todos
void grava_cartao(void)
{
FSFILE *MyFile1, *MyFile2, *MyFile3;
char nome[20], mode[3];
unsigned char err, k;
char *Sc;
int result, i, j;
float mV, Temp, Temp_Bla;
char Heart[3];
k= 0;
// Configure Timer. Start timer interrupts
Config_Timer( );
do
{
Delay10KTCYx(50);
err = FSInit();
k++;
}
while ((k<10) && (err==FALSE));
if ((k==10) && (err==FALSE))
{
TRISDbits.TRISD0 = 0;
PORTDbits.RD0 = 1; //Error...
erro = 1;
}
else
{
//TRISDbits.TRISD1 = 0;
//PORTDbits.RD1 = 1;
sprintf(&nome[0],"Temp_Amb.txt");
sprintf(&mode,"w+");
MyFile1 = FSfopen(nome,mode);
sprintf(&nome[0],"Temp_Bla.txt");
sprintf(&mode,"w+");
MyFile2 = FSfopen(nome,mode);
sprintf(&nome[0],"Humi.txt");
sprintf(&mode,"w+");
MyFile3 = FSfopen(nome,mode);
for(Sc=&MyBuffer[0];*Sc!=0;Sc++);
k=Sc-&MyBuffer[0];
Dia=02;Mes=02;Ano=2012;Hora=14;Minuto=29;Segundo=10;
SetClockVars(Ano,Mes,Dia,Hora,Minuto,Segundo);
FSfwrite(&MyBuffer[0],1,k,MyFile1);
FSfwrite(&MyBuffer[0],1,k,MyFile2);
FSfwrite(&MyBuffer[0],1,k,MyFile3);
while(1)
{
result = Read_ADC_Chan(ADC_CH1); // Get the data
mV = (result * 500) / 1023; // Convert to mV
Temp = mV; // Calculate temperature
i = (int)Temp; // Integer part
j = (int)((Temp-i)*10); // Fractional part
// Write to SD card
FSfprintf(MyFile1, "\n%d.%d", i, j);
while(BusyUSART( ));
putcUSART('G');
while(BusyUSART( ));
putcUSART('1');
while(BusyUSART( ));
putcUSART(0x0D);
//putcUSART('\r');
if (DataRdyUSART( ))
{
for (i=0; i<3; i++)
Heart[i] = getcUSART();
//return(0);
}
// Write to SD card
FSfprintf(MyFile2, "\n%c", Heart);
// sprintf(buff,"\fTemperature:%d.%d", i, j);
// lcd_escreve(buff);
// sprintf(buff,"\nHeart: %d ", Heart);
// lcd_escreve(buff);
// result = Read_ADC_Chan(ADC_CH2); // Get the data
// mV = (result * 500) / 1023; // Convert to mV
// Temp_Bla = mV; // Calculate temperature
// i = (int)Temp_Bla; // Integer part
// j = (int)((Temp_Bla-i)*10); // Fractional part
//
// // Write to SD card
// FSfprintf(MyFile2, "\n%d.%d", i, j);
//
//
// result = Read_ADC_Chan(ADC_CH3); // Get the data
// mV = (result * 500) / 1023; // Convert to mV
// Temp = mV; // Calculate temperature
// i = (int)Temp; // Integer part
// j = (int)((Temp-i)*10); // Fractional part
//
// // Write to SD card
// FSfprintf(MyFile3, "\n%d.%d", i, j);
if(PORTAbits.RA4 == 0)
{
FSfclose(MyFile1);
FSfclose(MyFile2);
FSfclose(MyFile3);
break;
}
// Wait for a second. Variable "flag" is set whevenever an interrupt occurs
while(!One_Sec_Flag);
One_Sec_Flag = 0;
}
}
}
Esta a função que envia os dados e deveria receber os dados.
- Código: Selecionar todos
// This function initializes the USART
void Init_USART(void)
{
OpenUSART(USART_TX_INT_OFF & // Interrupção de transmissão desabilitada
USART_RX_INT_OFF & // Interrução de recepção desabilitada
USART_ASYNCH_MODE & // Modo assíncrono
USART_EIGHT_BIT & // Dados de 8 bits
USART_CONT_RX & //
USART_BRGH_LOW, // Alta velocidade
51); // Baud rate de 9600
}
Esta função é a de configuração, caso esteja faltando algo por favor dê uma luz.

Enviado:
16 Abr 2012 19:29
por Daniel dos Santos Costa
o pic16F913 esta no modulo de batimento cardiaco vendido na Sparkfun, vou anexar o manual desse modulo
http://danjuliodesigns.com/sparkfun/hrmi_assets/hrmi.pdf

Enviado:
02 Mai 2012 08:32
por Daniel dos Santos Costa
Ola pessoal
Consegui resolver o problema.
Obrigado pelo apoio.
Daniel