

	#picaxe 20M2

start0: 'Premier programme en temps partagé

'****** Nomination des ports entrées **********************
	symbol cmd 		= pinC.5	'commande sur pin interruption 
	symbol fcf	 	= pinC.6	'fin de course fermeture
	symbol fco	 	= pinC.7	'fin de course ouverture	
	symbol sensib	= B.5		'pot lecture seuil sensibilité
	symbol courmot	= B.6		'lecture courant moteur
	symbol alert	= pinC.0	'lecture état barrière IR
	symbol lecpot	= C.1		'ADC ou Fixe 1 = fermeture auto ; 0 = manuelle
	
'******* Nomination des variables **********	
	symbol mouv		= bit0	'bit état "en mouvement" pour le flash 
	symbol souvre	= bit1	'mémo état précédent (1=ouverture; 0=fermeture)
	symbol obst		= bit2	'mémo détection obstacle
	symbol fermauto	= bit3	'mémo fermauto ou manuel	
	symbol etat		= b1		'état en cours 1=ouverture; 2=fermeture; 3= arret
	symbol seuil	= b2		'valeur seuil sensib
	symbol courant	= b3		'mesure du courant
	symbol tempo	= w13		'lecture temporisation
	
'******* Nomination des ports sorties	 
	symbol LedR		= B.0		'sortie flash	'
	symbol EmetIR	= B.1		'sortie Led IR
	symbol ouv		= B.2		'commande moteur ouverture
	symbol ferm		= B.3		'commande moteur fermeture
	
	'do:loop while cmd=0 		'attente réglage ADC simu
	
'******** Initialisation variables ********	
	low ouv: low ferm: low ledR	
	etat =3			'etat arret à la mise en route
	souvre=0			'memo fermeture la 1ère commande sera ouverture
	readadc10 lecpot,tempo	'lecture tempo 
	if tempo > 900 then	'pot max, on passe en manuel ou pas de pot C.1 à 5 v
		fermauto=0		'fermauto en manuel		
	elseif tempo <20 then	'automatic sans pot C.1 est à 0
		fermauto=1		'automatique
		tempo=4000		'tempo fixe 4 s
	else 				'pot position médiane
		fermauto=1		'automatique
		tempo= 20*tempo	'réglage tempo 0,4s à 18s
	endif
		
	pwmout EmetIR, 104, 211 'activation Emet IR PWM 38 kHz à 16MHz	
'******** Interruption sur C.5 niveau haut *********	 
	setint %00100000 ,%00100000	

'******** Boucle principale ********		
	Do
		readadc sensib, seuil	'lecture du seuil		
	
		select  etat	'aiguillage suivant variable "etat"
		
		case 1 		' etat ouverture
			mouv=1	'pour le flash
			souvre=1	'mémo état
			obst=0	'reset mémo obstacle IR
			
			do		'boucle ouverture
				low ferm : high ouv		'positionnement des relais ouverture				
			loop while fco=0 and etat=1		'tant que fco ouvert et pas de changementd'état		
			if etat<>3 then
				etat=4				'etat fermeture auto 4 s
			endif
					
		case 2 		' état fermeture		
			mouv=1	'pour le flash
			souvre=0	'mémo état			
			do		'boucle fermeture
				readadc courmot, courant 	'lecture courant moteur
				if courant > seuil then		'si dépassemnt seuil
						obst=1		'mémo détect obstacle 
						etat=1		'positionnement état ouverture					
				endif
				
				if alert=1 then		'détection alert IR
						etat=1	'position état ouverture						 
				endif
				
				low ouv: high ferm	'on ferme!
			loop while fcf=0 and etat=2	'tant que fcf ouvert et pas de changement d'état
			
			if alert=0 and obst =0	then	'pas de problèmes ?					
					 etat =3		'alors,positionnement état arret						
			endif								
		
		case 3		' état arret ;flash OFF		
			low ouv : low ferm	'arret moteur		
			mouv=0			'arret du flash
			
		case 4		'état automatique ; flash ON
			low ouv : low ferm			'arret moteur		
			do:loop while alert=1 and etat=4	'blocage par obstable IR si pas changement état
			if fermauto =1 and etat=4 then	'si automatique =1 et etat 4
				pause tempo				'attente 4 s
				etat=2				'fermeture auto
						else			'sinon							
				etat=3				'arret
			endif
				
		end select
			
	loop	

interrupt:	'Ah, on a appuyé sur le bouton !!

	do : loop while cmd=1 'attente relachement poussoir
	
	select etat
	
		case 1,2,4		'on est en état 1,2 ou 4	
			etat = 3		'alors passage à l'état 3 (arret)
					
		case 3 		'on est à l'arret
			if souvre=1 then 	' état précédent= ouverure 
					etat=2	' alors on passe en fermeture
			else 
					etat=1	' sinon, c'est le contraire
			endif
		
	end select
	setint %00100000 ,%00100000	'reset de l'interruption
	
	return	
	
start1:	'Second programme en temps partagé uniquement pour le flash

	Do
	if mouv=1 then	'si mouvement
		high ledR	'ça 
		pause 500	'cli
		low ledR	'gno
		pause 500	'te !
	endif
	loop
		