interrupção+serial+16f628a

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

interrupção+serial+16f628a

Mensagempor Vitu » 05 Ago 2007 18:05

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??
Vitu
Bit
 
Mensagens: 8
Registrado em: 20 Mar 2007 14:14
Localização: RJ

Mensagempor RobL » 05 Ago 2007 18:19

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.
RobL
Dword
 
Mensagens: 1546
Registrado em: 20 Fev 2007 17:56

Mensagempor Vitu » 06 Ago 2007 09:11

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á...
Vitu
Bit
 
Mensagens: 8
Registrado em: 20 Mar 2007 14:14
Localização: RJ

Mensagempor ze » 06 Ago 2007 12:58

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.
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor Vitu » 06 Ago 2007 13:44

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..
Vitu
Bit
 
Mensagens: 8
Registrado em: 20 Mar 2007 14:14
Localização: RJ

Mensagempor ze » 06 Ago 2007 14:27

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.
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor Junior_C » 06 Ago 2007 17:33

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.
Junior_C
Nibble
 
Mensagens: 72
Registrado em: 16 Nov 2006 14:30

Mensagempor Vitu » 06 Ago 2007 17:38

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??
Vitu
Bit
 
Mensagens: 8
Registrado em: 20 Mar 2007 14:14
Localização: RJ

Mensagempor Vitu » 06 Ago 2007 18:54

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
Vitu
Bit
 
Mensagens: 8
Registrado em: 20 Mar 2007 14:14
Localização: RJ

Mensagempor Junior_C » 06 Ago 2007 19:36

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
Junior_C
Nibble
 
Mensagens: 72
Registrado em: 16 Nov 2006 14:30

Mensagempor Vitu » 06 Ago 2007 20:44

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á.
Vitu
Bit
 
Mensagens: 8
Registrado em: 20 Mar 2007 14:14
Localização: RJ

Mensagempor caduhitec » 06 Ago 2007 21:38

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.
caduhitec
Bit
 
Mensagens: 17
Registrado em: 27 Out 2006 15:39
Localização: Rio de Janeiro - RJ

Mensagempor ze » 08 Ago 2007 09:15

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
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor ze » 08 Ago 2007 09:16

basta LER o byte RCREG
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor Vitu » 10 Ago 2007 09:47

perdoem minha ignorância, mas existe alguma maneira de zerar esse registrador antes do inicio da execução do programa??
Vitu
Bit
 
Mensagens: 8
Registrado em: 20 Mar 2007 14:14
Localização: RJ

Próximo

Voltar para PIC

Quem está online

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

x