Il codice è stato compilato con il compilatore della Mikroe (https://www.mikroe.com/), MikroC PRO Pic (https://www.mikroe.com/mikroc-pic), gratuito fino a 2K di codice.
Per la simulazione del codice è stato usato Proteus.
La prima parte del codice che vi mostrerò ha il compito di dividere gli impulsi presenti sulla PORTA.4 del Pic, per una valore di divisione non intero, e di generare un impulso di Step della durata di 2us.
//Definizione delle variabili***************************************************
unsigned char Div1; //Definidco una variabile a 8bit
unsigned int Div2; Somma;//Definidco delle variabile a 16bit
//Routine di interruzione*******************************************************
void interrupt() {
if (TMR0IF_bit == 1){ //Discrimino l'interrupt del TMR0 dall'interrupt del TMR1
Somma = Somma + Div2; //Addizione la parte decimale del valora di divisione
if (Somma >= 10000) { //Se la Somma è = 0 > di 10000 continua altrimenti salta
Somma = Somma - 10000;//Sottrai al valore totale 10000
TMR0L = 256 - Div1 - 1;//Diminuisci di 1 il valore da caricare nel TMR0(Div1)
} else {
TMR0L = 256 - Div1; //Carica nel TMR0 il valore di Divisione
}
TMR1H = 255; //Carica in TMR1H 255
TMR1L = 246; //Carica in TMR1L 246
PORTC = 0; //Poni a 0 il bit 0 della porta C
TMR1ON_bit = 1; //Abilita il TMR1
TMR0IF_bit = 0; //Resetta il bit di Flag dell'interrupt del TMR0
}
if (TMR1IF_bit == 1){ //Discrimino l'interrupt del TMR1 dall'interrupt del TMR0
PORTC = 1; //Poni a 1 il bit 0 della porta C
TMR1ON_bit = 0; //Spegni il TMR1
TMR1IF_bit = 0; //Resetta il bit di Flag dell'interrupt del TMR1
}
}
//Routine principale************************************************************
void main() {
//Configurazione dell'oscillatore***********************************************
IRCF0_bit = 0; //Setto l'oscillatore interno a 4Mhz
IRCF1_bit = 1;
IRCF2_bit = 1;
PLLEN_bit = 1; //Moltiplico la frequenza dell'oscillatore interno per 4
//Configurazione dei registri***************************************************
INTCON = 0b11100000; //Abilito tutti gli interrupts non mascherati, tutti gli interrupt non mascherati delle periferiche e l'interrupt sull'overflow del TMR0
T0CON = 0b11101000; //Baypasso il prescaler del TMR0, seleziono come fonte del TMR0 il T0CKI, configuro il TMR0 a 8bit, abilito il TMR0
T1CON = 0b00000001; //Abilito il TMR1
PIE1 = 0b00000001; //Abilito l'interrupt sull'overflow del TMR1
TMR0IF_bit = 0; //Resetta il bit di Flag dell'interrupt del TMR0
TMR1IF_bit = 0; //Resetta il bit di Flag dell'interrupt del TMR1
TMR0H = 255; //Carica in TMRH 255
TMR0L = 255; //Carica in TMRL 255
//Inizializzazione delle porte**************************************************
Delay_ms(100);
PORTA = 0; //Initialize PORTA by clearing output data latches
//LATA = 0; //Alternate method to clear output data latches
ADCON1 = 15; //Configure A/D for digital inputs
CMCON = 7; //Configure comparators for digital inputs
TRISA = 0b11111111; //Set RA<7:0> as inputs
PORTB = 0; //Initialize PORTB by clearing output data latches
//LATB = 0; //Alternate method to clear output data latches
TRISB = 0b00000000; //Set RB<7:0> as output
PORTC = 0; //Initialize PORTC by clearing output data latches
//LATC = 0; //Alternate method to clear output data latches
TRISC = 0b11111110; //Set RC<7:1> as inputs and RC<0> as output
Div1 = 2;
Div2 = 5000;
//while(1) {
// PORTB = 0b00000000;
// Delay_ms(500);
// PORTB = 0b11111111;
// Delay_ms(500);
//}
//Metodo alternativo mediante l'uso degli operatori logici**********************
while(1) {
PORTB = PORTB^0b11111111; //Xor PORTB
Delay_ms(500);
}
}
Allego i rispettivi file.