/****************************************************************************************************
/* Esercizi sviluppati in ambiente MikroC. Alessio Bajona
/****************************************************************************************************
/* N.1 accensione led (hello). Esercizio per verificare se il sistema hw/sw funziona*/
void main()
{
// inizializzazione del uC: si esegue solo all'avvio del programma
ADCON1=0x07; //PORTA in digitale
TRISA=0x00; //PORTA dichiarata di out
PORTA=0x01; /*scrittura sul registro PORTA, sull'intero byte;
a ciascuno degli a 8 bit corrisponde un pin che assume tensione 5V se il bit è 1, 0V se il bit è 0;
0x01 numero in base 16; 0b00000001 numero in base 2; 1 in base 10;
in questo caso si dovrebbe accendere il led collegato al primo bit di PORTA*/
//loop infinito; schema base per tutti i programmi a uC: contiene le istruzioni da ripetere continuamente
while(1)
{
//in questo primo esempio il uC non esegue istruzioni
}//fine main loop
} //fine main()
/****************************************************************************************************
/****************************************************************************************************
/* N.2 lampeggio (blinking). Questo programma serve a far lampeggiare un led, quindi ha bisogno di pause (delay)*/
void main()
{
ADCON1=0x07; //PORTA in digitale
TRISA=0x00; //PORTA dichiarata di out
PORTA=0x00; //inizializzazione PORTA: tutti i pin stato basso e led spenti
while(1) //loop infinito
{
PORTA.F1=0; //scrittura sul singolo bit di PORTA (da 0 a 7); scrivendo 0 il relativo led (giallo) si spegne
Delay_ms(1000); //pausa 1 secondo (1000 millisecondi). Funzione inserita nella libreria built_in.h
PORTA.F1=1; //led giallo acceso
Delay_ms(1000); //pausa 1 secondo
} //fine main loop
} //fine main()
/****************************************************************************************************
/****************************************************************************************************
/* N.3 rotazione led. Accendere un led per volta, a rotazione, come se fosse un semaforo, con un ritardo di un secondo*/
void main()
{
ADCON1=0x07; //PORTA in digitale
TRISA=0x00; //PORTA dichiarata di out
PORTA=0x00; //inizializzazione PORTA: tutti i pin stato basso
while(1) //loop infinito
{
PORTA=1; //accende primo led e spegne gli altri
Delay_ms(1000); //pausa 1 sec
PORTA=2; //accende secondo led e spegne gli altri
Delay_ms(1000); //pausa 1 sec
PORTA=4; //accende terzo led e spegne gli altri
Delay_ms(1000); //pausa 1 sec
} //fine main loop
}//fine main()
/***************************************************************************************************
/****************************************************************************************************
/* N.4 lampeggio PWM. Accendere e spegnere un led con luminosità graduale. Si sfrutta l’effetto di persistenza dell’immagine sulla retina. Si usa la tecnica PWM, modulazione di larghezza di impulso, pulse-width modulation. Si comanda il led in ON-OFF: in accensione aumentando gradualmente il tempo di accensione finchè è completamente acceso, in spegnimento aumentando gradualmente il tempo di spegnimento finchè è completamente spento.
Purtroppo la funzione Delay_ms accetta solo valori costanti e non variabili; allora dobbiamo creare una funzione di ritardo che accetta un parametro variabile
*/
#define TEM 20 //TEM è una costante: il preprocessore sostituisce a TEM il valore 20
void ritardo(char i); //dichiarazione della funzione
void main()
{
char k; // indice per il ciclo
ADCON1=0x07; //PORTA in digitale
TRISA=0x00; //PORTA dichiarata di out
PORTA=0x00; //inizializzazione PORTA tutti i pin stato basso
while(1) //loop infinito
{
for(k=0 ; k<TEM ; k++) //loop di accensione: durata=TEM*TEM=0,4s; durata > tempo di persistenza dell'immagine sulla retina ( 0,1s)
{
PORTA.F2=1;
ritardo(k);
PORTA.F2=0;
ritardo(TEM-k); //ritardo singolo ciclo=k+(TEM-k)=TEM
} //ritardo intero ciclo for = ritardo singolo ciclo * numero cicli= TEM*TEM
for(k=0 ; k<TEM ; k++) //loop di spegnimento
{
PORTA.F2=0;
ritardo(k);
PORTA.F2=1;
ritardo(TEM-k);
}
}//fine main loop
}//fine main
// funzione che genera un ritardo di i millisecondi
void ritardo(char i)
{
char k;
for(k=0 ; k<i ; k++)
Delay_ms(1)
}