PIC : changer vitesse RS232 à chaud

Do you have a question? Post it now! No Registration Necessary

Translate This Thread From French to

Threaded View
Bonjour ,

je me bats avec un PIC 16F876 pour lui faire changer la vitesse de la RS232
alors que le PIC a déjà démarré.

j'ai fait plusieurs éssais sans résultat.

ca doit etre possible car TINYBLD (bootloader pour PIC ) le fait mais après
un branchement à l'adresse 0 (reset).

D'ou ma question : est-il possible de changer la vitesse d'une RS232 sans
redemarrer le PIC ?

Merci de vos réponses.





Re: PIC : changer vitesse RS232 à chaud
On Jan 23, 11:16 am, "free.fr"

Quoted text here. Click to load it

Oui je te le confirme : c'est possible E0% la volE9%e et sans
reset, je l'ai dE9%ja fait sur du MicroChip et d'autres uC.

Mais il ne suffit pas de (par exemple) une simple
E9%criture des registres pour la vitesse du port :
si je me souviens bien, il y a une sequence E0% respecter,
genre : dE9%valider le port, dE9%valider les E9%ventuelles IT,
positionner les paramE8%tres (diviseurs, vitesse, paritE9%, etc)
puis seulement ensuite, revalider le port.

Il faut E9%plucher la doc de ton 16F876,
mais ce genre de manip marche nickel.

Re: PIC : changer vitesse RS232 à chaud
free.fr a ecrit
Quoted text here. Click to load it

oui c'est possible, mais comme repondu par jean-christophe , il faut
respecter la chronologie.
Voir le chapitre 10 du datasheet en ce qui concerne les set up
transmit and receive.
Tu code en asm natif ou avec un compilo ?
Rvl



Re: PIC : changer vitesse RS232 à chaud
je code avec PICBASIC. de Microengineering (vieille version)

et je regarde ce qu'il génère au niveau assembleur.

Faut-il un branchement au debut , genre RESET logiciel ?

J'ai lu le chapitre 10 mais on y trouve comment démarrer une RS232.

Pas comment l'arreter.

Vous n'auriez pas un bout de code ?

Merci quand même




Re: PIC : changer vitesse RS232 à chaud
question subsidaire :

est-ce que vos codes marchaient aussi en simul sur MPLAB ?

merci

Re: Re: PIC : changer vitesse RS232 à chaud
free.fr a ecrit
Quoted text here. Click to load it

bonjour free.fr
Pour verif et confirmation simple un dimanche :D
j'ai codé ça sous le basic de MEL (4.15)
et ça roule sans probleme

Rvl
---------------
program UART
dim uart_rd as byte

main:

  UART1_Init(9600)                     ' Initialize UART module at 9600
bps
  Delay_ms(100)                        ' Wait for UART module to
stabilize

  UART1_Write_Text("OK for pass96")
  UART1_Write(10)                      ' Line Feed
  UART1_Write(13)

  delay_ms(1500)                       ' delai à la louche
  UART1_Init(2400)                     ' Initialize UART module at 2400
bps
  Delay_ms(100)                        ' Wait for UART module to
stabilize

  UART1_Write_Text("OK for pass24")
  UART1_Write(10)                      ' Line Feed
  UART1_Write(13)
  delay_ms(1500)
 goto main
-------------



Re: Re: PIC : changer vitesse RS232 à chaud
je suis surpris , je ne reconnais pas la syntaxe du BASIC PICBASIC de Micro
Engineering Labs (MEL)

qui est plutôt à base de HSERIN / HSEROUT pour la RS232.

Dans mon cas je recois des trames à une certaine vitesse d'un appareil A et
les renvois à une autre vers un appareil B.

je vais faire un essai en emission seulement avec changement de vitesse.


Re: Re: Re: PIC : changer vitesse RS232 à chaud
free.fr a ecrit
Quoted text here. Click to load it


ha ba c'est pt'ete normal , puisque là c'est le basic de
MikroELectronika ;o)

<http://www.mikroe.com/eng/products/view/9/mikrobasic-pro-for-pic/

Rvl



reflexions ...
en fait je recois une trame de 6,5 ms à 62500 bauds.

je veux la renvoyer à 115200 sachant que j'ai une trame toutes les

30 ms.

l'exemple de code de rvlegran mentionne un délai de stabilisation :

rédibitoire pour mon cas.

pouvez-vous détailler la chronologie à respecter , car la combinatoire

des situations augmente vite.

merci.

PS : un bout de code serait l'idéal.


Re: reflexions ...
On Jan 23, 7:21 pm, "free.fr"

Quoted text here. Click to load it

Ces deux vitesses sont-elles fixes ?
( Rx E0% 62,5 K  et  Tx E0% 115,2 K )

