Modbus pé de chinelo e endereçamento de coils!

Software e Hardware para linha ARM

Moderadores: 51, guest2003, Renie, gpenga

Modbus pé de chinelo e endereçamento de coils!

Mensagempor cortex » 01 Fev 2011 14:29

tenho um modibus bem barrelo rodando num LPC 1768, apenas respondendo em 6 hold registers com um simulador mestre que tenho aqui, estou tentando acionar 8 saidas sendo uma cada coil, o que não estou conseguindo é ler o byte da requisição para endereçar os coils! alguem tem alguma idéia de como ler e armazenar byte a byte para fazer a comparação e responder para o mestre? se é que meu raciocínio está correto??????
cortex
Byte
 
Mensagens: 121
Registrado em: 27 Out 2010 10:32

Mensagempor leoabubauru » 02 Fev 2011 12:10

Não sei se entendi sua dúvida, mas...

Se você já conseguiu retirar a mensagem recebida no registrador RX do uC, monte um buffer em faça um AND com o valor do bit desejado num IF

Código: Selecionar todos
if (BufferRX[POSICAO_DO_BYTE_COMANDO] & 8) // Bit 8 está setado?
    {
    faz alguma coisa
    }



Se ainda não conseguiu montar o buffer da mensagem recebida no RX, leia o datasheet sobre quais registradores devem ser configurados / lidos e, depois, faça o algoritmo acima.
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

Mensagempor cortex » 02 Fev 2011 14:49

Fala leo blz!

estão to fazendo o seguinte:


char rx_char[8];

rx_char[LPC_UART0->RBR] = LPC_UART0->RBR;

sendo o "LPC_UART0->RBR" o registrador de recebimento da serial

isso seria um buffer?


ai faço minha condição:
if( rx_char[LPC_UART0->RBR]& 0x05) {

}

funciona, mas responde em outros pedidos tbm! to bem perdido nos bytes aqui!!
cortex
Byte
 
Mensagens: 121
Registrado em: 27 Out 2010 10:32

Mensagempor polesapart » 02 Fev 2011 16:26

cortex escreveu:
char rx_char[8];

rx_char[LPC_UART0->RBR] = LPC_UART0->RBR;



Caramba, isso sim é buffer overflow :P
Warning: time of day goes back (-163479us), taking countermeasures. :)
Avatar do usuário
polesapart
Byte
 
Mensagens: 477
Registrado em: 19 Nov 2007 12:56
Localização: Curitiba

Mensagempor cortex » 03 Fev 2011 07:05

Sou bem fraco em "C"!

não entendo como fazer pra colocar cada byte em cada posição do meu bufer!
cortex
Byte
 
Mensagens: 121
Registrado em: 27 Out 2010 10:32

Mensagempor leoabubauru » 03 Fev 2011 12:50

Hummmm!

Bem, comece gerando uma interrupção do canal RX e armazenando o registrador de RX numa matriz (ou vetor, ou o que prefirir chamar)

Código: Selecionar todos
#define TAMANHO_BUFFER 8
#define POSICAO_DO_BYTE_COMANDO x (substituir x pelo número que representa a posição do byte que contém o comando)

char rx_char[8];
static char BufferCounter = 0;

/* Rotina de interrupção de RX */
void int_UART_RX()
{
    rx_char[BufferCounter] = LPC_UART0->RBR;
    BufferCounter++;
   
    if (BufferCounter >= TAMANHO_BUFFER)
        {
        BufferCounter = 0;
        }
}




Depois você usa o byte referente ao comando em outra parte do seu código.


Código: Selecionar todos
if (rx_char[POSICAO_DO_BYTE_COMANDO] & 0x08) // Bit 4 está setado (0000 1000 = 0x08)?
    {
    faz alguma coisa
    }




Este é um exemplo simplista. Comece a escrever o código. Teste-o. Depois faça uma rotina para tratar erros como, por exemplo, zerar a variável BufferCounter se o buffer tem um CRC errado.
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

Mensagempor cortex » 03 Fev 2011 16:28

ae leo eu tava batendo na trave velho! sou bem fraquin em "C" vou fazendo meio que no chutômetro, peguei tua explicação e tava parecida com o que eu estava fazendo! fiz uns ajustes e funcionou legal! agora é só desenvolver!

valeu! abraço!!!! :D
cortex
Byte
 
Mensagens: 121
Registrado em: 27 Out 2010 10:32


Voltar para ARM

Quem está online

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

cron

x