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 ...
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
#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