jeudi 24 novembre 2011

Eurobot 2012 : La liaison I²C

Aujourd'hui, on a testé le bus I²C de nos cartes. Le but était de connecter deux cartes à base de PicAxe 20X2 et de tester l'échange d'information entre maitre et esclave du bus.





Après quelques minutes nous obtenons finalement un résultat mais pas d'échange de bytes entre nos deux PicAxe ... Bizarre bizarre ... Pourtant nos courbes ont l'air corrects ...
La ligne Clk de la liaison I²C
Ici les lignes Clk et Sda mises en parallèle
Finalement, on aura oublié de prendre en compte le fait que les données sont stockés dans une mémoire spéciale. Ceci fait, et en supprimant la ligne de debug, la liaison fonctionnera correctement et permettra d'échanger des informations entre les cartes.

Voici une petite vidéo qui montre deux cartes dialoguant en  I²C. L'une capture l'information provenant du capteur de distance, l'autre pilote le moteur en fonction de la distance de détection.

 

L'ensemble fonctionne très correctement  et la liaison semble fiable mais beaucoup d'autres tests sont à effectuer ...
Voici le code utilisé pour cette démonstration :
L'esclave :

#picaxe 20x2

;---------
;ESCLAVE !
;---------

;-----------------------------------------------------------------------------------------------
;objectif: ECRITURE ET LECTURE PAR UN MAITRE I2C
;-----------------------------------------------------------------------------------------------
;Ecriture:
;        Le maitre ecrit dans la memoire scratchpad de l'esclave ,
;        a ce moment la le flag I2C passse a 1. on génere alors une interruption
;        sur le front montant de ce flag.
;        On ecrit la derniere valeur reçut (stockée dans hi2clast) dans une variable
;        On reset le flag puis on réenclenche l'interruption
;Lecture:
;        On place la valeur d'une variable dans le scratchpad,celui ci sera lui par le maitre
;-----------------------------------------------------------------------------------------------


;-----------------------------------------------------------------------------------------------
;INITIALISATION
;-----------------------------------------------------------------------------------------------
init: ;Ce picaxe est l'esclave
    hi2csetup i2cslave, %10100000
    ;permet de creer une interuption sur l'etat haut du flag 6 (I2C)
    setintflags %01000000,%01000000
    ;Configuration des entrées ADC
    adcsetup = 00100000000000
    ;Initialisation de b1
    b1=0
   
;-----------------------------------------------------------------------------------------------
;PROGRAMME PRINCIPAL
;-----------------------------------------------------------------------------------------------
main:
   
    readadc B.6,b2;On lit une valeur de l'ADC ( capteur sharp par exemple )
    put 1,b2;On place la valeur dans le scratchpad
    debug
goto main
   

;-----------------------------------------------------------------------------------------------
;INITERRUPTION
;-----------------------------------------------------------------------------------------------
interrupt:
    get hi2clast,b1 ; Récupération du dernier Byte reçu
    let hi2cflag = 0  ;permet de remettre a l'etat bas le flag(I2C)
    setintflags %01000000,%01000000  ;permet de redéclencher l'interruption
return   

Le maitre :

#picaxe 20x2

;---------
;! MAITRE !
;---------

;-----------------------------------------------------------------------------------------------
;objectif: ECRITURE ET LECTURE D'UN ESCLAVE I2C
;-----------------------------------------------------------------------------------------------
;Ecriture:
;       
;Lecture:
;       
;-----------------------------------------------------------------------------------------------


;-----------------------------------------------------------------------------------------------
;INITIALISATION
;-----------------------------------------------------------------------------------------------
init: ;Ce picaxe est le maitre et a un esclave a l adresse %xxxxxxxxxxx
    hi2csetup i2cmaster, %10100000, i2cfast, i2cbyte
    ;initialisation de la valeur b2
    b2=0
    ;initialisation d'un servmoteur en b.0 pour faire un test
    servo B.0 , 80

;-----------------------------------------------------------------------------------------------
;PROGRAMME PRINCIPAL
;-----------------------------------------------------------------------------------------------
main:

    b1=1 ;On place 1 dans la variable b1
    hi2cout b1,(b1) ; On envoi la valeur b1 à l'esclave
    pause 10
    hi2cin 1,(b2);permet de lire des donnée placé dans le scratchpad de l esclave
    pause 10
    ;Routine de choix de direction du servomoteur en fonction de la valeur retournée en b2
    if b2<100 then
        servopos B.0 , 80
    else
        servopos B.0 , 175
    endif
goto main

Aucun commentaire:

Enregistrer un commentaire