Ir ao conteúdo
  • Cadastre-se
Ftg Claudio

Comunicação Serial PIC18F45550

Recommended Posts

Galera,

estou tentando comunicar o pic com o computador, já desenvolvi o hardware e tenho o software que desenvolvi no Visual Basic, mas nunca consigo receber ou enviar o mesmo dado. ALguém tem um exemplo para me passar ?

Abaixo meu código :

Uso o MPLAB C18 :

 

#include <p18cxxx.h>
#include "usart.h"
#include "displayLCD.h"
#include <stdio.h>
#include <stdlib.h>
/************************************************DEFINES**********************************************/
 
#pragma config FOSC=HS
#pragma config CPUDIV=OSC1_PLL2
#pragma config WDT=OFF
#pragma config PWRT=ON
#pragma config BOR=ON
#pragma config BORV=1
#pragma config PBADEN=OFF
#pragma config LVP=OFF
/*******************************************************************************************************/
void main (){
    char A=0;
 ConfiguraLCD();
    TRISC = 0b10111111;
   //Configura como oscilador externo - 20Mhz
     OSCCONbits.SCS0 = 0;
     OSCCONbits.SCS1 = 0;
 
   //Define TX como transmissor (saída)
     TRISCbits.TRISC6 = 0;
   //Define RX como receptor (entrada)
     TRISCbits.TRISC7 = 1;
     
OpenUSART(USART_TX_INT_OFF &
 USART_RX_INT_OFF &
 USART_ASYNCH_MODE &
 USART_EIGHT_BIT &
 USART_BRGH_LOW,31);
 
baudUSART(BAUD_8_BIT_RATE &
 BAUD_AUTO_OFF &
 BAUD_WAKEUP_OFF);
   
 
             while (1)
 
            {    PosicaoCursorLCD(1,1);
                 EscreveFraseRomLCD("Funcionando");
 
//                 while(DataRdyUSART());
//                 A=ReadUSART();
//                 EscreveFraseRomLCD(A);
 
//                while(BusyUSART());
//                putcUSART('A');
//
//                PosicaoCursorLCD(2,1);
//                 EscreveFraseRomLCD("A");
//
//            Delay10KTCYx(250);   // Delay 10000*250 Ciclos
//Delay10KTCYx(250);   // Delay 10000*250 Ciclos
//Delay10KTCYx(250);   // Delay 10000*250 Ciclos
//Delay10KTCYx(250);   // Delay 10000*250 Ciclos
//Delay10KTCYx(250);   // Delay 10000*250 Ciclos
//
//                while(BusyUSART());
//                putcUSART('B');
//                                PosicaoCursorLCD(3,1);
//                                 EscreveFraseRomLCD("B");
//     Delay10KTCYx(250);   // Delay 10000*250 Ciclos
//Delay10KTCYx(250);   // Delay 10000*250 Ciclos
//Delay10KTCYx(250);   // Delay 10000*250 Ciclos
//Delay10KTCYx(250);   // Delay 10000*250 Ciclos
//Delay10KTCYx(250);   // Delay 10000*250 Ciclos
 
Delay10KTCYx(250);   // Delay 10000*250 Ciclos
Delay10KTCYx(250);   // Delay 10000*250 Ciclos
Delay10KTCYx(250);   // Delay 10000*250 Ciclos
Delay10KTCYx(250);   // Delay 10000*250 Ciclos
Delay10KTCYx(250);   // Delay 10000*250 Ciclos
Delay10KTCYx(250);   // Delay 10000*250 Ciclos
A=4;
 
                while(BusyUSART());
                PosicaoCursorLCD(4,1);
                 EscreveFraseRomLCD("Caraca");
                putsUSART(~'AAAAAAA');
 
Delay10KTCYx(250);   // Delay 10000*250 Ciclos
Delay10KTCYx(250);   // Delay 10000*250 Ciclos
Delay10KTCYx(250);   // Delay 10000*250 Ciclos
Delay10KTCYx(250);   // Delay 10000*250 Ciclos
Delay10KTCYx(250);   // Delay 10000*250 Ciclos
Delay10KTCYx(250);   // Delay 10000*250 Ciclos
 
           }
}
 
