Ir ao conteúdo

Posts recomendados

Postado

Pessoal

Bom dia !

Estou trabalhando com o PIC 18F452, e estabeleci uma comunicação serial com o mesmo, preciso encarecidamente de uma ajuda. Fiz a seguinte rotina:

void main()

{

unsigned short int var;

TRISD = 0;

TRISB = 0;

PORTB = 0;

Usart_Init(9600);

lcd_config(&PORTD,1,3,2,7,6,5,4);

lcd_cmd(lcd_clear);

lcd_cmd(lcd_cursor_off);

delay_ms(10);

do

{

if(Usart_Data_Ready()) //Verifica se algum byte, caractere, chegou no buffer serial

{

var = Usart_Read(); // Lê o byte, caractere, do buffer e salva na variável "var"

}

switch(var)

{

case 'A':

lcd_cmd (lcd_clear);

lcd_out (1, 1, "Abrindo");

lcd_out (2, 1, "Portao");

PORTB.F0 = 1;

delay_ms(6000);

lcd_cmd (lcd_clear);

lcd_out (1, 1, "Portao Aberto");

PORTB.F0 = 0;

break;

var = 0;

case 'B':

lcd_cmd (lcd_clear);

lcd_out (1, 1, "Fechando");

lcd_out (2, 1, "Portao");

PORTB.F1 = 1;

delay_ms(6000);

lcd_cmd (lcd_clear);

lcd_out (1, 1, "Portao Fechado");

PORTB.F1 = 0;

break;

var = 0;

case 'C':

lcd_cmd (lcd_clear);

lcd_out (1, 1, "Porta");

lcd_out (2, 1, "Destravada");

PORTB.F2 = 1;

delay_ms(2000);

PORTB.F2 = 0;

break;

var = 0;

case 'D':

lcd_cmd (lcd_clear);

lcd_out (1, 1, "Aciona");

lcd_out (2, 1, "Rele");

PORTB.F3 = 1;

break;

var = 0;

}

}

while(1);

}

Funciona da seguinte forma:

Quando eu envio o caracter "A" ele executa a rotina acima e volta para o programa inicial.

Usart_Data_Ready() - Esse comando fica fazendo uma varredura no buffer do PIC, para verificar se tem ou não bytes lá

Se sim...

Usart_Read() - esse outro comando faz a leitura e associa uma variável a esse byte, por exemplo

var = Usart_Read();

Certo, agora vamos ao caso real. Envio pela serial o caracter "A" o Usart_Data_Ready() identificar, o var = Usart_Read(); associa o "A" á variável var, na sequência ele executa a rotina acima.

Quando a rotina for finalizada, ele volta para o programa inicial, agora que vem o meu problema:

Quando eu envio outro caracter, por exemplo "B" pela serial, dá erro na minha rotina, porque o caracter "A" ainda está no buffer do PIC, ou seja, ele não foi deletado ou excluído, desta forma a minha rotina não vai entender que terá que executar o caracter "B" invés do "A".

Alguém poderia me ajudar me dizendo como eu faço para zerar/limpar o buffer do PIC logo após a execução dessa rotina? Tipo, mando o caracter "A", executa a rotina, e quando ele voltar para o programa inicial, o caracter "A" não estará mai lá no buffer, sendo assim, poderei enviar outro e assim sucessivamente.

Obrigado à todos

Abs

  • 10 anos depois...
Postado

@Fermota @Fermota sou leigo em programação, mas pelo que eu sei o buffer de transmissão/recebimento via serial esvazia quando a mensagem acaba de ser transmitida/recebida. Você pode verificar isso colocando um led em uma porta e executar uma condição para o led ascenda quando o bit 0 (BF) do registrado SSPSTAT estiver cheio e verificar se o erro não está no seu código. Esse bit que eu acabei de falar e o bit que diz se o buffer está cheio ou vazio. Se cheio retorna "1" e se vazio retorna "0"

 

Espero ter ajudado 👍

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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 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...