'
' Exemple de programme pour piloter l'ouverture et la fermeture du portail
' en BASIC11 (basic compilé)
' démo HB du 26/02/1999

' LES ENTREES SORTIES SUR LA CARTE CONTROLBOY
' Les entrées :
' PORT A bit 0 : fdfer
' PORT A bit 1 : fdouv
'
' Les sorties :
' PORT B bit 0 : commande RE1 (sens Ouverture = 0 / fermeture =1)
' PORT B bit 1 : commande RE3 (alimentation moteur)


' Fichier de config E/S
#include "start.bas"

' Déclaration des variables

int tp(4), tp_ok(4), tmax(4), nb_tempos, nb

BYTE X(7) ' Déclaration du tableau des étapes 0 à 6
BYTE fdfer, fdouv ' Déclaration variables associées aux capteurs
BYTE commande ' Déclaration variable associée à la télécommande (simulé par bouton poussoir)
BYTE arreter_moteur, fermer_portail ' variables associées aux sorties (actions)
BYTE v, s1, s2, s3, s4, s5, s6, s7
BYTE T0_D, T1_D

' Initialisation

PACTL.1 = 0 ' selectionner la vitesse
PACTL.0 = 0
TMSK2.6 = 1 ' declencher le timer
cli ' autoriser les interruptions

tmax(0) = 500 ' valeur tempo 0

nb_tempos = 1 ' (+1)

v = 1
X(0) = 1
X(1) = 0
X(2) = 0
X(3) = 0
X(4) = 0
X(5) = 0
X(6) = 0


PORTB = 0 ' Arrêt moteur

DDRD = 0 ' PD5=PD4=PD3=PD2=input
SCONF = 0x4C ' B,C = sorties
lcdinit()


print " G. OUVRE-FERME "

' PROGRAMME PRINCIPAL

DO ' début de la boucle

' Lecture des entrées

LDAA PORTD ' Lecture interrupteur sur carte Controlboy
ANDA #32 ' MASQUAGE
EORA #32 ' inversion du bit car
STAA commande ' Interrupteur carte actif niveau 0

LDAA PORTA ' Lecture capteur fdfer (fin fermeture)
ANDA #1 ' bit0 = 1 si non actif
EORA #1 ' Inversion bit
STAA fdfer

LDAA PORTA ' Lecture capteur fdouv (fin ouverture)
ANDA #2 ' bit1 = 1 si non actif
EORA #2 ' Inversion bit
STAA fdouv

' MISE A JOUR DES RECEPTIVITES

T0_D = testtempo(0)



'**** Mise à jour des étapes ****

IF commande > 0 AND X(0) = 1 THEN
s1 = 1

ELSE
s1 = 0
END IF

IF fdouv > 0 AND X(1) = 1 THEN
s2 = 1
ELSE
s2 = 0
END IF

IF commande > 0 AND X(2) = 1 THEN
s3 = 1
ELSE
s3 = 0
END IF



IF T0_D = 1 AND X(3) = 1 THEN
s4 = 1
ELSE
s4 = 0
END IF

IF fdfer > 0 AND X(4) = 1 THEN
s5 = 1
ELSE
s5 = 0
END IF

IF T0_D = 1 AND X(5) = 1 THEN
s6 = 1
ELSE
s6 = 0
END IF

IF v = 1 and X(6) = 1 THEN
s7 = 1
ELSE
s7 = 0
END IF



' DESACTIVATION DES ETAPES
IF s1 = 1 THEN
X(0) = 0
END IF
IF s2 = 1 THEN
X(1) = 0
END IF
IF s3 = 1 THEN
X(2) = 0
END IF
IF s4 = 1 THEN
X(3) = 0
END IF
IF s5 = 1 THEN
X(4) = 0
END IF
IF s6 = 1 THEN
X(5) = 0
END IF
IF s7 = 1 THEN
X(6) = 0
END IF



' ACTIVATION DES ETAPES

X(0) = s7 OR X(0)
X(1) = s1 OR X(1)
X(2) = s2 OR X(2)
X(3) = s3 OR X(3)
X(4) = s4 OR X(4)
X(5) = s5 OR X(5)
X(6) = s6 OR X(6)



' Equation des sorties

tp_ok(0) = X(3) OR X(5) ' Validation tempo T0

' Affectation des sorties

IF X(0) = 1 THEN
PORTB = 0
END IF

IF X(1) = 1 THEN
PORTB = 2 ' Activation relais RE3 (RE1 inactivé = ouverture)
END IF

IF X(2) = 1 THEN
PORTB = 0 ' Désactivation RE3
END IF

IF X(3) = 1 THEN
PORTB = 1 ' Activation RE1 : SENS fermeture
END IF

IF X(4) = 1 THEN
PORTB = 3 ' RE3 = 1 (ALIM ) + RE1 =1 (sens fermeture)
END IF

IF X(5) = 1 THEN
PORTB = 1 ' RE3 désactivé, RE1 reste actif
END IF

IF X(6) = 1 THEN
PORTB = 0 ' Désactivation RE3
END IF



LOOP ' Reboucler vers DO


function tempo(cnt)
int t
for cnt=cnt to 0 step -1
for t=0 to 200
next
next
end function

' Fonction test d'une tempo n

function testtempo(n)
if tp(n) >= tmax(n) then
return 1
else
return 0
end if

end function



' Fonction d'interruption pour Tempo non bloquante

interrupt function temporiser3 at $FFF0

for nb = 0 to nb_tempos
if tp_ok(nb) = 1 then
if tp(nb)>20000 then ' Limit max si erreur programme
tp(nb) = 20000
end if

tp(nb) = tp(nb) + 1

else
tp(nb) = 0

end if
next

TFLG2.6 = 1 ' autoriser l'interruption à nouveau

end function


' Fichier routines pour afficheur LCD
#include "lcd.bas"

' FIN DU PROGRAMME BASIC11