Problème de variable.

Pedro51

Member
[Résolu] Problème de variable.

Salut,

Je modifie actuellement une lampe de poche, en lui ajoutant une batterie au lithium (donc avec gestion de la charge) et également une led de puissance de marque Cree. Le tout commandé avec un picaxe évidemment.

J'ai donc créer un circuit en cms, mon premier en fait avec le Picaxe en haut. L'autre partie réservé a la charge.
CI-TL1.2.jpg

Et donc le programme qui permet de régler la lampe à trois puissances, un mode "SOS", et extinction de la lampe et mise en veille si batterie déchargé ou chargeur branché. Un seul interrupteur pour commander le tout.

Code:
#picaxe 08m2

init:
	high 4 : pause 100 : low 4
	
main:
	if b12=0 or b12=85 or b12=170 then : gosub calcul : endif
	if pin1=1 then : gosub mode : gosub calcul : endif
	pause 25
	inc b12
	goto main

calcul:
	w0=0
	for b5=1 to 10
	calibadc10 w1            	; lecture de la tension interne du PicAxe
	w0=w0+w1
	next b5
	w0=w0+10/10
	w1=53429/w0*20+30   		; calcul de la tension réelle en mV
	w4=w1-3400/2
	w4=900-w4
	if w1<=3400 or pin3=1 then goto bip
	
sortie:
	if b10=1 then : w4=w4/15 : pwmout pwmdiv4, 2, 249, w4 : endif
	if b10=2 then : w4=w4/4 : pwmout pwmdiv4, 2, 249, w4 : endif
	if b10=3 then : pwmout pwmdiv4, 2, 249, w4 : endif
	return
	
mode:
	b12=0 : b6=0
	high 4 : pause 50 : low 4
	do while pin1=1
	inc b6
	pause 100
	if b6>=10 then : goto sos : endif
	loop
	inc b10
	if b10>3 then : b10=1 : endif
	return

sos:
	b10=0 : b7=127
	for b13= 1 to 3
	for b11= 1 to 3
	pwmout pwmdiv4, 2, 249, 100 : pause b7
	pwmout 2,off : pause 127
	next b11
	b7=b7+128
	pause 400
	if pin1=0 then goto main
	next b13
	pause 400
	if pin1=0 then goto main
	goto sos
	
bip:
	if pin3=0 then
	for b5= 1 to 12
	Toggle 4 : pause 50
	next b5
	endif
	b10=0
	
att_charge:

	pwmout 2,off
	disablebod 
	sleep 4
	enablebod
	
	calibadc10 w1            	 ; lecture de la tension interne du PicAxe
	w1=53429/w1*20+30   		 ; calcul de la tension réelle en mV
	if w1>= 3600 and pin3=0 then goto main		
	goto att_charge
Lorsque j'utilise la variable "b4" à la place de "b10", cette dernière change de valeur toute seule. J'ai mis du temps à comprendre que cela venait de là, car une fois que j'ai mis b10 a la place, tous est revenu à la normal.

Je suppose donc que le Picaxe à un défaut de conception, est ce que cela vous est déjà arrivé?
Ou bien un truc m'a peu être échappé dans le programme!
 
Last edited:

MGU

Senior Member
Salut,

Je modifie actuellement une lampe de poche, en lui ajoutant une batterie au lithium (donc avec gestion de la charge) et également une led de puissance de marque Cree. Le tout commandé avec un picaxe évidemment.

J'ai donc créer un circuit en cms, mon premier en fait avec le Picaxe en haut. L'autre partie réservé a la charge.
View attachment 18012

Et donc le programme qui permet de régler la lampe à trois puissances, un mode "SOS", et extinction de la lampe et mise en veille si batterie déchargé ou chargeur branché. Un seul interrupteur pour commander le tout.

Code:
#picaxe 08m2

init:
	high 4 : pause 100 : low 4
	
main:
	if b12=0 or b12=85 or b12=170 then : gosub calcul : endif
	if pin1=1 then : gosub mode : gosub calcul : endif
	pause 25
	inc b12
	goto main

