Não consigo comandar via Usart (mikroC)

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Não consigo comandar via Usart (mikroC)

Mensagempor alexhnunes » 13 Mar 2008 16:02

Boa tarde, pessoal. É o seguinte: estou desenvolvendo um sinalizador que funciona da seguinte maneira: aperto um botão (são vários), liga o led correspondente e manda um sinal via serial RS232 para um painel sinalizador, acendendo outro led. Para apagar os leds correspondentes nos painéis (não todos de uma vez, mas somente o que eu necessito), o microcontrolador recebe um sinal de outro microcontrolador ou pelo PC. Para acender e emitir o sinal serial, o sistema funciona sem problemas, a questão está no recebimento do sinal, já fiz de tudo no código e não consegui fazê-lo funcionar a contento. Estou utilizando o compilador MikroC e os Pic's são 16F877A e serial MAX232. Uma parte do código segue abaixo:

/*************************DEFINIÇÃO DAS VÁRIÁVEIS******************************/
short bt01,bt02,bt03,bt04,...;

unsigned short x, i, rc;
//int i;
//char rec[6];
short rec[5];

/**************************DEFINIÇÃO DE ENTRADAS*******************************/
#define LB1 PORTC.F0
#define LB2 PORTC.F1
#define LB3 PORTC.F2

// Tratamento da Serial

void trata_serial()
{
//delay_ms(10);
//Usart_Write('t');
if ((rec[0]=='D')&&(rec[1]=='0')&&(rec[2]=='1')) bt01=0;
if ((rec[0]=='D')&&(rec[1]=='0')&&(rec[2]=='2')) bt02=0;
if ((rec[0]=='D')&&(rec[1]=='0')&&(rec[2]=='3')) bt03=0;
if ((rec[0]=='D')&&(rec[1]=='0')&&(rec[2]=='4')) bt04=0;
...
}

/*****************************BLOCO PRINCIPAL**********************************/
void main()
{

/*************************INICIALIZAÇÃO DOS PORT'S*****************************/
TRISB=0X88; PORTB=0X88;

TRISC=0X87; PORTC=0X00;

TRISD=0X88; PORTD=0X77;

ADCON1 = 0X0F;

USART_init(9600);

/******************************************************************************/
bt01=0;bt02=0;bt03=0;bt04=0;...

for (i=0;i<=4;i++) rec[i] = '\0';

i=0;

/****************TRATAMENTO DOS BOTÕES E TRANSMISSÃO DE COMANDO****************/
while(1){

PORTD=0XFE; //BOTAO 01
PORTB=0X88;
delay_ms(1);
if ((LB1)||(bt01==1)){
PORTB=0X88;
PORTD=0XEF;
delay_ms(1);
if (bt01==0){
USART_Write ('L');
USART_Write ('0');
USART_Write ('1');
while(LB1) {}
}
bt01=1;

}...

if (Usart_Data_Ready()) {
rec[i] = Usart_Read();
//rec[i] = rc;
i++;
if (rec[i-1]==0x0D)
{
trata_serial();
for (i=0;i<=4;i++) rec[i] = '\0';
i=0;
}
}
}
}
/***********************************fim****************************************/

Alguém estaria disposto a me dar uma luz? Detalhe: simulando pelo Proteus, o código está correto, mas no protoboard só funciona para ligar os leds e enviar o sinal...

Agradeço
alexhnunes
Nibble
 
Mensagens: 59
Registrado em: 28 Mai 2007 10:04
Localização: Campinas - SP

Mensagempor Sergio38br » 14 Mar 2008 08:25

bom dia, nesta linha vc colocou o pino de RX a zero deixe em um

Código: Selecionar todos

 TRISC=0X87; PORTC=0X00;



.....


Código: Selecionar todos

 TRISC=0X87; PORTC=0X80;



Sergio
Avatar do usuário
Sergio38br
Word
 
Mensagens: 759
Registrado em: 22 Nov 2007 13:39
Localização: São Paulo - SP

Mensagempor alexhnunes » 14 Mar 2008 12:28

