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.
Didn't find your answer? Ask the community — no account required.
J
Jean-Christophe
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.
R
rvlegran
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
F
free.fr
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
F
free.fr
question subsidaire :
est-ce que vos codes marchaient aussi en simul sur MPLAB ?
merci
R
rvlegran
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
-------------
F
free.fr
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.
R
rvlegran
free.fr a ecrit
ha ba c'est pt'ete normal , puisque là c'est le basic de MikroELectronika ;o)
Rvl
F
free.fr
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.
J
Jean-Christophe
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.
F
free.fr
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.
J
Jean-Christophe
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 )
R
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) 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
R
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
F
free.fr
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 !
R
rvlegran
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
F
free.fr
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.
F
free.fr
le PIC est à 20 MHZ
la trame fait une quarantaine de caractères , emise toutes les 30 ms.
R
rvlegran
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
F
free.fr
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
Join the Discussion
Have something to add? Share your thoughts — no account required.
Didn't find your answer?
Ask the community — no account required
Report Content
You are reporting this content to the moderators. They will look at it
ASAP.