Página 1 de 2
Enviando e Recebendo 16 bits pela serial

Enviado:
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

Enviado:
12 Abr 2011 19:44
por andre_luis
Em pseudo-código :
- Código: Selecionar todos
Valor = getc(dado) ;
Valor += ( getc(dado)<<8 ) ;
+++

Enviado:
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

Enviado:
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

Enviado:
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

Enviado:
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
+++

Enviado:
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.

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

Enviado:
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!!!
...

Enviado:
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ç

Enviado:
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.
.

Enviado:
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).

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

Enviado:
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 ...
}

Enviado:
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