Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Interrupt timer0 su pic12f675

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[11] Re: Interrupt timer0 su pic12f675

Messaggioda Foto Utentesorecaro » 20 set 2015, 16:30

Purtroppo ancora non funziona come dovrebbe. Il mio intento è quello di variare in modo automatico la luminosità di 2 lampade, mentre una aumenta l'altra diminuisce
Codice: Seleziona tutto
void interrupt (void){
if (INTCON.GPIF){
  if(incremento==100)
  {
  aumenta=0;
  diminuisce=1;
  }
 
  if(incremento==0)
  {
  aumenta=1;
  diminuisce=0;
  }
 
  if( (impulso_di_zero>=50) && (diminuisce==1))
  { incremento--;
  impulso_di_zero=0;
  }
 
 
 
if((impulso_di_zero>=50)&& ( aumenta==1))
{
  incremento++;
  impulso_di_zero=0;
  }
    if((gpio.f3==0)&&(stato==1))
    {
       impulso_di_zero++;
       INTCON.T0IE=1;
       tmr0=255;
       stato=0;
       INTCON.GPIF=0;
     }
if((gpio.f3==1)&&(stato==0))
    {
      INTCON.T0IE=1;
      tmr0=255;
      stato=1;
      INTCON.GPIF=0;
         }
         


                   }

    if(INTCON.T0IF)
    {
     zero_crossing++;
     tmr0=206;
     intcon.t0if=0;
     
     if(zero_crossing>(100-incremento)&& (stato_2==0))
     {
     gpio.f4=0;
     delay_us(800);
     gpio.f4=1;
     stato_2=1;
     
     }
     if((zero_crossing>incremento) && (stato_1==0))
     {
     gpio.f5=0;
     delay_us(800);
     gpio.f5=1;
     stato_1=1;
     }
     if(stato_1 && stato_2)
     {
     zero_crossing=0;
       intcon.t0ie=0;
       stato_1=0;
       stato_2=0;
       }
      }

      }

.
Sto provando questa routine ma non dà l'effetto desiderato, entrambe sono accese e hanno un brutto sfarfallio
Avatar utente
Foto Utentesorecaro
36 3 7
Frequentatore
Frequentatore
 
Messaggi: 233
Iscritto il: 26 feb 2013, 19:30

0
voti

[12] Re: Interrupt timer0 su pic12f675

Messaggioda Foto Utentesorecaro » 21 set 2015, 10:55

Buongiorno, ho fatto un video per far capire meglio il problema. Gl'impulsi che dovrebbero eccitare i triac non sono "continui", ma hanno dei salti. Per ora sto simulando con proteus,
Avatar utente
Foto Utentesorecaro
36 3 7
Frequentatore
Frequentatore
 
Messaggi: 233
Iscritto il: 26 feb 2013, 19:30

0
voti

[13] Re: Interrupt timer0 su pic12f675

Messaggioda Foto Utentesorecaro » 21 set 2015, 17:56

Forse il problema é il delay. Domani proverò con due timer, timer0 per un canale e timer1 per un altro
Avatar utente
Foto Utentesorecaro
36 3 7
Frequentatore
Frequentatore
 
Messaggi: 233
Iscritto il: 26 feb 2013, 19:30

0
voti

[14] Re: Interrupt timer0 su pic12f675

Messaggioda Foto UtentePaolino » 22 set 2015, 8:39

Appena riesco provo a simulare il comportamento del tuo codice.

Paolo.
"Houston, Tranquillity Base here. The Eagle has landed." - Neil A.Armstrong

-------------------------------------------------------------

PIC Experience - http://www.picexperience.it
Avatar utente
Foto UtentePaolino
32,0k 8 12 13
G.Master EY
G.Master EY
 
Messaggi: 4186
Iscritto il: 20 gen 2006, 11:42
Località: Vigevano (PV)

0
voti

[15] Re: Interrupt timer0 su pic12f675

Messaggioda Foto Utentesorecaro » 22 set 2015, 9:59

Grazie, molto gentile
Avatar utente
Foto Utentesorecaro
36 3 7
Frequentatore
Frequentatore
 
Messaggi: 233
Iscritto il: 26 feb 2013, 19:30

0
voti

[16] Re: Interrupt timer0 su pic12f675

Messaggioda Foto Utentesorecaro » 23 set 2015, 18:56

Buonasera, per cercare di capire dovo sto sbagliando ho modificato il software per un solo triac ma ancora nulla. La lampada parte subito al massimo della luminosità, poi scende fino a metà e riprende, si spegne, e cosi via, in poche parole non fa nulla di quello dovrebbe fare :D

