Enviando e Recebendo 16 bits pela serial

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Enviando e Recebendo 16 bits pela serial

Mensagempor Gilberto Coutinho Duarte » 11 Abr 2011 19:51

Como vão amigos.

O codigo abaixo serve para enviar o valor de uma variavel de 16bits pela porta serial RS232. OK, ate aqui funciona realmente.

Como seria o codigo para receber esse valor "32791" no outro PIC ???

*********************************************************



#include <16f877A.h>
#device adc=8

#FUSES NOWDT //No Watch Dog Timer
#FUSES XT //Crystal osc <= 4mhz
#FUSES NOPUT //No Power Up Timer
#FUSES PROTECT //Code protected from reads
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection

#use delay(clock=4000000)
#use rs232(baud=19200,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

int16 numero=32791; // Variavel de 16 bits

void main(void)
{

setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);

while(true)
{
printf("%lu\r\n",numero); // Envia o valor da variavel "numero" de 16 bits pela porta serial.
delay_ms(1000); //Aguarda 1 segundo
}
}

*********************************************************
Editado pela última vez por Gilberto Coutinho Duarte em 12 Abr 2011 20:11, em um total de 1 vez.
Gilberto Coutinho Duarte
Bit
 
Mensagens: 6
Registrado em: 08 Abr 2011 19:12

Re: Enviando e Recebendo 16 bits pela serial

Mensagempor andre_luis » 12 Abr 2011 19:44

Em pseudo-código :

Código: Selecionar todos
Valor  = getc(dado) ;
Valor += ( getc(dado)<<8 ) ;


+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor Gilberto Coutinho Duarte » 12 Abr 2011 19:52

Claro que eu não saberia o motivo, mas o codigo acima não deu certo não. Sera que você poderia me mostrar um exemplo mais completo.

Obrigado
Gilberto Coutinho Duarte
Bit
 
Mensagens: 6
Registrado em: 08 Abr 2011 19:12

Mensagempor Andre_Cruz » 13 Abr 2011 14:23

Gilberto,

O código não deu certo em que sentido ??
Não compilou ? Ou não mostrou o resultado esperado ??

Abraço

André Cruz
Andre_Cruz
Word
 
Mensagens: 559
Registrado em: 03 Jan 2009 14:06

Mensagempor ze » 13 Abr 2011 15:42

a seguinte pergunta também pode ajudar: que tipo de dado a função getc() espera receber?
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Re: Enviando e Recebendo 16 bits pela serial

Mensagempor andre_luis » 13 Abr 2011 19:11

andre_teprom escreveu:Em pseudo-código :

Código: Selecionar todos
Valor  = getc(dado) ;
Valor += ( getc(dado)<<8) ;


+++


Olá Gilberto,

Como tinha dito, isso tinha sido escito em pseudo-código, apenas para apresentar o algorítmo num formato de linguagem de programação, ao invéz de fluxograma. A propósito, o trecho em sí já é o exemplo completo.

Certamente pode ter algum erro de sintaxe.
A idéia é deslocar um byte para a esquerda, e encaixar o seguinte no 'buraco'.

Lembrar de declarar a variável Valor acima como 16 bits

+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor Gilberto Coutinho Duarte » 13 Abr 2011 19:50

Quero muito a AJUDA de vocês que dominam a programação em C.
Eu botei o código acima para simplificar a questão!!!
"O CODIGO ACIMA SERVE PARA ENVIAR O VALOR!!!"
"AGORA QUERO RECEBER EM OUTRO PIC"

A minha duvida é apenas receber o valor que chaga pela serial e copia la para uma outra variável.

O exemplo abaixo não me bastaria, pois minha noção em C não me permite acompanhar a idéia do colega. Ainda estou muito VERDE em C.

Valor = getc(dado) ;
Valor += ( getc(dado)<<8) ;


Para mim, so um exemplo mais completo.
Gilberto Coutinho Duarte
Bit
 
Mensagens: 6
Registrado em: 08 Abr 2011 19:12

Mensagempor andre_luis » 13 Abr 2011 19:57

Agora ficou claro...voce quer a solução pronta, e não apenas a orientação.

+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor Gilberto Coutinho Duarte » 13 Abr 2011 20:00

andre_teprom escreveu:Agora ficou claro...voce quer a solução pronta, e não apenas a orientação.

+++



