Página 1 de 2

interrupção+serial+16f628a

MensagemEnviado: 05 Ago 2007 18:05
por Vitu
Sou novo por aqui e gostaria de uma ajuda com projeto que estou desenvolvendo na faculdade envolvendo comunicação serial entre um pic 16f628a e um celular siemens mc60.
O problema é o seguinte: estou usando a USART do pic e a interrupção int RDA para ler as strings que o celular manda e de vez em quando quando reseto o pic manualmente o programa trava na interrupção (como se estivesse chegando dado sem parar) e não faz ais nada. Testei conectando o pc a USART e funciona blz, mas quando conecto o celular as vezes dá esse problema. Alguém conhece algum tipo de interupção ai eficiente para receber strins pela USART com o 628a??

MensagemEnviado: 05 Ago 2007 18:19
por RobL
As vezes somente?
Se funcionou e as vezes trava, ele pode estar perdendo dados e não enche o buffer. Seu PIC ou seu celular estão falando com velocidades com erro acima de 3%.
Seu PIC está usando cristal ou oscilador interno?
Se for interno, precisa ser calibrado. Não sei se no 628A dá para calibrar o oscall.
Use cristal.

MensagemEnviado: 06 Ago 2007 09:11
por Vitu
Tanto o pic quanto o celular estão configurados para falar em 9600 baunds e estou usando oscilador externo de 4MHz.
O problema ocorre quando eu energizo o sistema, tem horas que funciona na boa, mas as vezes ele nem executa o programa, fica travado na interrupção, eu fiz o teste com pc e isso acontece quando eu ligo o sistema com uma tecla pressionada no teclado.
Preciso refinar essa rotina de interrupção, talvez temporizar, sei lá...

MensagemEnviado: 06 Ago 2007 12:58
por ze
seu programa pode estar ficando preso dentro da int serial. experimente algo como timeout dentro da int. p.ex. se não chegar nenhum dado por alguns ms, sai da int.
abraço.

MensagemEnviado: 06 Ago 2007 13:44
por Vitu
Era exatamene o q eu estava pensando, só que eu já tive esse problema e o sintoma é diferente, vou expicar: como eu uso "gets" para ler a serial, se a eu não tiver um <CR> (enter) no final da string recebida, o programa fica preso na interrupção e não faz mais nada, isso dá pra resolver com o time_out, mas o problema agora é outro, o q parece é que tá chegando dado o tempo todo na serial, na verdade ele não fica preso dentro da interrupção ele fica é chamando a int a todo momento e é claro desse jeito o prog não faz nada..

MensagemEnviado: 06 Ago 2007 14:27
por ze
não estás esquecendo de zerar o flag de int serial RCIF? ele não zera sozinho. precisa ser por sw. com ele em 0 o uC pensa que tem int.

MensagemEnviado: 06 Ago 2007 17:33
por Junior_C
Já tive este tipo de problema, o celular é 3V e o pic 5v ai o pic as vezes não entende os dados recebidos, tem que converte de 3v para 5v ai funciona.

MensagemEnviado: 06 Ago 2007 17:38
por Vitu
hummmm.... boa...pode ser isso... olha como to fazendo a interrupção:

#int_rda
void rda_isr() {

if(kbhit()){
gets(str1);
}

Como faço pra zerar esse flag??

MensagemEnviado: 06 Ago 2007 18:54
por Vitu
Junior C, eu já to usando um buffer entre o celular e o pic por causa dessa diferença de tensão, o problema é software mesmo

MensagemEnviado: 06 Ago 2007 19:36
por Junior_C
Tem outro detalhe que esqueci de te falar, não entendo bem de C só o básico do básico e não sei tratar interrupções em C para poder te ajudar no soft, mas tem que limpar ( 0 ) o pino 7 do celular um tempo antes de enviar o comando, senão as vezes ele não responde aos comandos, principalmente no modelo A52 e C72

MensagemEnviado: 06 Ago 2007 20:44
por Vitu
Opa, essa informação é nova!! Pino 7?? No meu celular o pino 7 é DCD (clockline for accessory) tem alguma coisa a ver?? E como assim limpar?? vc deixa ele direto em zero ou só manda um pulso baixo na hora de mandar os comandos??
Mas apesar de não saber disso antes, não estou tendo problemas no envio e sim na recepção dos comandos, ou seja, o cel sempre executa o q eu mando eu é que as vezes não enxergo a resposta.

Mas valeu pela dica, vou testar aqui e ver no q dá.

MensagemEnviado: 06 Ago 2007 21:38
por caduhitec
Fala irmão!!! O PIC só tem um buffer de 2 caracteres, se ele recebe mais de 2 caracteres e não tem tempo suficiente para tratá-los, a serial dele trava mesmo.

MensagemEnviado: 08 Ago 2007 09:15
por ze
bem lembrado caduhitec.
para zerar RCIF segundo o data sheet basta o byte RCREG. se ler 2 vezes vai garantir a liberação dos "imensos" 2 bytes do buffer.
Veja a página 81 (12.2.2 USART ASYNCHRONOUS RECEIVER) do data sheet 16F627/628/648.
abraço

MensagemEnviado: 08 Ago 2007 09:16
por ze
basta LER o byte RCREG

MensagemEnviado: 10 Ago 2007 09:47
por Vitu
perdoem minha ignorância, mas existe alguma maneira de zerar esse registrador antes do inicio da execução do programa??