Amigo Sérgio, obrigado pela sugestão, porém não houve alteração. Continua com o mesmo problema...
O acendimento continua normal, porém ao receber o comando da serial, ora apaga somente o primeiro led independente do comando, e quando é dado outro comando em seguida, apaga-se o segundo e terceiro led's. Meu problema se resume no recebimento do comando e na ação de apagar o led correspondente ao comando...
alexhnunes
Nibble
 
Mensagens: 59
Registrado em: 28 Mai 2007 10:04
Localização: Campinas - SP

Mensagempor LeandroPIC » 14 Mar 2008 12:42

o MICROC gera um arquivo em asm do que vc compila de uma olhada onde vc configura e trata a serial, tem compiladores que fasen coisas que vc não manda.
Avatar do usuário
LeandroPIC
Byte
 
Mensagens: 163
Registrado em: 06 Jul 2007 12:19

Mensagempor Sergio38br » 14 Mar 2008 14:01

ok, então vc esta recebendo, pensei que naum o estivesse. ok,mais uma sugestão compara tua entrada da serial com o CR(0x0d) antes de incrementar o variavel, se for true, desliga a Irq da serial , trata a informação, limpa o buffer da serial (limpando o flag de interrupção) e ativa a interrupção da serial novamente.

Sergio
Avatar do usuário
Sergio38br
Word
 
Mensagens: 759
Registrado em: 22 Nov 2007 13:39
Localização: São Paulo - SP

Mensagempor alexhnunes » 14 Mar 2008 16:08

Sim, eu recebo, porém ele não está aceitando o comando corretamente. No início parece que o contador (i) ou não está zerando ou não está contando... De repente, ele começa a apagar os led's a cada letra digitada, não espera eu digitar o comando e enviar...

Como eu poderia fazer esse procedimento que vc citou? Eu não manjo ainda de comunicação serial...
alexhnunes
Nibble
 
Mensagens: 59
Registrado em: 28 Mai 2007 10:04
Localização: Campinas - SP

Mensagempor Sergio38br » 15 Mar 2008 11:26

bom dia, antes de tudo podia exemplificar a string de comando com todos os dados que você envia, apenas um exemplo.

Sergio
Avatar do usuário
Sergio38br
Word
 
Mensagens: 759
Registrado em: 22 Nov 2007 13:39
Localização: São Paulo - SP

Mensagempor alexhnunes » 17 Mar 2008 08:52

Sergio38br escreveu:bom dia, antes de tudo podia exemplificar a string de comando com todos os dados que você envia, apenas um exemplo.

Sergio

Pois então, Sérgio, o programa está descrito no primeiro post...
Para acender os leds, ao apertar o botão ele envia "Lxx" (xx corresponde ao número do led, são 22), mas somente um dado de cada vez. Já o comando para apagar, que ele vai receber de outro local, portanto somente via serial, é "Dxx". Em "trata_serial" o programa faz a diferenciação. E no final do programa estão as linhas de comando para o recebimento do sinal.
alexhnunes
Nibble
 
Mensagens: 59
Registrado em: 28 Mai 2007 10:04
Localização: Campinas - SP

Mensagempor Sergio38br » 17 Mar 2008 11:01

bom dia,



Código: Selecionar todos
/*************************DEFINIÇÃO DAS VÁRIÁVEIS******************************/
short bt01,bt02,bt03,bt04,...;

unsigned short x, i, rc;
//int i;
//char rec[6];
short rec[5];
unsigned char a;
unsigned char b;
unsigned char c;

/**************************DEFINIÇÃO DE ENTRADAS*******************************/
#define LB1 PORTC.F0
#define LB2 PORTC.F1
#define LB3 PORTC.F2

// Tratamento da Serial

//void trata_serial()
//{
//delay_ms(10);
//Usart_Write('t');
//if ((rec[0]=='D')&&(rec[1]=='0')&&(rec[2]=='1')) bt01=0;
//if ((rec[0]=='D')&&(rec[1]=='0')&&(rec[2]=='2')) bt02=0;
//if ((rec[0]=='D')&&(rec[1]=='0')&&(rec[2]=='3')) bt03=0;
//if ((rec[0]=='D')&&(rec[1]=='0')&&(rec[2]=='4')) bt04=0;
//...
//}

//**************************************************
//Nova trata_serial

// Tratamento da Serial

