#include #pragma config PLLDIV = 5 #pragma config CPUDIV = OSC1_PLL2 #pragma config USBDIV = 2 #pragma config FOSC = HSPLL_HS #pragma config FCMEN = OFF #pragma config IESO = OFF #pragma config PWRT = OFF #pragma config BOR = OFF #pragma config VREGEN = OFF #pragma config WDT = OFF #pragma config WDTPS = 32768 #pragma config MCLRE = ON #pragma config LPT1OSC = OFF #pragma config PBADEN = OFF #pragma config CCP2MX = ON #pragma config STVREN = OFF #pragma config LVP = OFF #pragma config ICPRT = OFF #pragma config XINST = OFF #pragma config DEBUG = OFF #pragma config CP0 = OFF #pragma config CP1 = OFF #pragma config CP2 = OFF #pragma config CP3 = OFF #pragma config CPB = OFF #pragma config CPD = OFF #pragma config WRT0 = OFF #pragma config WRT1 = OFF #pragma config WRT2 = OFF #pragma config WRT3 = OFF #pragma config WRTB = OFF #pragma config WRTC = OFF #pragma config WRTD = OFF #pragma config EBTR0 = OFF #pragma config EBTR1 = OFF #pragma config EBTR2 = OFF #pragma config EBTR3 = OFF #pragma config EBTRB = OFF #define TGL_VALUE PORTBbits.RB7 #define LED_PULS1 PORTBbits.RB6 void main(); void InterruptHandlerHigh(); unsigned char TmrL=0xB6,cont1=0,State_Tgl=0; unsigned int Count_Tgl=0; void main() { // IMPOSTAZIONI Timers TMR1H=0xFF; // TMR1L=0xBD; TMR0H=0xFA; //Valore 64038 in modo da avere interruzioni ogni 0.001 sec TMR0L=0x26; T1CON=0x90; //Prescaler=08 Modalit` 16 bit ancora spento T0CON=0x02; //Prescaler 8, 16 bit spento // IMPOSTAZIONI ADC ADCON0=0x00; //Tutto spento ADCON1=0x0F; //Tutto digitale // IMPOSTAZIONI Comparatori CMCON =0x07; //Tutto digitale CVRCON=0x00; //Rete riferimenti spenta // IMPOSTAZIONI I/O Reset Porte PORTA=0x00; PORTB=0x00; PORTC=0x00; PORTD=0x00; PORTE=0x00; TRISA=0x00; TRISB=0x80; //Ingresso pulsante TRISC=0x00; TRISD=0x00; TRISE=0x00; // IMPOSTAZIONI Low-Voltage Detect HLVDCONbits.HLVDEN=0; // IMPOSTAZIONI USB UCON=0x00; UCFG=0x08; // IMPOSTAZIONI Interrupts RCONbits.IPEN=1; //Abilito le interruzioni in modalit` prioritaria INTCON=0xC0; //Abilitato tutte le interruzioni ad alta e bassa priorita`; PIE1bits.TMR1IE=1; //Abilito l'interruzione del TMR1 IPR1bits.TMR1IP=1; //Abilito l'interruzone del TMR1 in alta priorità //INTCONbits.TMR0IE=1; //Abilito l'interruzione del TMR1 INTCON2bits.TMR0IP=1; //Abilito l'interruzone del TMR1 in alta priorità T1CONbits.TMR1ON=1; //ACCENDO TMR1 //T0CONbits.TMR0ON=1; //ACCENDO TMR0 Non lo accendo adesso ma nel momento del cambiamento di frequenza per simulare un tempo di volo while(1) ; }//fine main //RUTINES DI INTERRUPT #pragma code InterruptVectorHigh = 0x08 void InterruptVectorHigh (void) { _asm goto InterruptHandlerHigh //jump to interrupt routine _endasm } #pragma code #pragma interrupt InterruptHandlerHigh void InterruptHandlerHigh() { if (PIR1bits.TMR1IF) //Timer1 ha generato un interruzione { TMR1L=TmrL; TMR1H=0xFF; PORTAbits.RA1=!PORTAbits.RA1; //Questo fa generare l'impulso a frequenza circa 40 KHz cont1++; if (cont1==1) { PORTBbits.RB3=!PORTBbits.RB3; //Queste 4 istruzioni seguenti generano l'impulso di sincronizzazione Nop(); Nop(); PORTBbits.RB3=!PORTBbits.RB3; } else if (cont1==40) //Imposta il timer per produrre la freq più bassa la prox volta ke ce un interruz { TmrL=0xB9; } else if (cont1==250) { TmrL=0xBF; //Imposta il timer per produrre la freq più alta la prox volta ke ce un interruz cont1=0; } Count_Tgl++; if (Count_Tgl==400) { if ((State_Tgl==0)&&(TGL_VALUE)) State_Tgl=1; //Lettura pulsante Nota else if ((State_Tgl==1)&&(!TGL_VALUE)) { LED_PULS1=!LED_PULS1; State_Tgl=0; Nop(); LED_PULS1=!LED_PULS1;} Count_Tgl=0; } PIR1bits.TMR1IF=0; //Azzeramento flag Intrrrupt TMR1 (Riabilito l'interruzione) }//Fine gestione interrupt TMR1 }//Fine gestione interruzioni ad alta priorità