[ create a new paste ] login | about

Link: http://codepad.org/yibIsDnw    [ raw code | fork ]

C, pasted on Apr 28:
#define _LEGACY_HEADERS 
#include<htc.h>
#include "delay.c"
#define XTAL_FREQ 4MHZ  //Quarzo a 4MHz
#define SOURCE_IDLE1 0b00000001 //Valori per ADCON0 in modo da accendere il modulo
							  //e portarlo in 'ascolto' dell'ingresso analogico AN0
#define SOURCE_IDLE2 0b00000101 //Valori per ADCON0 in modo da accendere il modulo
							  //e portarlo in 'ascolto' dell'ingresso analogico AN1
#define ROTAZIONI 5 //Quante volte effettuare la rotazione completa del motore ogni ciclo di rotazione
#define SOGLIA 1 // Soglia luminosa oltre la quale entra in azione il sistema di correzione dell'inclinazione
#define REFRESH 50 //Ms (1-65535) tra un refresh e l'altro delle condizioni del sistema
#define T_BUIO 3 //Durata buio
#define SOGLIA_BUIO 50 //Soglia al di sotto della quale il segnale luminoso è considerato un ambiente buio

void lettura (int n_sensore, int *tensione);
void rotazione (int verso, int velocita);
void asp (int sec);



main(void)
{
	TRISA=0b00000011;   //Bits 0 e 1 come ingressi (analogici AN0 e AN1), il resto uscite
	TRISB=0b00000011; //Bits 0 e 1 come ingressi (finecorsa), il resto uscite
    TRISC=0b00000000; //Inutilizzate, tutte uscite	
	PORTA=0; //Azzeramento uscite per evitare disturbi	
	
	ADCON1=0b00001101;  //Valori per ADCON1 in modo da settare le porte RA0 e RA1 come ingressi analogici AN0 e AN1
	ADCON2=0b10010100; //Valori per ADCON2 in modo da settare 'giustifica a destra dei Bits',
					  //'Tempo di acquisizione' 16 Tad = 64us e 'Clock di conversione' Fosc/16 = 4us
	
	int tensione0=0, tensione1=0, ddp=0, buio=0;
	
	//eeprom_write(0, 0);
	//eeprom_write(1, 0);
	
	while(1)
	{		
		do
		{
			lettura(0, &tensione0);
			lettura(1, &tensione1);
			ddp=tensione0-tensione1;
			
			if((ddp>SOGLIA)&&(RB0==0))
			{
				rotazione(0,(int)ddp/4);
				buio=0;
			}
			if((ddp<SOGLIA*(-1))&&(RB1==0))
			{
				rotazione(1,(int)ddp/4);
				buio=0;
			}
			//eeprom_write(5, ddp);
			//eeprom_write(6, buio);
			if((ddp<=SOGLIA)&&(ddp>=SOGLIA*(-1))&&(((tensione0+tensione1)/2)<=SOGLIA_BUIO)) //Controlla se è buio
			{
				buio++;
			}
			
		}while(!((ddp<=SOGLIA)&&(ddp>=SOGLIA*(-1)))); //Effettua le rotazioni fin quando la ddp è compresa nella soglia
		
		asp(REFRESH);
		
		if(buio>=T_BUIO)
		{
			buio=0;
			while(RB0==0)
			{
				PORTA=0b10000000;
				rotazione(1,100);
			}
		}
	}
}		
		
	
	void rotazione (int verso, int velocita)
	{
		int step[4]={4,8,16,32}, j;
		
		for(int i=0;i<ROTAZIONI;i++) //ciclo per le rotazioni
		{
			switch(verso)
			{
				case 0: //rotazione oraria
				for(j=0;j<4;j++)
				{
					PORTA=step[j];
					DelayUs(256-velocita);
					DelayUs(256-velocita);					
				}
				break;
				
				case 1: //rotazione anti-oraria
				for(j=3;j>=0;j--)
				{
					PORTA=step[j];
					DelayUs(256-velocita);
					DelayUs(256-velocita);					
				}
				break;				
			}
		}
		PORTA=0;
	}
				

	void lettura (int n_sensore, int *tensione)
	{
		switch(n_sensore)
		{
			case 0: //rilevazione e conversione sorgente AN0
			ADCON0=SOURCE_IDLE1;
			DelayUs(10);
			GO=1;
			while(GO) //attesa conversione
			continue;
			
			//eeprom_write(0, ADRESH);
			//eeprom_write(1, ADRESL);			
			
			*tensione=(ADRESH<<8)+ADRESL; //unione registri
			break;
			
			
			case 1: //rilevazione e conversione sorgente AN1
			ADCON0=SOURCE_IDLE2;
			DelayUs(10);
			GO=1;
			while(GO) //attesa conversione
			continue;
			
			//eeprom_write(2, ADRESH);
			//eeprom_write(3, ADRESL);			
			
			*tensione=(ADRESH<<8)+ADRESL; //unione registri
			break;
		}
		
	}
	
	void asp (int sec)
	{
		int i;
		for(i=0;i<sec;i++)
		{
			DelayMs(1);
		}
	}


Create a new paste based on this one


Comments: