Página 1 de 2
Leitura de um botão antes do main (rotina principal)

Enviado:
12 Mar 2009 20:11
por fabio_pic
Senhores,
Preciso que o PIC faça uma configuração de USART através de um botão antes que o microcontrolador entre na rotina de main.
Estou tentando usar o #IF mas tá dando erro no compilador (CCS). Parece que não dá pra fazer.... Alguém tem alguma idéia de como se faz isso?
#include <16F877A>
#fuses hs, nolvp, etc...
#define BOTAO PIN_C3
#if (input(BOTAO))
{
use rs232 (baud=[b]9600[/b],xmit=pin_c6,rcv=pin_c7)
}
#else
{
use rs232 (baud=[b]115200[/b],xmit=pin_c6,rcv=pin_c7)
}
#endif
void main (void)
{
código qualquer;
}
Abraços,
Fábio.

Enviado:
12 Mar 2009 23:38
por tcpipchip
Nao funciona pq sao diretivas do compilador.
Faz o seguinte, mexe direto nos registradores para configuracao de BAUD...
TCPIPCHIP

Enviado:
13 Mar 2009 09:24
por Jorge_Francisco
Não lembro mais do CCS, mas deve ter uma função parecida com isso setBaudRate.
Vlw

Enviado:
13 Mar 2009 10:39
por msamsoniuk
nao tem como funcionar, pq input(BOTAO) eh um resultado obtido em tempo de execucao, mas o #if roda em tempo de compilacao (eh apenas uma macro de pre-processador C).
como o tcpipchip disse, o maximo que vc pode fazer eh iniciar os parametros estaticamente, mas tambem nao vai servir pq vc quer uma inicializacao condicional, entao nao tem jeito, vc tem que fazer um if() normal dentro de main.
tem algum motivo especial para nao ser em main() ?

Enviado:
13 Mar 2009 13:11
por tcpipchip

Enviado:
13 Mar 2009 15:22
por Andre_Cruz
fabio_pic
Programo em C mas com o hitech, não sei se no CCS é a mesma coisa, mas vou tentar explicar.
Você quer alterar a configuração da USART se caso um botão, for pressionado na inicialização do PIC.
Primeiro para que você possa usar o IF, comando de seleção você deve configurar o pino em que esta o botão, como entrada, senão o if será sempre falso.
Antes do main, acredito que seje meio dificil, você pode fazer assim que entrar no main, configurar o pino do botão como entrada, e logo em seguida fazer um if para selecionar entre as duas configuraçaões da USART.
Abraço
Espero ter ajudado a você ter uma idéia de como solucionar seu problema.
André

Enviado:
13 Mar 2009 15:52
por Jorge_Francisco
Pois é, só quando entrar no main mesmo, fazendo um teste do botão e logo em seguida usando uma função para setar o Baud, ou indo direto nos registros. Só vejo um problema nisto, a pessoa terá que estar pressionando o botão quando o equipamento for ligado. Não seria melhor criar uma rotina, dentro de um loop?E dentro deste loop também estaria o resto do código?
Vlw

Enviado:
13 Mar 2009 16:05
por Andre_Cruz
Jorge_Francisco
Pelo que entendi, era isso que o fabio_pic precisa.
Logo na inicialização do PIC, ler o estado desse botão e alterar a configuração da USART.
Se ele precisar de testar sempre, ele pode colocar esse if dentro de uma interrupção, ou dentro de um loop, como você disse.
Se ele nos dar mais detalhes do projeto dele, e algoritmo fica mais facil.
Abraço
André

Enviado:
13 Mar 2009 22:56
por fabio_pic
Senhores,
Primeiramente gostaria de agradecer as respostas.
O problema é justamente esse. Se a "setagem" do baud rate é feito nas diretrizes (em tempo de compilação), ou seja, antes da inicialização do PIC, como eu posso alterar depois?
Pensei em fazer essa manobra pois ainda não consegui entender o processo de alteração do baud de alguns dispositivos por comando. Explico.
Exemplo: Tenho um dispositivo que tem a taxa padrão é 9600 mas o sistema deve trabalhar a 115200. Este dispositivo tem comando para alterar a taxa de 9600 para 115200 (ou outras taxas). Até aí tudo bem.
Então eu tenho um sistema que está a 115200 e um dispositivo a 9600.
A pergunta é. Como enviar um comando para o dispositivo mudar para 115200 se o sistema está e 9600. A única resposta que encontrei é: alterar a taxa do sistema (PIC) de forma temporária. Entenderam?
Realmente acho isso bem estranho.
Abraços a todos,
Fábio.

Enviado:
14 Mar 2009 14:17
por buiz
Não sei se entendi bem a aplicação que vc quer, mas no CCS seria +/- assim:
- Código: Selecionar todos
#USE rs232(BAUD=9600, PARITY=N, XMIT=PIN_C6, RCV=PIN_C7, BITS=8, STREAM=COM1)
#USE rs232(BAUD=115200, PARITY=N, XMIT=PIN_C6, RCV=PIN_C7, BITS=8, STREAM=COM2)
main()
{
if (input(BOTAO)) fputc(VAR,com1); // envia pela com1 a 9600
if(!input(BOTAO)) fputc(VAR,com2); // envia pela com2 a 115200
}
Att.
Buiz.

Enviado:
14 Mar 2009 16:10
por fabio_pic
buiz,
Preciso que o PIC fale com dois dispositivos a 115200 mas um deles tem a taxa padrão em 9600. Este de 9600 posso mudar para 115200 através de comando AT mas para isso o PIC deve estar a 9600 primeiro para que depois do camando dado mude para 115200.
A sua dica resolverá meus problemas. Irei testar o mais rápido possível.
Obrigado,
Fábio.

Enviado:
15 Mar 2009 02:24
por Renie
Olá Fábio,
Para conectar em uma linha sem padrão de Baud, apesar de não ser
muito complicado, todos os dispositivos precisam estar preparados para
tal atuação!
O método usado desde a pré-historia dos modems, era ir testando a
conexão desde a taxa mínima até a máxima!
[]'s
Renie

Enviado:
15 Mar 2009 03:03
por fabio_pic
Pois é Renie,
Isso é realmente estranho. Só que estou receoso em fazer o teste de baud pois acho que com isso travei um módulo GPRS pois ele tem o baud inicial padrão em 115200 e tentei um comunicação a 9600.
Ainda espero achar a resposta para a questão da troca de baud por comando AT.
Obrigado,
Fábio.

Enviado:
15 Mar 2009 03:30
por fabio_pic
buiz,
Inseri as linhas que você sugeriu no código e, apesar de não apresentar erros de compilação, o PIC transmitiu a 115200 independente do estado do botão.

Enviado:
15 Mar 2009 03:39
por Renie
Olá Fábio,
Se estiver usando um botão mesmo, a chance de erro é talvez uns 80%!!!!!!
Se fosse uma chave definida antes de ligar o circuito era outra coisa
( mais parecido com seu post inicial ).
Ler botão, precisa de rotinas específicas para debounce!
[]'s
Renie