Não consigo comandar via Usart (mikroC)

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Mensagempor alexhnunes » 17 Mar 2008 14:01

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

"D + 01 + 0x0d"???

Sergio


Somente o código, no caso "D+0+1" para desligar somente o número 1, "D+0+2" para desligar somente o número 2 e assim por diante...

Mas só complementando, eu coloquei antes uma linha para mostrar o que eu estava recebendo na serial e estava tudo correto, o que eu mandava, recebia certinho, pelo menos era o que mostrava no terminal...
alexhnunes
Nibble
 
Mensagens: 59
Registrado em: 28 Mai 2007 10:04
Localização: Campinas - SP

Mensagempor Sergio38br » 17 Mar 2008 14:25

e onde entrar o carry return(0x0d) que esta no programa?

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

Mensagempor Sergio38br » 17 Mar 2008 14:29

esta parte de mandar o eco é interessante, mas inclua uma para ver o que vc tem na matriz "rec" antes de tratar a serial para testar.

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 14:31

Aí é que eu acredito estar o problema... O CR era para fazer com que o bloco trata_serial fosse acionado, porém está acionando conforme digito qualquer caractere.
alexhnunes
Nibble
 
Mensagens: 59
Registrado em: 28 Mai 2007 10:04
Localização: Campinas - SP

Mensagempor Sergio38br » 17 Mar 2008 14:56

mas vc esta transmitindo o CR??
vou mexer na rotina hoje a noite , posto amanhã cedo

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 15:19

Eu estou usando o terminal RComSerial RS232 da Rogemcom, já transmiti de todas as formas possíveis, habilitando CR/LF, enviando caracterautomaticamente, os dois juntos, um ou outro, sem nenhum dos dois, dando Enter... Não há meios de ir legal...

Tentei colocar o "eco" e antes de entrar na rotina da Usart, ele mostra rec[i]=0, mas como não tem contador, fica jogando direto...

Não sei mais onde poderia mexer, tenho alguns exemplos aqui que batem com o que eu escrevi, mas tbm não funcionam... Será que pode ser algum erro no software?
alexhnunes
Nibble
 
Mensagens: 59
Registrado em: 28 Mai 2007 10:04
Localização: Campinas - SP

Mensagempor Sergio38br » 18 Mar 2008 11:06

bom dia, fiz umas modificações validando o dado pela posição, vc vai ter de enviar o "CR" no final da digitação quando enviar o comando.

Código: Selecionar todos


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

unsigned short x, i, rc,j,k,l;
//int i;
//char rec[6];
short rec[3];



