Temps de cycle

#1
Bonjour

voici un petit programme sur un 20M2 qui me permet de lire 4 DS18b20 et un potar, les résultats sont envoyés sur un lcd 2004 I2C.
Tout fonctionne correctement, mais le temps de réaction est plutot long.
Par ex: si je met un bouton poussoir, le temps d'acquisition peut aller jusqu'a environ 1 seconde.
Le souci va être quand je vais devoir piloter un moteur et verifier ses positions...

Existe t'il une solution, si ce n'est de diviser les taches sur plusieurs picaxes?

Le prog n'est surement pas optimal, je débute et ce sont des morceaux de prog que j'ai "piqué" a droite et a gauche, et assemblé a ma sauce.

Merci de vos réponses

Code:
'picaxe 20M2
;    SCL sur B.7
;    SDA sur B.5
DirsC=%00001111 'C0 a C3 en sorties
pullup%1111000000000000 'pullup sur c4 a c7
symbol rsbit=bit0
symbol cpt=b1
symbol car=b2
symbol dat=b3
symbol valid=pinC.6
symbol led=C.0
symbol tempair=w10
symbol tempch1=w11
symbol tempch2=w12
symbol tempch3=w13
symbol potar= w9 'pin b6   
      
    setfreq M32             
; Initialisation I2C 4 bits , etc ********
    hi2csetup i2cmaster,%01001110, i2cslow_32, i2cbyte       

; Initialisation LCD *********
    for cpt=0 to 5
        lookup cpt,($33,$32,$28,$c,$6,$01),car
        gosub EnvoiByteCommInit
    next
    pause 100    ;temps init du LCD               
' ========================================================
;  Affichage texte ***********************           
    car= 128    'curseur d?but ligne1
    gosub EnvoiByteComm   
    for cpt=0 to 19
    lookup cpt,("Ch1     ?   C=    ?"),car
    GOSUB EnvoiByteData   
    next   
    car= 192    'curseur  ligne2
    gosub EnvoiByteComm   
    for cpt=0 to 19
    lookup cpt,("Ch2     ?   C=    ?"),car
    GOSUB EnvoiByteData   
    next   
    car= 148 'ligne 3
    gosub EnvoiByteComm
    for cpt=0 to 19
        lookup cpt,("Ch3     ?   C=    ?"),car
        GOSUB EnvoiByteData
next
   car= 212 'ligne 4
    gosub EnvoiByteComm
    for cpt=0 to 8
        lookup cpt,("Air     ?"),car
        GOSUB EnvoiByteData
        next
  '==================================================
    do' boucle affichage variables
' affichage temperature chambre 1
    
    car=132 'ligne 1 colonne 6
gosub EnvoiByteComm
'debug
readtemp12 b.4,tempch1
tempch1=tempch1-13 'ajustement temp
w5=tempch1
gosub decomp
tempch1=w5
bintoascii tempch1,b4,b4,b4,b5,b6
for cpt=0 to 3
lookup cpt,(b4,b5,".",b6),car
gosub EnvoiBytedata
next

' affichage temperature chambre 2
car=196 'ligne2  colonne 6
gosub EnvoiByteComm
'debug
readtemp12 b.3,tempch2
'tempch2=tempch2-13 'ajustement temp
w5=tempch2
gosub decomp
tempch2=w5
bintoascii tempch2,b4,b4,b4,b5,b6
for cpt=0 to 3
lookup cpt,(b4,b5,".",b6),car
gosub EnvoiBytedata
next

' affichage temperature chambre 3
car=152 'ligne  colonne 6
gosub EnvoiByteComm
'debug
readtemp12 b.2,tempch3
'tempch3=tempch3-13 'ajustement temp
w5=tempch3
gosub decomp
tempch3=w5
bintoascii tempch3,b4,b4,b4,b5,b6
for cpt=0 to 3
lookup cpt,(b4,b5,".",b6),car
gosub EnvoiBytedata
next

'affichage temperature air conduit
car=216 'ligne  colonne 6
gosub EnvoiByteComm
'debug
readtemp12 b.1,tempair
'tempair=tempair-13 'ajustement temp
w5=tempair
gosub decomp
tempair=w5
bintoascii tempair,b4,b4,b4,b5,b6
for cpt=0 to 3
lookup cpt,(b4,b5,".",b6),car
gosub EnvoiBytedata
next
if valid=0 then
    high led
    
else low led
endif

'================================ Potar consigne
car=143 'curseur ligne4
gosub EnvoiByteComm
readadc10 B.0,potar
potar=potar*50/102
bintoascii potar,b4,b4,b4,b5,b6
for cpt=0 to 3
lookup cpt,(b4,b5,".",b6),car
gosub EnvoiBytedata
next

' ==================================== Valid consigne CH2



loop
    'do loop            ;boucle d'arret programme
                
' decomposition temp DS18B20
decomp:
w8=w5/16
w7=w5//16
w7=625*w7/1000
w5=w8*10+w7
return





; Sub envoi vers LCD via I2C *************
EnvoiByteCommInit:
    pause 15
EnvoiByteComm:
    rsbit=0
EnvoiByteData:
;1?re moiti?
    dat=car & $F0 | %1000 | rsbit ;%1000 pour l'?clairage
    hi2cout (dat)
    pause 2       
    dat=dat | %1100
    hi2cout (dat)    ;pulse sur E cad P2
    pause 2            ;pause 2 pour 32 MHz
    dat=dat | %1000    ;fin pulse
    hi2cout (dat)
    pause 2   
;2?me moiti?
    dat=car & $0F * 16 | %1000 | rsbit
    hi2cout (dat)
    pause 2
    dat=dat | %1100
    hi2cout (dat)
    pause 2
    dat=dat | %1000 & %1011
    hi2cout (dat)   
    rsbit=1
    return
 

