Chenillard méthode du lapin fou !

BESQUEUT

Senior Member
Dans ce code . Je définie, pendant combien de temps et a quelle fréquence en allume b0
On peut le voir comme ça, mais ce n'est pas optimal car il y a deux tests alors qu'un seul suffit.
Voir mon post #4
Notez qu'on ne donne pas la liste complète des opérations, mais seulement la première.
C'est seulement quand on a allumé la première lampe que l'on envoie un autre message "allumer la lampe suivante dans n secondes"
C'est effectivement assez déstabilisant de ne pas envisager l'ensemble du problème mais seulement ses événements intermédiaires...
En gros le programme se résume à :
Si je reçoit un signal de la télécommande, allumer la première lampe. POINT FINAL

Et c'est tout ?
Oui : c'est tout !

Par contre, quand on allume la première lampe, il faut poster un message pour l'éteindre dans n secondes et allumer la suivante...
 
Last edited:

dje8269

Senior Member
32768 est la moitié de 65536, c'est à dire 1 de plus que le plus grand nombre manipulable par un PICAXE (2^16)
Quand Timer dépasse 32768, il peut y avoir des rendez-vous programmés dans le futur, donc entre 32769 et 65535
En enlevant 32767, on est sur de ne pas passer en dessous de zéro (ce qui aurait l'effet inverse de celui recherché...)
Ok , j'ai compris le principe , mais j'ai du mal a visualiser , je vais bosser dessus .
On peut le voir comme ça, mais ce n'est pas optimal car il y a deux tests alors qu'un seul suffit.
??? comment un seul test peut définir si c'est l'heure d'allumer ou d'éteindre ? car il y as une différence entre durée d'allumage et fréquence d'allumage ..
 

BESQUEUT

Senior Member
??? comment un seul test peut définir si c'est l'heure d'allumer ou d'éteindre ? car il y as une différence entre durée d'allumage et fréquence d'allumage ..
Voir #41
Quand on planifie la tâche "allumer la lampe", on s'en fout de ce qui se passera plus tard !

C'est quand on planifie la tâche "éteindre la lampe" que l'on tient compte de cette autre durée

Code:
#PICAXE 28X2
 
settimer 34286


symbol Freq = 5		'Frequence d'allumage en secondes
symbol duree = 4		'Durée d'un allumage en seconde
symbol H1 = w27	        'Heure tache 1

symbol D_E=b3            ' durée d'extinction
symbol Flag=bit0          ' vrai si période d'allumage. On peut aussi tester directement l'état de la broche.

D_E=Freq-duree
H1 = timer + D_E
flag=false



do

    	If H1>= Timer then
            if flag=false then
                 flag=true
                 high 0
                 H1=timer + D_E
            else
                 flag=true
                 low 0
                 H1=timer + duree
            endif

 	  endif

       if Timer >32768 then
            H1=H1-32767
            Timer=Timer-32767
       endif
    
loop
Exemple non testé : je n'ai pas PE sous la main...

On n'utilise plusieurs H1, H2, ... que si on a des tâches indépendantes.
Dans le cas de la lampe, elle ne peut être que allumée ou éteinte. Donc on peut programmer la suite à chaque rendez-vous, et une seule variable suffit, donc un seul test par boucle.

Ca parait dingue d'optimiser à ce point la boucle principale.
Pour des durées exprimées en seconde, c'est du luxe.
Pour tester des boutons avec des durées exprimées en tickcount sur un Picaxe, c'est nécessaire si on souhaite une bonne réactivité.
Pour lire plusieurs ports série "à la volée" (pas sur un PICAXE...) c'est crucial.
 
Last edited:

PieM

Senior Member
Attention a bien prendre des variable Word pour les heures!
sinon le lapin a la myxomatose...
 

dje8269

Senior Member
Bon voila environ une heure que je galere .

En fait votre code ne fonctionnais pas sous PE .
J'ai donc recherché a vous comprendre , puis a trouver l'erreur puis a corriger .
Et hop voila un nouveau code .

Code:
 #PICAXE 28X2
 
settimer 34286
symbol false = 0
symbol true = 1
symbol H1 = w27		'Heure tache 1 stocke dans une variable word. car sinon probleme arrive a 255
symbol Freq = 5
symbol duree = 4		'Durée d'un allumage en seconde
symbol D_E=b3           'durée d'extinction
symbol flag=bit0        'vrai si période d'allumage. On peut aussi tester directement l'état de la broche.


flag=false			'mise du flag a 0 car la lumiere est eteinte au demarrage

D_E=Freq-duree
		
H1 = timer + D_E		'comme la lumiere est eteinte au depart. l'heure de la prochaine action seras la duree d'extinction

do

    	If H1 <= Timer then		'si c'est l'heure de faire quelque chose ou si l'heure a été depassée alors on agit
            
'######## On sait qu'il faut agir , mais on sait pas quoi faire encore
            
            if flag = false then	'si la lumiere est eteinte alors
                 high 0			'On allume
                 flag=true		'on passe a 1 le flag pour dire qu'on a allumé
                 H1=timer + duree	'on determine l'heure de la prochaine action c'est a dire l'extinction ou la fin de l'allumage comme on veut( c'est pareil). 
            				'qui est egale au temps + le temps que l'on veille quelle s'allume
           
           else						
                    
            				'Comme la lumiere n'est pas eteinte , elle est forcemenet allumé donc
            	low 0			'On l'eteint
			flag=false		'on passe le flag a 0 pour dire qu'on l'a eteinte
			H1=timer + D_E	'on determine l'heure de la prochaine action qui seras de l'allumée ou la fin de l'extinction c'est aussi pareil
            				'qui est egale au temps + Duree d'extinction 
		end if
		
 	  endif

       if Timer >32768 then		' la je seche,  -je sais pkoi il faut faire ca,
         H1=H1-32767			' je sais comment c'est fait
           Timer=Timer-32767		',mais je comprends pas comment ca marche
       endif
    
