#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);
}
}