Página 1 de 1

Dúvidas com a serial do LPC214x...

MensagemEnviado: 13 Dez 2006 08:23
por jeanfernandes
Prezados

Um dos meus canais seriais ...é compartilhado com duas portas externa ou seja eu tenho ou um porta RS-232 ou uma RS-485, como mostra a figura a seguir....

Circuito

A linha RS-DIR me diz se eu vou trafegar pela 232 ou pela 485.

Bom o circuito na teoria e pratica funciona. O problema é o seguinte....
Quando eu transmito um frame eu preciso saber quando o ultimo caracter ja foi pra poder por exemplo chavear de uma serial pra outra......
vamos ver aqui o codigo que fiz..... pra ver onde mexer pra essa onça funcionar direito.....

no caso tem uma variavel chamada uart1_transmitindo.....mas nao ta virando nao....tem hora que eu chaveio de uma serial pra outra analisando essa variavel .....ai froide na cuca...e come byte que ainda nao foi transmitido...

Eu estava usando o principio de enable e disable IRQ pra resolver uns probleminhas mas ficou meio doido pois tem outras interrupcoes rolando na parada (Fábio termina esse livro, pô ! ehehehehe)......

Arquivo C

Arquivo H




Alguém da uma dica ae...obrigado.....

MensagemEnviado: 13 Dez 2006 09:31
por Renato
Cara, não abri tuas rotinas, mas informo algum caminho:
- Antes de transmitir, dar um delay, pois se o modo é half-duplex, esse
tempo é necessário pela propagação e anti-eco.
- Testar buffer de saída vazio, após enviar bloco tx,

Sucesso aeh !

MensagemEnviado: 13 Dez 2006 10:42
por Fábio Pereira
Pois é ...

Eu nem estou usando a UART dos LPC, mas olhando o registrador UxLSR, há um bitzinho chamado TEMT que indica que o caractere presente no registrador de deslocamento de transmissão foi completamente transmitido.

Na minha humilde concepção, basta você verificar este bit (após o buffer de TX estar vazio) e aguardar que o mesmo vá a "1", quando então você terá certeza de que a UART está livre e aí você pode comutar a função.

Até +

MensagemEnviado: 13 Dez 2006 11:32
por xultz
No caso do LPC2106, eu faço o segunte:
while(!(UART1_LSR & 0x40));

Ele fica em loop esperando o último bit sair pela porta, assim que sair, esse flag muda e pode mudar o pino do chip de RS485 com segurança.
É possível gerar uma interrupção quando isso ocorre, mas para não ganhar mais cabelos brancos, eu fiz o firmware inteiro sem interrupções, porque esse é um capítulo à parte da história da humanidade: o sistema de interrupções dos LPCs...

MensagemEnviado: 13 Dez 2006 12:58
por Viktor
Que PTC é esse que você está usando ? Qual o fabricante ?

MensagemEnviado: 15 Dez 2006 09:37
por jeanfernandes
Ok XUTS/FP

Nao vou fazer com while nao, mas vou usar dessa sua ideia ae....sobre as interrupcoes onde tem enable, disable irq eh um codigo ASM que vai dentro dele....ainda vou por.....eh que tava numa correria fdp.....mas eh simples....(hoje ta ficando mais clara a coisa)

Vou testar a solucao dos dois.....

Mas tipo chefe eu faco uma rotina com uma filinha na serial (mesmo que ela tenha a FIFO dela)..... vou injetando dado na serial e miha rotinha se encarrega da mandar sozinha..... mas nao fica parada nao....vai mandando pela interrupcao da serial mermo....como ta mostrado la....

Belezinha...

MensagemEnviado: 16 Dez 2006 22:58
por microeletronica
Oi Jean, tambem faco como o xultz.

Mas, vejha o treco abaixo, copiado do forum LPC2000:
Various bits in the LSR register are supposed to be cleared on read (read
the user manual or the data sheet of a 'discrete' 16x50.

You have to read the value only once, then check it. Read it again only to
clear the next source.

Check any working interrupt code for this series of UART any you will see
those precautions taken.


Tem mesmo que tomar cuidado ao ler algo que limpa quando le. :P
Mas nesse caso especifico funciona...