- Codice: Seleziona tutto
tmr0=255;
Così hai un overflow immediato e l'interrupt si scatena subito.
Se vuoi avere un tempo "lungo" dovrai caricare
- Codice: Seleziona tutto
tmr0=0;
Il timer0 conta in avanti non all'indietro.
Paolo.
Moderatore: Paolino
tmr0=255;
tmr0=0;
if((zero_crossing>incremento)&&(zero_crossing>=10))
è corretto inizializzarle prima di accedere al loop principale o, comunque, ogni qual volta ti trovi nella condizione di re-inizializzare il tuo processo; il fatto è che la inizializzazione, come ho scritto, deve essere eseguita per tutte le variabili, e questo per più motivi.sorecaro ha scritto:Per quanto riguarda le variabili le inizializzo nel main portandole a zero, é sbagliato fare così?
unsigned bit stato; aumenta; diminuisce;
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 fornte di discesa sul gpio.f3
{
impulso_di_zero++; //incrementa impulso_di_zero
INTCON.T0IE=1; //abilita tmr0 con valore 255
tmr0=156;
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=156;
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>100) //se incremnta maggiore 75 imposta flag per diminuire
{
aumenta=0;
diminuisce=1;
}
if(incremento<5) //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=156; //carica il timer0 con 156 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
//luminosità della lampada
{
gpio.f4=0; //innesco triac per 50us
delay_us(50);
gpio.f4=1;
zero_crossing=0; //reset variabili e interrupt
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;
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
{
}
}
Torna a Firmware e programmazione
Visitano il forum: Nessuno e 6 ospiti