- Codice: Seleziona tutto
unsigned bit stato; aumenta; diminuisce; stato_1; stato_2;
unsigned int zero_crossing; impulso_di_zero; incremento;
void interrupt (void){ //interrupt per rilevamento zero_crossing
if (INTCON.GPIF){ //8
if((gpio.f3==0)&&(stato==1)) //se c'e' un fronte di discesa sul gpio.f3
{
impulso_di_zero++; //incrementa impulso_di_zero
INTCON.T0IE=1; //abilita tmr0 con valore 255
tmr0=206;
stato=0; //resetta flag fronte discesa
}
if((gpio.f3==1)&&(stato==0)) //se c'è stato un fronte di salita sul gpio.f3
{
impulso_di_zero++; //incrementa impulso_di_zero
INTCON.T0IE=1; //abilita tmr0 con valore 255
tmr0=206;
stato=1; //resetta flag fronte salita
}
if((impulso_di_zero>10)&& ( aumenta==1)) //se ci sono stati più di
{ //10 passaggi per lo zero
incremento++; //ed il flag aumenta è 1
impulso_di_zero=0; //aggiungi 1 a incremento
} //reset impulso_di_zero
if( (impulso_di_zero>10) && (diminuisce==1))
{ //come sopra ma per diminuire
incremento--; //
impulso_di_zero=0;
}
if(incremento>=90) //se incrementa maggiore 90 imposta flag per diminuire
{
aumenta=0;
diminuisce=1;
}
if(incremento<10) //se incrementa minore 10 imposta flag per aumentare
{
aumenta=1;
diminuisce=0;
}
INTCON.GPIF=0; //reset interrupt per porta gpio.f3
}
if(INTCON.T0IF) { //se il timer0 ha ragguinto l'owerflow
zero_crossing++; //aumenta zero_crossin
tmr0=206; //carica il timer0 con 206 per avere un altro
//owerflow dopo 100us
intcon.t0if=0; //rese flag interrupt tmr0
if((zero_crossing>incremento)&&(zero_crossing>=10)) //condizione per aumentare e diminuire la gpio.f4
//luminosità della lampada
{
gpio.f4=0; //innesco triac per 2us
delay_us(2);
gpio.f4=1;
stato_2=1;
}
if((zero_crossing>=91-incremento)&&(zero_crossing>=10)) //condizione per aumentare e diminuire la gpio.f5
//luminosità della lampada
{
gpio.f5=0; //innesco triac per 2us
delay_us(2);
gpio.f5=1;
stato_1=1;
}
if((stato_1==1) && (stato_2==1)) //routine per reset interrupt tmr0
{
stato_1=0;
stato_2=0;
zero_crossing=0;
intcon.t0if=0;
intcon.t0ie=0;
}
}
}
void main() {
impulso_di_zero=0;
stato=0; //inizializza variabile
zero_crossing=0;
incremento=0;
aumenta=0;
diminuisce=0;
stato_1=0;
stato_2=0;
CMCON = 7; //Disabilita comparatore
ADCON0 = 0b000000001; //Aisabilita convertitore A/D
ANSEL = 0b00000001; //Tutte le porte in digitale tranne gp0
TRISIO = 0b00001001; //Tutti i pin in OUT tranne gpio3
IOC= 0b001000; //imposta interrupt su pin 3
OPTION_REG=0b11000000; //abilita presaler 1:2
INTCON.GPIE =1; //abilita interrupt generale
INTCON.GIE =1; //abiita interrupt su porta gpio
gpio.f1=1; //imposta le uscite a 1
gpio.f2=1;
gpio.f4=1;
gpio.f5=1;
while(1) //Eseguo un ciclo //finito
{
}
}
ho l'effetto voluto, mentre una lampada aumenta l'altra diminuisci. Il codice funziona perfettamente.
Ora vorrei implementare tramite l'ingresso analogico del PIC (ingresso ANO)un ritardo che mi permetta di impostare il tempo di aumento/decremento.
Ho impostato il codice in questo modo
- Codice: Seleziona tutto
unsigned bit stato; aumenta; diminuisce; stato_1; stato_2;
unsigned int zero_crossing; impulso_di_zero; incremento;
unsigned int valore;
unsigned int adc(){
unsigned int pot;
unsigned int valore1;
pot=ADC_Read(0);
valore1=pot/100;
return valore1;
}
void interrupt (void){ //interrupt per rilevamento zero_crossing
if (INTCON.GPIF){ //8
if((gpio.f3==0)&&(stato==1)) //se c'e' un fornte di discesa sul gpio.f3
{
impulso_di_zero++; //incrementa impulso_di_zero
INTCON.T0IE=1; //abilita tmr0 con valore 255
tmr0=206;
stato=0; //resetta flag fronte discesa
}
if((gpio.f3==1)&&(stato==0)) //se c'è stato un fornte di salita sul gpio.f3
{
impulso_di_zero++; //incrementa impulso_di_zero
INTCON.T0IE=1; //abilita tmr0 con valore 255
tmr0=206;
stato=1; //resetta flag fronte salita
}
if((impulso_di_zero>valore)&& ( aumenta==1)) //se ci sono stati più di
{ //10 passaggi per lo zero
incremento++; //ed il flag aumenta è 1
impulso_di_zero=0; //aggiungi 1 a incremento
} //reset impulso_di_zero
if( (impulso_di_zero>valore) && (diminuisce==1))
{ //come sopra ma per diminuire
incremento--; //
impulso_di_zero=0;
}
if(incremento>=98) //se incremnta maggiore 75 imposta flag per diminuire
{
aumenta=0;
diminuisce=1;
}
if(incremento<10) //se incremnta minore 1 imposta flag per aumentare
{
aumenta=1;
diminuisce=0;
}
INTCON.GPIF=0; //reset interrupt per porta gpio.f3
}
if(INTCON.T0IF) { //se il timer0 ha ragguinto l'owerflow
zero_crossing++; //aumenta zero_crossin
tmr0=206; //carica il timer0 con 206 per avere un altro
//owerflow dopo 100us
intcon.t0if=0; //rese flag interrupt tmr0
if((zero_crossing>incremento)&&(zero_crossing>=valore)) //condizione per aumentare e diminuire la gpio.f4
//luminosità della lampada
{
gpio.f4=0; //innesco triac per 2us
delay_us(2);
gpio.f4=1;
stato_2=1;
}
if((zero_crossing>=90-incremento)&&(zero_crossing>=valore)) //condizione per aumentare e diminuire la gpio.f5
//luminosità della lampada
{
gpio.f5=0; //innesco triac per 1us
delay_us(2);
gpio.f5=1;
stato_1=1;
}
if((stato_1==1) && (stato_2==1)) //routine per reset interrupt tmr0
{
stato_1=0;
stato_2=0;
zero_crossing=0;
intcon.t0if=0;
intcon.t0ie=0;
}
}
}
void main() {
impulso_di_zero=0;
stato=0; //inizializza variabile
zero_crossing=0;
incremento=0;
aumenta=0;
diminuisce=0;
stato_1=0;
stato_2=0;
CMCON = 7; //Disabilita comparatore
ADCON0 = 0b000000001; //Aisabilita convertitore A/D
ANSEL = 0b00000001; //Tutte le porte in digitale tranne gp0
TRISIO = 0b00001001; //Tutti i pin in OUT tranne gpio3
IOC= 0b001000; //imposta interrupt su pin 3
OPTION_REG=0b11000000; //abilita presaler 1:2
INTCON.GPIE =1; //abilita interrupt generale
INTCON.GIE =1; //abiita interrupt su porta gpio
gpio.f1=1; //imposta le uscite a 1
gpio.f2=1;
gpio.f4=1;
gpio.f5=1;
while(1) //Eseguo un ciclo //finito
{
if(incremento<10){ //se la variabile incremento è minore di 10 leggi copia il valore dell'ingresso ANO sulla varibiale valore
valore=adc();
}
}
}