MGU

Senior Member
#2
Bonjour

voici un petit programme sur un 20M2 qui me permet de lire 4 DS18b20 et un potar, les résultats sont envoyés sur un lcd 2004 I2C.
Tout fonctionne correctement, mais le temps de réaction est plutot long.
Par ex: si je met un bouton poussoir, le temps d'acquisition peut aller jusqu'a environ 1 seconde.
Le souci va être quand je vais devoir piloter un moteur et verifier ses positions...

Existe t'il une solution, si ce n'est de diviser les taches sur plusieurs picaxes?

Le prog n'est surement pas optimal, je débute et ce sont des morceaux de prog que j'ai "piqué" a droite et a gauche, et assemblé a ma sauce.

Merci de vos réponses


Bonjour,

Il faut dire que les picaxes sont faciles d'emploi, mais ce ne sont pas les plus rapides.

D'autre part, on lit dans les datasheet DS18B20:
Converts 12-bit temperature to digital word in 750 ms (max.)

Donc, si on a pas besoin d'une résolution sur 12bits et que 8 suffisent (résolution de 1°C),un "readtemp" serait peut être plus rapide (pas testé).
C'est un moteur de quoi?

MM
 
#3
Bonsoir et merci de ta réponse

C'est vrai que la résolution 12bits est un peu du luxe, mais d'un autre coté, 1° de delta ça me choque.
Mais bon pour le temps de lecture et la validation des consignes, ce n'est pas trop gênant.

Je viens de penser a faire une interruption le temps de positionner la trappe ou le clapet (pas encore décidé).
Pour le moteur, je ne sais pas encore. j'avais pensé a un moteur pas a pas (fond de tiroir), ou CC avec plusieurs fdc.
Pas encore sérieusement pensé a l'aspect mécanique.

Le CDC en gros c'est :
J'ai une arrivée d'air, vers les 50,60 degrés, que je dois envoyer vers:
Chambre 1 (prioritaire)
Chambre 2
Chambre 3 en dernier

Je regarde du coté des peek,poke, car les mots me manques (sans rire).
J'attend un 20X2

PS: peek et poke me font penser au zx81, ca ne rajeuni pas...
 

PieM

Senior Member
#4
Bonjour,
Je n'ai pas décortiqué le programme , mais vu le cahier des charges, je ne vois pas en quoi la réactivité poserait un problème!
Que la chambre 2 voit son air chaud arriver avec 3 secondes de délai, , ne doit pas être catastrophique sachant que des variations de température dans ce cas, sont lentes, et que surtout, le temps de stabilisation de la température doit être important.
J'espère que tu ne prévois pas un PID !
Si un moteur doit être contrôlé, c'est cette fonction qui doit être prioritaire, sur les mesures.
 
Last edited:
#5
Bonjour et merci de ta réponse

Je suis bien d'accord que le rafraichissement de l'affichage n'est pas pénalisant.
Attendre le signal (manuel) du BP de validation de la consigne pendant 1 sec. non plus.

Pas de PID:
1: je ne saurais pas faire
2: aucun intérêt dans le cas présent

c'est pour le moteur que je me pose la question.
soit une interruption (que je ne sais pas encore faire), soit un 08M2, qui ne fera que cela, et sera relié a mon 20M2 (ou X2).
D'ailleurs, c'est combien la longueur de liaison maxi entre 2 picaxes?
 

PieM

Senior Member
#6
Gérer 6 fdc sur interruptions c'est faisable. Il faut l'activer pour l'entrée concernée uniquement quand on commande le moteur.
Autre philosophie : un picaxe dans chaque chambre et chacun règle la température qu'il veut. pas besoin de liaison série. Affichage par un 4 digit chinois, ça ne coûte pas cher.
 
#7
OK
Ça me laisse l'embarras du choix, et c'est bien.
Je vais explorer ces pistes.
Je pense que je vais me lancer sur un moteur pas a pas.
 

PieM

Senior Member
#8
Je pense que je vais me lancer sur un moteur pas a pas.
Attention qu'un moteur PaP a aussi besoin d'un repère fixe (FdC) et qu'il faut définir la mécanique avant pour connaître le couple résistant. Et un PaP consomme à l'arrêt si on veut qu'il garde sa position...
Un servo ne serait pas plus indiqué ?
 
#9
Bonjour
Un servo serait bien, mais je n'en ais pas, par contre j'ai des moteurs pas a pas (de récup).
Tous unipolaires
2 petits 12v 200pas, qui vont bien avec un uln2803 (essayé pour l'instant en manuel avec un codeur rotatif)
2 beaucoup plus gros, mais sans aucune inscription et qui consomme 2.5A.
Si je veux les piloter il faudra que je fasse une carte de puissance, c'est possible.

Donc je vais me faire la main avec un "petit" sur un picaxe pour le pilotage (c'est pas gagné), et j'aviserais selon.
Ok pour le repère, c'est logique, et je pense me débrouiller mécaniquement pour ne pas avoir besoin de laisser le moteur sous-tension a l'arrêt.
Je ne suis pas a quelques mm près.
Je pense que j'aurais d'autres questions bientôt.
 
#11
Bonjour et merci de ta réponse
D'ailleurs, c'est combien la longueur de liaison maxi entre 2 picaxes?
Certains ont pu communiquer avec un Picaxe satellisé. En radio, c'est facile pour quelques dizaines de m, un peu plus pointu et/ou coûteux au delà. En I2C quelques m. En rs232, quelques dizaines de m. En rs485 quelques centaines. Avec un modem, on peut faire le tour de la planète. Mais aujourd'hui, on utilisera plutôt une liaison IP.
 
Top