Allego il software completo, se avete qualche consiglio. Il compilatore è mikroc, il PIC un 12f675
Codice: Seleziona tutto
unsigned bit  stato; aumenta; diminuisce;
unsigned int tempo;zero_crossing; impulso_di_zero;  incremento;

void interrupt (void){      //interrupt per rilevamento zero_crossing
if (INTCON.GPIF){

    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=255;
       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=255;
      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>=75)     //se incremnta maggiore 75 imposta flag per diminuire
  {
  aumenta=0;
  diminuisce=1;
  }

  if(incremento<1)   //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)//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;
   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
       {
}
     }
Avatar utente
Foto Utentesorecaro
36 3 7
Frequentatore
Frequentatore
 
Messaggi: 233
Iscritto il: 26 feb 2013, 19:30

0
voti

[17] Re: Interrupt timer0 su pic12f675

Messaggioda Foto UtenteWALTERmwp » 23 set 2015, 23:06

Foto Utentesorecaro, volevo capire se lungo il percorso si è perso qualche pezzo.
Il codice del Post [4], dopo che presumo tu abbia modificato il tipo di variabile, ha funzionato ?

Siccome nel Post [11] hai scritto, rispondendo a @Paolino,
sorecaro ha scritto:(...) Purtroppo ancora non funziona come dovrebbe.(...)
ti riferivi invece solo al codice [11] dove il proposito era rendere complementare la luminosità ?

Per questo invece (Post [12])
sorecaro ha scritto:(...) Gl'impulsi che dovrebbero eccitare i triac non sono "continui", ma hanno dei salti. (...)
tu cosa intendi con "continui" ?
Grazie.

Saluti
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
22,2k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 6444
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino

0
voti

[18] Re: Interrupt timer0 su pic12f675

Messaggioda Foto Utentesorecaro » 24 set 2015, 8:55

Buongiorno Walter, purtroppo nessun codice funziona come dovrebbe. Il post 11 era riferito al codice per far accendere 2 lampade in modo complementare.
Quando parlo di "impulsi NON continui" mi riferisco al fatto che simulando il software con proteus noto degli scatti improvvisi, ho anche postato un video per far capire meglio cosa intendo, naturalmente ho controllato anche con oscilloscopio reale, ma la situazione non cambia.
Dopo varie prove ho deciso di provare a scrivere un codice che facesse variare la luminosità ad una sola lampada (codice postato ieri post 16)ma anche quello ha dei problemi, la lampade sembra impazzita, aumenta, si spegne, si accende, diminuisce e così via.
Sicuramente sto sbagliando qualcosa nel conteggio del timer0, ma non capisco dove
Avatar utente
Foto Utentesorecaro
36 3 7
Frequentatore
Frequentatore
 
Messaggi: 233
Iscritto il: 26 feb 2013, 19:30

0
voti

[19] Re: Interrupt timer0 su pic12f675

Messaggioda Foto UtentePaolino » 24 set 2015, 13:10

Prova a fare qualosa del genere:

Codice: Seleziona tutto
volatile unsigned char dummyPort;
void interrupt (void){
if (INTCON.GPIF){
    dummyPort = GPIO;
    if((gpio.f3==0)&&(.....
....
....


Forza la lettura della porta GPIO a fronte di un IOC.

Ciao.

Paolo.
"Houston, Tranquillity Base here. The Eagle has landed." - Neil A.Armstrong

-------------------------------------------------------------

PIC Experience - http://www.picexperience.it
Avatar utente
Foto UtentePaolino
32,0k 8 12 13
G.Master EY
G.Master EY
 
Messaggi: 4186
Iscritto il: 20 gen 2006, 11:42
Località: Vigevano (PV)

0
voti

[20] Re: Interrupt timer0 su pic12f675

Messaggioda Foto Utentesorecaro » 24 set 2015, 13:33

Paolino grazie ma non riesco a capire. Se viene scatenato l'interruttore copio il valore della porta nella variabile dummyPort e poi. Il rilevamento dello zero crossing funziona, la stessa routine ( naturalmente senza la parte del timer0 ) é funzionante. Penso che il problema sia il conteggio, ma non comprendo quale
Avatar utente
Foto Utentesorecaro
36 3 7
Frequentatore
Frequentatore
 
Messaggi: 233
Iscritto il: 26 feb 2013, 19:30

PrecedenteProssimo

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite