collapse

* Posts Recentes

Amplificador - Rockboard HA 1 In-Ear por almamater
[Ontem às 19:13]


O que é isto ? por KammutierSpule
[26 de Março de 2024, 19:35]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Emulador NES em ESP32 por dropes
[13 de Março de 2024, 21:19]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]


Meu novo robô por josecarlos
[06 de Janeiro de 2024, 16:46]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]

Autor Tópico: EUSART PIC18F4550  (Lida 11742 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline jbecg

  • Mini Robot
  • *
  • Mensagens: 26
EUSART PIC18F4550
« em: 16 de Setembro de 2011, 23:44 »
Ando a tentar fazer uma pequena brincadeira com um microcontrolador PIC18F4550. Nesta fase pretendo transmitir dados para um computador através da porta serie, acontece que estou com um problema, já consigo comunicar mas o que recebo não corresponde exactamente àquilo que envio. Já confirmei várias vezes a taxa de transmissão, mas continuo sem obter sucesso. Deixo aqui a minha versão do código e espero sugestões.

Cumprimentos,

JBECG

#include <pic18.h>
#include <stdio.h>

void main (void)
{
   //ports
   TRISC6 = 1;
   TRISC7 = 1;

   //EUSART
   SPBRGH = 0x00;
   SPBRG = 0x81; // fOSC= 20 MHz
   BRGH = 1;
   BRG16 = 0;
   SYNC = 0;
   SPEN = 1;

   //TX
   TXCKP = 0;
   TXIE = 0;
   TX9 = 0;
   TXEN = 1;
   
   //Interrupts
   PEIE = 1;
   GIE = 1;

   while(1)
   {
      asm("CLRWDT");
      while(TRMT == 0);
      TXREG = 'A';
      
      while(TRMT == 0);
      TXREG = 'Z';
   }
}

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: EUSART PIC18F4550
« Responder #1 em: 16 de Setembro de 2011, 23:47 »
Isso compila assim sem erros?
Normalmente os bitfields de cada registo não são acedidos assim dessa maneira, mas PIC não é bem a minha área e nem disseste que compilador usas.
Avr fanboy

Offline beirao

  • Mini Robot
  • *
  • Mensagens: 1.531
Re: EUSART PIC18F4550
« Responder #2 em: 16 de Setembro de 2011, 23:57 »
eh la.. pergunto o mesmo, isso compila? por exemplo, nos registos, tens de meter INTCONbits.GIE em vez de GIE.. mas tambem nao sei que compilador usas.

depois, como tas a receber os dados no pc? no hiperterminal?
"O único lugar onde o sucesso vem antes do trabalho, é no dicionário" - Albert Einstein

Offline jbecg

  • Mini Robot
  • *
  • Mensagens: 26
Re: EUSART PIC18F4550
« Responder #3 em: 17 de Setembro de 2011, 01:04 »
Sim realmente não disse e sim o código compila. Estou a utilizar o hi-tech. A configuração desses bits eu fiz directamente no MPLAB IDE através dos configurations bits.

Os caracteres que recebo não correspondem àqueles que envio, isto é, envio A e Z continuamente e recebo algo que não é uma sequência de  A's e Z's.

Não estou a utilizar o hiperterminal estou a utilizar um pequeno programa que já usei noutras situações o RCOMSerial (está o link para os interessados em utilizar http://www.rogercom.com/)



Offline FET_Destroyer

  • Mini Robot
  • *
  • Mensagens: 213
    • Fet Destroyer
Re: EUSART PIC18F4550
« Responder #4 em: 17 de Setembro de 2011, 14:22 »
Sim realmente não disse e sim o código compila. Estou a utilizar o hi-tech. A configuração desses bits eu fiz directamente no MPLAB IDE através dos configurations bits.

Os caracteres que recebo não correspondem àqueles que envio, isto é, envio A e Z continuamente e recebo algo que não é uma sequência de  A's e Z's.

Não estou a utilizar o hiperterminal estou a utilizar um pequeno programa que já usei noutras situações o RCOMSerial (está o link para os interessados em utilizar http://www.rogercom.com/)

Boas
Se tens tudo correcto e nao estás a descobrir o problema podes sempre fazer isto.
Percorres todos os valores do registo da baudrate de certeza que vais ver os caracteres no terminal.
Tive uma vez esse problema, dava-me uma baudrate do genero 101kbps que nao é generica, tinha la uns erros nas contas, depois corrigi, logo se isso nao recebe certo tens erros nas contas.


   unsigned char contador=0;
   
   while(1)
   {
      asm("CLRWDT");
      while(TRMT == 0);
      TXREG = 'A';
     
      while(TRMT == 0);
      TXREG = 'Z';

      SPBRG = contador++;
      while(TRMT == 0);
      TXREG = contador;

   }

Offline Sérgio_Sena

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 1.649
    • Electronic Gear for Musicians
Re: EUSART PIC18F4550
« Responder #5 em: 17 de Setembro de 2011, 20:50 »
Assim de repente, vejo q falta o seguinte ::

# os FUSES devem ser postos no código e não nos menús do MPLAB

# os pinos não usados devem ser configurados como OUTPUT

# tens as interrupções ligadas, apesar de não estares a usar nenhuma, e não tens a função de interrupção presente. O compilador provavelmente faz-te logo o RETFIE assim que vê uma interrupção.

O facto do compilador não dar erros, é por si estranho.
Experimenta o programa terminal ::  BRAY TERMINAL ou o HERCULES TERMINAL.
Tens acesso a osciloscópio? rapidamente vês, realmente, o q está a sair.

Offline jbecg

  • Mini Robot
  • *
  • Mensagens: 26
Re: EUSART PIC18F4550
« Responder #6 em: 18 de Setembro de 2011, 12:28 »
Agradeço a sugestão dada pelo FET_Destroyer, porque na verdade foi a única maneira de conseguir encontrar o valor correcto de SPBRG que possibilita o envio correcto dos caracteres pretendidos. A minha questão agora é a seguinte de acordo com a formula e as tabela de configuração do baud rate, com SYNC =0, BRG16=0, BRGH=1, o valor de SPBRG seria 129, no entanto e utilizando a dica do FET_Destroyer o valor que me permite transmitir o pretendido em condições é 44, conseguem explicar-me o porque disto?

Agradeço também à analise feita ao meu código pelo asena, sou um mero curioso destas andanças e com pouca experiência, por isso não sei o que são #FUSES, sempre fiz as configurações dos configurations bits directamente no MPLAB e nunca tive problemas. A questão das interrupções são para tratar da recepção de dados (ainda não a tenho implementada, mas é o passo seguinte).
Com a dica do FET_Destroyer foi possível obter uma comunicação através do RCOMSerial.
Relativamente, à situação dos pinos não usados terem a necessidade de ser configurados como OUTPUT já tinha essa ideia embora não o tenha feito.

Obrigado a ambos.

jbecg

Offline Sérgio_Sena

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 1.649
    • Electronic Gear for Musicians
Re: EUSART PIC18F4550
« Responder #7 em: 18 de Setembro de 2011, 14:30 »
o cristal q estás a usar é de qt, 20megas ?

Offline jbecg

  • Mini Robot
  • *
  • Mensagens: 26
Re: EUSART PIC18F4550
« Responder #8 em: 18 de Setembro de 2011, 17:53 »
Sim, 20 MHz.

Offline Sérgio_Sena

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 1.649
    • Electronic Gear for Musicians
Re: EUSART PIC18F4550
« Responder #9 em: 18 de Setembro de 2011, 18:12 »
Com esse valor de SPBRG, parece que tem o oscilador a trabalhar a 8 megas.
Será que com SPBRG a 129, a velocidade não é de ~27.7kbps ou de ~3.8kbps? estou a achar isso muito estranho. Mas como faltam tantas configurações no código, é impossivel o q o compilador está a fazer por trás.

Maravilhoso assembler !

Offline jbecg

  • Mini Robot
  • *
  • Mensagens: 26
Re: EUSART PIC18F4550
« Responder #10 em: 18 de Setembro de 2011, 18:37 »
Tenho um oscilador de 20 MHz e estou a comunicar à taxa de 9600 bits/s com o valor de SPBRG = 44. Relativamente às configurações será que o printscreen dos configuration bits ajudam? (seguem em anexo)


Não estou a conseguir adicionar anexos! O anexo respeita todas as restrições (.rar e 240KB)

Já arranjei solução, os ficheiro encontram-se disponíveis para download neste link: http://www.megaupload.com/?d=3XIC5ZQ3
« Última modificação: 18 de Setembro de 2011, 18:42 por jbecg »

Offline Sérgio_Sena

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 1.649
    • Electronic Gear for Musicians
Re: EUSART PIC18F4550
« Responder #11 em: 18 de Setembro de 2011, 19:27 »
Pelas configurações, tens 48Mhz como Primary Clock.

Mas, o quadradinho que diz "Configuration bits set in code" está activado e não devia, pois não tens configurações feitas no programa.

Offline jbecg

  • Mini Robot
  • *
  • Mensagens: 26
Re: EUSART PIC18F4550
« Responder #12 em: 18 de Setembro de 2011, 19:57 »
Mas mesmo para 48MHz como Primary Clock o valor de SPBRG, para a taxa de transmissão de 9600 bits/s, não seria de 44. Já agora como é que eu posso mudar a frequência de primary clock para 20 MHz, já que é aquela que corresponde à frequência do meu oscilador.

Offline Sérgio_Sena

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 1.649
    • Electronic Gear for Musicians
Re: EUSART PIC18F4550
« Responder #13 em: 18 de Setembro de 2011, 20:57 »
DATASHEET, capítulo do Oscilador, está lá tudo explicado!

Offline jbecg

  • Mini Robot
  • *
  • Mensagens: 26
Re: EUSART PIC18F4550
« Responder #14 em: 18 de Setembro de 2011, 21:28 »
Sei que sim e esta configuração foi feita com base nisso. Para primary clock = 20MHz foi necessário atribuir a CPUDIV (oscillator prostscaler) = 00 e FOSC3:FOSC0 = 0 (Leitura feita através do diagrama de blocos)