//**********************************************************************************************************************************
//Descrizione programma : genera su RA0 un onda quadra con periodo di 1 mS (f = 1 Khz)
//Descrizione del funzionamento : Per ottenere un onda quadra con periodo pari a 1 mS e' possibile
//utilizzare il TIMER0, precaricandolo con un valore opportuno e mandando in toggle lo stato di
//RA0 ogni qualvolta il TIMER0 va in overflow, situazione per la quale si genera una richiesta
//di interrupt (flag T0IF a 1) se la stessa e' abilitata' (T0IE a 1).
//Ogni volta che avviene una richiesta di interrupt su T0IF occorrera' ricaricare il TIMER0 con
//il valore apposito, invertire lo stato di RA0, e riabilitare l'interrupt (T0IF a 0).
//Con una frequenza di clock di 4 Mhz il periodo e' di 250 nS, per cui il tempo-istruzione e'
//di 1 uS. Affinche' il TIMER0 conti per 1 mS occorrera' caricarlo con il valore 1000. (1000 uS =
//1 mS). Non potendo caricare 1000 su un registro a 8 bit bisognera' caricare 6 (contare da 6
//a 0 significa contare 250 volte)ed utilizzare il prescaler in configurazione 1:4 
//(divide per 4 la frequenza di clock). In questo modo otteniamo il valore 1000 come 250 * 4

//**********************************************************************************************************************************
//Dati di sistema
//Fclock         : 4 MHz
//Tclock         : 250 nS
//Tistruzione    : 1 uS

//INCLUDE files
#include <pic.h>

//*********************************************************************************************************************************
//Configurazione bit di programmazione
//Oscillatore : XT
//Watchdog : OFF
//Power Up Timer : ON
//Code Protect : ALL
//Brown Out Detect : ON
//Low Voltage Program : Disable
//Data EE Protect : OFF
//Flash Program Write : Disable
//Background Debug : Disable

//0b 0000 0101 0100 0001
__CONFIG(0x0D41);
//


//*********************************************************************************************************************************
//Prototipi
void SystemInit (void);

//*********************************************************************************************************************************
//Simboli
#define Segnale RA0
#define TimerInit 9  //sarebbe 6 ma con i tempi di caricamento del timer si va a 9

//*********************************************************************************************************************************
//Tipo di segnale (analogico o digitale) sui portx
#define ADMode 0x06;   //tutto in digitale

//Collegamenti a PORTA
//RA0 (OUT) --> LED0
//RA1 (OUT) --> NU
//RA2 (OUT) --> NU
//RA3 (OUT) --> NU
//RA4 (OUT) --> NU
//RA5 (OUT) --> NU
#define TrisaInit 0x00;

//Colelgamenti a PORTB
//RB0 (OUT) --> NU
//RB1 (OUT) --> NU
//RB2 (OUT) --> NU
//RB3 (OUT) --> NU
//RB4 (OUT) --> NU
//RB5 (OUT) --> NU
//RB6 (OUT) --> NU
//RB7 (OUT) --> NU
#define TrisbInit 0x00;

//Colelgamenti a PORTC
//RC0 (OUT) --> NU
//RC1 (OUT) --> NU
//RC2 (OUT) --> NU
//RC3 (OUT) --> NU
//RC4 (OUT) --> NU
//RC5 (OUT) --> NU
//RC6 (OUT) --> NU
//RC7 (OUT) --> NU
#define TriscInit 0x00;

//Colelgamenti a PORTD
//RD0 (OUT) --> NU
//RD1 (OUT) --> NU
//RD2 (OUT) --> NU
//RD3 (OUT) --> NU
//RD4 (OUT) --> NU
//RD5 (OUT) --> NU
//RD6 (OUT) --> NU
//RD7 (OUT) --> NU
#define TrisdInit 0x00;

//Colelgamenti a PORTE
//RE0 (OUT) --> NU
//RE1 (OUT) --> NU
//RE2 (OUT) --> NU
#define TriseInit 0x00;


//*********************************************************************************************************************************
//Main
void main(void)
{
 SystemInit();
 for (;;)
 {
 }
 
}


//*********************************************************************************************************************************
//Definizione funzioni

void SystemInit (void)
{
 //Tipi di segnali sui portx
 ADCON1 = ADMode;

 //Direzione portx
 TRISA = TrisaInit;
 TRISB = TrisbInit;
 TRISC = TriscInit;
 TRISD = TrisdInit;
 TRISE = TriseInit;

 //Registro INTCON
 GIE = 1;    //abilita globalmente gli interrupt
 T0IE = 1;   //abilita l'interrupt per il Timer0

 //Registro OPTION
 T0CS = 0;    //clock interno 
 PSA = 0;     //prescaler assegnato al Timer0
 PS2 = 0;     //divide per 4
 PS1 = 0;     //   "    "  "     
 PS0 = 1;     //   "    "  "  
}


//routine di interrupt
void interrupt Timer0InterruptService (void)
{
 TMR0 = TimerInit;   //inizializza il timer0
 T0IF = 0;           //resetta il flag di interrupt su timer0
 Segnale = !Segnale; //toggle del segnale
 
}