Si c'est le cas, il y a des uC avec deux (ou plus)
ports sE9%rie (je ne sais pas c'est le cas pour le tien)

Dans ce cas tu paramE8%tres une fois pour toutes :
 le port#1 E0% 62,5 K
 le port#2 E0% 115,2 K
 tu branches le Rx sur le port#1 (Tx inutilisE9%)
 tu branches le Tx sur le port#2 (Rx inutilisE9%)
comme cela tu n'as plus besoin de changer de vitesse.

Si ton uC n'a qu'un seul port (E0% une seule vitesse)
et que le changement de vitesse E0% la volE9%e
te cause problE8%me, au pire il y a la solution
d'utiliser un chip UART externe au uC :
cela revient au cas prE9%cE9%dent, avec par exemple
le port du uC en E9%mission E0% 115,2 K
et l'UART en rE9%ception E0% 62,5 K.


Re: reflexions ...
oui les vitesses sont fixes

et je voudrais me servir d'un seul microprocesseur.

j'ai fait des tests avec une deuxieme RS232 logicielle mais

elle n'est pas assez rapide et donc je perds des trames.



Re: reflexions ...
On Jan 23, 7:46 pm, "free.fr"

Quoted text here. Click to load it

Bon, c'est dE9%ja ca.

Quoted text here. Click to load it

En ce qui concerne l'E9%mission,
pour faire un port sE9%rie externe il suffit
juste d'un simple registre E0% dE9%calage,
pas besoin de tout un uC au grand complet.
Il faut vE9%rifier les timmings et coder
en soft le bit de partitE9% ( s'il y en a un )


Re: reflexions ...
free.fr a ecrit
Quoted text here. Click to load it

Mon code etait un bout de code d'example fourni avec le compilo
Je viens de faire un essai avec 1 ms dde stabilisation comme timing
j'ai mis du 115200 et 57600 pour tester avec un terminal (pas de 62500
dispo)
et ça fonctionne ok (clock pic en 8MHz)
Rvl
--------------
main:

  UART1_Init(115200)                     ' Initialize UART module at
115200
  Delay_ms(1)                        ' Wait for UART module to
stabilize

  UART1_Write_Text("OK for pass115 ")
  UART1_Write(10)                      ' Line Feed
  UART1_Write(13)


  UART1_Init(57600)                     ' Initialize UART module at
57600 bps
  Delay_ms(1)                        ' Wait for UART module to
stabilize

  UART1_Write_Text("OK for pass576 ")
  UART1_Write(10)                      ' Line Feed
  UART1_Write(13)

 goto main



Re: reflexions ...
free.fr a ecrit
Quoted text here. Click to load it

Mon code etait un bout de code d'example fourni avec le compilo
Je viens de faire un essai avec 1 ms dde stabilisation comme timing
j'ai mis du 115200 et 57600 pour tester avec un terminal (pas de 62500
dispo)
et ça fonctionne ok (clock pic en 8MHz)
complement ok aussi avec une stab de 0.2 ms (200 µs)

Rvl
--------------
main:

  UART1_Init(115200)                     ' Initialize UART module at
115200
  Delay_ms(1)                        ' Wait for UART module to
stabilize

  UART1_Write_Text("OK for pass115 ")
  UART1_Write(10)                      ' Line Feed
  UART1_Write(13)


  UART1_Init(57600)                     ' Initialize UART module at
57600 bps
  Delay_ms(1)                        ' Wait for UART module to
stabilize

  UART1_Write_Text("OK for pass576 ")
  UART1_Write(10)                      ' Line Feed
  UART1_Write(13)

 goto main



Re: reflexions ...
merci rvlegran

mais il n'y a que de l'émission.

Or je soupconne la réception d'empecher la maj du SPBRG.

Si tu pouvais faire un essai avec emission et reception ce serait

parfait; Mais j'abuse peut-etre...

Et si le .HEX marche en simul avec MPLAB alors là c'est LaMecque !


Re: reflexions ...
free.fr a ecrit
Quoted text here. Click to load it

Pas de probleme mais pas ce soir, demain au labo
je vais faire un test en entrée 57600 et reinjection en 115200.

quelle clock ton 876 ?
quelle longueur la trame en entrée ?
je te mettrais le .hex et tu verra toi meme
Je ne vois pas pourquoi il y aurait probleme avec le SBPRG, l'important
est d'avoir de la latence pour faire le transfert.
Rvl



Re: reflexions ...
Merci rvlrgran

j'ai fait un petit test avec MEL que je viens d'installer.

j'obtiens le meme comportement qu'avec PICBASIC.

Mais effectivement si tu pouvais faire un test de ton coté ca me

démontrerait que je procède mal.

A demain

Test ci dessous :

program UART
dim uart_rd as byte

main:
  UART1_Init(57600)                     ' Initialize UART module at 9600 bps
  Delay_ms(1)                        ' Wait for UART module to stabilize


  while UART1_Data_Ready() = 0
  wend
  uart_rd = UART1_Read()           ' read the received data,
  UART1_Init(115200)                     ' Initialize UART module at 9600
bps
  Delay_ms(1)                        ' Wait for UART module to stabilize
  UART1_Write(uart_rd)
  goto main             ' and send data via UART

end.


trame
le PIC est à 20 MHZ

la trame fait une quarantaine de caractères , emise toutes les 30 ms.



Re: trame
free.fr a ecrit
Quoted text here. Click to load it

bonjour free.fr
juste pour test
ci joint
http://cjoint.com/data/0byvciHcN7A.htm
un .hex generé pour un 16F876A (20Mhz)

NB  2 remarques :
1-
 RX(hard) en 57600 attend une sequence de 40 caracteres
UART bascule ensuite en 115200 pour dupliquer la trame en TX.
retour en "listen" 57600

2- J'ai testé (vite mais ok) ça en live avec un 16F877A
je n'avais pas de 876A sous la main.
Rvl



Re: trame
merci rvl.

j'ai chargé et testé.

avant que je puisse envoyer une trame il m'envoie en boucle 'BLANK  '  à
115200 bauds.

j'ai essayé de desassembler mais c'est plus compliqué qu'avec PICBASIC.

Si tu peux m'envoyer le source ca m'aidera.

Mais tu me confirmes que ca marche , je vais donc perseverer.

Merci
 


Site Timeline