RSRRSRS, Q CHATO, detesto o PEIXE. Mas ainda não seria capaz de pescar sozinho!!! O forum esta cheio de fraguimentos sobre este assunto mas nada esta claro o bastante para leigos como eu!!!


...
Editado pela última vez por Gilberto Coutinho Duarte em 15 Abr 2011 21:53, em um total de 1 vez.
Gilberto Coutinho Duarte
Bit
 
Mensagens: 6
Registrado em: 08 Abr 2011 19:12

Mensagempor ze » 14 Abr 2011 14:12

já que está usando prinf para escrever, que tal usar scanf para ler? estude sua sintaxe. infelizmente não uso libs desta estirpe para te orientar melhor.
abç
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor Gilberto Coutinho Duarte » 15 Abr 2011 21:47

NÃO SEI QUAL SERIA A SOLUÇÃO PARA RECEBER ESTA VARIAVEL DE 16 BITS, MAS JÁ TENHO A CERTEZA QUE É BEM DIFÍCIL!!!! DEVE TER UNS 12 TÓPICOS SOBRE ESTE MESMO ASSUNTO!!!
EU TO PESQUISANDO, E VEJO QUE EU LEIGO QUE TEREI QUE BOTAR ESTA SOLUÇÃO AQUI!!!

SE ALGUÉM PUDER AJUDAR, NOS DO FÓRUM FICAREMOS AGRADECIDOS.

OBS: Se todos fizerem como o MACAQUINHO, ninguém aqui vai se AJUDAR!!! Um Beijo para o macaquinho. :P


.
Gilberto Coutinho Duarte
Bit
 
Mensagens: 6
Registrado em: 08 Abr 2011 19:12

Mensagempor msamsoniuk » 16 Abr 2011 00:05

eu voto na solucao do lellis, pois parece que ele foi o unico que leu o codigo e percebeu a simetria entre printf e scanf (infelizmente o exemplo do outro colega com getc nao le corretamente um dado transmitido em ascii via printf). o codigo inteiro eh exatamente o mesmo, a unica diferenca eh que o mcu que envia usa printf("%lu\r\n",numero) e o mcu que recebe usa scanf("%lu",&numero).
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor Gilberto Coutinho Duarte » 16 Abr 2011 14:17

Parece que o CCS não reconhece este comando "scanf". To verificvando aninda.
Gilberto Coutinho Duarte
Bit
 
Mensagens: 6
Registrado em: 08 Abr 2011 19:12

Mensagempor msamsoniuk » 16 Abr 2011 14:55

Gilberto Coutinho Duarte escreveu:Parece que o CCS não reconhece este comando "scanf". To verificvando aninda.


use um compilador melhor! :)

se nao for possivel, tente trocar scanf() por gets(), ele le uma linha em um buffer e depois vc pode usar atoi(). de qq forma, se nao tiver um gets, para fazer eh simples, inclusive com melhorias para evitar buffer overflow:

Código: Selecionar todos
int gets(char *buffer, int size)
{
    while (--size)
        if ((*buffer++ = getchar()) == '\n')
            break;
    *buffer = 0;
}

int main()
{
  char buffer[32];
  int valor;
  ... mimimi ...

  gets(buffer,32);
  valor = atoi(buffer);
  ... mimimi ...
}
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor luisf.rossi » 01 Mai 2011 23:28

Não deu certo por que você tem que esperar o dado chegar.. não adianta ler o buffer sem ter um dado la.. (a não ser que a função do CCS ja cuide disso)

Explicando o codigo passado:

Esse codigo considera que primeiro são passados os 8 bits menos significativos e depois os 8 mais significativos.

Valor = getc(dado) ; //Aqui você grava os primeiros bits
Valor += ( getc(dado)<<8) ; // Aqui você pega os 8 bits mais significativos, shifta para a esqueda 8 vezes e soma com o primeiro valor.

Porém como eu falei anteriormente essas duas instruções não devem ser utilizadas em seguida.. ignorando o uso de interrupçoes (que seria o melhor a se fazer) e considerando genericamente uma função DataReady() que retorna 1 se chegou dado na UART;

while(!DataReady());
Valor = getc(dado)
while(!DataReady());
Valor += ( getc(dado)<<8) ;

Essa função DataReady(), deve ler o registrador da UART que diz que o Buffer ta cheio...

Abs
luisf.rossi
Byte
 
Mensagens: 109
Registrado em: 28 Nov 2010 12:48
Localização: São Paulo, SP

Próximo

Voltar para PIC

Quem está online

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

x