Página 1 de 2

Enviando e Recebendo 16 bits pela serial

MensagemEnviado: 11 Abr 2011 19:51
por Gilberto Coutinho Duarte
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
}
}

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

Re: Enviando e Recebendo 16 bits pela serial

MensagemEnviado: 12 Abr 2011 19:44
por andre_luis
Em pseudo-código :

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


+++

MensagemEnviado: 12 Abr 2011 19:52
por Gilberto Coutinho Duarte
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

MensagemEnviado: 13 Abr 2011 14:23
por Andre_Cruz
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

MensagemEnviado: 13 Abr 2011 15:42
por ze
a seguinte pergunta também pode ajudar: que tipo de dado a função getc() espera receber?

Re: Enviando e Recebendo 16 bits pela serial

MensagemEnviado: 13 Abr 2011 19:11
por andre_luis
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

+++

MensagemEnviado: 13 Abr 2011 19:50
por Gilberto Coutinho Duarte
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.

MensagemEnviado: 13 Abr 2011 19:57
por andre_luis
Agora ficou claro...voce quer a solução pronta, e não apenas a orientação.

+++

MensagemEnviado: 13 Abr 2011 20:00
por Gilberto Coutinho Duarte
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!!!


...

MensagemEnviado: 14 Abr 2011 14:12
por ze
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ç

MensagemEnviado: 15 Abr 2011 21:47
por Gilberto Coutinho Duarte
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


.

MensagemEnviado: 16 Abr 2011 00:05
por msamsoniuk
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).

MensagemEnviado: 16 Abr 2011 14:17
por Gilberto Coutinho Duarte
Parece que o CCS não reconhece este comando "scanf". To verificvando aninda.

MensagemEnviado: 16 Abr 2011 14:55
por msamsoniuk
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 ...
}

MensagemEnviado: 01 Mai 2011 23:28
por luisf.rossi
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