Por favor?ajuda em C!!!

Programação C em geral

Moderadores: 51, guest2003

Por favor?ajuda em C!!!

Mensagempor ribeiro220 » 18 Jul 2009 14:27

Boa tarde pessoal,meu colega enviou-me esse programa abaixo e tive varias duvidas na analise,pois estou estudando linguagem c pra pic(fabio pereira)à pouco tempo.
Gostaria que me explicassem os itens em vermelho com mais detlhes,se possivel for é claro!!

#include <16f628A.h>
#use delay(clock=20000000)
#fuses HS,NOWDT,NOLVP,NOBROWNOUT,PUT,NOMCLR
#use rs232(BAUD=9600,XMIT=pin_b2, RCV=pin_b1)

#define MAX_BUFFER 20. Foi criado uma matriz de 20 bits,elementos ou byte?[/color]

boolean CHEGOU_FRAME_ZIGBEE = false;

BYTE BufferRX[MAX_BUFFER]; O que significa esta expressão? ,BYTE não vi isso no livro a não ser byte(minusculo) e #BYTE
BYTE IndexBuf=0;
BYTE TamaPacoteZigBee=0;
long int AGUARDA = 250;




//---------------------------------------------------------------------------
//Interrupção de recebimento de caracter pela UART.
//---------------------------------------------------------------------------
#int_rda
void RS232_Recebe_Byte()
{
BufferRX[IndexBuf] = getc(); //Guarda o caracter no buffer.

if( (BufferRX[IndexBuf] == 0x7E) || (IndexBuf >= 22) ) // Pacote ZigBee válido.tambem não entendi
{
IndexBuf = 0;
memset(BufferRX,0x00,MAX_BUFFER); //Limpa Buffer.
}
if( IndexBuf == 2 ) //Posição do byte tamanho dos dados.
{
TamaPacoteZigBee = BufferRX[2]; //7E 00 XX ...
}
if( BufferRX[3] == 0x92 ) //API ID.
{
output_high(pin_b3); //Liga saída do Alarme.
AGUARDA = 250;
set_timer0(1);
}
IndexBuf++; //Indexador do buffer.
}
//}
//---------------------------------------------------------------------------
//PROGRAMA PRINCIPAL
//---------------------------------------------------------------------------
void main(void)
{
setup_timer_0(RTCC_INTERNAL | RTCC_DIV_64); //Pino-3 RA4/TOCKI
set_timer0(1); //OLD 131
enable_interrupts(GLOBAL | int_timer0);
enable_interrupts(int_rda); //Habilita interrupção de recebimento.
delay_ms(3000);
output_high(pin_b5);
delay_ms(3000);

output_low(pin_b3); //Saída do alarme desligada.

while(TRUE) //LOOP, Considera um loop mas não tem nada dentro das chaves após o while(TRUE)
{
}
}

DESDE JÁ AGRADEÇO-LHES
ribeiro220
Bit
 
Mensagens: 42
Registrado em: 04 Mai 2007 21:06

Mensagempor joao » 18 Jul 2009 16:27

Ola Ribeiro,

Provavelmente você irá receber mais ajudas daqui a pouco, mas o que eu sei:

Numero significa as linhas vermelhas em sequencia:

1 - Esse define é apenas para dizer que aonde vc escrever MAX_BUFFER no seu código, você irá substituir por 20. Simples asim. Isso é feito na compilação. Então pense assim: para entender melhor esse define(é apenas um exemplo, não foi testado):
Código: Selecionar todos
#ifdef PIC16F628
    #define MAX_BUFFER 20
#else
   #define MAX_BUFFER 40
#endif

Olha que legal neste exemplo: se vc está compilando para 16F628, vc terá um buffer de 20, senão se for outro qualquer 40. Dai vc nunca vai precisar mudar em todo o seu código isso. Imagina que vc usa esse valor em uns 100, 200 lugares. Imaginou que saco é de mudar isso neste 100,200 lugares? Se vc usar o define em todos esses 100, 200 lugares, vc muda automaticamente eles quando mudar o valor na linha do define. Viu como fica mais simples dai? :)

2 - BYTE BufferRX[MAX_BUFFER]: Vc está criando um array de quantas posições? 20! porque MAX_BUFFER é 20. Logo, podemos escrever isso como: BYTE BufferRX[20]. OK, mas o que é isso? Provavelmente o sistema usa um define(olha ele de volta aqui!) dizendo que BYTE é 8BITS, provavelmente um UINT8(unsigned int de 8 bits). isso quer dizer que em bits, temos uma matrix de 8x20. Então, como vc acessa a linha 1 desta matriz? fazemos Buffer[0] (Lembre que a matriz começa em 0 em C!) . Um exemplo, quero jogar o valor 37 na linha 7 da matriz. O que eu faço? BufferRX[6] = 37;

3 - Esse eu não entendo o que é ZigBee, mas eu achei um erro aqui! Ou pelo menos acho que é! Qual é o tamanho da sua matriz? 20 certo? e qual é o valor máximo para o IndexBuf? 22! Veja só: na primeira parte do if, pelo o que eu entendi, pode-se ter 22 no IndexBuf. O que aconteceria? BufferRX[22]. Mas vc tem apenas até 19!(lembre-se que começa em zero a matriz.) Isso faria o sistema crashear! Melhor checar mais esse if...

4 - O while é infinito e nada acontece mesmo. Isso é para não matar o programa. Vc sabe o que acontece quando atingimos o fim de uma funçào main? O programa termina. :( Principalmente em microcontroladores, o programa não pode acabar! Então, coloca-se o while para manter ele vivo durante toda a eternidade... Tá, vc me pergunta, mas e o que ele vai fazer já que não tem nada dentro do main? Ai é que vem uma coisa chamada interrupção. Acontece que vc no começo do main setou o timer, e quando o timer termina, ele chama uma interrupção, e qual interrupçào? A funçào RS232_Recebe_Byte() que vc criou. Nào sei exatamente como funciona isso porque não trabalho com pic, mas veja que vc tem #int_rda antes da funçào certo? Eu acho que isso significa que essa função vai ser registrada para esse carinha(#int_rda). E dai vc tem a linha enable_interrupts(int_rda); que diz que vc quer chamar a funçào registrada para quem? para o nosso amigo #int_rda. Logo na verdade essa linha diz que vai chamar a funcão RS232_Recebe_Byte().

Provavelmente alguém que ajuda com PIC vai te ajudar mais, mas acho que com isso vc já vai ter uma boa idéia sobre o assunto.

[]'s
Como já diria um grande amigo: Só sei que nada sei!!!
Avatar do usuário
joao
Byte
 
Mensagens: 463
Registrado em: 17 Out 2006 08:21

Mensagempor Djalma Toledo Rodrigues » 18 Jul 2009 17:12

joao escreveu:... Principalmente em microcontroladores, o programa não pode acabar! Então, coloca-se o while para manter ele vivo durante toda a eternidade...
rsrsss

Em Asm:

Loop: Goto Loop

End
.
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor ribeiro220 » 18 Jul 2009 18:37

Muito boa suas explicações João,o zigbee na verade é um protocolo,veja no site do rogercon.com.br que ele tem uns circuitos com anten que trabalha com esses protocolos.
valeu djalma
ribeiro220
Bit
 
Mensagens: 42
Registrado em: 04 Mai 2007 21:06


Voltar para Visual C++/C/C++/C#

Quem está online

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

x