//
///** FIM DO ARQUIVO main.c ***************************************************************/
 
 /** V E C T O R   R E M A P P I N G ******************************************/
// Rotina necessária para o compilador C18 saber onde é o início do vetor de
// "reset".
// ATENÇÃO: Copiar esta parte do código dentro do arquivo "main.c" dos
// projetos usados com o Bootloader USB-HID para gravação in-circuit.
 
extern void _startup (void);        // See c018i.c in your C18 compiler dir
#pragma code REMAPPED_RESET_VECTOR = 0x1000
void _reset (void)
{
_asm goto _startup _endasm
}
#pragma code // Diretiva que retorna a alocação dos endereços
// da memória de programa para seus valores padrão
 
/** F I M  D A  S E Ç Ã O  D E   V E C T O R   R E M A P P I N G *************/

Att

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não conheço este compilador...

Os bauds, bits, etc estão iguais?

  while(BusyUSART()); //vê se está travando aqui

  putsUSART(~'AAAAAAA'); //pra mim isto é estranho. Tem que inverter mesmo? e as aspas são 'estas' mesmo? que tal se tentasse "estas"? e sem ~inverter. dê uma olhada no help da função

faça um teste

for (; putsUSART("Teste ") ;// putsUSART(~'AAAAAAA')

e veja no hyperterminal mesmo

 de nada...

Compartilhar este post


Link para o post
Compartilhar em outros sites
#include <p18f2550.h>#pragma config PLLDIV=1, CPUDIV=OSC1_PLL2, USBDIV=2, FOSC=XTPLL_XT//, FCMEM=OFF //CPUDIV=OSC1_PLL2=48MHz   CRISTAL 4 MHZ//#pragma config PLLDIV=2, CPUDIV=OSC1_PLL2, USBDIV=2, FOSC=HS//, FCMEM=OFF //CRISTAL =CPU COM 8 MHZ SEM PLL E USB FULLSPEED 48MHZ#pragma config IESO=OFF, PWRT=OFF, BOR=ON_ACTIVE, BORV=3, VREGEN=ON, WDT=OFF#pragma config MCLRE=ON, PBADEN=OFF, CCP2MX=OFF, STVREN=ON, LVP=ON, XINST=OFF, DEBUG=OFFunsigned char cUART_char;unsigned char cUART_data_flg;void init_uart(void);void UART_putc(unsigned char c);void InterruptHandlerLow ();void main(){	init_uart(); // init UART module	while (1) // infinite loop which handles ncoming data as they arrive	{		if (cUART_data_flg==1)// if new data available, send it back through USART tx line (echo it)		{			UART_putc(cUART_char); 			cUART_data_flg=0; // clear new data flag so one charactor will echoed once		}	}}//----------------------------------------------------------------------------//----------------------------------------------------------------------------#pragma code InterruptVectorLow = 0x18void InterruptVectorLow (void){  _asm    goto InterruptHandlerLow //jump to interrupt routine  _endasm}//----------------------------------------------------------------------------// Low priority interrupt routine#pragma code#pragma interrupt InterruptHandlerLowvoid InterruptHandlerLow (){  if (PIR1bits.RCIF==1)//is interrupt occured by EUSART receive?, 						//then RCREG is full we have new data (cleared when RCREG is read)  {  	if(RCSTA&0x06) //more efficient way than following commented method to check for reception error 	//if(RCSTAbits.FERR==1 || RCSTAbits.OERR==1 )    {      RCSTAbits.CREN=0;	//Overrun error (can be cleared by clearing bit CREN)      cUART_char=RCREG;	//clear Framing error       RCSTAbits.CREN=1;    }    else    {	   cUART_char = RCREG; // read new data into variable	   cUART_data_flg = 1; // new data received. so enable flg    }  }}//----------------------------------------------------------------------------//----------------------------------------------------------------------------void init_uart(void) // init UART module for 9600bps boud, start bit 1, stopbit 1, parity NONE{	cUART_data_flg=0;   // init data receive flag to zero (no data)	TRISCbits.TRISC7=1; //Make UART RX pin input	TRISCbits.TRISC6=0; //Make UART TX pin output    SPBRGH  = 0x02;     //9600bps 20MHz Osc    SPBRG   = 0x08;		    RCSTAbits.CREN=1;   //1 = Enables receiver    RCSTAbits.SPEN=1;   //1 = Serial port enabled (configures RX/DT and TX/CK pins as serial port pins)    BAUDCONbits.BRG16=1;//1 = 16-bit Baud Rate Generator – SPBRGH and SPBRG  	TXSTAbits.SYNC=0;  //0 = Asynchronous mode  	TXSTAbits.BRGH=1;  //1 = High speed   	TXSTAbits.TXEN=1;  //1 = Transmit enabled	RCONbits.IPEN = 1;  //enable Interrupt priority levels  	IPR1bits.RCIP=0; 	// EUSART Receive Interrupt Priority 0 = Low priority  	PIE1bits.RCIE=1; 	// 1 = Enables the EUSART receive interrupt	INTCONbits.GIEL = 1;//enable interrupts	INTCONbits.GIEH = 1;      }//----------------------------------------------------------------------------//----------------------------------------------------------------------------void UART_putc(unsigned char c){  TXSTAbits.TXEN=0;// disable transmission  TXREG=c;			// load txreg with data  TXSTAbits.TXEN=1;	// enable transmission  while(TXSTAbits.TRMT==0) // wait here till transmit complete  {	Nop();  }}

Faz um teste mas verifique o cristal usado.

O que voce enviar vai aparecer no terminal.

Neste código,voce seta tudo manualmente.

 

Caso queira que o compilador faça tudo,altere o exemplo do link,que usa um LCD,para as suas necessidades:

http://www.4shared.com/rar/Y5F3mJLd/Serial_pic.html

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vou tentar e ja retorno a vocês , Muito obrigado!


#include <p18f2550.h>#pragma config PLLDIV=1, CPUDIV=OSC1_PLL2, USBDIV=2, FOSC=XTPLL_XT//, FCMEM=OFF //CPUDIV=OSC1_PLL2=48MHz   CRISTAL 4 MHZ//#pragma config PLLDIV=2, CPUDIV=OSC1_PLL2, USBDIV=2, FOSC=HS//, FCMEM=OFF //CRISTAL =CPU COM 8 MHZ SEM PLL E USB FULLSPEED 48MHZ#pragma config IESO=OFF, PWRT=OFF, BOR=ON_ACTIVE, BORV=3, VREGEN=ON, WDT=OFF#pragma config MCLRE=ON, PBADEN=OFF, CCP2MX=OFF, STVREN=ON, LVP=ON, XINST=OFF, DEBUG=OFFunsigned char cUART_char;unsigned char cUART_data_flg;void init_uart(void);void UART_putc(unsigned char c);void InterruptHandlerLow ();void main(){	init_uart(); // init UART module	while (1) // infinite loop which handles ncoming data as they arrive	{		if (cUART_data_flg==1)// if new data available, send it back through USART tx line (echo it)		{			UART_putc(cUART_char); 			cUART_data_flg=0; // clear new data flag so one charactor will echoed once		}	}}//----------------------------------------------------------------------------//----------------------------------------------------------------------------#pragma code InterruptVectorLow = 0x18void InterruptVectorLow (void){  _asm    goto InterruptHandlerLow //jump to interrupt routine  _endasm}//----------------------------------------------------------------------------// Low priority interrupt routine#pragma code#pragma interrupt InterruptHandlerLowvoid InterruptHandlerLow (){  if (PIR1bits.RCIF==1)//is interrupt occured by EUSART receive?, 						//then RCREG is full we have new data (cleared when RCREG is read)  {  	if(RCSTA&0x06) //more efficient way than following commented method to check for reception error 	//if(RCSTAbits.FERR==1 || RCSTAbits.OERR==1 )    {      RCSTAbits.CREN=0;	//Overrun error (can be cleared by clearing bit CREN)      cUART_char=RCREG;	//clear Framing error       RCSTAbits.CREN=1;    }    else    {	   cUART_char = RCREG; // read new data into variable	   cUART_data_flg = 1; // new data received. so enable flg    }  }}//----------------------------------------------------------------------------//----------------------------------------------------------------------------void init_uart(void) // init UART module for 9600bps boud, start bit 1, stopbit 1, parity NONE{	cUART_data_flg=0;   // init data receive flag to zero (no data)	TRISCbits.TRISC7=1; //Make UART RX pin input	TRISCbits.TRISC6=0; //Make UART TX pin output    SPBRGH  = 0x02;     //9600bps 20MHz Osc    SPBRG   = 0x08;		    RCSTAbits.CREN=1;   //1 = Enables receiver    RCSTAbits.SPEN=1;   //1 = Serial port enabled (configures RX/DT and TX/CK pins as serial port pins)    BAUDCONbits.BRG16=1;//1 = 16-bit Baud Rate Generator – SPBRGH and SPBRG  	TXSTAbits.SYNC=0;  //0 = Asynchronous mode  	TXSTAbits.BRGH=1;  //1 = High speed   	TXSTAbits.TXEN=1;  //1 = Transmit enabled	RCONbits.IPEN = 1;  //enable Interrupt priority levels  	IPR1bits.RCIP=0; 	// EUSART Receive Interrupt Priority 0 = Low priority  	PIE1bits.RCIE=1; 	// 1 = Enables the EUSART receive interrupt	INTCONbits.GIEL = 1;//enable interrupts	INTCONbits.GIEH = 1;      }//----------------------------------------------------------------------------//----------------------------------------------------------------------------void UART_putc(unsigned char c){  TXSTAbits.TXEN=0;// disable transmission  TXREG=c;			// load txreg with data  TXSTAbits.TXEN=1;	// enable transmission  while(TXSTAbits.TRMT==0) // wait here till transmit complete  {	Nop();  }}

Faz um teste mas verifique o cristal usado.

O que voce enviar vai aparecer no terminal.

Neste código,voce seta tudo manualmente.

 

Caso queira que o compilador faça tudo,altere o exemplo do link,que usa um LCD,para as suas necessidades:

http://www.4shared.com/rar/Y5F3mJLd/Serial_pic.html

 

Usei o seu codigo VTR, alterando apenas a funçao putc que criou, não conseguir exito, utilizo o pic 18f4550 e uso cristal de 20MHZ utilizei também o seu programa pra receber os dados na serial. Caso tenha outro codigo e queirma me enviar para testar, agradeço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Já tinha testado este vtrx, por acaso você tem um serial que utiliza cristal de 20 MHZ em pic 18f4550, preciso apenas de enviar um número inteiro para o computador. Vou tentar enviar via USB então. att

Compartilhar este post


Link para o post
Compartilhar em outros sites

Galera 

 

Estou tentando resolver um problema no meu TCC que está muito complicado,estou tentado  fazer um comunicação de RFID modelo RDM6300 com o PIC18F4520,estou usando o programa MICRO C, porém sem sucessos.

Verifiquei exemplos que o pessoal incluem o arquivo usart.h , preciso realmente de arquivo?pois não tenho o mesmo.

Ser alguém tiver algum código fonte pra ajudar eu agradeço.

 

Gostaria ser possível você me ajudarem nestas informações,detalhe ser alguém tiver o arquivo usart.h para me enviar eu agradeço.

 

:confused:  :confused:  :confused:  :confused:  :confused:  :confused: 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×