Rotina Mestre X Escravo

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Mensagempor buiz » 14 Jan 2008 08:35

Master envia 1 Byte com o endereço do Slave.

Slave responde 1 Byte com o endereço do Master confirmando que recebeu a solicitação.

Master se prepara para receber 128 Bytes do Slave.

Slave envia 128 Bytes ao Master.


Mais ou menos assim que estou imaginando fazer.
Avatar do usuário
buiz
Byte
 
Mensagens: 165
Registrado em: 20 Out 2006 14:59
Localização: Cachoeira do Sul - RS

Mensagempor Maurício » 14 Jan 2008 16:37

Quem transmite não precisa de tempo ocioso depois de transmitir. Nem antes, nem depois. Mestre é mestre.
Transmitiu? O master coloca a linha em recepção imediatamente.
O escravo que atendeu a chamada, depois de reconhecer o endereço, espera um tempo (sei lá, depende da rede, uns 100us, p.ex., pro mestre poder baixar a linha), e envia o pacote.

Se o mestre chama um escravo e não recebe resposta, é porque o escravo não está na rede.

Não sei se nesse protocolo precisa do reconhecimento do escravo. Se o escravo reconheceu o endereço, transmite imediatamente. Não perde tempo. O mestre conta os bytes, chegando no final, simplesmente sai.

[]'s
"Não leve a vida tão à sério, afinal, nenhum de nós sairá vivo, dela!"
Avatar do usuário
Maurício
Word
 
Mensagens: 678
Registrado em: 14 Out 2006 17:23
Localização: São Paulo - SP

Mensagempor buiz » 14 Jan 2008 17:34

Olá Mauricio,

Acho que é ai que eu estou me perdendo, como faço para contar os BYTES recebidos, pode parecer meio burra esta minha pergunta, mas como estou usando getc() para receber, não sei como contar cada byte que o mestre recebe.

Ou a rotina para em getc() até que receba um outro sinal, ai eu posso implementar um contador para contar cada recepção, seria isso?

Buiz.
Avatar do usuário
buiz
Byte
 
Mensagens: 165
Registrado em: 20 Out 2006 14:59
Localização: Cachoeira do Sul - RS

Mensagempor Maurício » 14 Jan 2008 18:12

Toda a vez que vc sair de getc, incrementa uma variável:

Código: Selecionar todos
dado = getc();
bytes_recebidos++;


Por interrupção da serial acho que é melhor.

[]'s
"Não leve a vida tão à sério, afinal, nenhum de nós sairá vivo, dela!"
Avatar do usuário
Maurício
Word
 
Mensagens: 678
Registrado em: 14 Out 2006 17:23
Localização: São Paulo - SP

Mensagempor buiz » 14 Jan 2008 19:15

Matei a duvida que eu tinha, agora esta começando a ficar mais facil, o getc() so vai adiante após receber o dado que estava esperando, eu estava achando que se quando entrava na função mesmo que não recebece nada ele ia seguir adiante, só que implementei uma variavel para contar e coloquei um delay de 1seg no escravo, o mestre só seguia a rotina após receber o dado que estava esperando.

Parece simples, mas para quem nunca usou comunicação é complicado, mas com todas as ajudas que tive, estou quase lá.

Valeu pessoal, obrigado pela força...

Qualquer duvida a mais eu incomodo vocês aqui..

Abraços!! Buiz.
Avatar do usuário
buiz
Byte
 
Mensagens: 165
Registrado em: 20 Out 2006 14:59
Localização: Cachoeira do Sul - RS

Mensagempor fabim » 15 Jan 2008 10:00

ou.... Gisculpa... passoulico batido..

Buiz, siguinte..

Em uma rede que existem equipamentos paralelos seja, 485,422,can etc..

O mais importante do protocolo é o pacotinho de start..

Exemplo, o PC manda apenas 1 byte que é o endereço de 0 a 64 slaves..

>>>>64D e depois fica pra receber esperando este mesmo numero
o slave manda 64D <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
o master sabe que o fein tá na fita
aí o master manda "para exemplificar" estes caracteres.
'64_eu_quero_dados'
o slave pega e identifica estes bytes dentro dele pra ver se bateu o primeiro byte "se esta falando com ele" e os subsequentes, pra saber se o cabeça da historia quer os 128 bytes..
Mais aí entra o tale do start, no meio destes 128bytes se forem valores de 0 a 255, pode acontecer de em uma parte dele que o slave 64 esta mandando pro cabeção, um outro slave enxerga uma sequencia pedindo dados pra ele, pronto aí f****..
O segundo slave vai mandar dados, juntamente com o que ja estava mandando.!!

Resumindo de uma forma simples..uma solução pratica e inteiramente funcional..
Pegue como base um filtro >>>http://www.asciitable.com/<<<

Funciona basicamente usando codigos de 1 a 31..
estes codigos independentemente de comprimento serão utilizados para inico de dados, fim de dados etc

.Ponto.
Ao invés de eu enviar por exemplo valores analogicos de 0 a 255 para o cabeção, eu envio ja
tratado.

Neste array de resposta de 128 bytes em questão seja lá o que estiver dentro dele, por exemplo
podera usar caracteres epenas 48 a 57, 65 a 90, 97 a 122, os outros caracteres voce utiliza
para comandos endereçamentos etc..

Exempro do preto véio..
MASTER MANDA COMANDO.{
start of reading, start of text, endereço do módulo, end of text, end of transmission.
são 5 bytes de controle, para ping.}

Slave devolve pedido.{
start of reading, start of text, endereço do módulo, end of text, end of transmission.
são 5 bytes de controle, para ping.
(todos os slaves vão receber os 5 bytes, e todos vão comparar todos os bytes para saber se a informação chegou
corretamente, feito isto os slaves vão comparar o byte 3 com o seu endereço fisico, o slave cuja
endereço fisico bater retorna estes bytes..!ponto.

OBS: para comando e pedido de informação crie um delay por exemplo de 500mS, se vier dados antes de estourar
os 500mS intão é continuação, se estourar é apenas aquela quantidade de bytes.

EX.start of reading, start of text, 35D , end of text, end of transmission.500mS...estourou.

Aí o pic ..
quantos bytes chegaram ?
5
Case 5 of

5 : Ping.
trata ping

etc.

agora master pede informação para slave.."128bytes"
"start of reading, start of text, endereço do módulo, end of text,start of text,'IND' , end of text,end of transmission."500mS
10 bytes. sendo 6,7,8 "I N D", I ned data.
mesma coisa a cima.!!!
o PIC devolve.
"start of reading, start of text, endereço do módulo, end of text,start of text,128 bytes , end of text,end of transmission."500mS
etc etc etc..
Com isso não tem como haver erro de colisão.

nossa doeu a cabeça.

abraços
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 buiz » 15 Jan 2008 12:53

Olá Fabim,

Cara, vou até imprimir isso para nunca mais esquecer, clareou ainda mais as ideias aqui, valeu pelo tempo dedicado.

Estou digerindo estas informações agora, vou começar os testes, qualquer coisa eu volto e posto aqui.

Abraços Buiz.
Avatar do usuário
buiz
Byte
 
Mensagens: 165
Registrado em: 20 Out 2006 14:59
Localização: Cachoeira do Sul - RS

Anterior

Voltar para PIC

Quem está online

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

x