Página 1 de 1

UART em PIC18F

MensagemEnviado: 29 Mar 2007 15:25
por andre_bcs
Amigos, a dúvida é relativamente simples, a vocês que já são mestres em prog. em C! Eu vim recentemente do Assembly, pois agora preciso mexer com os 18F da vida, e to sofrendo um pouco com as sintaxes do C18.
Eu preciso fazer um programinha simples, q eu pego um dado na USART do PIC (q eu jah fiz), e jgoar esses dados pro PC através de uma UART utilizando dois pinos de I/O qualquer do PIC18F452.
Aí que esta o problema!! Eu não sei COMO configurar essa UART... Como configurar os pinos, e ajustar o delay para 9600bps (para o PC).
Dei uma olhada na apostila do C18 aqui, mas não sei como fazer... ele só me mostra um "OpenUART()", mas e aí?!?
Se alguem pudesse só dar uma passadinha breve por cima dessa rotininha, eu agradeceria MUITO!!! Pois eu não acerto a sintaxe aqui de maneira nenhuma!
Qualquer ajuda é bem vinda, muito obrigado amigos!!!

MensagemEnviado: 29 Mar 2007 15:50
por Red Neck Guy
#include <18f452.h>
#use delay(clock = 40000000)
#use rs232(baud = 9600,xmit=PINA0,rcv=PINA1)

void main(void){
unsigned char valor=0;
/*
Eu nunca mandaria pra rua um código asssim...
*/
for(; ; ){ //maldito ;) é igual à ; ) sem o espaço...
valor++;
putc(valor);
delay_ms(1000);
}
}

Mas sinceramente, sem saber a sintaxe de C tu não conseguri fazer nada de util não. Um erro comum que vejo o pessoal novato cometer é querer programar sem conhecer a linguagem. Infelizmente aí não tem como...
Sem conhecer a linguagem e o básico da arquitetura do MCU só dá pra fazer piscar led com output_toogle do CCS.

MensagemEnviado: 29 Mar 2007 16:22
por andre_bcs
Marcos, agradeço a ajuda. Mas eu estou usando o C18, não o CCS.

Eu sou novato em C pois migrei a pouco tempo, programei muito em Assembly. Mas eu fiz o curso do C18 pra PIC18F, só que as diretivas para configurar UART eu não sei... Eu achei a apostila das Libraries do C18 da Microchip meio fraca nesse ponto. Por isso peço ajuda a vocês...
Obrigado!

MensagemEnviado: 29 Mar 2007 16:35
por Red Neck Guy
Ao meu ver, a melhor maneira que se tem de configurar a usart é manipulando diretamente os registradores do mcu.
Logo se tu já programa em Assembly, não encontratá dificuldades para fazê-lo.
Apenas tem que descobrir como alocar uma variavel em um endereço pré-determinado(que será no caso o endereço do registrador) e pronto.
EU não uso o C18, mas o Keil, IAR,CCS tem, logo o C18 tambem deve ter.

MensagemEnviado: 29 Mar 2007 16:55
por ric_vas
Eu faço assim:

Código: Selecionar todos
void SetupUsart1(unsigned int regSPBRG)
{
   //Startup Serial Port 1 (RS-232)
   ///////////////////////////////////////////////////
   Open1USART(    USART_TX_INT_OFF &  //Transmit interrupt OFF
                USART_RX_INT_ON &            //Receive interrupt ON
                USART_ASYNCH_MODE &      //Asynchronous mode
                USART_EIGHT_BIT &            //8-bit transmit and receive
                USART_CONT_RX &              //Continuous reception
                USART_BRGH_HIGH,            //High baudrate
                regSPBRG );                        //SPBRG register

}


Chamo essa função passando o valor SPBRG para a velocidade que desejo. Consulte o datasheet do mcu para verificar o valor correto.

Ric

MensagemEnviado: 30 Mar 2007 08:32
por andre_bcs
Amigos... o negócio é o seguinte... A USART minha tah tudo certinho, eu tenho no datasheet como configura-la pq ela SIM tem um registrador que me permite dar um "OpenUSART" e manipular bit por bit, certo??
Só que implementar uma UART (usart por SOFTWARE) que é o problema!! Não tem no datasheet! Mas tem rotinas prontas naquelas 'libraries' do C18. Porém, tá muuuuito superfricial ao meu ver... O exemplo de uso deles é o seguinte:

void main(void)
{
char data
OpenUART(); // aqui q eu nao entendi o q q tem q fazer!! parece q ele chama uma funcao, mas ele nao diz como atribuir os pinos de I/O q eu vou usar, nem o delay pra 9600bps!!

while(1)
{

data = ReadUART();
WriteUART(data);
}
}

Nessa apostila das 'libraries', ele até fala como fazer essas configurações, mas não da exemplo do comando, sabe?! E é aí q eu me perco nas sintaxes.. quem puder, por favor, dá uma ajudinha aí!
Obrigado novamente!

MensagemEnviado: 30 Mar 2007 08:52
por fabim
agora eu que fiquei confuso.
o seu compilador não aceita diretivas ASM. se aceitar, crie uma função de transmissão e recepção em asm, dentro de um comando em C.

Em pascal ficaria mais ou menos assim.

procedure manda_dados(input : array X of byte)
var XXX
begin
asm
"faço o UART na unha"
end;
End;

Fabim

MensagemEnviado: 30 Mar 2007 08:57
por ric_vas
Pelo que entendi os pinos a serem utilizados estão pré-definidos na biblioteca. Para altera-los você deve acessar os fontes das bibliotecas, mudar os valores e compilar novamente (se não me engano existem uns arquivos .BAT que fazem a compilação:

The precompiled versions of these functions use default pin assignments that can be
changed by redefining the equate (equ) statements in the files writuart.asm,
readuart.asm and openuart.asm, found in the src/traditional/pmc/sw_uart or
scr/extended/pmc/sw_uart subdirectory of the compiler installation:


Para a velocidade (Baud) o usuário deve definir funções em seu código que serão responsáveis pelos delays (bits, bytes) do canal serial.


DelayTXBitUART ((((2*FOSC) / (4*baud)) + 1) / 2) - 12 cycles
DelayRXHalfBitUART ((((2*FOSC) / (8*baud)) + 1) / 2) - 9 cycles
DelayRXBitUART ((((2*FOSC) / (4*baud)) + 1) / 2) - 14 cycles


O link abaixo pode dar algumas dicas:

http://forum.microchip.com/tm.aspx?m=75988&mpage=1&key=software%2cuart&#75988

Ric

MensagemEnviado: 30 Mar 2007 11:04
por andre_bcs
Fabim, eu consigo escrever a configuração da UART em assembly sim... mas pra falar a verdade, eu nunca implementei isso tanto em assembly, mtu menos em C!
ric_vas, a parte do delay tá tranquilo, entendi! eles sugerem até que se faça a rotina em assembly para que se tenha uma precisão maior do delay... posto que em C não é um delay 'cravado' no valor que se deseja.
Em relação aos bits para Tx e Rx, eu tenho que mudá-los na biblioteca?!? Nunca fiz isso... mas foi tentar aqui! Se eu conseguir configurar direitinho e funcionar eu posto a solução aqui pra vocês!
Obrigado a todos!!

E, se alguem ainda puder contribuir com mais alguma dica, agradeço tambem!! =]

MensagemEnviado: 02 Abr 2007 23:24
por microeletronica
#define BP 42

TRISCbits.TRISC6 = 0; // pino TX USART do 18F
TRISCbits.TRISC7 = 1; // pino RX USART do 18F

OpenUSART( USART_TX_INT_OFF & USART_RX_INT_OFF &
USART_ASYNCH_MODE & USART_EIGHT_BIT &
USART_CONT_RX & USART_BRGH_HIGH ,BP);
//57600 bps - frequencia de operacao a 40Mhz (10 * 4 utilizando o pll!!!)


Para testes:

char Teste[7];

strcatpgm2ram(Teste, (char rom*)"mmm...");

putcUSART('@');
putcUSART('\r');
putcUSART('\n');

putsUSART(Teste);

Manda o XT que tah usando que faco aas contas pra vc!
Manda tambem a frequencia desjada de operacao de seu PIC!

Dah uma olhada nos exemplos do Compilador.
Sao bons!
Dah um search no forum da microchip./
forum.microchip.com

MensagemEnviado: 03 Abr 2007 08:50
por andre_bcs
Amigos, eu estou com um probleminha...
Criei minhas rotininhas de delay para:

- DelayTXBitUART
- DelayRXHalfBitUART
- DelayRXBitUART

E gerei um '.asm'. Só que agora, ONDE eu coloco esse arquivo no meu programa em C??
obrigado!

MensagemEnviado: 03 Abr 2007 13:51
por ric_vas
Dá uma olhada no fim deste tópico...isso deve ajudar:

http://forum.microchip.com/tm.aspx?m=146791&mpage=1&key=include%2casm%2cfile&#146795

Ric

MensagemEnviado: 03 Abr 2007 20:00
por microeletronica
Mas porque vc criou isso?
Inclui o usart.h e sai usando.
Nao tem que fazer delay nao!!!

[]s.

MensagemEnviado: 03 Abr 2007 20:11
por ric_vas
É uma serial por software não por hardware.

Ric

MensagemEnviado: 03 Abr 2007 20:27
por microeletronica
viaajei. desculpa.
Usa as prontas do compilador, de qq forma.