calcul:
	w0=0
	for b5=1 to 10
	calibadc10 w1            	; lecture de la tension interne du PicAxe
	w0=w0+w1
	next b5
	w0=w0+10/10
	w1=53429/w0*20+30   		; calcul de la tension réelle en mV
	w4=w1-3400/2
	w4=900-w4
	if w1<=3400 or pin3=1 then goto bip
	
sortie:
	if b10=1 then : w4=w4/15 : pwmout pwmdiv4, 2, 249, w4 : endif
	if b10=2 then : w4=w4/4 : pwmout pwmdiv4, 2, 249, w4 : endif
	if b10=3 then : pwmout pwmdiv4, 2, 249, w4 : endif
	return
	
mode:
	b12=0 : b6=0
	high 4 : pause 50 : low 4
	do while pin1=1
	inc b6
	pause 100
	if b6>=10 then : goto sos : endif
	loop
	inc b10
	if b10>3 then : b10=1 : endif
	return

sos:
	b10=0 : b7=127
	for b13= 1 to 3
	for b11= 1 to 3
	pwmout pwmdiv4, 2, 249, 100 : pause b7
	pwmout 2,off : pause 127
	next b11
	b7=b7+128
	pause 400
	if pin1=0 then goto main
	next b13
	pause 400
	if pin1=0 then goto main
	goto sos
	
bip:
	if pin3=0 then
	for b5= 1 to 12
	Toggle 4 : pause 50
	next b5
	endif
	b10=0
	
att_charge:

	pwmout 2,off
	disablebod 
	sleep 4
	enablebod
	
	calibadc10 w1            	 ; lecture de la tension interne du PicAxe
	w1=53429/w1*20+30   		 ; calcul de la tension réelle en mV
	if w1>= 3600 and pin3=0 then goto main		
	goto att_charge
Lorsque j'utilise la variable "b4" à la place de "b10", cette dernière change de valeur toute seule. J'ai mis du temps à comprendre que cela venait de là, car une fois que j'ai mis b10 a la place, tous est revenu à la normal.

Je suppose donc que le Picaxe à un défaut de conception, est ce que cela vous est déjà arrivé?
Ou bien un truc m'a peu être échappé dans le programme!
Non, c'est pas un défaut du picaxe, c'est un défaut du programme.

le word w0 est l'association de deux bytes b0 et b1 et donc, tu mélanges tout.

Pour éviter ça, prends les bytes dans l'ordre croissant b0,b1,b2....
Et les words dans l'ordre décroissant w13,w12,w11....
Evidemment, si on utilise beaucoup de variables, ils finissent par se rencontrer.

Et nomme les variables, c'est mieux pour tout le monde.

MM
 

Pedro51

Member
Salut MGU,

J'ai fait le programme en moins d'une demi-heure, j'ai pas pris le temps de nommer les variables, désolé.

Malheureusement, j'utilise "b5" mais pas "w2" donc le problème ne vient pas de là.

je vient de tester avec un autre picaxe sur ma platine d'essai et le problème n'apparait pas. Je me demandai juste si cela arrivait souvent ou bien si je suis tombé sur un cas isolé.
 

MGU

Senior Member
Salut MGU,

J'ai fait le programme en moins d'une demi-heure, j'ai pas pris le temps de nommer les variables, désolé.

Malheureusement, j'utilise "b5" mais pas "w2" donc le problème ne vient pas de là.

je vient de tester avec un autre picaxe sur ma platine d'essai et le problème n'apparait pas. Je me demandai juste si cela arrivait souvent ou bien si je suis tombé sur un cas isolé.
Non, tous les problèmes que j'ai eu venaient d'une erreur de ma part, ce qui est le plus probable.
Voir aussi si il n'y a pas de patte "en l'air"

MM
 

alainav1

Senior Member
Bonjour,
j'ai pris l'habitude de mettre les entrée en pullup pour éviter les pattes en l'air !
et d'intitialiser le variables en debut de programme .
ça peut pas faire de mal !
Alain
 

Pedro51

Member
Salut,

J'utilise bien le pulldown à mes entrées.

En fait c'était le switch tout neuf qui déconnait. :mad: Allez comprendre!

Merci pour vos conseils.
 
Top