PIC : changer vitesse RS232 à chaud

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.

Reply to
free.fr
Loading thread data ...

On Jan 23, 11:16 am, "free.fr"

Oui je te le confirme : c'est possible =E0 la vol=E9e et sans reset, je l'ai d=E9ja fait sur du MicroChip et d'autres uC.

Mais il ne suffit pas de (par exemple) une simple =E9criture des registres pour la vitesse du port : si je me souviens bien, il y a une sequence =E0 respecter, genre : d=E9valider le port, d=E9valider les =E9ventuelles IT, positionner les param=E8tres (diviseurs, vitesse, parit=E9, etc) puis seulement ensuite, revalider le port.

Il faut =E9plucher la doc de ton 16F876, mais ce genre de manip marche nickel.

Reply to
Jean-Christophe

free.fr a ecrit

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

Reply to
rvlegran

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

Reply to
free.fr

question subsidaire :

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

merci

Reply to
free.fr

free.fr a ecrit

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

-------------

Reply to
rvlegran

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.

Reply to
free.fr

free.fr a ecrit

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

Rvl

Reply to
rvlegran

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.

Reply to
free.fr

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

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 s=E9rie (je ne sais pas c'est le cas pour le tien)

Dans ce cas tu param=E8tres 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 inutilis=E9) tu branches le Tx sur le port#2 (Rx inutilis=E9) 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 vol=E9e te cause probl=E8me, au pire il y a la solution d'utiliser un chip UART externe au uC : cela revient au cas pr=E9c=E9dent, avec par exemple le port du uC en =E9mission =E0 115,2 K et l'UART en r=E9ception =E0 62,5 K.

Reply to
Jean-Christophe

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.

Reply to
free.fr

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

Bon, c'est d=E9ja ca.

En ce qui concerne l'=E9mission, pour faire un port s=E9rie externe il suffit juste d'un simple registre =E0 d=E9calage, pas besoin de tout un uC au grand complet. Il faut v=E9rifier les timmings et coder en soft le bit de partit=E9 ( s'il y en a un )

Reply to
Jean-Christophe

free.fr a ecrit

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

Reply to
rvlegran

free.fr a ecrit

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

Reply to
rvlegran

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 !

Reply to
free.fr

free.fr a ecrit

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

Reply to
rvlegran

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.

Reply to
free.fr

le PIC est à 20 MHZ

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

Reply to
free.fr

free.fr a ecrit

bonjour free.fr juste pour test ci joint

formatting link
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
Reply to
rvlegran

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

Reply to
free.fr

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.