rda x while

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

rda x while

Mensagempor mugangalinux » 07 Set 2010 22:17

pessoal...ja utilizei a interrupcao int_rda no exemplo abaixo e funcionou beleza.
Gostaria de entender poque nao funciona quando coloco a avaliacao de chegada de caracteres dentro do laco while.

obrigado a todos

Muganga


#include <16F628A.h>
#include <stdio.h>
#use delay(clock=4000000)
#fuses INTRC_IO, NOLVP, NOWDT, PUT, BROWNOUT
#use rs232(baud=9600, xmit=PIN_B2, rcv=PIN_B1, stream = com_pc)
char receive[4] = {""};


main() {
enable_interrupts(GLOBAL);
enable_interrupts(INT_RDA);
delay_ms(1000);
output_low (PIN_B6);

while(true) {

receive[0]=fgetc(com_pc);
receive[1]=fgetc(com_pc);
receive[2]=fgetc(com_pc);


if ((receive[0] == 1) && (receive[1] == 2) && (receive[2] == 3))
{
output_high(PIN_B6);
}



}
}
mugangalinux
Nibble
 
Mensagens: 62
Registrado em: 19 Abr 2007 15:59

Mensagempor leoabubauru » 08 Set 2010 19:48

Você tem certeza que quando se usa interrupão dá pra ler também com "fgetc"?
Tento, tento e tento...
Me arrebento!
Também bato!
Ô negocim bunitim essa tal eletrônica de barco!
leoabubauru
Byte
 
Mensagens: 227
Registrado em: 21 Nov 2006 19:08
Localização: São Paulo

rda

Mensagempor mugangalinux » 08 Set 2010 20:58

desabilitei a interrupcao int_rda e coloquei ' ' entre os numero 1 2 e 3 e funcionou.

outra duvida minha é:

preciso de duas seriais no pic...uma ja sao os pinos b1 e b2
#use rs232(baud=9600, xmit=PIN_B2, rcv=PIN_B1, stream = com_pc)


se eu usar
#use rs232(baud=9600, xmit=PIN_B2, rcv=PIN_B1, stream = com_pc)
#use rs232(baud=9600, xmit=PIN_B5, rcv=PIN_B4, stream = com_pic)


tem como eu usar fgetc (com_pc) e outro fgetc (com_pic) dentro da int_rda?

ou somente posso usar fgetc (com_pc) e outro fgetc (com_pic) dentro do laco while?


muito obrigado




main() {
enable_interrupts(GLOBAL);
delay_ms(1000);
output_low (PIN_B6);

while(true) {

recebe[0]=fgetc(com_pc);
recebe[1]=fgetc(com_pc);
recebe[2]=fgetc(com_pc);


if ((recebe[0] == '1') && (recebe[1] == '2') && (recebe[2] == '3'))

{
output_high(PIN_B6);
}



}
}
mugangalinux
Nibble
 
Mensagens: 62
Registrado em: 19 Abr 2007 15:59

Mensagempor leoabubauru » 09 Set 2010 13:54

mugangalinux

Você está ciente que seu software ficará parado em cada "fgetc" esperando algo da serial? Já verificou se não seria melhor usar "kbhit"?

Eu, particularmente, prefiro usar a interrupção do micro e preencher um buffer em RAM para depois tratar a mensagem. Isto pois os uCs pequenos dificilmente têm mais de 3 bytes de buffer em hardware (16F628A, por exemplo, tem só dois bytes). Fazer poling é arriscado pois o hardware pode travar se mais de 2 bytes chegar e você não os tratar. Considere usar a interrupção...

Quanto a usar mais de uma serial, o 16F628A só possui 1 hardware de serial. SE vocÊ colocar mais um em software ele será emulado em software. E se sua aplicação for grandinha não haverá memória de programa suficiente...[/b]
Tento, tento e tento...
Me arrebento!
Também bato!
Ô negocim bunitim essa tal eletrônica de barco!
leoabubauru
Byte
 
Mensagens: 227
Registrado em: 21 Nov 2006 19:08
Localização: São Paulo


Voltar para PIC

Quem está online

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

x