serin, serout, inapropriés ?

PapyJP

Senior Member
La liaison Picaxe-Minitel est du type TTL-TTL.
De trés nombreux exemples d' interfaçage sont proposés dans le manuel3 ( Darlington, CI 28003, ... ). Tout est dit.
Mais qu' en est-il des circuits des puces elles-même dont je n' ai trouvé que la seule limitation est 20 mA par patte ( sink or seek ) avec un max de 90 mA par puce : vrai TTL, avec ou sans R de rappel, collecteur ouvert, ... toutes identiques ? ).

J' ai étudié ce que j" appelle 'l affectation et l' interrogation des lignes d' E/S' suivant les conseils de PieM ( #105 et 106 ).
Pour ce qui est de la commande dirs, dirsC= % 00000101 va configurer C.0 et C.2 en tant que sortie, et les autres en tant qu'entrées...
.
C' est clair.
Plus loin je trouve :
la variable ' pins ' placée à droite d' un assignement renvoie l' état des entrées ( let b1=pinsB ).
Cela veut-il dire que sur un port panaché comme ci-dessus par dirsC, le tri sera fait automatiquement en ne gardant que les entrée et ignorant les sorties ?
 

PieM

Senior Member
Mais qu' en est-il des circuits des puces elles-même dont je n' ai trouvé que la seule limitation est 20 mA par patte ( sink or seek ) avec un max de 90 mA par puce : vrai TTL, avec ou sans R de rappel, collecteur ouvert, ... toutes identiques ? )
Selon le type de picaxe le type d'entrée peut être du type TTL ou trigger de Schmitt, et éventuellement configurable dans le cas des M2 (voir la commande inputype). Si le Picaxe est alimenté en en >4.5V, le niveau haut TTL est défini pour u > 2.0V . le niveau bas est pour u < 0.8V.

De même avec les M2, il est possible de mettre par programme une résistance de pull-up sur certaines entrées. (voir pullup )


la variable ' pins ' placée à droite d' un assignement renvoie l' état des entrées ( let b1=pinsB ).
Cela veut-il dire que sur un port panaché comme ci-dessus par dirsC, le tri sera fait automatiquement en ne gardant que les entrée et ignorant les sorties ?
Oui. Mais là aussi il faut savoir de quel type de Picaxe on parle . Sur un port bidirectionnel, pins est l'état des entrées et outpins sera l'état des sorties.

Donc un même port, C par exemple, verra ses broches 0 et 2 en sortie avec dirsC = %00000101

un b1 = pinsC aura comme valeur %01000000 après mise à un de l'entrée C.6
et un b2 = outpinsC aura comme valeur %00000100 après un high C.2


petit programme pour expliciter:

Code:
#picaxe 20M2
do
[INDENT]dirsC = %00000101
high C.2
b1 = pinsC
b2 = outpinsC[/INDENT]
loop
Il suffit d'activer en simulation, les entrées pour voir ce qui se passe...
 

PapyJP

Senior Member
Merci, c' est trés clair ( as usual ! )

Je viens de faire mes premiers pas ( prudents ) suivant la description donnée manuel1 page 49.
Ca clignote ! Magique !
 
Last edited:

PapyJP

Senior Member
Comment déclencher un programme ?
1/Je branche AXE 027, je débranche le Minitel et je charge le programme ( qui doit envoyer des caractères au Minitel ) car ' serialout ' est câblé au deux.
2/ Je débranche AXE 027, je branche le Minitel.
Faut-il que j' installe un poussoir sur une entrée et que je prévois une boucle d' attente du genre do ... loop until qui teste le poussoir par exemple ?
Ou y a-t-il un autre moyen ?
 

PieM

Senior Member
car ' serialout ' est câblé au deux.
Je ne comprends pas trop ... vous utilisez serial in et serial out avec sertxd / serrxd pour votre liaison avec le Minitel ?
On avait dit que ce n'était pas compatible au niveau des débits ! (#65)

Sinon, si vous voulez arrêter/ démarrer votre programme comme bon vous semble, effectivement un inter sur une entrée est à prévoir.
 

PapyJP

Senior Member
Bien sûr, je suis un âne !
J' ai confondu ' serialout ' et ' serout ' ( je n' ai pas encore Basic en tête, les PIC n' ont que 35 instructions ! ).

J' avais pourtant bien noté #65 avec sa remarque sur l' initialisation de la ligne utilisée.

Merci de me remettre dans l' AXE !
 

