#include unsigned int SetCCP; unsigned int Gradi; unsigned int oneOff,oneOffPar; void main( void ) { oneOff = 1; // Variabile di verifica rilascio // pulsante step positivo oneOffPar = 1; oneMOff = 1; // Variabile di verifica rilascio // pulsante step positivo oneMOffPar = 1; PORTA = 0; PORTB = 0; CMCON |= 0b00000111; //disattivo il comparatore TRISB3 = 0; //setto RB3 ad uscita TRISB4 = 0; //setto RB4 ad uscita TRISB5 = 0; TRISB6 = 0; TRISB7 = 0; CCP1CON = 0b00001000; // setto il modulo CCP per il compare: // quando CCPR1 e' uguale a TMR1 viene // settato RB3 T1CON = 0b10000001; // attivo il timer 1, // prescaler 1:1, // fonte di clock interna (il quarzo) - // 1 incremento ogni 1 msec Gradi = 0; TMR1IE = 1; //attivo l'interrupt quando TMR1 va in overflow GIE = 1; PEIE = 1; while( 1 ) { asm("clrwdt"); // Settaggio a 0 del WatchDog Timer // Settando il CCP, ad ogni ciclo di clock il PIC lo incrementa. // Quando viene raggiunto il valore 65536 viene generato un interrupt di overflow // 64536 = 1 msec di impulso (impulso base per la posizione 0°) // Ogni 11,111111 microsec il Motore si muove di 1° SetCCP = 64536 - ( ( unsigned long int ) Gradi * 11111111 ) / 1000000; // Inizializzazione e verifica della comunicazione // su porta parallela. // Se il PIC riceve 111, risponde 000; // il PC replica con 000 e il PIC invia 111. if ( RB0 && RB1 && RB2 ) { RB5 = 0; RB6 = 0; RB7 = 0; // Attesa di 000 while ( !RB0 && !RB1 && !RB2 ) /*if ( RA1 ) break*/; RB5 = 1; RB6 = 1; RB7 = 1; RB4 = 1; // Se sono uscito per la pressione di RA1 // non accendo il LED } if ( RA2 || RB2) // Posizione centrale { Gradi = 45; // Comunicazione di messaggio ricevuto // Se si inserisce un fotodiodo di controllo i seguenti // tre comandi devono essere inviati all'attivazione del diodo RB5 = 1; RB6 = 1; RB7 = 0; } /*if( RA1 || RB1) // Posizione di partenza { Gradi = 0; // Comunicazione di messaggio ricevuto // Se si inserisce un fotodiodo di controllo i seguenti // tre comandi devono essere inviati all'attivazione del diodo RB5 = 1; RB6 = 0; RB7 = 1; }*/ if (RA1 == 0 ) // Verifica del rilascio del pulsante di incremento // per evitare incrementi continui oneMOff = 1; if (RB1 == 0) { oneMOffPar = 1; // Comunicazione di messaggio ricevuto // Se si inserisce un fotodiodo di controllo i seguenti // tre comandi devono essere inviati all'attivazione del diodo RB5 = 0; RB6 = 1; RB7 = 0; } if( RA1 || RB1 && (Gradi > 0 ) ) // Movimento di -1° if (oneOff && oneOffPar) { oneMOff=0; oneMOffPar=0; Gradi = Gradi - 1; // Comunicazione di messaggio ricevuto // Se si inserisce un fotodiodo di controllo i seguenti // tre comandi devono essere inviati all'attivazione del diodo RB5 = 1; RB6 = 0; RB7 = 1; } if (RA0 == 0 ) // Verifica del rilascio del pulsante di incremento // per evitare incrementi continui oneOff = 1; if (RB0 == 0) { oneOffPar = 1; // Comunicazione di messaggio ricevuto // Se si inserisce un fotodiodo di controllo i seguenti // tre comandi devono essere inviati all'attivazione del diodo RB5 = 1; RB6 = 0; RB7 = 0; } if( RA0 || RB0 && (Gradi < 90 ) ) // Movimento di 1° if (oneOff && oneOffPar) { oneOff=0; oneOffPar=0; Gradi = Gradi + 1; // Comunicazione di messaggio ricevuto // Se si inserisce un fotodiodo di controllo i seguenti // tre comandi devono essere inviati all'attivazione del diodo RB5 = 0; RB6 = 1; RB7 = 1; } } } void interrupt ISR( void ) @0x004 // Funzione eseguita ad ogni interrupt { if ( TMR1IF ) // Interrupt dovuto a overflow su Timer1 { TMR1IF = 0; // Ignoro ulteriori interrupt TMR1ON = 0; //blocco TMR1 // Setto Timer1 in modo da eseguire il ciclo base di 20 msec (periodo PWM) TMR1H=0xB1; //B1E0H = 49536 -> 16000 cicli di clock TMR1L=0xE0; CCP1CON = 0; // resetto il modulo in modo da mandarne a 0 l'uscita RB3 = 0; CCPR1L = SetCCP & 0x00FF; // Setto il comparatore in modo da generare l'impulso CCPR1H = SetCCP >> 8; // di comando CCP1CON = 0b00001000; TMR1ON = 1; //riattivo TMR1 } }