Como transmitir tabelas via serial RS232

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Como transmitir tabelas via serial RS232

Mensagempor Fabio_Jerena » 02 Mai 2011 00:25

Bom pessoal, acho que minha dúvida é bem trivial, mas como não tenho experiência nesta aplicação aí vai minha pergunta:

Eu tenho um programa onde rodam várias tarefas ao mesmo tempo, encadeadas com eventos de interrupção (em baixo e alto nivel de prioridade) e quero concomitante a estes inumeros eventos receber dados da maneira mais rápida possível, porem para esta aplicação eu defini a interrupção referente à comunicação serial como baixa prioridade e é a segunda função a ser atendida (é o que eu disponho no momento), eu desejo passar valores que serão inseridos dentro de vetores do meu programa.
Abaixo um exemplo de vetor que eu gostaria de passar para meu programa.

signed int TABSPRKADV[8][8] = { -35, -35, -35, -35, -35, -35, -35, -35,
-35, -35, -35, -35, -35, -35, -35, -35,
-35, -35, -35, -35, -35, -35, -35, -35,
-35, -35, -35, -35, -35, -35, -35, -35,
-35, -35, -35, -35, -35, -35, -35, -35,
-35, -35, -35, -35, -35, -35, -35, -35,
-35, -35, -35, -35, -35, -35, -35, -35,
-35, -35, -35, -35, -35, -35, -35, -35 };


Este é um exemplo de tabela que eu quero transmitir do meu PC para o meu projeto com o PIC 18F452, minha dúvida é se devo converter esses valores para correspondentes em ASCII, se envio um a um como caracter e reconstruo os valores ao chegarem no PIC (esse método acho que vai me tomar muito tempo já que chegariam como simbolos e teria que converte-los). Fico preocupado pois no PIC ele só recebe até três caracteres de 8 bits cada e estoura o buffer de recepção(sobrescreve), eu tenho que receber os dados e gravá-los antes da chegada dos próximos e isso está me preocupando devido tempo!
Outra dúvida é como debugar isso no Proteus, eu não consigo transmitir o que eu quero em binário, têm que ser em caracteres ASC ou o hex correspondente, não há outra forma, para eu conseguir testar estas rotinas neste software? Sei lá, estava pensando em usar um hyperterminal para passar esses valores para o PIC, mas não sei como montar esse "protocolo" de comunicação!
Muito obrigado!
Fábio Jerena
Fabio_Jerena
Nibble
 
Mensagens: 52
Registrado em: 08 Mar 2007 08:59

Mensagempor luisf.rossi » 02 Mai 2011 07:25

Parece meio estranho essa pergunta mas... quantos bits tem um int no seu compilador? Na teoria eles não deveriam tem menos de 16 bits.. mas tem compiladores (se não me engano MikroC é um deles) que faz isso...

Cansiderando que tenha 16 bits, basta dividir com bitshift o int. Quanto ao protocolo. Se você não tem nenhuma garantia de leitura em tempos e tempos do seu buffer, o máximo que eu posso falar para você fazer é mandar alguma mensagem de volta para um computador falando que ele pode mandar mais um byte.

Abs
luisf.rossi
Byte
 
Mensagens: 109
Registrado em: 28 Nov 2010 12:48
Localização: São Paulo, SP

Re: Como transmitir tabelas via serial RS232

Mensagempor andre_luis » 02 Mai 2011 19:24

Olá Fábio,

Quanto ao protocolo, voce pode definir da maneira como voce quizer. O mais usual é o seguinte :
Código: Selecionar todos
[STX] [QUANTIDADE] [DADOS] [CRC] [ETX]

Te confesso que foram raras as vezes em que usei o CRC.

No caso da codificação em ASCII só acho recomendável voce adotar se houver a possibilidade de algum dia tais comandos terem de ser enviados por terminal ( Hiperterminal / minicom ) diretamente pelo usuário. Isso porque o tamanho da palavra a ser enviada iria dobrar, pois é necessário codificar cada nibble de cada byte.


Outro detalhe importante, com respeito á sua preocupação relacionado á taxa de transmissão/recepção : Voce pode utilizar a interrupção da serial apenas para inserir os dados recebidos numa fila circular FILO ( First-In-Last-Out ). Assim, mesmo para uma taxa relativamente elevada de Baud, voce poderia tratar essa recepção conforme a disponibilidade do programa.

+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor ze » 03 Mai 2011 11:45

a princípio voce não precisa converter. tem programa de terminal que lê em hexa. O proteus também. E se tiver tiver que converter sugiro queo faça no pc pra não forçar o amigo pic.
o buffer em hw é de só 2 bytes mesmo. Mas voce pode criar um buffer maior em sw usando interrupçao
algo assim:
Código: Selecionar todos
unsigned char TABSPRKADV[64],i=0;
static bit buffercheio=0;
static void interrupt
qualquernome(void)
{
if (RCIF)
   {
   RCIF=0;//acho que não precisa
   TABSPRKADV[i]=RCREG;//ele é zerado aqui. confereaê!
   i++;
   if (i>63) {i=0;buffercheio=1;} //só 64
   }
if (outrosflags)
   {
   //outras tarefas
   }
}

e no main() com calma voce acha os bytes segundo orientação do protocolo do amigo
Pra gravar suspenda a recepção e só grave se o valor alterou pr economizar alguns dos milhoes de ciclos de gravação.
ex.
Código: Selecionar todos
...
main()
...//inicializahweetc();
for(;;)
{
...
if (buffercheio)
   {
   bufercheio=0;
   RCIE=0; //suspenda
   //...organizadadoscomcalma();
   for (i=0;i<64;i++)
      {
      if (eepromread(i)!=TABSPRKADV[i] eeprowrite(i,TABSPRKADV[i])
      }
   RCIE=1;
   }
...   
}


Podem haver bugs. Mas queira descobrir por si.
sucessos!
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Re: Como transmitir tabelas via serial RS232

Mensagempor Wagner de Queiroz » 04 Mai 2011 08:54

andre_teprom escreveu:Olá Fábio,

Quanto ao protocolo, voce pode definir da maneira como voce quizer. O mais usual é o seguinte :
Código: Selecionar todos
[STX] [QUANTIDADE] [DADOS] [CRC] [ETX]

Te confesso que foram raras as vezes em que usei o CRC.


+++



CRC é uma rotininha um pouco cara para um pobre PIC, troque o [CRC] por checksum que é mais rapido:

Código: Selecionar todos
[STX] [QUANTIDADE] [DADOS] [CHK] [ETX]


O checksum é facil. Vai somando os bytes do pacote, o resultado vc faz AND 256 e inverte. Não é tao bom quanto o CRC, mas é melhor que a paridade da serial e muito raramente tive problemas.

Quando o PIC receber e validar o pacote, vc deve devolver ao PC uma resposta antes do PC mandar outro pacote:

Código: Selecionar todos
[STX] [ACK] [CHK] [ETX]

para o codigo bem recebido ou
Código: Selecionar todos
[STX] [NACK] [CHK] [ETX]

se houve erro.
Seja Livre, Use Linux
Avatar do usuário
Wagner de Queiroz
Word
 
Mensagens: 872
Registrado em: 11 Out 2006 13:38
Localização: Barueri-SP


Voltar para PIC

Quem está online

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

cron

x