loop
 
Last edited:

dje8269

Senior Member
Pour les erreurs . plusieurs choses .

déjà pour la détermination de l'heure . le signe était inversé .
C'est quand le temps "réel" est égal, mais aussi supérieur (c'est a dire qu'on l'as dépassé), à l'heure que l'on a déterminée, qu'il faut agir !!
Donc "If H1 <= Timer then"

Après quand on allume l'ampoule , le nouveau temps à calculer, c'est le temps + la durée qu'on veuille qu'elle reste allumée ou la durée quand on veut l'éteindre . Mais pas la durée du temps qu'elle doit rester éteinte .
Donc "H1=timer + duree"

et enfin dans la deuxième partie vous avez marque flag=true . dans ce cas le flag est toujours true . il faut donc le mettre à false quand on a éteint la lumière ..
Donc "low 0 : flag=false "

Voila, pkoi j'ai autant galeré !! en trouvant une erreur y'en avait une autre , puis une autre lol . je trouve ça déjà pas mal sans PE d'avoir écrit ces lignes ; Attention je me moque pas !!! car moi j'ai PE c'est plus facile
 
Last edited:

PieM

Senior Member
En outre, il y a un risque de dérive du temps puisqu'on incrémente l'heure par rapport au timer en cours:
Quand on test H1, timer peut avoir dépassé H1. (si on a une base de temps en 1/100 de s c'est facile ..)
ensuite on génère une action, ici mettre une sortie à 1 ou à 0, mais ça peut être une action plus longue.
quand on revient on ajoute une durée au temps en cours ... qui a changé. Donc en fait la durée réelle sera plus longue.

Si on veut que l'évènement se déroule toutes les X , il faut ajouter des durées à la valeur courante de l'horloge et non à la valeur du timer.
donc : H1=H1 + duree

Il faut savoir en fait si on veut respecter une horloge ou des durées ....
 

dje8269

Senior Member
Si on veut que l'évènement se déroule toutes les X , il faut ajouter des durées à la valeur courante de l'horloge et non à la valeur du timer.
donc : H1=H1 + duree
Je suis d'accord. Comme dirais un proverbe chinois " petit décalage peu devenir grand , à la longue" :D

Il faut savoir en fait si on veut respecter une horloge ou des durées ....
sans rentré dans la philosophie , il y as une relation . Étant donné qu'une durée est la différence entre deux horloges . si on respecte l'horloge, normalement on respecte les durées .

Je pense qu'il est préférable de respecter l'horloge quitte a accepté une petite erreur de durée . Car plusieurs petites erreurs de durée ne gène en rien(recalcul a chaque fois) voir même on peut les compenser.
Mais des petites erreurs d'horloge peuvent a la fin engendrer de grosses erreur car elles , elles s'accumulent, contrairement a la durée qui se recalcule a chaque fois
 

PieM

Senior Member
si on respecte l'horloge, normalement on respecte les durées .
non avec le test H <= timer , timer peut être en avance.
quand on fera H +durée , le test suivant s'il se fait à l'heure engendre une durée plus courte.
Soit on veut quelque chose de précis à court terme avec les durées, soit à long terme en ne calculant pas les heures à partir du timer en cours.

Sur du long terme, le calcul précis de l'instant de l'action répétitive sans avoir recours à des cumuls de temps est la méthode du modulo (//) . Il y en a d'autres...
 
Last edited:

BESQUEUT

Senior Member
Bravo pour toutes vos corrections !
Et je copierai 1000 fois :
"Quand on teste si une heure est dépassée, il faut changer le sens de l'inégalité"

Petite explication pour le test "Delorean"
Code:
 #PICAXE 28X2
 
'Si on assimile la durée maximale du timer (65535) à une journée, de 0 à 24 h,
' sachant que si l'horloge atteint minuit, elle explose :

       if Timer >32768 then		' Si l'heure dépasse midi
           H1=H1-32767			' On enlève 12 h à tous nos rendez-vous
'          H2=H2-32767
'          etc...
           Timer=Timer-32767		', et aussi à l'horloge.
       endif
    
loop
Supposons qu'on ait planifié un rendez-vous à 2h de l'après-midi
A midi, le rendez-vous est donc dans 2h : OK ?

A midi une seconde,on retarde la montre de 12h, mais on enlève aussi 12h à tous les rendez-vous.
Du coup, notre rendez-vous est maintenant à 2 h du mat.
Notre horloge marque maintenant 0h et des broutilles. Notre rendez-vous est dans 2heures.
Tout va bien...
Le lapin peut continuer à tourner en rond avec sa montre sans risquer d'exploser.
 
Last edited:

dje8269

Senior Member
J'ai pas trop de merite , car je peut tester avec PE !!!! contrairement a vous .

mais je connais pas de meilleur exercice pour apprendre, comprendre, chercher, se creuser les méninges, bref merci a vous .

Mais quand même , cette façon de "penser" , de voir les choses, et vachement complexe !!! car même en ayant compris, je pense pas être capable de trop complexifier la chose . Ce demande une gymastique neuronnale extreme pour ma part lol .
Alors qu'avec un petite pause , ben c'est clair net et pas trop précis lol .

J'ai passé une heure a trouver les erreurs qui allume une ampoule , alors imaginez sur un programme complexe le debuggage dur trois jours
 

dje8269

Senior Member
Exemple parfais , j'ai tout compris. Le coup de 0 à 24h et de midi excellent .

Si je chipote un peu .

"if Timer >32768 then" signifie donc que timer est égale au minimum à 32769 ( strictement supérieur).

"H1=H1-32767" pkoi on ne déduis pas 32769 pour avoir un horloge au plus prêt de 0 plutôt qu'a 2 ( je sais c'est pas 2 secondes c'est 2/65536) ?

pour le moment vous faites 32769 - 32767 = 2 dans le meilleure des cas ! on peut gagner en precision non 32769 -32769 = 0 la il est vraiment minuit
 

BESQUEUT

Senior Member
Mais quand même , cette façon de "penser" , de voir les choses, et vachement complexe !!! car même en ayant compris, je pense pas être capable de trop complexifier la chose . Ce demande une gymastique neuronnale extreme pour ma part lol .
Les neurones, ça ne s'use que si l'on ne s'en sert pas !
Je reconnais que c'est un peu déstabilisant au début. D'ailleurs à la base, les gens qui programmaient les macs en "multitâche collaboratif" étaient pris pour des fous furieux ou de doux rêveurs par les tenants de l'algorithmie...
On s'y fait avec un peu de pratique, surtout quand on prends conscience de l'intérêt d'avoir un lapin toujours en éveil pour réagir très vite au moindre changement sur une broche.
 

dje8269

Senior Member
Après réflexion , pkoi remettre le timer à "0" a midi ? ce serais la valeur max possible acceptable pour effectuer 1 boucle . Car en fait on pourrait le remettre a zero a 20h00 et reculé de 20h , cela reviendrais au même non ?
 

BESQUEUT

Senior Member
Après réflexion , pkoi remettre le timer à "0" a midi ? ce serais la valeur max possible acceptable pour effectuer 1 boucle . Car en fait on pourrait le remettre a zero a 20h00 et reculé de 20h , cela reviendrais au même non ?
C'est arbitraire en effet, mais :
- si on fait la soustraction à 20h, on ne peut pas prendre de rendez-vous plus que 4 heures à l'avance.
- en la faisant à midi, on peut prendre des rendez-vous jusqu'à 12 h à l'avance.
- on pourrait faire encore mieux en faisant la soustraction à 6h du mat, ce qui permettrait de prendre des rendez-vous 18h à l'avance. Mais d'une part on n'en a pas besoin, et d'autre part, ça conduit à changer d'heure 2 fois plus souvent.

J'en profite pour exposer une amélioration potentielle : ça me gêne de faire le test Delorean à chaque boucle.
En fait, il me semble que ce serait suffisant de le faire uniquement avant de programmer un nouveau rendez-vous.
J'attends de retrouver mon PE pour voir si ça tient la route.
 

BESQUEUT

Senior Member
on peut gagner en precision non 32769 -32769 = 0 la il est vraiment minuit
Non : on ne gagne rien en précision ; on enlève la même chose au timer et aux rendez-vous.
On peut juste programmer un rendez-vous 2s plus tard, CAD au plus à 23h59mn59s au lieu de 23h59mn57s
Sachant qu'en général on ne planifie pas à plus que quelques minutes, ça n'a pas grande importance.
Par contre, juste avant, on a pu planifier un rendez-vous pour la prochaine boucle genre :
H1=Timer
Et pas de bol, on n'avait pas encore passé la seconde et Timer valait 32768
Du coup, quand on fait H1=H1-32769, on trouve 65535 et ça merdouille gravement... :(

A noter : si on souhaite planifier un rendez-vous "urgent" IE pour la prochaine boucle, il faut écrire :
H1=Timer
et pas H1=0 qui marcherait aussi, sauf 1 fois sur 32000...


Pour info, la vraie journée du Timer fait 18h (65536/3600) mais ça ne change pas grand chose au problème
NB : la "journée" d'un Picaxe fait 18h si le SetTimer est réglé à 1s
C'est un peu moins de 2h si on travaille en 1/10s. Dans ce cas, il ne faut pas planifier des tâches plus loin que 3/4 h
 
Last edited:

PieM

Senior Member
J'avoue ne pas trop comprendre.

Si ce principe général est destiné à éviter l'utilisation de l'instruction pause et éventuellement l'interruption pour ce cas précis, je ne vois pas pourquoi timer serait réglé sur 1 seconde ...
Quel serait l'intérêt d'utiliser un X2 et son settimer ?
 

BESQUEUT

Senior Member
J'avoue ne pas trop comprendre.

Si ce principe général est destiné à éviter l'utilisation de l'instruction pause et éventuellement l'interruption pour ce cas précis, je ne vois pas pourquoi timer serait réglé sur 1 seconde ...
Quel serait l'intérêt d'utiliser un X2 et son settimer ?
Vous avez raison : ma remarque prête à confusion et je la modifie en conséquence.

On a aussi vu que même en utilisant une interruption, il n'est pas évident de traiter rapidement un événement si le PICAXE est en PAUSE.

Cela dit, on peut utiliser la même technique avec Time ou avec des Tickcounts.
 

dje8269

Senior Member
Non : on ne gagne rien en précision ; on enlève la même chose au timer et aux rendez-vous.
Tout a fait exact , j'ai saisi la subtilité ; désolé je suis pas encore au point !!! lol . ( mais j'y travaille)

En fait, il me semble que ce serait suffisant de le faire uniquement avant de programmer un nouveau rendez-vous.
oui c'est vrai, mais ça ferais un paquet de fois quand même , a chaque programmation de RDV . ça rallongerais beaucoup le programme

si on souhaite planifier un rendez-vous "urgent" IE pour la prochaine boucle
Que voulez vous dire par "IE" je connais "internet explorer", mais je vois pas trop le rapport !!! lol

Pour infos, la vraie journée du Timer fait 18h (65536/3600)
Effectivement ça change pas grand chose au problème, mais ça mérite d'être dis je trouve .

Quel serait l'intérêt d'utiliser un X2 et son settimer ?
L'utilisation est simplement dûs au manque de broches entrées/sorties (18) du 20M2, contre 22 sur le 28X2. pour le settimer je sais pas !
 

BESQUEUT

Senior Member
oui c'est vrai, mais ça ferais un paquet de fois quand même , a chaque programmation de RDV . ça rallongerais beaucoup le programme
Dans un GOSUB Delorean par exemple
Ce serait moins pénalisant de faire ça une fois de temps en temps qu'un test à chaque tour de boucle, même si le test est négatif 99,997 fois sur 100
Que voulez vous dire par "IE" je connais "internet explorer", mais je vois pas trop le rapport !!! lol
Oups : c'est de l'anglais ; ça m'a échappé ; c'est l'acronyme de "It Explain" qu'il faut traduire par "C'est à dire..."
Effectivement ça change pas grand chose au problème, mais ça mérite d'être dis je trouve .
Le lapin vit sur une exoplanète dont la journée peut durer ce qu'on veut en fonction du SetTimer...
L'utilisation est simplement dûs au manque de broches entrées/sorties (18) du 20M2, contre 22 sur le 28X2. pour le settimer je sais pas !
Le multitâche collaboratif est un principe assez universel applicable à n'importe quel processeur monotâche. Il ne nécessite pas une vraie montre, mais seulement un "ordonnanceur" qui permette de mettre les événements dans l'ordre. Bien sur, avec une montre, la chronologie est bien plus précise et il faut l'utiliser si on en dispose.
 

BESQUEUT

Senior Member
Réponse JYB N°1

Donc on désire, sur la base d'un 28X2 : On désire faire un chenillard sur le port B ( B0 a B7) toutes les secondes une ampoule s'allume .
Pendant ce temps que le chenillard chenille , on désire (sur le port C) aussi allumé une ampoule toutes 3 secondes (C.3) et une autres toutes les 7 secondes (C.7)
Voila les bases sont posées . que le lapin fou tourne !!!!!
Code:
' Exemple de chenillard méthode "lapin fou"
' Le lapin tourne en rond à toute vitesse en regardant sa montre.
' Si c'est l'heure, il fait avancer le chenillard.

#picaxe 28X2
#simspeed 0


symbol H1=w27
symbol D1 = 10	' durée d'allumage d'une ampoule en 1/10 s

symbol H2=W26
Symbol D2=30		' Durée en 1/10 s
symbol Etat_Amp=bit0
symbol Allumee=1
symbol Eteinte=0

symbol H3=W25
Symbol D3=70		' Durée en 1/10s


symbol Amp=b1	' le numéro de l'ampoule

H1=Timer
H2=Timer
H3=Timer
Amp=0
high amp
'settimer  t1s_8	' Timer en s


[S]settimer 63974	' Timer en 1/10 s[/S]
settimer 62411  ' Timer en 1/10 s
' NB : c'est plus précis, mais le programme ne va pas plus vite et n'est pas plus réactif !
' Le problème Delorean se produit 10 fois plus souvent...


do
	if timer>H1 then				' c'est l'heure du RDV N°1
		H1=H1+D1
		low amp
		if amp=7 then
			amp=0
		else
			inc amp
		endif
		high amp
	endif
	
	if timer>H2 then				' c'est l'heure du RDV N°2
		if Etat_Amp=Eteinte then
			H2=H2+D2			' Durée d'allumage : 3s
			Etat_Amp=Allumee
			high C.3
		else
			' Durée d'extinction courte : ASAP
			Etat_Amp=Eteinte
			low C.3
		endif
	endif
	
	if timer>H3 then			' c'est l'heure du RDV N°3
		H3=H3+D3
		toggle C.7
	endif
loop

'NB sur ASAP
' On pourrait éteindre la lampe immédiatement après l'avoir allumée : 
' ==> le flash serait encore plus rapide.

' Ici, on attends la prochaine boucle (le prochain TickCount) dans l'état d'esprit du "multitâche collaboratif" : 
' ==> on rends la main à la boucle principale. 
' ==> on continuera le traitement ASAP...
 
Last edited:

BESQUEUT

Senior Member
Réponse JYB N°2

Le cahier des charges étant très répétitif, il serait possible de faire la même chose avec des modulos (méthode PieM).
De plus, les durées étant exprimées en secondes, il ne sert à rien d'être plus précis.
Pour compliquer un peu : le chenillard est du type "glaçon fondant" (comme on en trouve sur les sapins de Noël)
Les leds descendent de plus en plus vite.
Code:
' Exemple de chenillard méthode "lapin fou"
' Le lapin tourne en rond à toute vitesse en regardant sa montre.
' Si c'est l'heure, il fait avancer le chenillard.

#picaxe 28X2
#simspeed 0


symbol H1=w27
symbol D1 = b1	' durée d'allumage d'une ampoule en 1/10 s

symbol H2=W26
Symbol D2=30		' Durée en 1/10 s
symbol Etat_Amp=bit0
symbol Allumee=1
symbol Eteinte=0

symbol H3=W25
Symbol D3=70		' Durée en 1/10s


symbol Amp=b4	' le numéro de l'ampoule
symbol AmpP=b5    ' l'ampoule précédente

D1=64
H1=Timer +D1
H2=Timer
H3=Timer
Amp=7
high amp
'settimer  t1s_8	' Timer en s


[S]settimer 63974	' Timer en 1/10 s[/S]
settimer 62411  ' Timer en 1/10 s
' NB : c'est plus précis, mais le programme ne va pas plus vite et n'est pas plus réactif !
' Le problème Delorean se produit 10 fois plus souvent...


do
	if timer>H1 then				' c'est l'heure du RDV N°1
		low ampp
		ampp= amp
		
		if amp=0 then
			amp=8
			d1=50
		else
			dec amp
			d1=d1*10/16
			high amp
		endif
		H1=H1+D1
	endif
	
	if timer>H2 then				' c'est l'heure du RDV N°2
		if Etat_Amp=Eteinte then
			H2=H2+D2			' Durée d'allumage : 3s
			Etat_Amp=Allumee
			high C.3
		else
			' Durée d'extinction courte : ASAP
			Etat_Amp=Eteinte
			low C.3
		endif
	endif
	
	if timer>H3 then			' c'est l'heure du RDV N°3
		H3=H3+D3
		toggle C.7
	endif
loop

'NB sur ASAP
' On pourrait éteindre la lampe immédiatement après l'avoir allumée : 
' ==> le flash serait encore plus rapide.

' Ici, on attends la prochaine boucle (le prochain TickCount) dans l'état d'esprit du "multitâche collaboratif" : 
' ==> on rends la main à la boucle principale. 
' ==> on continuera le traitement ASAP...
Mon prochain CDC consistera à prendre en compte des événements extérieurs.
Mais le simulateur est trop lent pour ça : autour de la seconde par boucle.
Du coup, impossible de mettre en évidence l'intérêt statistique des tests qui sont négatifs la plupart du temps...
Il va falloir sortir le hardware... matériel...

Pour préparer ça, l'allumage de la deuxième lampe n'est plus symétrique :
elle ne reste éteinte que le temps d'une boucle.

ASAP : As Soon As Possible
Traduire : "Dès que possible"
 
Last edited:

PieM

Senior Member
Petite remarque :
le 28X2 tourne à 8 MHz, donc settimer pour 0.1s est de 62411 au lieu de 63974, et pour les secondes, son raccourci est t1s_8.
Mais en simu ça ne se voit pas trop!
 

dje8269

Senior Member
#simspeed 0
Je viens de regarder cette commande qui met la vitesse entre chaque lignes du simu a 0 . Ma question est : même si on est sur 20ms dans les options ?

settimer 63974 ' Timer en 1/10 s
settimer 62411 ' Timer en 1/10 s
Je comprends pas les deux settimer, Pourriez vous éclairer ma lanterne ?
 

BESQUEUT

Senior Member
Pour le simspeed, 0 ou 20 c'est pareil : c'est déjà tellement lent que rajouter 20ms ou rien entre chaque instruction ne change rien à l'affaire...
Je comprends pas les deux settimer, Pourriez vous éclairer ma lanterne ?
La première ligne est rayée : voir "Reason" en bas de post...
 
Last edited:

BESQUEUT

Senior Member
Réponse JYB N°3

Code:
' Exemple de chenillard méthode "lapin fou"
' Le lapin tourne en rond à toute vitesse en regardant sa montre.
' Si c'est l'heure, il fait avancer le chenillard.

#picaxe 40X2


symbol H1=w27
symbol D1 = b1	' durée d'allumage d'une ampoule en 1/10 s

symbol H2=W26
Symbol D2=30		' Durée en 1/10 s
symbol Etat_Amp=bit0
symbol Allumee=1
symbol Eteinte=0
symbol S2=D.2



symbol H3=W25
Symbol D3=70		' Durée en 1/10s
symbol S3=D.3

Symbol Coeur=D.0
symbol Travail=D.1



symbol Amp=b4	' le numéro de l'ampoule
symbol AmpP=b5    ' l'ampoule précédente

D1=64
H1=Timer +D1
H2=Timer
H3=Timer
Amp=7
high amp

setfreq em32
settimer  53036	' Timer en 1/10 s

' NB : c'est plus précis, mais le programme ne va pas plus vite et n'est pas plus réactif !
' Le problème Delorean se produit 10 fois plus souvent...


do
	if timer>H1 then				' c'est l'heure du RDV N°1
		high Travail
		low ampp
		ampp= amp
		
		if amp=0 then
			amp=8
			d1=50
		else
			dec amp
			d1=d1*10/16
			high amp
		endif
		H1=H1+D1
		low Travail
	endif
	
	
	if timer>H2 then				' c'est l'heure du RDV N°2
		high Travail
		if Etat_Amp=Eteinte then
			H2=H2+D2			' Durée d'allumage : 3s
			Etat_Amp=Allumee
			high S2
		else
			' Durée d'extinction courte : ASAP
			Etat_Amp=Eteinte
			low S2
		endif
		low Travail
	endif
	
	
	if timer>H3 then			' c'est l'heure du RDV N°3
		high Travail
		H3=H3+D3
		toggle S3
		low Travail
	endif
	
	toggle Coeur
loop

'NB sur ASAP
' On pourrait éteindre la lampe immédiatement après l'avoir allumée : 
' ==> le flash serait encore plus rapide.

' Ici, on attends la prochaine boucle (le prochain TickCount) dans l'état d'esprit du "multitâche collaboratif" : 
' ==> on rends la main à la boucle principale. 
' ==> on continuera le traitement ASAP...
Et voici une petite étude basée sur ce programme :
View attachment Chenillard 03.pdf
Je reste persuadé que ce genre de PICAXE est tout à fait capable de gérer le chenillard tout en réagissant à des événements en tâche de fond (port série et touches.)
La seule incompatibilité à ma connaissance, c'est sa capacité à recevoir une commande par un port série (télécommande...) pendant qu'il écrit sur le LCD.
Donc si on est en train de régler le chenillard, il est possible que la télécommande marche moins bien.
 
Last edited:

dje8269

Senior Member
Donc si on est en train de régler le chenillard, il est possible que la télécommande marche moins bien.
Bonjour à tous,

Si on régle le chenillard, la télécommande doit etre inhibé !!! Pour eviter un declecnhement
 
Top