Página 1 de 1

Mudança de paridade na serial

MensagemEnviado: 29 Jun 2013 14:12
por hemasc
Senhores, gostaria de implementar em um equipamento (escravo) a opção do usuário escolher a paridade da comunicação serial para ímpar, par ou nenhuma.

Mas como fazer isso no meio do programa?
Eu utilizo o CCS e PIC18f87k90 (não tem paridade por hardware)

#use rs232(baud=9600, parity=N,stop=1,xmit=PIN_C6,rcv=PIN_C7,bits=8, errors) //sem paridade
#use rs232(baud=9600, parity=O,stop=1,xmit=PIN_C6,rcv=PIN_C7,bits=8, errors) //paridade ímpar
#use rs232(baud=9600, parity=E,stop=1,xmit=PIN_C6,rcv=PIN_C7,bits=8, errors) //paridade par

Se a paridade fosse um número, seria só criar uma variável e mudar seu valor, mas como é uma letra (N, O ou E), não tenho certeza do que fazer...
Estou fazendo alguns testes e caso eu venha a encontrar a solução, postarei aqui.
Fico no aguardo se alguém puder me orientar...

Re: Mudança de paridade na serial

MensagemEnviado: 29 Jun 2013 17:35
por RobL
Tem o bit de paridade sim. Usar o nono bit.
Talvez o CCS já faça a setagem para usar o nono bit como paridade.
O problema é que paridade é algo de museu, por isso os chips novos nem perdem tempo em ter um bit exclusivo, no em um registro de controle, para tal.
O percentual de erro detetável por paridade é muito baixo. Um CRC de 8 bits ou qualquer tralha simples é melhor que paridade. Já um CRC de 16, 32 já dá pra quase tudo. O resto é para trabalho muito mais fino.

Re: Mudança de paridade na serial

MensagemEnviado: 29 Jun 2013 18:27
por hemasc
Olá RobL!

Acho que não fui claro na minha pergunta e acabei influenciando você a não responder o que questionei... rsrs

Ao invés de eu apenas fixar a paridade no início do programa conforme:

#use rs232(baud=9600, parity=O,stop=1,xmit=PIN_C6,rcv=PIN_C7,bits=8, errors) //paridade ímpar

Tem como mudar a paridade no meio do programa?

por exemplo:

if(true) paridade ímpar
else paridade par


em relação a CRC, já é feito, mas o cliente quer com escolha de paridade também...

ps: o datasheet do 18f87k90 diz não suportar paridade por hardware, mas pode usar o 9º bit para controle por software, sendo assim, não tem paridade por hardware
"Parity is not supported by the hardware but can be
implemented in software and stored as the 9th data bit."

Re: Mudança de paridade na serial

MensagemEnviado: 29 Jun 2013 18:43
por KrafT
Concordo com o Robl, esse recurso é tão antigo (quanto eu), que atualmente praticamente não é utilizado.

Alternativas:

1- Configura a outra ponta para não usar paridade;
2- Configura o teu PIC manualmente sem usar a diretiva do CCS, aí vc muda como quiser;
3- Se precisar compilar ora com e hora sem, basta definir essa condição com #ifdef, #ifndef, etc...

Re: Mudança de paridade na serial

MensagemEnviado: 29 Jun 2013 18:57
por hemasc
Olá KrafT!

...enfim, antigo ou não, poderíamos focar na solução?

1- Configura a outra ponta para não usar paridade;
o cliente quer com paridade devido ao software e equipamentos que ele possui

2- Configura o teu PIC manualmente sem usar a diretiva do CCS, aí vc muda como quiser;
confesso que não consegui fazer isso e por isso coloquei a dúvida no fórum, me propõe uma forma?

3- Se precisar compilar ora com e hora sem, basta definir essa condição com #ifdef, #ifndef, etc...
rsrsrs... sim, mas como mudar a paridade?

obrigado pelas sugestões... continuo tentando mexer no programa, mas ainda não obtive sucesso...

Re: Mudança de paridade na serial

MensagemEnviado: 29 Jun 2013 19:04
por RobL
Agora não entendi mais. :D
Mudei umas bobagens escritas, por mim aqui.

Você não vai mudar o resultado do byte para impar ou par. O bit terá paridade impar ou par.
Suponha que foi enviado um datagrama com paridade par.
Se trabalhar com paridade par.
No outro lado o soft vai checar o conjunto de bytes e checar se o bit de paridade é igual. Se o recebido for, para par e o cálculo para paridade do conjunto recebido ( par) for o mesmo bit, está ok.
Se trabalhar com impar , o bit sera o inverso do que foi no par.
Mudar em run time ? Estranho. E a outra ponta?

Você quer saber o código para determinar a paridade ?

Re: Mudança de paridade na serial

MensagemEnviado: 29 Jun 2013 19:22
por KrafT
Solução que sempre funciona e com qualquer chip, sem ter que estudar muito:

- Pega no datasheet todos os registradores envolvidos na comunicação serial;
- Compila o código com paridade e verifica o que o CCS faz com os registradores;
- Compila sem paridade e idem ao item anterior;
- Entendido como funciona, faz teu software "na mão" sem o auxilio do compilador.


Eu uso essa alternativa quando tenho preguiça de esmiuçar o chip, e não quero usar funções prontas por alguma razão qualquer.

Re: Mudança de paridade na serial

MensagemEnviado: 19 Jul 2013 10:06
por hemasc
Senhores, agradeço a todos pelas orientações dadas a mim, principalmente ao Kraft por passar a sacada principal...
Demorei para responder por motivos profissionais.

#locate RCSTA = 0xFAC
#locate TXSTA = 0xFAB

#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7,errors,stream=COMM_1,enable=PIN_B1)

if(bit_com_paridade)
{
bit_set(TXSTA,6);
bit_set(RCSTA,6);
}
else
{
bit_clear(TXSTA,6);
bit_clear(RCSTA,6);
}

Abraço a todos e novamente muito obrigado!