Timer en tâche de fond

PapyJP

Senior Member
Je maîtrise assez bien les échanges avec le Minitel dans les deux sens ( voir serin,serout, inapropriés ? ).
Mon code me permet de gérer des sorties à partir du clavier et d' afficher leurs états à l' écran.
Les erreurs de frappe sont détectées et engendrent un message d' erreur à l' écran.
Par contre je ne suis pas tout à fait au point pour afficher les changements d' état sur les entrées; ça viendra !

Mon pb du jour est le suivant :
L' écran du Minitel s' éteint automatiquement au bout d' environ quatre minutes-trente si aucune activité n' est détectée ( le STUM précise que c' est pour ne pas " brûler " l' écran par une image fixe lorsque la luminosité est réglée vers son maximum, bonne précaution ).
Néanmoins, dans mon appli ( PIC + assembleur ), j' avais programmé un timer en tâche de fond qui envoyait systématiquement un caractère non imprimable toutes les quatre minutes ce qui avait pour effet de " réarmer " l' écran ===> écran permanent.
Peut-on, en picaxe, programmer un timer en " tâche de fond " ?
 

PieM

Senior Member
J
Néanmoins, dans mon appli ( PIC + assembleur ), j' avais programmé un timer en tâche de fond qui envoyait systématiquement un caractère non imprimable toutes les quatre minutes ce qui avait pour effet de " réarmer " l' écran ===> écran permanent.
Peut-on, en picaxe, programmer un timer en " tâche de fond " ?
Pas couché encore !! :)

Il suffit de lire la variable TIME qui s'incrémente toutes les secondes

donc au départ écrire time = 0

puis dans le programme faire régulièrement un test:

if time > 240 then
'envoi du caractère
TIME = 0 'RAZ de time
endif
et on continue ...
 

PapyJP

Senior Member
Non ! je suis un " couche ( très ) tard ".
Mais en conséquence un " lève pas tôt "
Merci de votre code.

Néanmoins ce test me semble difficile à implanter car s' il n' y a pas d' activité c' est que le picaxe est en attente d' un caractère tapé au clavier.
Donc pas de boucle où tester.

Ou alors faire "serin" un certain temps ( c' est possible avec les attributs de l' instruction ), aller tester ' time ' puis refaire "serin" avec le risque du coup de pas de pot ( règle universelle dite de l' emmerdement maximum ) où une frappe au clavier ' tombe ' pendant le test.
Et quel timer le "serin " limité en temps par son attribut utilise-t-il ? Ce n' est pas " time " par hasard ( voir la règle universelle ci-dessus ! ) ?

Et que se passe-t-il si, au moment où " serin " est à nouveau activé, le pic reçoit une fin de trame ( une trame incomplète, par exemple les 5 derniers bits sur les 10 attendus ) ?

Le timer ( PIC+assembleur ) déclenchait une IT et, si pendant le traitement de celle-ci, il y avait modif des E/S, une autre IT le signalait.

Je vais ' refléchir '.
 
Last edited:

BESQUEUT

Senior Member
une frappe au clavier ' tombe ' pendant le test.
Et quel timer le "serin " limité en temps par son attribut utilise-t-il ? Et que se passe-t-il si, au moment où " serin " est à nouveau activé, le pic reçoit une fin de trame ?
Bien que certaines fonctions puissent le laisser penser (background receive... voir post #128 prémonitoire dans serin,serout inapropriés...), le Picaxe n'est vraiment pas multitache. Donc effectivement, il n'y a pas d'autre moyen que celui que vous proposez,( en tout cas, pas à ma connaissance qui n'est pas universelle.)
La probabilité est quand même assez faible et dépends du temps que met le programme a traiter chaque action. On retrouve ici mon obsession d'écrire un programme qui "tourne vite" bien que vous ayez exprimé la non-nécessité au niveau de l'interface utilisateur.
Et oui, vous pouvez recevoir des trames incomplètes ; mais notez que celà peut également se produire si vous utilisez le clavier pendant que le Picaxe traite les dernières frappes de touches.
Donc :
1) optimiser le code en vitesse d'éxécution autant que possible pour diminuer la probabilité que celà se produise,
2) étudier ce qui se passe en cas de séquence incomplète. C'est souvent le else d'un select case...
Noter que le point 2 traite également les frappes inapropriées de l'utilisateur (Il est bien connu que le dévelopeur est un mauvais testeur parce qu'il sait ce qui doit être entré au clavier. A contrario, un utilisateur lambda aura vite fait de planter le programme s'il subsiste des séquences de touches dangereuses...)
Dernier point, la variable time peut-être utilisée et même remise à zéro sans risque d'effet de bord avec d'autres fonctions.
Le code proposé par PieM convient tout à fait à votre besoin.
Par contre (d'un point de vue général), le fait de remettre time à zéro est une mauvaise idée quand on veut faire un timer précis (par exemple afficher l'heure chaque seconde et faire quelque chose au bout de n minutes). En effet le test ne se faisant pas au moment d'une seconde entière, celà revient à cumuler l'erreur faite sur chaque seconde. Avec ce procédé, l'heure dérive très rapidement alors que l'oscillateur du Picaxe n'est pas si mauvais, et encore moins si on utilise un quartz. La solution dans ce cas est de mémoriser la dernière heure lue dans une variable w, et de comparer avec time. Si différent, il s'est écoulé environ 1 seconde depuis la dernière lecture...
 
Last edited:

PapyJP

Senior Member
Merci
compte tenu de toutes ces remarques, je me propose de faire une pirouette à la barre fixe ( est-ce bien raisonnable à mon âge ? ).

La probabilité est quand même assez faible
En effet mais la loi de l' emm...t maximum s' applique et donc il faut traiter ce cas.

1/ cas où aucun bit n' est reçu pendant le test
je vais ajouter un " bip " à la fin de toute commande correctement exécutée ( ligne modifiée + écran à jour ).
Cela devrait alerter l' utilisateur en cas d' absence de " bip " .
Sans " bip " l' utilisateur prononcera certainement des noms d' oiseaux à mon égard ( ce n' est pas tout à fait exact : généralement, quand une machine ne fait pas ce que l' on voudrait qu'elle fasse, c' est elle que l' on injurie ... pas le programmeur ! ).
Peu importe, si l' absence de " bip " l' engage à re-essayer sa commande... bingo !

2/ cas d' une transmission incomplète,
je devrais pouvoir tester le nombre de bits contenus dans la trame.
S' il n' est pas correct, je pourrais faire monter le message d' erreur ( qui monte actuellement pour toute frappe non correcte et non attendue ).
Là encore, noms d'oiseaux !

Ceci allonge certainement la durée du test ( time + trame ): C' est un pis-aller, un coup de barre fixe.
Qu' en pensez-vous ?
Autres idées ?
 
Last edited:

PapyJP

Senior Member
Dans l' instruction
serin [timeout], pin,....
timeout est en ms. ( manuel2 )
Quelle valeur maximum ( 4mn ===> 240 000 ms)
Doit-on l' écrire en décimal, hexa, ... ?
Faut-il écrire les " right brackets "
 

PieM

Senior Member
Dans l' instruction
serin [timeout], pin,....
timeout est en ms. ( manuel2 )
Quelle valeur maximum ( 4mn ===> 240 000 ms)
Doit-on l' écrire en décimal, hexa, ... ?
Faut-il écrire les " right brackets "
Timeout est une varable type word donc 65535 maxi.
s'écrit en valeur décimale avec les crochets

serin [65535], pin,....
 
Top