'
'  Exemple de programme pour piloter l'ouverture et la fermeture du portail 
'  Avec temporisation  (fermeture automatique au bout de X secondes)
'  
'  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  ' variables de fin de temporisation 

' 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 T0 
 tmax(1) = 2000 ' valeur tempo T1
 nb_tempos = 2    ' (+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. O-F T "

' 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)
T1_D = testtempo(1)


' **** 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 T1_D = 1  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
tp_ok(1) = X(2)

' 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 