/**************************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()
{
k = 0;
l=(((rec[1] - 48) << 4)||(rec[2] - 48));
if (rec[0]=='D')k = 0;//se o primeiro dado for 'D' k = 0(apaga)
if (rec[0]=='L')k = 1;//se o primeiro dado for 'L' k = 1( liga o led)
       switch (l)
       {
       case 01 : bt01 = k;
       case 02 : bt02 = k;
       //......
       }
for (i=0;i<=3;i++) rec[i] = '\0'; //depois de tratar, limpa a matriz e seu indice
i=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<=3;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())
 {
 j = Usart_Read();
 //rec[i] = Usart_Read();
 if (i == 0)
       {
        if ((j > 0x40)&&(j< 0x5B)) // se o primeiro dado esta entre A e
           {                       // Z , armazena na primeira posição da matriz
           rec[i] = j;
           i++;
           }
        else
           {                       //caso contrario zera o indice da matriz e
           i = 0;                  // limpa variavel de transferencia
           j = 0;
           }
        }
 if ((i > 0)&&(i < 3))               //o segundo e terceiro dado tem de ser
        {
         if ((j > 0x29)&&(j < 0x3A)) //numericos
             {
              rec[i] = j;
              i++;
             }
            else
           {                       //caso contrario zera o indice da matriz e
           i = 0;                  // limpa variavel de transferencia
           j = 0;
           }
        }
 if ((i == 3)&&(j == 0x0D))          //apenas qdo o quarto dado for um cr
 {                                  // é liberado o tratamento dos dados da serial
    trata_serial();
//    for (i = 0;i < 3; i++) rec[i] = '\0';
//    i = 0;
 }

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


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

Mensagempor alexhnunes » 18 Mar 2008 15:07

Sérgio, infelizmente tbm não funcionou, agora nenhum led apaga... Estou fazendo outro programa usando o CCS para ver se funciona a contento, pois tenho uns exemplos com serial aqui. Agradeço muito a sua ajuda!
Alexandre Nunes
alexhnunes
Nibble
 
Mensagens: 59
Registrado em: 28 Mai 2007 10:04
Localização: Campinas - SP

Mensagempor Sergio38br » 18 Mar 2008 15:19

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

Mensagempor Renie » 19 Mar 2008 01:26

Olá Alex,

explique melhor sua topologia :

...o microcontrolador recebe um sinal de outro microcontrolador ou pelo PC...
[]'s
Renie
-------------------------------------------------------------------------------------------------------------
Meu velho site com eletrônica praticamente parado http://www.reniemarquet.com
Nosso Blog http://artemadeiraevida.blogspot.com.br
Renie
Word
 
Mensagens: 732
Registrado em: 11 Out 2006 22:35
Localização: RJ - Niterói - Brasil

Mensagempor Renie » 19 Mar 2008 01:55

Olá Alex novamente,

Além da msg anterior e a resposta no outro tópico, como já falei, não uso
C, mas, pelo pouco que olhei e penso que entendí, achei seu código frágil
a erros de comunicação!

Se você não receber o código de fechamento do pacote, você estoura
seu buffer!

if (Usart_Data_Ready()) {
rec[i] = Usart_Read();
//rec[i] = rc;
i++;
if (rec[i-1]==0x0D) //// e se ele não chegar????????????
{
trata_serial();
for (i=0;i<=4;i++) rec[i] = '\0';
i=0;
}


Ps: e nem mesmo identificação de início da mensagem, não há nenhuma
segurança!
[]'s
Renie
-------------------------------------------------------------------------------------------------------------
Meu velho site com eletrônica praticamente parado http://www.reniemarquet.com
Nosso Blog http://artemadeiraevida.blogspot.com.br
Renie
Word
 
Mensagens: 732
Registrado em: 11 Out 2006 22:35
Localização: RJ - Niterói - Brasil

Mensagempor alexhnunes » 19 Mar 2008 09:57

Então, Renie, explicando a topologia:

O sistema em desenvolvimento será comandado por um 16F877A (mestre) na recepção, onde ao ser apertado um botão (são 22, para diferentes localidades), um led que indica qual botão foi apertado (no próprio console) deverá ficar aceso e a serial deverá enviar um comando (L01, L02...) para acendimento de outro led (sinalização externa) em um painel remoto, onde outro 16F877A receberá este sinal. A comunicação a princípio será serial. Para apagar os leds, um terceiro 16F877A, conectado a botões em salas distintas enviaria o sinal para o desligamento dos leds correspondentes (D01, D02...), tanto do painel de sinalização quanto do console. Enviar o sinal eu já consegui, porém o problema está no recebimento do sinal, o programa não está reconhecendo corretamente...

Sobre a fragilidade do código, considero sim essa possibilidade. Como o Sérgio mesmo disse, provavelmente o CR não esteja vindo, mas isso é intermitente, ora vem, ora não vem. Infelizmente tenho que estudar mais isso, pois é a primeira vez que estou fazendo algo com serial...

Eu não mencionei no início, mas o clock que estou usando é de 8MHz e BR 9600. Já vi dar problemas parecidos em BR 9600, porém com clock de 4MHz. Será que ainda há a necessidade de baixar ainda mais o BR?

Foi tentado antes em um exemplo uma transmissão serial com interrupção e uma como o descrito, que estou usando, aparentemente funcionou nas duas situações. Será que o pacote de instruções é considerado "grande" a ponto de requerer ser "quebrado"? Acho que não, já vi transmissões maiores...

De qualquer forma, estou tentando acertar ele usando o programa CCS, conforme já mencionado. Ainda não cheguei na parte de transmissão do sinal, mas já vi que terei que fazer uns acertos para o circuito real (ainda não está a contento), no Proteus o que fiz já funcionou.

Obrigado pelas dicas! :wink:
Alexandre Nunes
alexhnunes
Nibble
 
Mensagens: 59
Registrado em: 28 Mai 2007 10:04
Localização: Campinas - SP

Mensagempor Renie » 20 Mar 2008 00:35

Olá Alex,

Descupe-me, mas não respondeu a questão topologia!

EX: um 877 mestre, ligado ao PC, escravos comunicando com meste por
I2C, etc...

Ou está tudo pendurado na 232?
[]'s
Renie
-------------------------------------------------------------------------------------------------------------
Meu velho site com eletrônica praticamente parado http://www.reniemarquet.com
Nosso Blog http://artemadeiraevida.blogspot.com.br
Renie
Word
 
Mensagens: 732
Registrado em: 11 Out 2006 22:35
Localização: RJ - Niterói - Brasil

Mensagempor fabim » 20 Mar 2008 08:10

RS232 painel - painel
Quantos metros de cabo entre um e outro ?^
Ou voce esta usando um conversor 232/485 ?

Fabim
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor alexhnunes » 03 Abr 2008 15:16

Pessoal, desculpem a demora na resposta...

Renie, para teste estou usando RS232, depois irei passar para RS485.

Fabim, o esquema seria assim:

16F877A na recepção envia sinal para ligar leds nos painéis na sala de espera e consultório e recebe sinal do consultório para resetar - 16F877A do painel recebe sinal para ligar e sinal para desligar leds tanto da recepção quanto do consultório - 16F877A do consultório recebe sinal para ligar e envia sinal para desligar leds da espera e reseta na recepção.

Os sistemas ainda estão no protoboard, não estou usando cabos longos.

Mas pessoal, refiz os programas no compilador CCS e agora está funcionando tudo certinho, inclusive já com o RS485. Infelizmente não consegui descobrir ainda o que acontece no MikroC, quando eu tiver um tempo sobrando darei uma verificada melhor e posto os resultados. Valeu pela ajuda de todos...
Alexandre Nunes
alexhnunes
Nibble
 
Mensagens: 59
Registrado em: 28 Mai 2007 10:04
Localização: Campinas - SP

Anterior

Voltar para PIC

Quem está online

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

x