C18 e USART

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

C18 e USART

Mensagempor Bardelli » 01 Jul 2008 11:43

Olá Caros amigos,

Resolvi aprender o compilador C18 da Microchip. no entanto não estou obtendo muito sucesso. Alguem poderia me dizer oque está errado com esse código:
#include <p18F452.h>
#include <usart.h>
#pragma wdt=off
void main(void)
{
short fef;
// configure USART
OpenUSART( USART_TX_INT_OFF &
USART_RX_INT_OFF &
USART_ASYNCH_MODE &
USART_EIGHT_BIT &
USART_CONT_RX &
USART_BRGH_HIGH,
12 );

while(1){
WriteUSART(PORTD ); //write value of PORTD

}
}


Obs: Estou usando um PIC18F452 com cristal de 4Mhz. Fiz um programa no PICC da CCS e a comunicação serial funciona 100%, esse aqui não está funcionando. Oque eu estou fazendo de errado?

abraços
Bardelli
Bardelli
Byte
 
Mensagens: 126
Registrado em: 20 Out 2006 12:42

Mensagempor Fernando Guimarães Aguiar » 01 Jul 2008 14:16

Bardelli, para enviar um byte pela usart no C18, eu utilizo a rotina putcUSART (dado); e também utilizo a rotina
BusyUSART(); para verificar se o dado já foi enviado.

Assim, o seu loop principal ficaria da seguinte maneira:

Código: Selecionar todos
while(1)
{
putcUSART(PORTD); //write value of PORTD
while (BusyUSART());
}


Só lembrando que esta rotina envia um byte (HEX), e não ASCII.
E de acordo com o spbrg, o baud rate da sua transmissão é 4800 bps.

No mais é isso aí.
T+
Avatar do usuário
Fernando Guimarães Aguiar
Nibble
 
Mensagens: 53
Registrado em: 21 Out 2006 10:54
Localização: São Carlos

Mensagempor Bardelli » 01 Jul 2008 14:22

Porque o Baud Rate da minha transmissao é 4800??

Eu fiz as contas para 19200, eu usei a seguinte formula:

Baud Rate= Fosc/(16*(sprg+1))

Como o meu cristal é de 4 Mhz, o resultado deu 12...

abraços
Bardelli
Byte
 
Mensagens: 126
Registrado em: 20 Out 2006 12:42

Mensagempor Fernando Guimarães Aguiar » 01 Jul 2008 14:48

Bardelli Realmente é 19200 bps.
Quando eu realizei as contas pela primeira vez, eu utilizei a fórmula errada (para USART_BRGH_LOW e não para USART_BRGH_HIGH, como vc está utilizando).

Foi um lapso de fórmulas... hehehe...

Abraços.
Avatar do usuário
Fernando Guimarães Aguiar
Nibble
 
Mensagens: 53
Registrado em: 21 Out 2006 10:54
Localização: São Carlos

Mensagempor Bardelli » 01 Jul 2008 15:08

Olá,

Então, a minha pergunta tinha um objetivo, eu estou conseguindo fazer funcionar, porém para velocidades até 9600 BPS, com o compilador CCS eu consigo 19200 facil facil, mas o objetivo não é usar esse compilador.

Tem ideia porque não está funcionando?
Bardelli
Byte
 
Mensagens: 126
Registrado em: 20 Out 2006 12:42

Mensagempor ze » 01 Jul 2008 15:56

pic--->pic
Código: Selecionar todos
#include <pic.h>
// ************************ configuração ***********************
// proteção do código,4Mhz,powerup,lowvoltagedis,debdis,flaswritedis,wathdogdis,brownouresetdis
//__CONFIG(PROTECT & XT & PWRTEN & LVPDIS & DEBUGDIS & WRTDIS & WDTEN & BOREN); //876
__CONFIG(UNPROTECT & XT & PWRTEN & LVPDIS & DEBUGDIS & WDTDIS & BOREN);   //876a
//***************************************************
static void interrupt
timer_int(void)
{
}
//*********************************************************
void main(void)
{
OPTION=0b00100001; //com pullup, clock ligado em RA4, prescaler/
T1CON=0b00000111; //timer on, prescale 1:1, não sincroniza, clock externo, timer1 on
ADCON1=0b00000110; //AN=digital
TRISA=0b00001001; //RA3, RA1=entrada comparador
//TRISB=0xff; //lado dos sensores
TRISB=0x00; //lado dos leds
CMCON=0b00000001;
T1CON=0B00010101;   // prescaler /2 timer1 on
TMR1IF=0;           //zera flag timer1
TRISC=0b10011111;//RC7,RC6=txrx,RC5=buzzer,RC4,RC3=e2p,RC2=vnr,RC1=por,RC0=comtec1
//------------- interface serial-------
SPBRG=155;    //9600,n,8 @ 24MHz
TXEN=1;       //hab. transmissão
//BRGH=0;     //sel. baud rate baixa 2400bps
BRGH=1;       //sel. baud rate alta  9600bps
SYNC=0;       //assinc.
SPEN=1;       //hab. pinos como int. serial
CREN=1;       //recepção contínua
RCIF=0;       //flag de recepção
RCIE=1;        //hab int serial
//--------------------------------------

for(;;)
{
//   TXREG=PORTB;    //lado dos
//   while(TXIF);    // sensores   

   while(!RCIF);   //lado dos
   PORTB=RCREG;      //leds
}

}

é pro 876 mas a essência pro 452 é a lesma lerda. Particularmente gosto de controlar os registros manualmente e não por funções prontas.
atenção aos SPBRG (baud rate), SPEN, CREN
num esqueça: receptor e transmissor com mesmo baudrate (blêrrrrrrrrrr!)
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

cron

x