Ultrason et picaxe

JRTEC

Senior Member
Bonjour

je suis en train de travailler sur un proget de regulation

Mais j ai beau lire et relire des sujets, j ene trouve pas quelles sont les exigences necessaires des ports d un picaxe pour y relier un module HC-SR04 .

Je veux dire par la , quelle qualite doit avaoir le port picaxe pour y relier la ligne TRIG ? ( ADC, PWM ??? ) et idem pour la line ECHO

Mon projet se baserai sur un Picaxe 20M2 , et j ai besoin d y relier 2 module ultrason et tous les ports de B0 a B5 sont utilisé pour un LCD

Par avance merci de votre aide
 

PieM

Senior Member
Aucune qualité particulière:
le TRIG doit être relié à une sortie qui va être utilisée par la commande pulsout. donc possible sur C.0 à C.7 sauf C.6
le ECHO doit être relié à une entrée qui va être utilisée par la commande pulsin. donc possible sur C.0 à C.7

Attention a bien décaler les instructions si les modules sont proches, sinon brouillage !
et attendre 20ms entre deux mesures sur le même module.
 

JRTEC

Senior Member
bonjour

je reviens vers au sujet de ces ultrason , j ai realise un motage avec un module HC-SR04 , un 20M2 et un LCD 1602 donc voici le schema ( c est une ebauche il manque des bout pour l instant :

ultra son rampe 2.JPG

j ai realiser un programme afin d afficher l information de distance

' JRTEC essai ultrason

#picaxe 20M2 'directive utilisation pisaxe 18M2

'***** Nomination des Entr?es / Sorties ************

symbol trig= C.3 'emission
symbol echo=C.2 'reception

'***** Nomination des variables *********************


symbol mill=b7 'chiffre des millier de cm
symbol cent=b8 'chiffre des centaines de cm
symbol dix=b9 'chiffre des dizaimes de cm
symbol unit=b10 'chiffre des unites de cm



symbol dist=w11 'distance totale



'********************************************************************

setfreq m32 'Fr?quense horloge interne picaxe ? 32Mhz

'***** Initialisation LCD*******************

dirsB=%111111 'd?fini les I/O ports B en sortie

'*****Donn?es d'initialisation de l'afficheur Type HD44780 ***********
'*****Pour l'affichage, on utilise les ports BO ? B5 du 20M2********

SYMBOL RS = B.0 ; 0 = Command 1 = Data
SYMBOL E = B.1 ; 0 = Idle 1 = Active
SYMBOL DB4 = B.2 ; LCD Data Line 4
SYMBOL DB5 = B.3 ; LCD Data Line 5
SYMBOL DB6 = B.4 ; LCD Data Line 6
SYMBOL DB7 = B.5 ; LCD Data Line 7
SYMBOL RSCMDmask = %00000000 ; Select Command register
SYMBOL RSDATmask = %00000001 ; Select Data register
SYMBOL cpt = b1
SYMBOL car = b2
SYMBOL rsbit = b3

'Nibble commands - To initialise 4-bit mode

DATA 0,( $33 ) ; %0011---- %0011---- 8-bit / 8-bit
DATA 1,( $32 ) ; %0011---- %0010---- 8-bit / 4-bit

'Byte commands - To configure the LCD

DATA 2,( %00101000 ) ; %001LNF00 Display Format
DATA 3,( %00001100 ) ; %00001DCB Display On
DATA 4,( %00000110 ) ; %000001IS Cursor Move
' ; L : 0 = 4-bit Mode 1 = 8-bit Mode
' ; N : 0 = 1 Line 1 = 2 Lines
' ; F : 0 = 5x7 Pixels 1 = N/A
' ; D : 0 = Display Off 1 = Display On
' ; C : 0 = Cursor Off 1 = Cursor On
' ; B : 0 = Cursor Steady 1 = Cursor Flash
' ; I : 0 = Dec Cursor 1 = Inc Cursor
' ; S : 0 = Cursor Move 1 = Display Shift
DATA 5,( $01 ) ; Clear Screen

'***** Envoi de ces donn?es au LCD ***************
PowerOnReset:
FOR cpt = 0 TO 5
READ cpt,car
GOSUB SendInitCmdByte
NEXT

'***** DEBUT PROGRAMME PERSO ************************


DATA 6,("Dist1= cm") 'Texte sur l'afficheur ligne1 (16c)


gosub texte 'Texte ligne 1 et 2

pause 4000 'pause de 0.5 s à la mise sous tension

DO

low 1
pulsout C.2,1
pulsin C.3,1,w1
w3=w1*10
dist=w3/58
bintoascii dist,cent,dix,unit

pause 10

gosub affiche 'Affichage des donn?es

pause 100


LOOP

'***** Affichage des donn?es ************************************
affiche:
car= $80 | $07 'curseur d?but ligne1 col 15
gosub SendCmdByte

car=mill
GOSUB SendDataByte

car=cent
GOSUB SendDataByte

car=dix '
GOSUB SendDataByte

car=unit '
GOSUB SendDataByte




'***** Ecriture du texte fixe sur afficheur *********************************************************
texte: 'position du curceur ligne 1 et ecriture du label

car= $80 | $00 'curseur d?but ligne1
gosub SendCmdByte

FOR cpt = 6 TO 21 'lecture texte ligne1
READ cpt,car
GOSUB SendDataByte
NEXT
'
return
'


'***** Sous programmes d'?criture du LCD************
SendInitCmdByte:

PAUSE 60 ; Delay 15mS

SendCmdByte:

rsbit = RSCMDmask ; RSCDmask = 0 ;Send to Command register

SendDataByte:

pinsB = car & $F0 / 4 | rsbit ; Put MSB out first
PULSOUT E,1 ; Give pulse on E

pinsB = car & $0F * 4 | rsbit ; Put LSB out second
PULSOUT E,1 ; Give pulse on E

rsbit = RSDATmask ; RSDATmask = 1 ; Send to Data register next

RETURN
Mais le resultat n est pas la hauteur de mes espoirs

D une part , l affichage de la valeur clignate en permanance et n est donc pas lisible

D autre voula avoir une valeur a 4 chiffres , si dans la fonction bintoacsii je mets la decomposition en 4 chiffre j ai une erreur

Votre aide serait la bienvenue
 

MGU

Senior Member
Bonjour JRTEC

Pour le bintoascii:

Si la commande concerne une variable byte, il y faut 3 arguments
Ex : bintoascii varbyte,b1,b2,b3

Si la commande concerne une variable word, il faut obligatoirement 5 arguments
Ex : bintoascii varword,b1,b2,b3,b4,b5

Pour la gestion du LCD, on peut faire le faire avec une liaison 6 fils, mais c'est pénalisant, en hard et en soft.

Une solution facile et pas chère est l'utilisation de modules I2C, plus que deux fils et code plus simple.
http://electromag1.wifeo.com/lcd-i2c-expandeur-pcf8574.php

Enfin, je ne conseille plus d'utiliser l'EEPROM mais un lookup pour mémoriser du texte.

Pour le clignotement, si on efface pas l’écran, je ne vois pas de raison.

MM
 
Last edited:

MGU

Senior Member
Quelques modif à tout hasard, à essayer, pour voir.... :

Code:
' JRTEC essai ultrason

#picaxe 20M2 'directive utilisation pisaxe 18M2

'***** Nomination des Entr?es / Sorties ************

symbol trig= C.3 'emission
symbol echo=C.2 'reception

'***** Nomination des variables *********************


symbol mill=b7 'chiffre des millier de cm
symbol cent=b8 'chiffre des centaines de cm
symbol dix=b9 'chiffre des dizaimes de cm
symbol unit=b12 'chiffre des unites de cm
symbol dist=w13 'distance totale
'************************************************* *******************

setfreq m32 'Fr?quense horloge interne picaxe ? 32Mhz
dirsB=%111111 'd?fini les I/O ports B en sortie

'*****Données d'initialisation de l'afficheur Type HD44780 ***********
'*****Pour l'affichage, on utilise les ports BO ? B5 du 20M2********

SYMBOL RS = B.0 ; 0 = Command 1 = Data
SYMBOL E = B.1 ; 0 = Idle 1 = Active
SYMBOL DB4 = B.2 ; LCD Data Line 4
SYMBOL DB5 = B.3 ; LCD Data Line 5
SYMBOL DB6 = B.4 ; LCD Data Line 6
SYMBOL DB7 = B.5 ; LCD Data Line 7
symbol rsbit= bit0
SYMBOL cpt = b1
SYMBOL car = b2

; Initialisation LCD 4 bits , etc *********
	for cpt=0 to 5
		lookup cpt,($33,$32,$28,$c,$6,$01),car
		gosub SendInitCmdByte
	next
	pause 100
		
;  Affichage texte ***********************			
	car= 128	'curseur début ligne1
	gosub EnvoiByteComm	
	for cpt=0 to 15
	lookup cpt,("Dist1=        cm"),car
	GOSUB EnvoiByteData
	next
		
	car= 192	'curseur  ligne2	
	gosub EnvoiByteComm	
	for cpt=0 to 15
	lookup cpt,("Dist2=        cm"),car
	GOSUB EnvoiByteData	
	next	

'***** DEBUT PROGRAMME PERSO ************************

DO
	low C.2
	pulsout C.2,1
	pulsin C.3,1,w1
	w3=w1*10
	dist=w3/58
	bintoascii dist,mill,mill,cent,dix,unit  ; il faut 5 arguments

        car= 134     ;affichage données ligne 1 col 7
        gosub EnvoiByteComm
	pause 10
	gosub affiche 'Affichage des donn?es
	pause 100

LOOP

'***** Affichage des donn?es ************************************
affiche:

car=mill
GOSUB EnvoiByteData

car=cent
GOSUB EnvoiByteData

car=dix '
GOSUB EnvoiByteData

car=unit '
GOSUB EnvoiByteData

return


'***** Sous programmes d'écriture du LCD************

SendInitCmdByte:

PAUSE 60 ; Delay 15mS

EnvoiByteComm:

rsbit = 0 	 ;Send to Command register

EnvoiByteData:

pinsB = car & $F0 / 4 | rsbit ; Put MSB out first
PULSOUT E,1 ; Give pulse on E

pinsB = car & $0F * 4 | rsbit ; Put LSB out second
PULSOUT E,1 ; Give pulse on E

rsbit = 1 ;  Send to Data register next

RETURN
 

JRTEC

Senior Member
bonsoir et merci de votre reponse

J ai resolu etrangement le clignotement de l affichage en excluant l affichage dans le groupe data les partie ou sont affichés les valeurs

'***** Ecriture du texte fixe sur afficheur *********************************************************
texte: 'position du curceur ligne 1 et ecriture du label

car= $80 | $00 'curseur d?but ligne1
gosub SendCmdByte

FOR cpt = 6 TO 11 'lecture texte ligne1
READ cpt,car
GOSUB SendDataByte

NEXT

car= $80 | $0E 'curseur d?but ligne1
gosub SendCmdByte

FOR cpt = 17 TO 18 'lecture texte ligne1
READ cpt,car
GOSUB SendDataByte

NEXT

car= $80 | $40 'curseur d?but ligne2
gosub SendCmdByte

FOR cpt = 20 TO 22 'lecture texte ligne2
READ cpt,car
GOSUB SendDataByte

NEXT
'
return
Par contre ayant parcuru plusieurs sujets sur SFR04 , avec picaxe , j ai toujours lu que l on prenais la valeur , con la mutiplie par 10 puis divise par 58

Personnellement , pour avoir une valeur en cm correcte , je la mutiplie par 10 puis je la divise par 116

'***** DEBUT PROGRAMME PERSO ************************


DATA 6,("Dist1= cm") 'Texte sur l'afficheur ligne1 (16c)

DATA 20,("ec=") 'Texte sur l'afficheur ligne1 (16c)

gosub texte 'Texte ligne 1 et 2



pause 4000 'pause de 0.5 s à la mise sous tension

DO

low 1
pulsout C.2,10
pulsin C.3,1,w13
w12=w13*10
w12=w12/116

bintoascii w13,cen,di,uni

bintoascii w12,cent,dix,unit



gosub affiche 'Affichage des donn?es

pause 1000


LOOP

Par contre j ai mis frequence 8 Mhz , je n arrive par a comprendre pourquoi j ai cela

Pourriez m eclaicir consernant les durée de mesure et les frequences des picaxe ?

@ MGU :J avais bien vu votre page concernant les adaptateur I2C types PCA8574 ou PCF8574 mais j avais du stock sur des composants et je me suis fortement inspire de votre programme pour le jalonnage donc je pense rester sur ce montage
 

MGU

Senior Member
bonsoir et merci de votre reponse


@ MGU :J avais bien vu votre page concernant les adaptateur I2C types PCA8574 ou PCF8574 mais j avais du stock sur des composants et je me suis fortement inspire de votre programme pour le jalonnage donc je pense rester sur ce montage

Pas de soucis, essayez tout de même le code envoyé (si vous voulez...)

Quel est l'utilité de low1 ?

Je n'ai jamais utilisé de module US.

Je pense qu'il y avait un doublon dans l'affichage du texte, d'où clignotement.

MM
 

PieM

Senior Member
Par contre ayant parcuru plusieurs sujets sur SFR04 , avec picaxe , j ai toujours lu que l on prenais la valeur , con la mutiplie par 10 puis divise par 58

Personnellement , pour avoir une valeur en cm correcte , je la mutiplie par 10 puis je la divise par 116




Par contre j ai mis frequence 8 Mhz , je n arrive par a comprendre pourquoi j ai cela

Pourriez m eclaicir consernant les durée de mesure et les frequences des picaxe ?
Pulsin mesure un temps en unités de 10µs si le picaxe est à 4 MHz, 5µs si il est à 8 MHz etc...
donc il est normal que pulsin donne un résultat 2 fois plus grand à 8MHz.
d'où le calcul avec 116

mais autant écrire
pulsin C.3,1,dist
dist=dist*10/116
 

JRTEC

Senior Member
Pas de soucis, essayez tout de même le code envoyé (si vous voulez...)

Quel est l'utilité de low1 ?


MM
merci de vos reponses: effectivement " low 1 " est une simple erreur due a un copier collé , desolé

L inspiration du programme de jalonnage m as permis de travailler sur l affichage
 

MGU

Senior Member
L'unité de temps (càd 1) pour pulsout est de 10µs à 4 MHz

Donc 10 à 8 MHZ ça fait 10 x 10 / 2 = 50 µs

Et si on veut une impulsion positive avec pulsout, il faut que C.2 soit à 0 avant.

low C.2 ; pour être sûr
pulsout C.2,10 ;pulse 50 µs à 8 MHz


MM
 

JRTEC

Senior Member
et ça dans le programme , c'est quoi ?
effectivement sur le premierprogramme j avais mis cela

j ai avancé un peu plus, alors voici le programme complet derniere version

' JRTEC essai ultrason

#picaxe 20M2 'directive utilisation pisaxe 20M2

'***** Nomination des Entr?es / Sorties ************

symbol trigG= C.3 'emission G
symbol echoG=C.2 'reception G

symbol trigD= C.1 'emission D
symbol echoD=C.0 'reception D

'***** Nomination des variables *********************

symbol sauve=bit0 'Mémorisation sauvegarde

symbol cent1=b4 'chiffre des centaines de cm G
symbol dix1=b5 'chiffre des dizaimes de cm G
symbol unit1=b6 'chiffre des unites de cm G

symbol cent2=b7 'chiffre des centaines de cm D
symbol dix2=b8 'chiffre des dizaimes de cm D
symbol unit2=b9 'chiffre des unites de cm D

symbol cent3=b10 'chiffre des centaines de cm DIFFERENCE
symbol dix3=b11 'chiffre des dizaimes de cm DIFFERENCE
symbol unit3=b12 'chiffre des unites de cm DIFFERENCE


symbol dist1=w13 'distance totale 1

symbol dist2=w12 'distance totale 2
symbol diFF=w11 'DIFFERENCE

'********************************************************************

setfreq m8 'Fr?quense horloge interne picaxe ? 8Mhz

'***** Initialisation LCD*******************

dirsB=%111111 'd?fini les I/O ports B en sortie

'*****Donn?es d'initialisation de l'afficheur Type HD44780 ***********
'*****Pour l'affichage, on utilise les ports BO ? B5 du 20M2********

SYMBOL RS = B.0 ; 0 = Command 1 = Data
SYMBOL E = B.1 ; 0 = Idle 1 = Active
SYMBOL DB4 = B.2 ; LCD Data Line 4
SYMBOL DB5 = B.3 ; LCD Data Line 5
SYMBOL DB6 = B.4 ; LCD Data Line 6
SYMBOL DB7 = B.5 ; LCD Data Line 7
SYMBOL RSCMDmask = %00000000 ; Select Command register
SYMBOL RSDATmask = %00000001 ; Select Data register
SYMBOL cpt = b1
SYMBOL car = b2
SYMBOL rsbit = b3

'Nibble commands - To initialise 4-bit mode

DATA 0,( $33 ) ; %0011---- %0011---- 8-bit / 8-bit
DATA 1,( $32 ) ; %0011---- %0010---- 8-bit / 4-bit

'Byte commands - To configure the LCD

DATA 2,( %00101000 ) ; %001LNF00 Display Format
DATA 3,( %00001100 ) ; %00001DCB Display On
DATA 4,( %00000110 ) ; %000001IS Cursor Move
' ; L : 0 = 4-bit Mode 1 = 8-bit Mode
' ; N : 0 = 1 Line 1 = 2 Lines
' ; F : 0 = 5x7 Pixels 1 = N/A
' ; D : 0 = Display Off 1 = Display On
' ; C : 0 = Cursor Off 1 = Cursor On
' ; B : 0 = Cursor Steady 1 = Cursor Flash
' ; I : 0 = Dec Cursor 1 = Inc Cursor
' ; S : 0 = Cursor Move 1 = Display Shift
DATA 5,( $01 ) ; Clear Screen

'***** Envoi de ces donn?es au LCD ***************
PowerOnReset:
FOR cpt = 0 TO 5
READ cpt,car
GOSUB SendInitCmdByte
NEXT

'***** DEBUT PROGRAMME PERSO ************************


DATA 6,("G: cm D: cm") 'Texte sur l'afficheur ligne1 (16c)

DATA 22,("DIF= cm MVT") 'Texte sur l'afficheur ligne1 (16c)

gosub texte 'Texte ligne 1 et 2



pause 4000 'pause de 0.5 s à la mise sous tension

DO

low C.2
pulsout C.2,10
pulsin C.3,1,w13
w13=w13*10/116

bintoascii w13,cent1,dix1,unit1

pause 1000

low C.0
pulsout C.0,10
pulsin C.1,1,w12
w12=w12*10/116

bintoascii w12,cent2,dix2,unit2

if w13>w12 then gauche


if w13=w12 then egal


if w12>w13 then droite




gauche:
w11=w13-w12
egal:
w11=000

droite:
w11=w12-w13

pause 1000


bintoascii w11,cent3,dix3,unit3

gosub affiche 'Affichage des donn?es

pause 1000


LOOP


'***gestion devers *************************************************


'***** Affichage des donn?es ************************************
affiche:




car= $80 | $02 'curseur d?but ligne1 col 2
gosub SendCmdByte


car=cent1
GOSUB SendDataByte

car=dix1 '
GOSUB SendDataByte

car=unit1 '
GOSUB SendDataByte



car= $80 | $0b 'curseur début ligne1 col 12
gosub SendCmdByte

car=cent2
GOSUB SendDataByte

car=dix2 '
GOSUB SendDataByte

car=unit2 '
GOSUB SendDataByte



car= $80 | $44 'curseur début ligne2 col 3
gosub SendCmdByte

car=cent3
GOSUB SendDataByte

car=dix3 '
GOSUB SendDataByte

car=unit3 '
GOSUB SendDataByte


car= $80 | $4d 'curseur début ligne2 test
gosub SendCmdByte

car=cent3
GOSUB SendDataByte

car=dix3 '
GOSUB SendDataByte

car=unit3 '
GOSUB SendDataByte

sauve=0


'***** Ecriture du texte fixe sur afficheur *********************************************************
texte: 'position du curceur ligne 1 et ecriture du label

car= $80 | $00 'curseur d?but ligne1
gosub SendCmdByte

FOR cpt = 6 TO 7 'lecture texte ligne1
READ cpt,car
GOSUB SendDataByte

NEXT

car= $80 | $05 'curseur d?but ligne1
gosub SendCmdByte

FOR cpt = 11 TO 16 'lecture texte ligne1
READ cpt,car
GOSUB SendDataByte

NEXT

car= $80 | $0e 'curseur d?but ligne1
gosub SendCmdByte

FOR cpt = 20 TO 21 'lecture texte ligne1
READ cpt,car
GOSUB SendDataByte

NEXT

car= $80 | $40 'curseur d?but ligne2
gosub SendCmdByte

FOR cpt = 22 TO 25 'lecture texte ligne2
READ cpt,car
GOSUB SendDataByte

NEXT
'

car= $80 | $47 'curseur d?but ligne2
gosub SendCmdByte

FOR cpt = 29 TO 34 'lecture texte ligne2
READ cpt,car
GOSUB SendDataByte

NEXT
return
'


'***** Sous programmes d'?criture du LCD************
SendInitCmdByte:

PAUSE 5 ; Delay 15mS

SendCmdByte:

rsbit = RSCMDmask ; RSCDmask = 0 ;Send to Command register

SendDataByte:

pinsB = car & $F0 / 4 | rsbit ; Put MSB out first
PULSOUT E,1 ; Give pulse on E

pinsB = car & $0F * 4 | rsbit ; Put LSB out second
PULSOUT E,1 ; Give pulse on E

rsbit = RSDATmask ; RSDATmask = 1 ; Send to Data register next

RETURN
pour faire simple au niveau bur de ce programme :

Mesure a l aide de 2 module ultra son chacun a l extremite d une rampe

Comparaison des 2 valeurs

correction de la rampe a l aide du verin electrique afin d obtenir une valeur a peu pres identique je dirai une tolerence de 15-20 cm , valeur que je veux definir plus tard a la aide d un potentiometre

mais je ne comprends pas trop une chose etrange

Si Droit et superieur a gauche , i,dication de la difference correcte ( 3 chiffres ) par contre si gauche est superieur a droite il y a des signes je dirai chinois qui apparencent a la place des centaines de la valeur de difference

Si vous regardez le programme cette valeur est envoye a 2 endoit sur l ecran , j avais fait cela pour voir que ce ne soit pas un doublons qui me genere cette erreur mais non ce n est pas le cas
 

MGU

Senior Member
C'est bête un programme, cà faut toujours exactement ce qu'on lui demande, après avoir fait gauche:, il enchaine sur egal:, contunue par droite:, et il affiche le résultat....

Il faut aussi relire #4

MM
 

JRTEC

Senior Member
Bonjour

et bien la je seche , j ai essayais de mettre des " endif" cela generent des erreurs , je relu le #4 , je ne vois pas
 

MGU

Senior Member
Bonjour

et bien la je seche , j ai essayais de mettre des " endif" cela generent des erreurs , je relu le #4 , je ne vois pas
Bonjour,

Faut pas se compliquer la vie:

Code:
if w13>w12 then   ;gauche
     w11=w13-w12
endif

if w13=w12 then    ;centre
    w11=000
endif

if w12>w13 then    ;droite
    w11=w12-w13 
endif
Un select case serait plus "élégant"...

Le #4, c'est pour la syntaxe du bintoascii
Une variable word comme w13 demande 5 arguments. Si on en a besoin que de trois, on peut économiser des variables.

Ex bintoascii w13,b1,b2,b3,b4,b5 pour 5 chiffres b1 à b5

Ou bintoascii w13,b1,b1,b1,b2,b3 pour 3 chiffres, mais w13 ne doit pas dépasser 999 ! (c'est ce que je fais, ça fonctionne...)

MM

MM
 
Last edited:

JRTEC

Senior Member
Merci de votre reponse

j ai appliquervotre methode et miracle cela marche

Mais !! j ai voulu inserer une tolerence de la maniere suivante :

Code:
readadc potsens , sens         ' lecture du potentiometre de sensibilite de 0 a 255 et memo val
	
low C.2		
pulsout C.2,10
pulsin C.3,1,w13
w13=w13*10/116

bintoascii w13,cent1,cent1,cent1,dix1,unit1

pause 500

low C.0
pulsout C.0,10
pulsin C.1,1,w12
w12=w12*10/116

bintoascii w12,cent2,cent2,cent2,dix2,unit2

If w13>w12+b13 then
	gosub gauche
endif	
 


if w12>w13+b13 then
	gosub droite
	else gosub egal
endif 

loop
Et la je plante a nouveau
 

MGU

Senior Member
Merci de votre reponse

j ai appliquervotre methode et miracle cela marche
Y a pas de miracle, faut juste lire et appliquer la doc.

On ne peut pas faire de calcul dans un if. Faut une ligne w13=w13 + b13 avant

MM
 

JRTEC

Senior Member
Bonsoir et merci pour vos conseils

j ai developpe un pleu plus mon projet dont voici le plan
ultra son rampe 2.JPG

et ci dessous le code:
Code:
' JRTEC essai ultrason 

#picaxe 20M2 	'directive utilisation pisaxe 20M2

'***** Nomination des Entr?es / Sorties ************
 
symbol trigG= C.5		'emission G
symbol echoG=C.4		'reception G
symbol trigD= C.1		'emission D
symbol echoD=C.0		'reception D

symbol potsens=C.7      ' potentiometre de tolerence 
symbol bloc= C.6		' blocage auto
symbol potdure=C.3	' potentioùetre de duré action


'***** Nomination des variables *********************

symbol sauve=bit0			'Mémorisation sauvegarde
                
symbol cent1=b4	 		'chiffre des centaines de cm G
symbol dix1=b5			'chiffre des dizaimes de cm G
symbol unit1=b6			'chiffre des unites de cm G

symbol cent2=b7			'chiffre des centaines de cm D
symbol dix2=b8			'chiffre des dizaimes de cm D
symbol unit2=b9			'chiffre des unites de cm D

symbol cent3=b10			'chiffre des centaines de cm DIFFERENCE ou tolerence
symbol dix3=b11			'chiffre des dizaimes de cm DIFFERENCE ou tolerence
symbol unit3=b12			'chiffre des unites de cm  DIFFERENCE ou tolerence
symbol sens=b13			'valeur potentiometre yolernce 



symbol distg=w13			'distance totale gauche 1

symbol distd=w12			'distance totale droite 2
symbol diFF=w11			'DIFFERENCE
symbol mvt=b13			'caractere du mouvement
symbol totg=w9			'distance g +tol
symbol totd=w10			'distance d +tol

symbol dure=w8			'val de d action en coef µs
symbol dureS=w7
symbol cent4=w6			'chiffre des centaines de temp de durée
symbol dix4=w5			'chiffre des dizaimes de temp de durée
symbol unit4=w4			'chiffre des unites de temp de durée	


'********************************************************************

setfreq m8		'Fr?quense horloge interne picaxe ? 8Mhz

'***** Initialisation LCD*******************

	dirsB=%111111	'd?fini les I/O ports B en sortie	
	
'*****Donn?es d'initialisation de l'afficheur Type HD44780 ***********
'*****Pour l'affichage, on utilise les ports BO ? B5 du 20M2********
	
	SYMBOL  RS        = B.0         ; 0 = Command   1 = Data
	SYMBOL  E         = B.1         ; 0 = Idle      1 = Active
	SYMBOL  DB4       = B.2         ; LCD Data Line 4
	SYMBOL  DB5       = B.3         ; LCD Data Line 5
	SYMBOL  DB6       = B.4         ; LCD Data Line 6
	SYMBOL  DB7       = B.5         ; LCD Data Line 7
	SYMBOL  RSCMDmask = %00000000 ; Select Command register
	SYMBOL  RSDATmask = %00000001 ; Select Data register
	SYMBOL  cpt       = b1
	SYMBOL  car		= b2
	SYMBOL  rsbit     = b3

		
	'Nibble commands - To initialise 4-bit mode
 
	DATA 0,( $33 )    ; %0011---- %0011----   8-bit / 8-bit
	DATA 1,( $32 )    ; %0011---- %0010----   8-bit / 4-bit
	
	'Byte commands - To configure the LCD
	 
	DATA 2,( %00101000 )    ;  %001LNF00   Display Format
	DATA 3,( %00001100 )    ;  %00001DCB   Display On
	DATA 4,( %00000110 )    ;  %000001IS   Cursor Move
	'                       ; L : 0 = 4-bit Mode    1 = 8-bit Mode
	'                       ; N : 0 = 1 Line        1 = 2 Lines
	'                       ; F : 0 = 5x7 Pixels    1 = N/A
	'                       ; D : 0 = Display Off   1 = Display On
	'                       ; C : 0 = Cursor Off    1 = Cursor On
	'                       ; B : 0 = Cursor Steady 1 = Cursor Flash
	'                       ; I : 0 = Dec Cursor    1 = Inc Cursor
	 '                      ; S : 0 = Cursor Move   1 = Display Shift
	DATA 5,( $01 )   	; Clear Screen
		
'***** Envoi de ces donn?es au LCD ***************
PowerOnReset:
	FOR cpt = 0 TO 5
		READ cpt,car
		GOSUB SendInitCmdByte
	NEXT 
		
'***** DEBUT PROGRAMME PERSO ************************


	DATA 6,("G:    Mvt  D:")	'Texte sur l'afficheur ligne1 (16c)
	
	DATA 22,("tol:    Ac: .  s")	'Texte sur l'afficheur ligne1 (16c)
	
	gosub texte 	'Texte ligne 1 et 2
	
	
	
 pause 4000		'pause de 0.5 s à la mise sous tension


do

gosub mesure	
	
mesure:

readadc potsens , sens        ' lecture du potentiometre de sensibilite de 0 a 255 et memo val
readadc potdure , dure		'lecture du potentiometre de sensibilite de 0 a 255 et memo val
dureS=dure*20                  ' duré entre 0 et 5100 soit a 8mhz(*5/10000) de 0 a 2.55 seconde

	
low C.4		
pulsout C.4,10
pulsin C.5,1,w13
w13=w13*10/116
w9=w13+b13

bintoascii w13,cent1,cent1,cent1,dix1,unit1

pause 500

low C.0
pulsout C.0,10
pulsin C.1,1,w12
w12=w12*10/116
w10=w12+b13

bintoascii w12,cent2,cent2,cent2,dix2,unit2


if w13>w10 then
	gosub gauche 
	endif	
 


if w12>w9 then
	gosub droite
	
	endif 

if w12<w9 and w13<w10 then
	gosub egal 
	endif


loop

'***gestion devers *************************************************	



gauche:
	
 w11=w13-w12 
 
 high B.6 pause dureS
 low B.7
 bintoascii b13,cent3,dix3,unit3 
 bintoascii dure,cent4,cent4,cent4,dix4,unit4
 mvt="<"
 gosub affiche	
 return
 
egal:

 if w13>w12 then
 w11=w13-w12
 endif
 
 if w12>w13 then
 w11=w12-w13
 endif
 
 if w13=w12 then
 w11=00
 endif
 
 
 low B.6 
 low B.7
 bintoascii b13,cent3,dix3,unit3 
 bintoascii dure,cent4,cent4,cent4,dix4,unit4
 mvt="="
 gosub affiche	
 return

droite:

 w11=w12-w13 
  low B.6
 high B.7 pause dureS
 bintoascii b13,cent3,dix3,unit3 
 bintoascii dure,cent4,cent4,cent4,dix4,unit4
 mvt=">"
 gosub affiche
return	
	
	
 
	
'***** Affichage des donn?es ************************************
affiche:




	car= $80 | $02	'curseur d?but ligne1 3° caractere
	gosub SendCmdByte
	

	car=cent1		 
	GOSUB SendDataByte
	
	car=dix1		'
	GOSUB SendDataByte	
	
	car=unit1		' 
	GOSUB SendDataByte 
	
	car= $80 | $09	'curseur début ligne1 15° caractere
	gosub SendCmdByte
	
	car=mvt		 
	GOSUB SendDataByte	
	
	
      car= $80 | $0d	'curseur début ligne1  14° caractere
	gosub SendCmdByte
	
	car=cent2		 
	GOSUB SendDataByte
		
	car=dix2		'
	GOSUB SendDataByte	
	
	car=unit2		' 
	GOSUB SendDataByte 
	
	
	
	car= $80 | $44	'curseur début ligne2 3° caractere
	gosub SendCmdByte
	
	car=cent3		 
	GOSUB SendDataByte
		
	car=dix3		'
	GOSUB SendDataByte	
	
	car=unit3		' 
	GOSUB SendDataByte 
	
	
	car= $80 | $4b	'curseur début ligne2 14° caractere
	gosub SendCmdByte
	
	car=cent4		 
	GOSUB SendDataByte			
	
	car= $80 | $4d	'curseur début ligne2 15° caractere
	gosub SendCmdByte
	
	car=dix4	 
	GOSUB SendDataByte
		
	
	car= $80 | $4e	'curseur début ligne2 16° caractere
	gosub SendCmdByte
	
	car=unit4		 
	GOSUB SendDataByte
		
	sauve=0
 	
	

	
'***** Ecriture du texte fixe sur afficheur *********************************************************	
texte:	'position du curceur ligne 1 et ecriture du label

	car= $80 | $00	'curseur ligne1 1° caractere
	gosub SendCmdByte
	 	
	FOR cpt = 6 TO 7	'lecture texte ligne1 
		READ cpt,car
		GOSUB SendDataByte
		
	NEXT
	
	car= $80 | $05	'curseur  ligne1 6 ° caractere
	gosub SendCmdByte
	 	
	FOR cpt = 11 TO 14	'lecture texte ligne1 
		READ cpt,car
		GOSUB SendDataByte
		
	NEXT	
	
	car= $80 | $0b	'curseur ligne1 11° caractere
	gosub SendCmdByte
	 	
	FOR cpt = 17 TO 18	'lecture texte ligne1 
		READ cpt,car
		GOSUB SendDataByte
		
	NEXT	
		
	car= $80 | $40	'curseur ligne2 1° caractere
	gosub SendCmdByte
	 	
	FOR cpt = 22 TO 25	'lecture texte ligne2
		READ cpt,car
		GOSUB SendDataByte	
		
	NEXT	
'

	car= $80 | $48	'curseur  ligne2 8° caractere
	gosub SendCmdByte
	 	
	FOR cpt = 30 TO 32	'lecture texte ligne2
		READ cpt,car
		GOSUB SendDataByte	
		
	NEXT
	
	car= $80 | $4c	'curseur  ligne2 8° caractere
	gosub SendCmdByte
	 	
	FOR cpt = 34 to 34	'lecture texte ligne2
		READ cpt,car
		GOSUB SendDataByte	
		
	NEXT
	
	car= $80 | $4f	'curseur  ligne2 8° caractere
	gosub SendCmdByte
	 	
	FOR cpt = 37 to 37	'lecture texte ligne2
		READ cpt,car
		GOSUB SendDataByte	
		
	NEXT
	
	return
'


'***** Sous programmes d'?criture du LCD************ 
SendInitCmdByte:
 
	PAUSE 5                        ; Delay 15mS 
 
SendCmdByte:
 
	rsbit = RSCMDmask               ; RSCDmask = 0 ;Send to Command register
 
SendDataByte:
 
	pinsB = car & $F0 / 4 | rsbit   ; Put MSB out first
 	PULSOUT E,1                     ; Give  pulse on E
	
	pinsB = car & $0F * 4 | rsbit   ; Put LSB out second
	PULSOUT E,1                     ; Give  pulse on E
		 
	rsbit = RSDATmask               ; RSDATmask = 1 ; Send to Data register next
	
	RETURN
etant arrive au bot du stock des variables de b0 a b13 j ai pioche dans les variables w13 et suis redessendu jusqu a w4 mais je pene que cela me pose un probleme pour l affichage ( des donness se melangeraient ) il me semble a voir lu qu une wariable par exempl w1 utilise le bit b1 et b2 , alors comment faire lorsque on est en rupture de stock ?

Par avance merci
 

dje8269

Senior Member
comment faire lorsque on est en rupture de stock ?
Des économies !!!

Une variable word est sur 16bit , soit 2 octets .

Une variable b1 est sur 8 bits soit 1 octet.

Par exemple w8 est composé de deux variables : b16 et b17 que vous pouvez utilisez séparément .

Il faut ajuster le contenu d'une variable a sa taille . Un varaible word doit etre utilisé pour stocker un nombre allant de 0 à 65535 . Sinon préféré un octet .

Par exemple dans votre programme :
Code:
symbol dix4=w5			'chiffre des dizaimes de temp de durée
symbol unit4=w4			'chiffre des unites de temp de durée
Pourrais être écrit
Code:
symbol dix4=b10		'chiffre des dizaimes de temp de durée
symbol unit4=b11		'chiffre des unites de temp de durée
Et vous gagné deux octets de stockage ou 1 word c'est pareil ! car b10 et b11 font partis entiere de w5, et doncw4 devient libre
A la seule de condition que dix4 et unit4 ne dépasse pas 255 ?

Une fois le ménage fait et l'optimisation réussis , il ne restera que l'utilisation de variable temporaire, nécessitant une certaines gymnastique

Bon courage
 

JRTEC

Senior Member
Par exemple w8 est composé de deux variables : b16 et b17 que vous pouvez utilisez séparément .


A la seule de condition que dix4 et unit4 ne dépasse pas 255 ?
e
Merci , il me semblais que les variables sarretaient a b13 , je l ai revé ?

Oui oui elles seront inferieur a 255 car c est un chiffre pour l inscroption sur le lcd
 

MGU

Senior Member
Bonjour,

C'est une question d'organisation.

Si on a 10 nombres de 5 chiffres à écrire, on est pas obligé d'utiliser 50 variables
Quand un nombre est décomposé en variables byte et écrit, on peut utiliser les mêmes variables pour décomposer et écrire le suivant.
Il n'y a pas cent1,cent2...., il y a cent, c'est tout.

En fait, on a 28 octets disponibles, que l'on groupe par deux pour les variables word, faut gérer les bytes et les words.
http://electromag1.wifeo.com/les-picaxes-et-leur-basic.php

Ben oui, c'est 28, pas 26

MM
 
Last edited:

dje8269

Senior Member
Merci , il me semblais que les variables sarretaient a b13 , je l ai revé ?
Oui lol .

Je plaisante sur un 08M2 les variables vont de W0 à w13 . donc il y à 28 variables de 1 octet ( de b0 à b27). Vous avez dus confondre

Oui oui elles seront inferieur a 255 car c est un chiffre pour l inscroption sur le lcd
c'est ce que je pensais il y a donc de grosse économie a faire ;)

Surtout que vous pouvez réutilisez une variable si c'est pour ecrire sur un LCD qui la souligné MGU
 

JRTEC

Senior Member
ok autant pour moi

par contre la , vous comprenenez ce qu il ne vas pas ? l autre jour je l ai fais et cela marchais , la varaible bloc est connue
12.JPG
 

MGU

Senior Member
Et puis maintenant, il faut utiliser les MACROS

On écrit une macro d'écriture pour un nombre et une position génériques.
On transfert un nombre et une position définis à la macro, et elle écrit le nombre ou il faut.

MM
 

MGU

Senior Member
J ai essaye c est pareil , il me semblerai que cela serait plus au niveu du =
Alors, il faut voir comment est défini "bloc" dans symbol. Attention aussi aux noms réservés, changer de nom de variable, pour voir .

MM
 

JRTEC

Senior Member
Alors, il faut voir comment est défini "bloc" dans symbol. Attention aussi aux noms réservés, changer de nom de variable, pour voir .

MM
effectiveùent si je mets bloc=0 ca beug , si je met pinC.6=0 ca marche
 

JRTEC

Senior Member
dites moi , vous etes d accord avec cela ?

readadc potdure , dure 'lecture du potentiometre de sensibilite de 0 a 255 et memo val
dureS=dure*20 ' duré entre 0 et 5100 soit a 8mhz(*5/10000) de 0 a 2.55 seconde
en pratique sur mon proto le temp me semble legerement plus long ( je visualise une led )
 

MGU

Senior Member
J ai essaye c est pareil , il me semblerai que cela serait plus au niveu du =
Faut voir la définition de "bloc" davec symbol

"bloc" ne semble pas être un nom réservé, mais on peut essayer de changer de nom, pour voir.

MM
 

JRTEC

Senior Member
Ben oui, regardez dans la colonne de droite, bloc n'est pas une variable, mais la valeur 14
Donc, Si 14=0,.... ça bug.

MM
et oui mais dans le meme endroit je vois ausi potsens potdure , qui sont variable pus lecture de potentiometre et echoG et echod qui sont aussi les retours des ultrason
 

JRTEC

Senior Member
Faut voir la définition de "bloc" davec symbol

"bloc" ne semble pas être un nom réservé, mais on peut essayer de changer de nom, pour voir.

MM
'***** Nomination des Entr?es / Sorties ************

symbol trigG=C.5 'emission G
symbol echoG=C.4 'reception G
symbol trigD=C.1 'emission D
symbol echoD=C.0 'reception D

symbol potsens=C.7 ' potentiometre de tolerence
symbol bloc=C.6 ' blocage auto
symbol potdure=C.3 ' potentioùetre de duré action
voila ce que j ai
 

MGU

Senior Member
et oui mais dans le meme endroit je vois ausi potsens potdure , qui sont variable pus lecture de potentiometre et echoG et echod qui sont aussi les retours des ultrason
"bloc" n'est pas défini comme une variable (comme b1 ou w12), mais comme une constante: 14 . La syntaxe du if n'est pas respectée.
 

MGU

Senior Member
voila ce que j ai
OK, il faut lire d'urgence la page donnée précédemment en #22 sur la broche et sa valeur logique.
C.6 est une broche physique du picaxe
La valeur de cette broche est pinC.6,
if variable ? value
il faut une variable à gauche, une variable ou une constante à droite

Symbol bloc= pinC.6

C'est un piège dans lequel nous sommes tous tombés....au début.

MM
 
Last edited:

JRTEC

Senior Member
Bonsoir

Je viens de m apercevoir de quelque chose : plutot que d utiliser des HC-SR04 pour une qustion environnementale ( brouillard , choc , etc .. ) j aimerai utiliser des capteurs de types vu sur des voitures

http://www.ebay.fr/itm/Reverse-radar-Ultrasonic-Ranging-Distance-Detector-Sensor-Probe-Waterproof-/400936505480?hash=item5d59ad9088:g:P5UAAOSw4HVWCPzs

Etanche compact , mais mon systeme je n y vois que des points positifs sauf que nul part je ne trouve d utilisation de ses capteurs a 2 fils avec un picaxe , avez vous deja utilisez cela s il vous plait ??

bonne soiree et par avance merci
 
Top