void trata_serial()
{
b = 0;
c = ((rec[1] - 48) << 4)||(rec[2] - 48));
if ((rec[0]=='D') {
       b = 0;
       switch (c){
       case 01 : bt01 = b;
       case 02 : bt02 = b;
       ......
      }
      }


/*****************************BLOCO PRINCIPAL**********************************/
void main()
{

/*************************INICIALIZAÇÃO DOS PORT'S*****************************/
TRISB=0X88; PORTB=0X88;

TRISC=0X87; PORTC=0X00;

TRISD=0X88; PORTD=0X77;

ADCON1 = 0X0F;

USART_init(9600);

/******************************************************************************/
bt01=0;bt02=0;bt03=0;bt04=0;...

for (i=0;i<=4;i++) rec[i] = '\0';

i=0;

/****************TRATAMENTO DOS BOTÕES E TRANSMISSÃO DE COMANDO****************/
while(1){

PORTD=0XFE; //BOTAO 01
PORTB=0X88;
delay_ms(1);
if ((LB1)||(bt01==1)){
PORTB=0X88;
PORTD=0XEF;
delay_ms(1);
if (bt01==0){
USART_Write ('L');
USART_Write ('0');
USART_Write ('1');
while(LB1) {}
}
bt01=1;

}...
//Nova rotina da serial
//*************************************************
if (Usart_Data_Ready()) {
 a = Usart_Read();
 //rec[i] = Usart_Read();
 if (a == 0x0D){
              trata_serial();
              for (i = 0;i < 5; i++) rec[i] = '\0';
              i = 0;
              }
 else{
             rec[i] = a;
             i++;
             }
//rec[i] = rc;
//i++;
//if (rec[i-1]==0x0D)
//{
//trata_serial();
//for (i=0;i<=4;i++) rec[i] = '\0';
//i=0;
//}
}
//************************************************
}
}
/***********************************fim****************************************/
]


veja as modificações feitas


Sergio
Avatar do usuário
Sergio38br
Word
 
Mensagens: 759
Registrado em: 22 Nov 2007 13:39
Localização: São Paulo - SP

Mensagempor alexhnunes » 17 Mar 2008 13:37

Sérgio, obrigado pelas modificações. Fiz elas aqui no programa, porém não compila. Dá a seguinte mensagem:

c Identifier redefined
alexhnunes
Nibble
 
Mensagens: 59
Registrado em: 28 Mai 2007 10:04
Localização: Campinas - SP

Mensagempor Sergio38br » 17 Mar 2008 13:38

isto no trata_serial?
Avatar do usuário
Sergio38br
Word
 
Mensagens: 759
Registrado em: 22 Nov 2007 13:39
Localização: São Paulo - SP

Mensagempor alexhnunes » 17 Mar 2008 13:43

Sergio38br escreveu:isto no trata_serial?


Não, antes, ele já pára na declaração das variáveis, exatamente na linha:

unsigned char c;
alexhnunes
Nibble
 
Mensagens: 59
Registrado em: 28 Mai 2007 10:04
Localização: Campinas - SP

Mensagempor Sergio38br » 17 Mar 2008 13:47

Então ja existe uma variavel como "c", escolha outro nome e troque no trata_serial tambem
Avatar do usuário
Sergio38br
Word
 
Mensagens: 759
Registrado em: 22 Nov 2007 13:39
Localização: São Paulo - SP

Mensagempor alexhnunes » 17 Mar 2008 13:54

Sim, troquei por j, compilou, mas continua exatamente como antes... O erro da serial persiste... Mas que zica!

Já revisei todo o circuito, serial, tudo, hardware não é... É algum detalhezinho que tá ficando pra trás que eu não estou lembrando...

Valeu pela ajuda!
alexhnunes
Nibble
 
Mensagens: 59
Registrado em: 28 Mai 2007 10:04
Localização: Campinas - SP

Mensagempor Sergio38br » 17 Mar 2008 13:59

antes de mais nada vc manda o que realmente? Codigo + caracteres de controles?
ex. desligar saida 1

"D + 01 + 0x0d"???

Sergio
Avatar do usuário
Sergio38br
Word
 
Mensagens: 759
Registrado em: 22 Nov 2007 13:39
Localização: São Paulo - SP

Próximo

Voltar para PIC

Quem está online

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

x