Pagina 1 di 6

Interrupt timer0 su pic12f675

MessaggioInviato: 18 set 2015, 15:21
da sorecaro
Buongiorno a tutti, tempo fa ho aperto una discussione http://www.electroyou.it/forum/viewtopic.php?f=17&t=59980 sul rilevamento dello zero crossing con un pic12f675. La routine in questione funziona perfettamente. Ora vorrei implementare la routine con un innesco ritardato da Timer0.
Codice: Seleziona tutto
void interrupt (void){
if (INTCON.GPIF){

    if((gpio.f3==0)&&(stato==1))
    {
       INTCON.T0IE=1;
       TMR0=6;
      stato=0;
     }
if((gpio.f3==1)&&(stato==0))
    {
      INTCON.T0IE=1;
       TMR0=6;
      stato=1;
          }
          }

    if(INTCON.T0IF)
    {
     gpio.f4=1;
     delay_us(100);
    gpio.f4=0;

     }
     INTCON.GPIF=0;
     INTCON.T0IF=0;

     }
   

Sto provando questa routine ma purtroppo c'è qualcosa che non mi quadra. La routine non mi crea un impulso unico, ma una serie infinita di impulsi. Dove sto sbagliando??

Dopo varie prove con questa routine mi è venuta in mente una cosa, correggetemi se sbaglio il ragionamento.
Se invece di spostare il tempo di innesco, io contassi gli impulsi??? Mi spiego meglio.
Ogni passaggio per lo zero vengono creati degl'impulsi ogni 500us, io voglio che l'innesco del triac sia eseguito dopo 4ms, basta contare 8 impulsi e dò l'innesco. Sono sulla giusta strada?

Re: Interrupt timer0 su pic12f675

MessaggioInviato: 18 set 2015, 16:13
da WALTERmwp
Ciao Foto Utentesorecaro,
sorecaro ha scritto:(...) La routine non mi crea un impulso unico, ma una serie infinita di impulsi.(...)
quando, in quale circostanza, e per quanto, secondo te ?

Saluti

Re: Interrupt timer0 su pic12f675

MessaggioInviato: 18 set 2015, 16:33
da sorecaro
WALTERmwp

forse perché non resetto l'interrupt, ma resetto solo il flag :-| :-| :-|
Per quanto riguarda il ragionamento di contare gl'impulsi sono sulla strada giusta???

Re: Interrupt timer0 su pic12f675

MessaggioInviato: 18 set 2015, 16:39
da sorecaro
Sto cercando di contare gl'impulsi ma non capisco come mai l'uscita gpio.f4 è sempre alta.
Codice: Seleziona tutto
void interrupt (void){
if (INTCON.GPIF){

    if((gpio.f3==0)&&(stato==1))
    {
       INTCON.T0IE=1;
       tmr0=255;
      stato=0;
      zero_crossing=0;
       INTCON.GPIF=0;
     }
if((gpio.f3==1)&&(stato==0))
    {
      tmr0=255;
      INTCON.T0IE=1;
      stato=1;
      zero_crossing=0;
           INTCON.GPIF=0;
          }

          }

    if(INTCON.T0IF)
    {
   
    zero_crossing++;
     tmr0=6;
     INTCON.T0IF=0;
     }
    if(zero_crossing>=5) {
     gpio.f4=0;
     Delay_us(50);
     gpio.f4=1;
     INTCON.T0IE=0;
      }


     }

Re: Interrupt timer0 su pic12f675

MessaggioInviato: 18 set 2015, 17:59
da sorecaro
stavo sbagliando io, non avevo notato che la variabile zero_crossing era impostata su bit, scusate

Re: Interrupt timer0 su pic12f675

MessaggioInviato: 18 set 2015, 21:34
da WALTERmwp
sorecaro ha scritto:(...) la variabile zero_crossing era impostata su bit, scusate
non e' il caso di scusarsi, non e' un problema.
Se funziona meglio cosi, anche se io non ho compreso su cosa avrei potuto indagare.
In questo caso, l'errore, dal mio punto di vista e' di carattere "espositivo"; scrivo cosi' con proposito costruttivo.
Se non si sa qual'e' il problema non si dovrebbe stabilire a priori la porzione di codice da sottoporre alla visione degli altri: e' un po una contraddizione.
Anche la descrizione dello stato dell'arte dovrebbe essere piu' "esaustiva".
Il mio e' solo un suggerimento, nulla di piu', ma ho notato che molti compiono queste distrazioni.

Saluti

Re: Interrupt timer0 su pic12f675

MessaggioInviato: 18 set 2015, 23:34
da sorecaro
WALTERmwp
hai ragione, d'ora in poi cercherò di essere più preciso

Re: Interrupt timer0 su pic12f675

MessaggioInviato: 19 set 2015, 14:27
da Paolino
sorecaro ha scritto:...Ogni passaggio per lo zero vengono creatidegl'impulsi ogni 500us, io voglio che l'innesco del triac sia eseguito dopo 4ms, basta contare 8 impulsi e dò l'innesco. Sono sulla giusta strada?


Sì, Foto Utentesorecaro. Se il timer 0 è impostato per avere overflow ogni 500us, sei sulla strada giusta.
Ma nel codice conti 6 impulsi non 8, quindi 3000us (3ms e non 4ms).

Paolo.

Re: Interrupt timer0 su pic12f675

MessaggioInviato: 19 set 2015, 17:30
da sorecaro
Paolino
grazie. L'idea é quella di far accendere e spegnere la lampada in modo graduale ed automatico, regolando questo " tempo" con un potenziometro.

Re: Interrupt timer0 su pic12f675

MessaggioInviato: 20 set 2015, 8:22
da Paolino
Ok, un varialuce (volgarmente detto).
Mi sembra di capire che ora funziona tutto. O sbaglio?

Ciao.

Paolo.