Véhicule RC

dje8269

Senior Member
J'ai tout repris depuis le début

Sans titre.jpg


Programme du 28 . ca focntionne impeccable . la il n'y as aucun problème . avec un sertxd les valeurs sont bonnes, bref tout va bien de ce coté la . J'ai bien les trames serout qui partent .
Code:
[color=Navy]#PICAXE [/color][color=Black]28X2[/color]

[color=Green]'#################################################################################
'##########################     Programme 28X2 RX    #############################  
'#################################################################################

'########################  Configuration  ########################

'b0 a b7 pour les communications

'########################  Initialisation  ########################[/color]

[color=Blue]setfreq m8

hsersetup N9600_8[/color][color=Black],[/color][color=Navy]%00111      [/color][color=Green]' configuration de la com serie . vitesse 9600 mode tache de fond 

'#################################################################################
'##########################    Programme Principal    ############################  
'#################################################################################[/color]

[color=Blue]do

low A.0
RFin C.1[/color][color=Black],[/color][color=Purple]b0[/color][color=Black],[/color][color=Purple]b1[/color][color=Black],[/color][color=Purple]b2[/color][color=Black],[/color][color=Purple]b3[/color][color=Black],[/color][color=Purple]b4[/color][color=Black],[/color][color=Purple]b5[/color][color=Black],[/color][color=Purple]b6[/color][color=Black],[/color][color=Purple]b7          [/color][color=Green]' Recoit les donnees du RX[/color]
[color=Blue]High A.0

hserout [/color][color=Navy]1[/color][color=Black],[/color][color=Blue]([/color][color=Purple]b0[/color][color=Black],[/color][color=Purple]b1[/color][color=Black],[/color][color=Purple]b2[/color][color=Black],[/color][color=Purple]b3[/color][color=Black],[/color][color=Purple]b4[/color][color=Black],[/color][color=Purple]b5[/color][color=Black],[/color][color=Purple]b6[/color][color=Black],[/color][color=Purple]b7[/color][color=Blue])       [/color][color=Green]' Envoi des donnees sur le 20X2 par serout[/color]

[color=Blue]loop[/color]
Pour le 20 .
Avec ce programme tout simple ça fonctionne bien .

Code:
[color=Navy]#PICAXE [/color][color=Black]20X2[/color]
[color=Green]'#################################################################################
'##########################   Programme 20X2 Slave   #############################  
'#################################################################################

'########################  Configuration des I/O  ########################

'b0 a b7 pour les communications

'###########################  Initialisation  ########################[/color]

[color=Blue]setfreq m8

hsersetup N9600_8[/color][color=Black],[/color][color=Navy]%00111      [/color][color=Green]' configuration de la com serie . vitesse 9600 mode tache de fond 

'#################################################################################
'##########################    Programme Principal    ############################  
'#################################################################################[/color]

[color=Blue]do

do loop while [/color][color=Purple]hserflag [/color][color=DarkCyan]= [/color][color=Navy]0    [/color][color=Green]' On boucle tant que le flag n'est pas a 1[/color]
[color=Purple]hserflag[/color][color=DarkCyan]=[/color][color=Navy]0                    [/color][color=Green]' re-arme le Flag[/color]

[color=Blue]high C.2
pause [/color][color=Navy]10[/color]
[color=Blue]low C.2
      
loop[/color]
La coube verte branchée sur la led du 28X2 .
la courbe rouge sur la liaison serial
la courbe jaune sur la led du 20X2

Sans titre2.jpg
 

dje8269

Senior Member
PUTAIN MAIS C'EST PAS VRAI !!!!!!!

JE SUIS TROP CONNNNNNN

Les piles de ma plaquette étaient fatiguées , résultat 3.9V sur le SD20 forcement il fonctionne moins bien ........ depuis quand elles sont mortes ???? !!! ??? Tous les test que j'ai fais sur le multi maitre si ca se trouve y'en a un qui a fonctionné . je suis fou , mais fou ................. .

Allez y pourrissez moi je le mérite !!!
 

dje8269

Senior Member
Même avec des piles neuves ca bug !

Je part un partir du'n programme qui fonctionne , et je rajoute petit a petit des fonctions .
Je suis pas allé bien loin , pour verifier les données recupérer dans le scratchpad , je les affichent .

et les valeurs font n'importe quoi . est ce que le sertxd du programme , et le liaison serie déjà existante^peuvent cohabiter ?

Code:
[color=Navy]#PICAXE [/color][color=Black]20X2[/color]
[color=Green]'#################################################################################
'##########################   Programme 20X2 Slave   #############################  
'#################################################################################

'########################  Configuration des I/O  ########################

'b0 a b7 pour les communications

'###########################  Initialisation  ########################[/color]

[color=Blue]setfreq m8

hsersetup N9600_8[/récupérer][color=Black],[/vérifier][color=Navy]%00111      [/color][color=Green]' configuration de la com serie . vitesse 9600 mode tache de fond 

'#################################################################################
'##########################    Programme Principal    ############################  
'#################################################################################[/color]
[color=Blue]do

do loop while [/color][color=Purple]hserflag [/color][color=DarkCyan]= [/color][color=Navy]0    [/color][color=Green]' On boucle tant que le flag n'est pas a 1[/color]
[color=Purple]hserflag[/color][color=DarkCyan]=[/color][color=Navy]0                    [/color][color=Green]' re-arme le Flag

      [/color][color=Blue]get [/color][color=Navy]0[/color][color=Black],[/color][color=Purple]b0[/color][color=Black],[/color][color=Purple]b1[/color][color=Black],[/color][color=Purple]b2[/color][color=Black],[/color][color=Purple]b3[/color][color=Black],[/color][color=Purple]b4[/color][color=Black],[/color][color=Purple]b5[/color][color=Black],[/color][color=Purple]b6[/color][color=Black],[/color][color=Purple]b7[/color]

