;régulation four MM 250624
;compatible MAX31855 et MAX6675
#picaxe 14M2
#no_data
symbol LCD=B.1
symbol CLK=C.1 ; pulse horloge
symbol CSB=C.2 ;demande lecture _____/
symbol SO=pinC.3 ;bit de donnée spiin
symbol potar=C.4 ;potentiomètre consigne
symbol four=B.4
symbol led=B.5
symbol def=bit0 ;bit défaut
symbol flag=bit1 ;passage par défaut
symbol MTC=pinB.2 ;max31855=1 ; max6675=0
symbol cpt=b1 ;compteur
symbol cpt2=b2 ;compteur
symbol delta=b3 ;écart limites / consigne: régulation TOR
symbol cons=b4 ;ici,0 à 255
;b5,b6,b7 chiffres affichage
symbol temptherm=w13 ;tempé thermocouple
symbol limit=w12 ;tempé interne
symbol temp=w11
setfreq M16
symbol baud=N2400_16
dirsC=%111111
pullup %100 ;pullup sur B.2
;*****************************
pause 500
gosub texte
high CSB ;première conversion
temp=0
delta=2 ;plage de température : +/- delta
;*************************************************
Do ;boucle principale
gosub affcon
on MTC gosub lec6675,lec31855
gosub afftherm
loop
lec31855:
temp=0
for cpt2=1 to 5
do
pause 500 ;125 ms à 16MHz
low CSB ;lecture registre
gosub shifin
high CSB ;nouvelle conversion
def=temptherm//2 ;isol bit défaut
if def=1 then ;y a un défaut
gosub erreur
endif
loop while def=1 ;y a plus de défaut
if flag=1 then
gosub texte ;on réécrit le texte
flag=0
endif
;**** temp thermocouple ******************************
temptherm=temptherm/4 ;suppression des 2 derniers bits
if temptherm>=$2000 then ;test 1er bit des 14 bits pour valeur négative
temptherm=0 ;valeur négatives non traitées :valeur mini à 0
endif
temptherm=temptherm/4 ;suppression des décimales-> val entière
temptherm=temptherm//4096 ;on garde les 12 derniers bits
temp=temp+temptherm ;cumul sur 5 valeurs
next cpt2
temp=temp/5
return
lec6675:
temp=0
for cpt2=1 to 2
do
pause 500
low CSB ;lecture registre
gosub shifin
high CSB ;nouvelle conversion
def=temptherm//8/4 ;isol bit défaut
if def=1 then gosub erreur
loop while def=1
if flag=1 then
gosub texte ;on réécrit le texte
flag=0
endif
temptherm=temptherm/32 ;on garde la valeur entière
temp=temp+temptherm ;cumul sur 5 valeurs
next cpt2
temp=temp/2
return
;La broche SO va copier successivement la valeur de chaque bit du registre.
shifin:
temptherm = 0
for cpt = 1 to 16
temptherm=temptherm * 2 + SO ;décalage à gauche + SO (0 ou 1)
pulsout CLK,1 ;pulse horloge
next cpt
return
afftherm: ;affichage température lue et thermostat
bintoascii temp,b5,b5,b5,b6,b7
if temp<100 then: b5=" " :endif ;suppression des 0 non significatifs
if temp<10 then :b6=" " :endif
serout LCD,baud,(254,202,b5,b6,b7)
limit= temp+delta ;limite sup
if cons>limit then
high four,led
endif
if temp>delta then ;éviter valeur négatives
limit=temp-delta
endif
if cons<limit then
low four,led
endif
return
affcon: ;affichage consigne
readadc potar,cons ;lecture potar consigne
bintoascii cons,b5,b6,b7
if cons<100 then: b5=" " :endif
if cons<10 then :b6=" " :endif
serout LCD,baud,(254,138,b5,b6,b7)
return
texte: ;texte fond d'écran
serout LCD,baud,(254,128,"CONSIGNE : ßC")
serout LCD,baud,(254,192,"TEMP LUE : ßC")
pause 500
return
erreur:
serout LCD,baud, (254,128," ERREUR ")
serout LCD,baud, (254,192," PAS DE SONDE ")
pause 1000
flag=1 ;marqueur de passage
return