Ir ao conteúdo
  • Cadastre-se

Comunicação Serial PIC18F45550


Posts recomendados

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

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

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...

Link para o comentário
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

Link para o comentário
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.

Link para o comentário
Compartilhar em outros sites

  • 5 meses depois...

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: 

 

 

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!