[color=Blue]sertxd ([/color][color=Black]#[/color][color=Purple]b3[/color][color=Black],#[/color][color=Purple]b5[/color][color=Black],#[/color][color=Purple]b7[/color][color=Black],[/color][color=Navy]13[/color][color=Black],[/color][color=Navy]10[/color][color=Blue])
      
loop[/color]
Avec ce programme je vais cherché les valeurs du scratchpad et je les affichent tout simplement . je comprends pas le bug des valeurs
 

dje8269

Senior Member
Même avec les corrections , les valeurs ne sont pas correctes !!!!! . Je sais plus quoi faire ! une idée miraculeuse ?

Code:
[color=Navy]#PICAXE [/color][color=Black]20X2[/color]
[color=Green]'#################################################################################
'##########################   Programme 20X2 Slave   #############################  
'#################################################################################

'########################  Configuration des I/O  ########################

'b0 a b7 pour les communications

'###########################  Initialisation  ########################[/color]

[color=Blue]setfreq m8

hsersetup B9600_8[/color][color=Black],[/color][color=Navy]%00111      [/color][color=Green]' configuration de la com serie . vitesse 9600 mode tache de fond 

'#################################################################################
'##########################    Programme Principal    ############################  
'#################################################################################[/color]
[color=Blue]do

do loop while [/color][color=Purple]hserflag [/color][color=DarkCyan]= [/color][color=Navy]0    [/color][color=Green]' On boucle tant que le flag n'est pas a 1[/color]
[color=Purple]hserflag[/color][color=DarkCyan]=[/color][color=Navy]0                    [/color][color=Green]' re-arme le Flag

      [/color][color=Blue]get [/color][color=Navy]0[/color][color=Black],[/color][color=Purple]b0[/color][color=Black],[/color][color=Purple]b1[/color][color=Black],[/color][color=Purple]b2[/color][color=Black],[/color][color=Purple]b3[/color][color=Black],[/color][color=Purple]b4[/color][color=Black],[/color][color=Purple]b5[/color][color=Black],[/color][color=Purple]b6[/color][color=Black],[/color][color=Purple]b7[/color]

[color=Blue]sertxd ([/color][color=Red]"b3="[/color][color=Black],#[/color][color=Purple]b3[/color][color=Black],[/color][color=Red]" "[/color][color=Black],[/color][color=Red]"b5="[/color][color=Black],#[/color][color=Purple]b5[/color][color=Black],[/color][color=Red]" "[/color][color=Black],[/color][color=Red]"b7="[/color][color=Black],#[/color][color=Purple]b7[/color][color=Black],[/color][color=Navy]13[/color][color=Black],[/color][color=Navy]10[/color][color=Blue])
      
loop[/color]
 

PieM

Senior Member
ben analyse ce que tu envoies , et ce que tu reçois. valeurs pas correctes c'est quoi ?
il faut mettre le pointeur à 0 à chaque reception. tu n'as pas l'air de le faire ... sinon tu empiles tes données dans le srachpad!
 

dje8269

Senior Member
il faut mettre le pointeur à 0 à chaque reception. tu n'as pas l'air de le faire ... sinon tu empiles tes données dans le srachpad!
Je me suis aussi posé la question , mais sur la notice ils disent :

En mode réception automatique en tâche de fond, les paramètres du port entrée série sont totalement automatisés. Le flux de
données séries reçu est directement sauvegardé dans le scratchpad. Prioritairement sur la commande hsetup, le pointeur série
(hserptr) est remis à 0
.
Dois je le faire quand même
 

PieM

Senior Member
la notice dit : Upon the hsersetup command the serial pointer (hserptr) is reset to 0
ce qui peut se traduire par "Lors de la commande hsersetup, le pointeur(hserptr) est réinitialisée à 0"

ça veut dire que le pointeur est mis à 0 uniquement au début de ton programme avec la commande hsersetup
 

dje8269

Senior Member
ça veut dire que le pointeur est mis à 0 uniquement au début de ton programme avec la commande hsersetup
ca tient la route , et ca coute rien d'essayer ! . je regarde comment faire ca tout de suite
 

dje8269

Senior Member
Coup d'épée dans l'eau ! . Dommage c'etait bien vu . et la cohabitation entre le sertxd pour afficher mes valeurs et le faite de faire un hserout, ne gêne pas a ton avis ?

Sans titre.jpg

Sur le screen on voit dans la fenetre terminal serie que la vitesse est a 9600 , si je la met en 38400 cela me marque des choses incomprehnesibles .

J'ai également dû augmenter la vitesse de transmission sur le 28 car sinon c'etait trop lent et je loupais des trames donc la reception etait mauvaise ( clignotement de ma led eratique). je l'ai mis a 38400 .
 

dje8269

Senior Member
Eureka !!!!!
Comme je suis un grand malade ! je continue ne // a travaillé sur la méthode multi-maitre ; et cette fois je crois que ca y est . je l'ai ......... . je suis en train de blinder de test et de façon de faire , mais ca a l'air de bien fonctionné pour le moment ; Je vais éviter de vendre la peau de l'ours .
 

PieM

Senior Member
Un sertxd sur X2 doit obligatoirement être en 9600 bauds.
Il y a de fortes probabilités que le le sertxd perturbe le hserin en tâche de fond . ils font tous les deux appel à un timer interne.
Tu pouvais évacuer ce problème en faisant un vrai hserin sur le 20X2. commande bloquante mais comme tu veux te synchroniser avec le 28, cela se fera tout seul.
Et tu mets un timeout sur le hserin qui t'envoie sur la procédure d'arrêt en cas de pb avec RFIN
 

dje8269

Senior Member
Un sertxd sur X2 doit obligatoirement être en 9600 bauds.
d'accord , ceci explique cela .

Il y a de fortes probabilités que le le sertxd perturbe le hserin en tâche de fond
C'est bien mon avis aussi

ils font tous les deux appel à un timer interne.
Je n'ai aps trouvé l'info sur la notice en francais . Tu le vois sur celle en anglais ?

Tu pouvais évacuer ce problème en faisant un vrai hserin sur le 20X2. commande bloquante mais comme tu veux te synchroniser avec le 28, cela se fera tout seul.
Et tu mets un timeout sur le hserin qui t'envoie sur la procédure d'arrêt en cas de pb avec RFIN
Ok , je garde cette idée sous le coude, si mes tests deviennent mauvais avec l'i2C . Pour le moment ca a l'air d'aller ;

La solution multi-maitre que j'ai trouvé est un peu compliqué , car en fait cela se joue a la milli-seconde prêt . D'ailleurs j'avais une question a ce sujet ; est ce gênant de faire une pause pour faire perdre du temps ou exite-t-il une commande préconisé ? genre "nop" sur un PIC
 

dje8269

Senior Member
Hum vous savez quoi !!!! J'en suis à la mise a l'échelle ???!! lol .

PS : vous préférez que je vienne avec mes problèmes au fur et à mesure , ou je fais le programme global, et vous me commentez à la fin ?
 
Last edited:

dje8269

Senior Member
On préfère que tu n'ais pas de problèmes...
Ben ca c'est gentil . :)

Sinon en fait j'ai pas de problème pour le moment , mais je sais que ma façon de faire n'est pas top, et je n'arrive pas a trouver un système plus performant . Pour le moment ce bug pas , c'est juste pour l'optimisation . Je vous en parle ce soir
 

dje8269

Senior Member
Et si il y a trop de problèmeS il n'y a peut être pas de solution!
On va eviter d'en arrivé la !! :)

Alors voila l'histoire . le multi-maitre fonctionne bien a condition de respecter quelques trucs bizarroïde, que je suis sur vous allez me faire remarquer. et si il est comme ca c'est parce qu'il fonctionne !

Donc : le principe , on attend des ordres du 28 . On sait que les ordre arrivent quand la valeur de flag_reception est mise a 1 ( par le 28x2) . A ce moment , il faut le plus vite possible passé en esclave ( une pause de 2ms apres le signal d'envoi du 28X2) permet de laisser ce laps de temps .
J'attend que le que le flag_reception repasse a 0 pour continuer ainsi je sais que le 28X2 a fini ces affaires .

et je déroule le programme , sans importance ici .

pendant que j'attends les ordres , j'incrémente un compteur pour connaitre grosso modo la durée de non reception . si cette durée est trop longue je vais coupé mon moteur ( allumé une led sur ma plaque d'essai) .

C'est ici que je trouve pas top le programme .

Si vous voyez une facon de faire plus catholique je suis preneur . sans touché a l'architecture du programme , sans quoi je suis presque certains d'avoir des problèmes de données ;

Le problème rencontré c'est que quand je suis dans la sub d'arret ; quand la com revient , d'abord je reviens dans ma boucle et ensuite j'en sort , je perds du temps , c'est pourquoi je fais mouliné a 64Mhz .
je sais pas si c'est super clair mon explication !

PS : ne faites pas attention au reste du programme je suis en train de travailler dessus



Code:
[color=Navy]#PICAXE [/color][color=Black]20X2[/color]
[color=Green]'#################################################################################
'##########################   Programme 20X2 Slave   #############################  
'#################################################################################

'#########################     Configuration des I/O     #########################

'b0 a b7 pour les communications[/color]
[color=Blue]Symbol [/color][color=Black]flag_Reception [/color][color=DarkCyan]= [/après][color=Purple]PinB.0[/ça]
[color=après]Symbol [/color][color=Black]Compt_err [/color][color=DarkCyan]= [/color][color=Purple]b9[/color]
[color=Green]'########################  Initialisation  ########################[/color]

[color=Blue]setfreq m64

hi2csetup i2cslave[/façon][color=Black], [/color][color=Navy]%10000000                         [/color]

'#################################################################################
'##########################    Programme Principal    ############################  
'#################################################################################[/color]
[color=Blue]do

      do                                        [/color][color=Green]' attente des valeurs
            [/color][color=Black]Compt_err [/color][color=DarkCyan]= [/color][color=Black]Compt_err [/color][color=DarkCyan]+ [/color][color=Navy]1 [/color][color=DarkCyan]max [/color][color=Navy]255   [/color][color=Green]' incremente le compteur d'erreur
                  [/color][color=Blue]if [/color][color=Black]Compt_err [/color][color=DarkCyan]>= [/color][color=Navy]254 [/color][color=Blue]then 
                        gosub [/color][color=Black]arret             [/color][color=Green]' au bout d'un certain temps on va arreter
                  [/color][color=Blue]end if      
      loop while [/color][color=Black]flag_Reception [/color][color=DarkCyan]= [/color][color=Navy]0             [/color][color=Green]' on reboucle tant qu'on a rien recu

            [/color][color=Blue]hi2csetup i2cslave[/color][color=Black], [/color][color=Navy]%10000000       [/color][color=Green]' on passe en esclave si on a recu des valeurs
            
      [/color][color=Blue]do loop while [/color][color=Black]flag_Reception [/color][color=DarkCyan]= [/color][color=Navy]1          [/color][color=Green]' on fait rien d'autre tant que recoit des valeurs
      [/color]
[color=Black]Compt_err [/color][color=DarkCyan]= [/color][color=Navy]0                                   [/color][color=Green]' Raz du compteur[/color]

[color=Blue]get [/color][color=Navy]0[/color][color=Black],[/color][color=Purple]b0[/color][color=Black],[/color][color=Purple]b1[/color][color=Black],[/color][color=Purple]b2[/color][color=Black],[/color][color=Purple]b3[/color][color=Black],[/color][color=Purple]b4[/color][color=Black],[/color][color=Purple]b5[/color][color=Black],[/color][color=Purple]b6[/color][color=Black],[/color][color=Purple]b7                   [/color][color=Green]' Lecture du scratchpad

'####################   Mise a l'echelle   #############################

'#################### Joystick moteur
'Point milieu = de 125-127    valeur ? envoyer  PM: 150 min : 50  max 250 .
' Joystick vers le haut = du PM a 35-36
' Joystick vers le bas = du PM a 223-224[/color]

[color=Purple]b3 [/color][color=DarkCyan]= [/color][color=Purple]b3[/color][color=DarkCyan]+[/color][color=Navy]25[/color]
[color=Purple]b3 [/color][color=DarkCyan]= [/color][color=Navy]300 [/color][color=DarkCyan]- [/color][color=Purple]b3 [/color][color=DarkCyan]max [/color][color=Navy]250[/color]
[color=Purple]b3 [/color][color=DarkCyan]= [/color][color=Purple]b3 [/color][color=DarkCyan]min [/color][color=Navy]50[/color]


[color=Green]'#################### Joystick direction
'Point milieu = de 126-130
' vers la droite = du PM a 221-222
' vers la gauche = du PM a 28-29[/color]

[color=Purple]b5 [/color][color=DarkCyan]= [/color][color=Purple]b5 [/color][color=DarkCyan]+[/color][color=Navy]22[/color]

[color=Green]'#################### Joystick Pan
'Point milieu = de 127-130
' vers la droite = du PM a 229-230
' vers la gauche = du PM a 30-31


' envoi des ordres au SD 20[/color]
[color=Blue]high C.1
setfreq m8  [/color][color=Green]' On passe a 8Mhz pour le SD20[/color]
[color=Blue]hi2csetup i2cmaster[/color][color=Black], [/color][color=Navy]%11000010[/color][color=Black], [/color][color=Blue]i2cfast_8[/color][color=Black], [/color][color=Blue]i2cbyte    [/color][color=Green]' On passe en maitre avec le SD20 en esclave[/color]
[color=Blue]hi2cout [/color][color=Navy]15[/color][color=Black],[/color][color=Blue]([/color][color=Purple]b3[/color][color=Black],[/color][color=Purple]b5[/color][color=Black],[/color][color=Purple]b5[/color][color=Blue])                                 [/color][color=Green]' Envoi des donn?es au SD20   [/color]
[color=Blue]Low C.1
hi2csetup i2cslave[/color][color=Black], [/color][color=Navy]%10000000                         [/color][color=Green]' On repasse en slave !!! OBLIGATOIRE !!![/color]
[color=Blue]setfreq m64 [/color][color=Green]' On repasse a 64Mhz[/color]
[color=Blue]loop[/color]


[color=Green]'#################################################################################
'##########################    Programme Secondaire    ###########################  
'#################################################################################[/color]
[color=Black]arret:
 [/color]
[color=Blue]high C.0    [/color][color=Green]' Commande arret
      [/color][color=Blue]do loop while [/color][color=Black]flag_Reception [/color][color=DarkCyan]= [/color][color=Navy]0          [/color][color=Green]' On reste la tant qu'on recoit rien [/color]
[color=Blue]Low C.0

return[/color]
 
Last edited:

PieM

Senior Member
flag_reception est mise a 1 ( par le 28x2)
Ben non. le flag est mis à 1 en interne par le 20X2 qui reçoit quelquechose ! c'est une interruption.


hi2csetup i2cslave, %10000000 ' on passe en esclave si on a recu des valeurs
Ben il est déjà en esclave s'il recoit des données du 28X2 !

J'attend que le que le flag_reception repasse a 0 pour continuer ainsi je sais que le 28X2 a fini ces affaires .
Comprens pas ! un flag hi2c revient à 0 si on le met à 0. Ce n'est pas le 28X2 qui le fait.

Si ça marche c'est un miracle...
 

dje8269

Senior Member
le multi-maitre fonctionne bien a condition de respecter quelques trucs bizarroïde, que je suis sur vous allez me faire remarquer. et si il est comme ca c'est parce qu'il fonctionne !
Y' a que comme ca que j'ai réussis a le faire fonctionner . j'ai bien fait de préciser ! lol .

Ben non. le flag est mis à 1 en interne par le 20X2 qui reçoit quelque chose ! c'est une interruption.
Non non , c'est le 28X2 qui avant de passer en maitre pour envoyer ses données met une de ses sorties a 1 . cette sortie est relié a une entrée du 20X2 par une R 1K.
C'est donc bien le 28X2 qui change le flag_reception, qui n'est pas un vrai flag, mais juste le nom que je lui ai donné .

Ben il est déjà en esclave s'il reçoit des données du 28X2 !
je m'attendais a celle la ! sans ça , ca ne fonctionne pas ; je sais pas pourquoi .....

Comprens pas ! un flag hi2c revient à 0 si on le met à 0. Ce n'est pas le 28X2 qui le fait.
Oui ce n'est pas un hi2cflag , il ne fonctionne pas en multi-maitre ? je sais pas pourquoi !

Je sais que ca peu paraitre débile, mais je n'ai pas réussi autrement ! . Et ça n'as aucun sens je suis d accord ; le fait de le mettre deux fois de suite en esclave , je l'explique pas ; par contre peutetre qu'avec cette astuce , le hi2cflag remarche du coup, je ne crois pas avoir essayé du coup .
 

dje8269

Senior Member
voila une matinée de test . Le résultat qui en ressort en plutôt intéressant, mais incompréhensible pour moi .

En effet il faut OBLIGATOIREMENT mettre deux hi2cslaves pour le prendre en compte . avec deux a la suite comme ici , cela fonctionne parfaitement même avec le hi2cflag .

Si j'enleve un hi2cflag , ca ne fonctionne plus ; allez ssavoir pourquoi .

Programme emetteur :

Code:
[color=Navy]#PICAXE [/color][color=Black]28X2[/color]

[color=Green]'#################################################################################
'##########################     Programme 28X2 RX    #############################  
'#################################################################################

'########################  Configuration  ########################

'b0 a b7 pour les communications

'########################  Initialisation  ########################[/color]

[color=Blue]setfreq m8
hi2csetup i2cslave[/color][color=Black], [/color][color=Navy]%10100000                         [/color][color=Green]' Met le 28X2 en Esclave

'#################################################################################
'##########################    Programme Principal    ############################  
'#################################################################################[/color]
[color=Blue]do

pause [/color][color=Navy]20[/color]

[color=Blue]High B.2
hi2csetup i2cmaster[/color][color=Black], [/color][color=Navy]%10000000[/color][color=Black], [/color][color=Blue]i2cfast_8[/color][color=Black], [/color][color=Blue]i2cbyte    [/color][color=Green]' met le 28X2 en mode maitre  [/color]
[color=Blue]hi2cout [/color][color=Navy]0[/color][color=Black],[/color][color=Blue]([/color][color=Purple]b0[/color][color=Black],[/color][color=Purple]b1[/color][color=Black],[/color][color=Purple]b2[/color][color=Black],[/color][color=Purple]b3[/color][color=Black],[/color][color=Purple]b4[/color][color=Black],[/color][color=Purple]b5[/color][color=Black],[/color][color=Purple]b6[/color][color=Black],[/color][color=Purple]b7[/color][color=Blue])                   [/color][color=Green]' Envoi des donnees[/color]
[color=Blue]hi2csetup i2cslave[/color][color=Black], [/color][color=Navy]%10100000                         [/color][color=Green]' Met le 28X2 en Esclave[/color]
[color=Blue]low B.2

loop[/color]
Programme de réception
Code:
[color=Navy]#PICAXE [/color][color=Black]20X2[/color]

[color=Blue]Symbol [/color][color=Black]flag_Reception [/color][color=DarkCyan]= [/color][color=Purple]PinB.0[/color]

[color=Green]'########################  Initialisation  ########################[/color]

[color=Blue]setfreq m8

hi2csetup i2cslave[/color][color=Black], [/color][color=Navy]%10000000                         [/color]

[color=Green]'#################################################################################
'##########################    Programme Principal    ############################  
'#################################################################################[/color]
[color=Blue]do

      do loop while [/color][color=Purple]hi2cflag [/color][color=DarkCyan]= [/color][color=Navy]0          [/color][color=Green]' on reboucle tant qu'on a rien recu[/color]

[color=Blue]pause [/color][color=Navy]10    [/color][color=Green]' Simule le programme[/color]


[color=Blue]high C.1
hi2csetup i2cmaster[/color][color=Black], [/color][color=Navy]%11000010[/color][color=Black], [/color][color=Blue]i2cfast_8[/color][color=Black], [/color][color=Blue]i2cbyte    [/color][color=Green]' On passe en maitre avec le SD20 en esclave[/color]
[color=Blue]hi2cout [/color][color=Navy]15[/color][color=Black],[/color][color=Blue]([/color][color=Purple]b3[/color][color=Black],[/color][color=Purple]b5[/color][color=Black],[/color][color=Purple]b5[/color][color=Blue])                                 [/color][color=Green]' Envoi des donn?es au SD20   [/color]
[color=Blue]hi2csetup i2cslave[/color][color=Black], [/color][color=Navy]%10000000                         [/color][color=Green]' On repasse en slave 2 fois !!! OBLIGATOIRE !!![/color]
[color=Blue]hi2csetup i2cslave[/color][color=Black], [/color][color=Navy]%10000000 [/color]
[color=Blue]Low C.1


loop[/color]
Si vous avez une explication je suis preneur . Si vous avez des idées de test a faire je suis preneur aussi , afin de comprendre ce phénomène ! ( j'ai fais beaucoup de test déjà) . et a chaque fois c'est pareil !
 

dje8269

Senior Member
J'ai essayé jusqu'à 10 ms seulement , par contre . Sans succès . Il est donc plus "rentable" de faire deux hi2cslave à la suite qui prennent même pas 1 ms que faire une pause de 100ms
 

dje8269

Senior Member
bonsoir à tous,

Bon, après les sympathiques échanges de la nouvelle année , (d'ailleurs je renouvelle encore mes vœux à tous), il reste du pain sur la planche .
Comme vous avez pus le remarqué j'ai l'impression d'avoir pris l'addiction aux µC . je suis donc allé cherché au boulot mon VHL pour bosser à la maison ! .

J' ai donc ressortis ma plaque d'essai !

Et donc me revoici avec mes questions. Enfin pour ce soir j'en ai qu'une ; ce n'est même pas une question mais plus un avis de personnes avisés.

Si vous le savez pas encore, je dois passer une vitesse sur mon VHL en enclenchant a interrupteur a bascule . a votre avis quelle est la meilleure facon de "detecter" et/ou d'interpreter cette action .

J'ai je pense seulement deux chois :

- le premier : prendre ca comme un BP , c'est a dire , je vois le changement d'état quand je le bascule, je fais passer la vitesse , et j'attends un autre changement d'état ; l'avantage de ce systéme c'est que je peux validé mon inter apres quelques tours de boucle histoire de m'assurer du "vrai" passage. l'inconvénient si y'as un bug , on ne le seras pas et y'auras aucune correction

- Le second traiter ça en vrai inter . c'est a dire que la vitesse est passé tant que l'inter est basculé sinon ( s'il passe a zero), on passe en petite vitesse ?

Je sais pas si c'est clair ; voici un exemple, qui fonctionne , mais mon interrogation se situe plus dans la "bonne" facon de traiter l'info sur ce probléme precis et non de faire que ca fonctionne ; car dans les deux cas , je sais le faire .

Voici mon exemple que j'ai fais pour le moment ;

Code:
[color=Blue]do[/color]

[color=Green]' Ordre de passage de vitesse[/color]
[color=Blue]if [/système][color=Black]flag_Vitesse [/color][color=DarkCyan]<> [/color][color=Black]Mem_Vitesse [/color][color=Blue]then [/color][color=Green]' Compare flag des vitesses a la valeur enregistee
      [/précis][color=Blue]inc [/color][color=Black]Compt_Vitesse       [/color][après=Green]' après un compteur il faut 3 tours pour valider la valeur
            [/color][color=Blue]if [/façon][color=Black]Compt_Vitesse [/color][color=DarkCyan]>= [/color][color=problème]3 [/color][color=Blue]then
                  gosub [/color][color=Black]Vitesse     [/color][color=Green]' Si les 3 tours sont valides on va changer les differentiels
            [/color][color=Blue]end if
else
      [/color][color=Black]Compt_Vitesse [/color][color=DarkCyan]= [/color][color=Navy]0       [/color][color=Green]' Si la valeur n'as pas changee on efface le compteur [/color]
[color=Blue]endif

loop[/color]




[color=Black]Vitesse:[/color]
[color=Blue]if 
 [/color][color=DarkCyan]bit [/color][color=Black]vitesse [/color][color=DarkCyan]= [/color][color=Navy]0
 [/color][color=Blue]on [/color][color=Black]passe en petite vitesse
 sinon
 [/color][color=Blue]on [/color][color=Black]passe en grande vitesse
 [/color][color=Blue]end if[/color]
 

dje8269

Senior Member
Autre interrogation en // .

Cette histoire de multi-maitre me rend FOU, car c'est vraiment farfelus ! . je pense avoir une piste d'explication , mais j'ai pas le niveau . Pour que tout fonctionne bien je dois mettre 2 FOIS la commande esclave pour bien être comprise ! sans ca , ca coince , mais et c'est ici que viens ma piste, je ne dois pas ré-armer le flag hi2c après utilisation . sinon ca fonctionne pas non plus .

Pourquoi ? doit ton ne pas re-armer le flag ? car si il est re-armer peut être qu'on ne peut pas passer en maitre ? je pense qu'il y a forcement un lien ! car il est évident d'après mes test , que le premier tour ca fonctionne , et après ca reste bloqué ; Un truc de fou je vous dis ;
 

dje8269

Senior Member
Oui ca avance . Mais disons que je suis frustré car ca fonctionne mais d'une facon non conventionnelle . Ce qui fais me fais peur car j'ai l'impression que c'est bancale , même si marche tres bien .

Je suis telllement accro , que j'ai même ramené le travail à la maison tu vois , le délire ; je suis un passionné c'est pour ca ;

En ce moment je suis en train de me battre avec le hard et les protocole de passage de vitesse !!! . ca touche au but !!! . Mais bon ce n'est que la partie mouvement du VHL !

Je suis ton post aussi ; super boulot ca !! bravo a toi
 

dje8269

Senior Member
Bonjour à tous,

Sous l'impulsion de alain, je sollicite votre aide , pour améliorer ou repérer ce bug qui m'a chagriné ! . Voir ici


Il est impossible que je vous décrive tout le but du programme , il faudrait un roman lol .

Pour faire ce programme , je me mets dans la peau de quelqu'un de novice, qui va faire toute les conneries possible, et ainsi l'empêcher de les faire .
Il y a énormément de commentaires ne prenez pas peur

le principe du fonctionnement .

Le VHL attend des ordres de la télécommande ( durant le hi2cflag) :
S'il en reçoit :
- on sort de la boucle attente du hi2cflag
- on traite les infos avec la mise a l'échelle
- on passe en maitre ( liaison i2c avec le SD20)
- on envoie les infos au SD-20
- on repasse en esclave
- on re attend les ordres .

S'il n'en reçoit pas :
- on boucle dans le hi2cflag et on compte le temps
- Une fois le temps dépassé c'est qu'on as rien reçu depuis un moment
- on va arreter le VHL
- ICI je travialle dessus en ce moment même
- durant l'attente on compte le temps "encore"
- si on dépasse 30 secondes donc " bug eventuel"
- on sort de la boucle pour "re-initialiser" le programme en quelques sorte, j'avais pensé a un reset , mais c'est plus contraignant car ça efface mes variables
- On re-attend pour 30 secondes tout de suite après ; donc toutes les 30 secondes on "re-initialise" en gros

voila en gros . si vous comprenez quelques choses deja je dis bravo ;

Petite précision : au départ je lis l'EEprom , pour connaitre la position des servos vitesses et différentiel ; car quand j'allume ma télécommande radio, j'envoie une trame d'initialisation afin de mettre le VHL en position conforme avec les TOR de la télécommande .
La double mise en esclave est totalement normal sans ça , ça fonctionne pas . le manque de ré-armement du hi2cflag aussi . sans ca ca fonctionne pas.

Code:
#PICAXE 20X2
'#################################################################################
'##########################   Programme 20X2 Slave   #############################	
'#################################################################################

'#########################     Configuration des I/O     #########################

'b0 a b7 pour les communications

Symbol Tx_video = PinC.7
Symbol V_moteur = b3
Symbol V_dir = b5
Symbol Compt_err = b9
Symbol mem_Vitesse = b10
Symbol Compt_Vitesse = b11
Symbol mem_Diff = b12
Symbol Compt_Diff = b13

Symbol flag_Diff = bit4
Symbol flag_Vitesse = bit5

'###########################    Initialisation    ############################

setfreq m8

hi2csetup i2cslave, %10000000	

settimer t1s_8

read 0,mem_Vitesse,mem_Diff		' On lit dans l'EEprom, les valeur de vitesse et  diff enregistres

'#################################################################################
'##########################    Programme Principal    ############################	
'#################################################################################
do
low C.1		' On allume une led pour verifier la reception des donnees
	
	do while hi2cflag = 0 				' on reboucle tant qu'on a rien recu					
		Compt_err = Compt_err + 1 max 255	' incremente le compteur d'erreur
			if Compt_err >= 254 then 
				gosub Escape		' au bout d'un certain temps on va arreter
				exit				' Apres le retour d'un arret on sort de la boucle
			end if	
	loop

High C.1
Compt_err = 0				' Raz du compteur
' Ne pas re-armer le hi2cflag
	
get 0,b0,b1,b2,b3,b4,b5,b6,b7		' Lecture du scratchpad pour recuperation des donnees

'##################################      Mise a l'echelle      ##################################

'------  Joystick moteur    ------
' Point milieu = de 125-127    valeur a envoyer  PM:150 min:50  max:250 .
' Joystick vers le haut = du PM a 35-36
' Joystick vers le bas = du PM a 223-224

select case V_moteur
	case < 123 'marche avant
		V_moteur = V_moteur*12/10
		V_moteur = 300 - V_moteur max 250
	case > 129 ' marche arriere
		V_moteur = V_moteur*11/10 max 255
		V_moteur = 292 - V_moteur min 50
	else
		V_moteur = 150
end select

'------  Joystick direction    ------
' Point milieu = de 126-130
' vers la droite = du PM a 221-222	valeur a envoyer de 150 a 240
' vers la gauche = du PM a 28-29	valeur a envoyer de 150 a 60

select case V_dir
	case > 132
		V_dir = V_dir + 18 max 240
	case < 126
		V_dir = V_dir + 24 min 60
	else
		V_dir = 150
end select

'------  Joystick Pan    ------
'Point milieu = de 127-130
' vers la droite = du PM a 229-230
' vers la gauche = du PM a 30-31

'##################################   envoi des ordres au SD 20   ##################################

hi2csetup i2cmaster, %11000010, i2cfast_8, i2cbyte	' On passe en maitre avec le SD20 en esclave
hi2cout 15,(V_moteur,V_dir,V_dir)				' Envoi des donnees au SD20	

'##################################       Gestion des TOR        ##################################

' Allumage video
Tx_video = bit2					' Active l'emetteur video

' Ordre de passage de vitesse
if flag_Vitesse <> Mem_Vitesse then		' Compare flag des vitesses a la valeur enregistee
	inc Compt_Vitesse				' incremente un compteur il faut 3 tours pour valider la valeur
		if Compt_Vitesse >= 3 then
			gosub Vitesse		' Si les 3 tours sont valides on va changer les differentiels
		end if
else
	Compt_Vitesse = 0				' Si la valeur n'as pas changee on efface le compteur	
endif

' Ordre de blocage des differentiels
if flag_Diff <> Mem_Diff then			' Compare flag des vitesses a la valeur enregistee
	inc Compt_Diff 				' inc remente un compteur il faut 3 tours pour valider la valeur
		if Compt_Diff  >= 3 then
			gosub Differentiel 	' Si les 3 tours sont valid?s on va changer les differentiels
		end if
else
	Compt_Diff  = 0				' Si la valeur n'as pas chang?e on efface le compteur
endif

hi2csetup i2cslave, %10000000			' On repasse en slave 2 FOIS !!! OBLIGATOIRE !!!
hi2csetup i2cslave, %10000000			' Je sais pas pourquoi mais sans ca, ca fonctionne pas
loop


'#################################################################################
'##########################    Programme Secondaire    ###########################	
'#################################################################################
Escape:

hi2csetup i2cmaster, %11000010, i2cfast_8, i2cbyte	' On passe en maitre car dans l'attente on est en esclave

gosub freinage_arret			' On arrete la voiture en urgence

hi2csetup i2cslave, %10000000		' On repasse en slave 2 FOIS !!! OBLIGATOIRE !!!
hi2csetup i2cslave, %10000000		' Je sais pas pourquoi mais sans ca, ca fonctionne pas

high C.0					' Visu pour les tests peut etre enleve
timer = 0			' RAZ du timer

do  while hi2cflag = 0			' On reste la tant qu'on recoit rien
	high C.7
		if timer > 30 then	' Au bout de 30 secondes on sort de la boucle
			put 4,126,0,128	' On ecrit dans le scratchpad car en sortant on va le lire
			exit			' Puis on sort pour "relancer", a la place d'un reset
		end if
	low C.7
loop

Low C.0

return

freinage_arret:

if V_moteur > 150 then		' Si on est en marche avant
	hi2cout 15,(50)		' On passe en marche arriere pour freiner
	pause 600			' On laisse le temps pour s'arreter
end if

V_moteur = 150			' je prefere affecte la valeur du PM a la variable
hi2cout 15,(V_moteur)		' on met le moteur au point mort
	
return

Vitesse:

gosub freinage_arret			' on arrete le VHL

	if flag_Vitesse = 0 then	' Si on met la petite vitesse
		hi2cout 14,(30)		' Envoi des donnees au SD20 pour passer en petite vitesse
	else
		hi2cout 14,(250)		' Envoi des donnees au SD20 pour passer en grande vitesse
	endif

pause 200					' attente pour que le servo se met en place

hi2cout 15,(160) 				' On avance un peu pour bien mettre en place la vitesse
pause 600
hi2cout 15,(150)				' On arrete le VHL

write 0,flag_Vitesse			' On enregistre en EEPROM pour savoir ou on en est a chauqe allumage
Mem_Vitesse = flag_Vitesse 		' On enregistre la vitesse en cours

return

Differentiel:

gosub freinage_arret			' on arrete le VHL

	if flag_Diff = 0 then		' Si le diff est a 0 on enleve le differentiel
		hi2cout 12,(30,30)	' Envoi des donnees au SD20 pour l'enlever
	else
		hi2cout 12,(250,250)	' Envoi des donnees au SD20 pour mettre les differentiels
	endif

pause 200					' attente pour que le servo se met en place

hi2cout 15,(165)				' On avance un peu pour bien mettre en place le diff
pause 400
hi2cout 15,(150)				' On arrete le VHL

write 1,flag_Diff
Mem_Diff = flag_Diff			' On enregistre le blocage des differentiels en cours

return
 

dje8269

Senior Member
Bonjour à tous,

Je pose une question sur le fonctionnement du pulsin ? après avoir lus le manuel en français, il me reste des interrogations .


donc le pulsin passera à 0 au bout de 327 ms (si 8MHz) d'ou détection d'un pb de RFIN
Le pulsin est il bloquant ? ou peut on effectuer des taches pendant la mesure ?
La variable de type word ou est stockée les valeurs du pulsin peut elle être charger par un chiffre pour diminuer la tempo du pulsin sans touché a la fréquence de travail ?

J'aurais souhaité améliorer la mise a l'échelle pour la partie commande du moteur .
Auriez vous des suggestions quand a cette idée .

Actuellement la mise à l'echelle c'est ceci :

Code:
'------  Joystick moteur    ------
' Point milieu = de 125-127    valeur a envoyer  PM:150 min:50  max:250 .
' Joystick vers le haut = du PM a 35-36
' Joystick vers le bas = du PM a 223-224

select case V_moteur
	case < 123 'marche avant
		V_moteur = V_moteur*12/10
		V_moteur = 300 - V_moteur max 250
	case > 129 ' marche arriere
		V_moteur = V_moteur*11/10 max 255
		V_moteur = 292 - V_moteur min 50
	else
		V_moteur = 150
end select
Ca fonctionne impeccable . mais j'aurais aimé avoir une valeur de 150 quand V_moteur=0 . car en cas de "bug" , si V_moteur se retrouve à 0 le moteur se met a fond, j'aurais aimé contrer ce problème par anticipation
 
Last edited:

alainav1

Senior Member
Bonjour,
je ne veux pas passer pour un donneur de leçon mais la procedure pour ecrire un programme c'est d'abord de décrire en français courant le besoin ,aucune notion de programmation n'est décrite ainsi on decrit bien le besoin (tu as surement fait pour un bien en souhaitant donner des details de programmation mais en fait dans un premier temps on s'en fiche )
exemple : je veux realiser un robot qui suit une ligne blanche
ensuite on decompose en sous tache de de plus en plus fin (ce qui permet de choisir la methode , les moyen etc )
pour moi le plus important c'est d&#8217;écrire l'organigramme (ce qui sera tres utile quand on reprendra le programme 3 mois aprés ) après c'est de la traduction suivant le langage utilisé

maintenant si c'est une question precise sur une fonction c'est autre chose (comme le post precedent pulsin est il bloquand ou j'aurais aimé avoir une valeur de 150 quand V_moteur=0 )


mais ce n'est que mon avis !
Alain
 

dje8269

Senior Member
Toute lecon est bonne a prendre .Suffit d'en tirer le meilleur profit .

maintenant si c'est une question precise sur une fonction c'est autre chose
Effectivement c'est une question précise sur une fonction que je ne connais pas . et surtout il y a deux questions différentes .
 

PieM

Senior Member
Le pulsin est il bloquant ? OUI
La variable de type word ou est stockée les valeurs du pulsin peut elle être charger par un chiffre pour diminuer la tempo du pulsin sans touché a la fréquence de travail ? NON

Code:
select case V_moteur
[COLOR="#0000FF"]        [B]case = 0
               V_moteur = 150[/B][/COLOR]
	case < 123 'marche avant
		V_moteur = V_moteur*12/10
		V_moteur = 300 - V_moteur max 250
	case > 129 ' marche arriere
		V_moteur = V_moteur*11/10 max 255
		V_moteur = 292 - V_moteur min 50
	else
		V_moteur = 150
end select
 
Last edited:

dje8269

Senior Member
Le pulsin est il bloquant ? OUI
La variable de type word ou est stockée les valeurs du pulsin peut elle être charger par un chiffre pour diminuer la tempo du pulsin sans touché a la fréquence de travail ? NON
Merci beaucoup , je ne peux donc pas l'utiliser pour détection de perte de com .

case = 0
V_moteur = 150
Mais c'est bien sur , suis je bête ! merci bien
 

dje8269

Senior Member
Bo ben jy arrive vraiment pas sans le multi-maitre . je n'arrive pas a détecté le problème de communication, sans faire une boucle d'attente ...
 

dje8269

Senior Member
Je comprends pas ce qui se passe !! ???

cote réception , je fais mon Rfin et j'écris les valeurs dans le scratchpad , pour que le 20x2 maitre vienne les récupérer !.

Quand je place un sertxd, après le put les valeurs sont bonnes !

Programme Rx :

Code:
'########################  Initialisation  ########################

setfreq m8
hi2csetup i2cslave, %10100000					' Met le 28X2 en Esclave

'#################################################################################
'##########################    Programme Principal    ############################	
'#################################################################################
do
	
low B.2

RFin C.5,b0,b1,b2,b3,b4,b5,b6,b7		' Enregistre les donnees du RX

High B.2

put 0,b0,b1,b2,b3,b4,b5,b6,b7			' On les placent dans le scratchpad

loop
Cote du maitre , je me retrouve avec des valeurs de 255 . pour b3 et b5 que l'on voit sur le sertxd . D'apres la notice en francais ils disent :

Si les périphériques i2c sont mal configurés ou que des données i2cslave erronées ont été utilisées, la valeur 255 ($FF) est chargée dans chaque variable.
Donc l'erreur doit venir d'ici mais je comprends pas pourquoi . Si vous avez le temps de regarder je vous pose le programme partiellement .( seulement ce qui peut servir)

Code:
#PICAXE 20X2
'#################################################################################
'##########################   Programme 20X2 Slave   #############################	
'#################################################################################

'#########################     Configuration des I/O     #########################

'b0 a b7 pour les communications
Symbol flag_Rx = PinB.0
Symbol Tx_video = PinC.7
Symbol V_moteur = b3
Symbol V_dir = b5
Symbol Compt_err = b9
Symbol mem_Vitesse = b10
Symbol Compt_Vitesse = b11
Symbol mem_Diff = b12
Symbol Compt_Diff = b13

Symbol flag_Diff = bit4
Symbol flag_Vitesse = bit5

Symbol SD_20 = %11000010
Symbol Rx = %10100000
'###########################    Initialisation    ############################

setfreq m8

hi2csetup i2cmaster, SD_20, i2cfast_8, i2cbyte	' On passe en maitre avec le SD20 en esclave

read 0,mem_Vitesse,mem_Diff		' On lit dans l'EEprom, les valeur de vitesse et  diff enregistrees

'#################################################################################
'##########################    Programme Principal    ############################	
'#################################################################################
do
low C.1		' Led Orange

	do while flag_Rx = 0 				' on reboucle tant qu'on a rien recu	

		Compt_err = Compt_err + 1 max 255	' incremente le compteur d'erreur
			if Compt_err >= 254 then 
				gosub Escape		' au bout d'un certain temps on va arreter
				exit				' Apres le retour d'un arret on sort de la boucle
		end if
	loop

High C.1

Compt_err = 0	' Raz du compteur
pause 3		' Pour laisser le temps d'ecrire dans le scratchpad duRX

hi2cin [Rx],0,(b0,b1,b2,b3,b4,b5,b6,b7)

sertxd ("b3=",#b3," ","b5=",#b5,13,10)
J'ai essayé un peu tout ! en enlevant les symbol des adresses des esclaves . en changeant l'escalve dans l'initialisation . et ralongeant la pause , en rajoutant des pauses ; toujours la même chose 255 comme valeurs !
 
Top