PapyJP

Senior Member
Ca fonctionne trés bien dans le sens Picaxe ---> Minitel !
Aucun pb .
J' ai fait une photo numérique de l' écran en jpeg pour vous la joindre mais impossible ( même transformée en .gif ne ' pesant ' que 47 kB ! ). Elle est toujours refusée par l' icône ' joindre une photo ' aprés chargement de l' image.
Expliquez-moi comment faire.
Reste l' autre sens !!!!!!!!!!!!
D' autres messages en perspective ! ( fonctionnement sous interruption ..................... )
 
Last edited:

BESQUEUT

Senior Member
Bravo !
( fonctionnement sous interruption ..................... )
Même si ce n'est pas vraiment idéal, je verrais plutôt un background receive.
Pouvez vous donner un exemple des messages échangés dans un sens et dans l'autre. Est-il possible que le Minitel envoie des caractères pendant qu'il en reçoit ? (half ou full duplex ?)
Y a-t-il d'autres événements à prendre en compte pendant ce dialogue ?
 

PapyJP

Senior Member
je verrais plutôt un background receive.
Quoi Caisse ?

Je pense qu' il est full duplex mais je n' en suis pas sûr. Je vais essayer de retrouver le STUM ( Spécifications Techniques d' Utilisation du Minitel ) dont je me méfie car pas toujours applicable au Minitel 1B, en particulier certaines séquences d' ordres ne fonctionnent pas ( effacement ligne par exemple ).
Non, il n'y a pas d' autres évenements à prendre en compte
 

PapyJP

Senior Member
Besqueut

Le STUM précise que la prise péri-informatique ( DIN 5 broches ) permet des échanges de données bidirectionnels simultanés donc full duplex

J' ai choisi la série M2 ( 08 et 20 )
 

BESQUEUT

Senior Member
donc full duplex
OK le Minitel sait le faire, mais on n'est pas obligés de l'utiliser...
le problème, c'est que tant que le Picaxe est occupé à envoyer des octets, c'est très difficile (impossible à ma connaissance ) d'en recevoir.
L'idée serait donc de supposer que l'utilisateur attende la fin de l'affichage avant d'utiliser le clavier.
Si de plus on n'a rien de pressé à faire, on peut bloquer le Picaxe en attente d'une entrée avec un bête serin.
Sinon, il faut utiliser le timeout et ainsi on est en mesure de faire un peu autre chose de temps en temps.
J' ai choisi la série M2 ( 08 et 20 )
Il me semblait bien avoir lu ça... donc on oublie le background receive.
(C'est un truc très puissant qui permet en théorie de recevoir des tas d'octets en tâche de fond sans avoir à s'en préoccuper dans le programme principal. Il y a simplement un flag qui bascule pour signaler que du courrier est arrivé (comme les boîtes aux lettre US...) Et donc on n'a pas besoin de scruter en permanence le port série au cas où un octet tomberait du ciel. En pratique avec un Picaxe, c'est incompatible avec des tas de choses dont en particulier les communications série... donc on ne perd pas grand chose...)
 

PapyJP

Senior Member
Rappel : le Minitel est un terminal passif.
Il permet la visualisation de données sur un écran et l' émission de données à partir d' un clavier.
Point barre ! N' ayant pas d' ALU, il ne sait rien faire d' autre.

Donc restons modeste.
Qu' est-ce qu' on veut faire ?

Cas d' école :

On veut, par exemple, à partir du clavier, fermer le volet 2 ( V2 ) et verrouiller la porte du garage ( G1 ) en domotique OU mettre l' aiguillage 7 ( A7) à droite et l' aiguillage 4 ( A4 ) à gauche en modélisme ferroviaire.
On souhaite avoir un compte rendu de ces manoeuvres.

J' abandonne donc toute idée d' interruption puisque l' on est en ' flip-flop'. Le Picaxe est toujours en attente de données du terminal.
Je propose :
1er temps.
Je tape au clavier( par expérience il ne faut pas trop de caractères à taper sinon galère ) :
V2F.................... ( ---> Fermer le volet 2 )
G1V....................( ---> Verrouiller la porte G1 )
OK

ou

A7D...................( aiguillage A7 à droite )
A4G...................( aiguillage A4 à gauche )
OK

2ème temps

Ces commandes sont ensuite envoyées puis exécutées ( par OK ) et enfin le Compte Rendu d' exécution ( CR ) est affiché à l' écran ( en domotique peut-être existe-il des contacts de fin de course à tester ? en modélisme c' est en 'boucle ouverte' ).
Donc, en domotique, CR aprés test des contacts de FdeC, en modélisme CR aprés envoi de la commande.

Autre idée ?
 

BESQUEUT

Senior Member
Ca me semble sobre et de bon gout...
Compte-tenu de la simplicité des commandes, il n'est éventuellement pas nécessaire de remettre à zéro le bit zéro.
Par habitude, j'ai tendance à mettre en premier l'action et ensuite les paramètres. Par exemple VG1 pour verouiller la porte G1.
(Du coup, on peut éventuellement faire VG1G2 ou VG1,G2 si un séparateur est nécessaire, mais restons simples dans un premier temps.)
Pour A7D, on peut considérer que A est le verbe et 7 & D deux paramètres.
Il me semble que le OK n'est pas indispensable puisque de toutes façons chaque ligne doit être validée. Mais vu le temps de rafraichissement d'un écran Minitel, l'idée est peut-être de ne rafraichir qu'en cas de réception de cette commande.
Je verrais bien qq chose comme :
Boucle :
serin timeout,...,b1,b2,b3,b4
if b4<> code_validation then goto Boucle
select case b1
case 65: gosub Aiguillage
case 194: gosub Barriere
else: afficher commande inconnue
endselect
goto Boucle

Ceci suppose que toutes les commandes sont en 3 caractère + une touche de validation.
S'il faut traiter le OK (touche OK ou caractères ?) et/ou des commandes à longueur variable, c'est un peu plus compliqué.
NB : 194= 128+66 et bien évidement 66 est le code ascii de la lettre B... (j'ai une chance sur 2 : je ne sais pas si la parité est paire ou impaire... je vous laisse corriger...)

On peut aussi ne prendre que le premier caractère et faire immédiatement un select case.
Du coup dans chaque sous-programme, on fait un deuxième serin pour recevoir les paramètres (qui dans ce cas peuvent être en nombre variable)
Je ne conseillerais pas cette méthode si l'émetteur était un processeur parce qu'il y a un risque de recevoir un deuxième caractère avant d'avoir terminé le select case. Mais comme ici, il faut taper sur un clavier, il est peu probable que le temps entre 2 caractères soit trop court...

Dans tous les cas, bien réfléchir à ce qui se passe si l'utilisateur tape des caractères incohérents (ou que la transmission est perturbée).

Encore une chose ! faut-il générer l'écho ? (il me semble que le Minitel peut le faire tout seul...)
 
Last edited:

PapyJP

Senior Member
Besqueut
merci de ces remarques.
Je vais ' re-fléchir ' !
Si l' on synthétise le scénario envisagé on s' aperçoit que, le Picaxe est toujours en attente d' une commande .
S' il en reçoit une, sa fonction est de l' exécuter ( commander un relais, envoyer une impulsion, ... ) puis de rendre compte en clair ( Volet 2 fermé, aiguille 7 à droite ) avant de revenir en attente.

L' écho sur Minitel est automatique, cad que tout caractère frappé au clavier est inscrit à l' écran.
C' est rassurant car on voit ( on évite pas hélas ) que l' on a fait une faute de frappe.

Dans mon appli avec un PIC16F84,
1/ je réserve une ligne pour les caractères frappés au clavier ( j' y place le curseur aprés toute action )
- si la commande est valide au niveau du PIC, il l' efface de l' écran et commande un Bip de validation
- si elle ne l' est pas il l' efface et écrit ' erreur ! ' dans cette ligne à l' écran.
2/ Les autres lignes sont réservées aux actionneurs et mises à jour après chaque action. Par exemple qqchose comme :
Aiguille 1 : D
Aiguille 2 : D
Aiguille 3 : G
etc ...
 

PapyJP

Senior Member
Besqueut
vous écrivez :
serin timeout ....
Le manuel 2 page 204 est vraiment trés sec sur cette formulation !
Je pense que ça veut dire : attendre une donnée pendant le temps timeout ?
Mais comment fixer timeout ( qui n' est pas, semble-t-il, une instruction ) ?
 

BESQUEUT

Senior Member
timeout is an optional variable/constant wich set the timeout period in ms (page 205)
En clair, si vous écrivez serin 1000,...,b1,b2,b3,b4 le PICAXE attendra 1 seconde et s'il ne reçoit rien continuera quand même. Evidement b1,b2,b3,... ne seront pas modifiés dans ce cas.
C'est optionel, donc vous pouvez ne rien mettre dans un premier temps. Dans ce cas, le PICAXE ne pourra rien faire tant que vous ne touchez pas au clavier.
(Je pense quand même qu'il peut réagit aux interruptions, mais je n'ai pas essayé.)
Si vous l'utilisez, vous pouvez donc de temps en temps lire une valeur analogique (exemple une LDR pour éclairer les lampadaires en fonction de la luminosité...)
Pendant ce temps, les commandes au clavier ne sont plus reçues, donc il ne faut pas le faire trop souvent et il faut que ce soit bref.
Attention aussi : remettre à zéro b1 avant le serin de façon à détecter qu'en fait il ne s'est rien passé...
 

BESQUEUT

Senior Member
C' est rassurant car on voit ( on évite pas hélas ) que l' on a fait une faute de frappe.
La suite logique, c'est de tenir compte des touches de correction... et ça le minitel ne le gère pas tout seul...
Dans un premier temps, on peut tout effacer si b4 est la touche d'erreur au lieu de la touche de validation.
Autre approche possible si on traite caractère par caractère : un bip si la commande est impossible et effacement du dernier caractère avec la touche ad hoc...
J'ai l'habitude de dire que 90% d'un programme est constitué par l'interface utilisateur (99,99 % avec Visual Studio) on en prends le chemin...
 

PapyJP

Senior Member
On ne peut pas utiliser les touches de correction pour corriger une erreur car tous les caractères frappés au clavier sont émis sur la liaison instantanément au fur et à mesure de la frappe.
On peut corriger seulement ce qui est affiché à l' écran mais si j' ai tapé 7 au lieu de 6 ---> le 7 est parti, suivi du 6.
C' est pourquoi c' est le PIC qui décide si la commande est valide.
 

PapyJP

Senior Member
Peut-on, avec les Picaxes, créer un ou plusieurs ' timers ' ( comme dans les PIC ) qui travaillent en tâche de fond et qui avertissent lors de l' over flow en déclenchant, par exemple, une IT ou une sous routine ?.
J en aurais besoin car l 'écran du Minitel s'éteint automatiquement s'il n'y a aucune activité clavier pendant environ quatre minutes ( déja écolo en 1980 ? ) .
Dans mon appli 16F84 je me sers d' un timer pour réactiver l' écran toutes les trois minutes environ ( mais laisse le choix à l' utilisateur d' avoir un écran permanent ou pas ).
 

BESQUEUT

Senior Member
réactiver l' écran toutes les trois minutes environ
Pour ce genre de chose, le lis la variable "time" dans la boucle principale et je compare à la dernière valeur lue. Si c'est différent, il s'est donc écoulé une seconde. Je mémorise la dernière valeur lue et je fais ce qui doit être fait toutes les secondes. On peut faire pareil après avoir divisé par n si on veut se dérouter toutes les n secondes.
Par ailleurs, si le programme est bloqué sur un serint, on doit pouvoir mettre un timeout de 3s et donc rafraichir l'écran à chaque fin de timeout.
 

BESQUEUT

Senior Member
On ne peut pas utiliser les touches de correction pour corriger une erreur car tous les caractères frappés au clavier sont émis sur la liaison instantanément au fur et à mesure de la frappe.
On peut corriger seulement ce qui est affiché à l' écran mais si j' ai tapé 7 au lieu de 6 ---> le 7 est parti, suivi du 6.
OUI je sais ce qu'est un terminal passif (VT 100 par exemple).
Une fois que l'on a tapé une commande, on a deux possibilités : soit on tape "entrée" ou retour à la ligne et le Picaxe essaye d'interprêter,
soit on tape la touche "Correction" et dans ce cas on efface le dernier caractère frappé (ou toute la ligne si c'est plus simple)
Ca complique un peu mais c'est plus convivial pour l'utilisateur.
L'idée générale c'est de mémoriser les caractères frappés par exemple dans b1,b2,b3 & b4.
b1 est le verbe, b4 la validation, b2 & b3 des paramètres.
On peut soit lire les 4 d'un coup, soit les lire l'un après l'autre ce qui est un poil plus compliqué, mais plus souple en particulier si on doit gérer les corrections.
 

PapyJP

Senior Member
Il n' y a donc pas de ' timer ' propre au picaxe.
Ceci dit votre stratègie me semble géniale, trés ' sioux ' !
Mais une question :
comment incrémenter la variable ' time ' toutes les secondes dans la boucle principale sans faire une ' pause 1000 ' qui va bloquer le déroulement du code ?
 

PapyJP

Senior Member
Rèponse à #145
Ce n' est pas tout à fait ça:
1/ tout caractère frappé au clavier est immédiatement transmis sur la prise péri-informatique sans autre forme de procès.
2/ par contre, toute ligne écrite à l' écran qui a fait l' objet ou non de corrections est en mémoire et ne sera transmise au modem ( donc sur la ligne téléphonique ) qu' au moment où l' on active la touche ' envoi '.
 

BESQUEUT

Senior Member
comment incrémenter la variable ' time ' toutes les secondes ?
C'est tout l'inrérêt de la variable spéciale "time" : elle s'incrémente toute seule toutes les secondes...
Le seul hic est que si on va la voir de temps en temps, impossible de savoir si on est dans la même seconde ou si ça a changé, voire même qu'il s'est écoulé deux secondes depuis la dernier fois, sauf à mémoriser sa valeur la dernière fois qu'on la lue...
J'ai vu des exemples qui la remette a zéro a chaque lecture et qui attendent qu'elle passe à un : mauvaise idée à mon avis...
Supposons qu'on lise time toute les 300ms. Au départ du programme on mets time à zéro.
Puis on fait 3 lectures qui sont donc toutes à zéro.
La quatrième fois, on lit 1 et on remet à zéro. Mais en réalité, il s'est écoulé 1,2s, et cette erreur est reproduite et cumulée toutes les secondes...
Avec ma méthode, on n'est pas plus précis sur la première seconde, mais on ne cumule pas les erreurs. des fois ça fera 0,8 s, des fois 1,2 mais en moyenne ce sera bon.
Si c'est juste pour rafraichir la page du Minitel, la méthode la plus simple est suffisante puisqu'on n'a pas besoin de précision.
Si c'est pour un timer qui doit battre la seconde, c'est autre chose...
 

BESQUEUT

Senior Member
1/ tout caractère frappé au clavier est immédiatement transmis sur la prise péri-informatique sans autre forme de procès.
2/ par contre, toute ligne écrite à l' écran qui a fait l' objet ou non de corrections est en mémoire et ne sera transmise au modem ( donc sur la ligne téléphonique ) qu' au moment où l' on active la touche ' envoi '.
Je ne connaissait pas la deuxième méthode.
Et donc j'ai toujours travaillé de la première façon (et sans utilisation de la touche envoi)
De toutes façon, il me semble raisonnable de laisser ça de coté dans un premier temps puisque ce n'est qu'une amélioration de confort.
J'ai toujours préféré commencer par un programme rustique mais qui marche,
plutôt que de tenter d'emblée l'usine à gaz qui fait tout mais qui est très difficile à mettre au point...
 

PieM

Senior Member
Il n' y a donc pas de ' timer ' propre au picaxe.
comment incrémenter la variable ' time ' toutes les secondes dans la boucle principale sans faire une ' pause 1000 ' qui va bloquer le déroulement du code ?
Le picaxe comporte un timer accessible par la variable time qui s'incrémente toutes les secondes.

Vous pouvez mettre à zéro cette variable par un time = 0
vous pouvez lire à tout instant le temps écoulé par un b1 = timer par exemple.
et de faire un test if time > 180 then ...

time est une variable de type byte donc peut compter jusqu'à 65535 s.
 
Last edited:

BESQUEUT

Senior Member
on efface le dernier caractère frappé .
J'ai peut-être été insufisament clair : "on" dans ce cas est le Picaxe ; il doit envoyer la séquence qui permet d'effacer un caractère (8,32,8 = a gauche, un blanc, à gauche)
En parallèle, si on est en train de lire le deuxième caractère, il faut faire en sorte que le programme attende de nouveau le deuxième caractère (et non le troisième)
Evidement, si on ne traite pas caractère par caractère, il n'y a pas d'autre choix que d'effacer la ligne (13,32,32,32,13) ou (13,"___",13) comme vous voulez
 

PapyJP

Senior Member
Vous pouvez mettre à zéro cette variable par un time = 0
vous pouvez lire à tout instant le temps écoulé par un b1 = timer par exemple.
et de faire un test if time > 180 then ...
Précisez svp :
... par un b1=timer
OU
... par un b1= time ?
 
Top