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

[31] Re: Interrupt timer0 su pic12f675

Messaggioda Foto UtenteWALTERmwp » 25 set 2015, 22:29

sorecaro ha scritto:Ho impostato il conteggio massimo a 50. (...)
... di ?
sorecaro ha scritto:incrementavo la variabile impulso di zero ogni passaggio per lo zero
si quello lo avevo visto ma pensavo fosse, da parte tua, intenzionale; praticamente hai realizzato una sorta di "prescaler" tra "impulso_di_zero" e "incremento".
Questa era/sarebbe una delle cose alle quali mi riferivo al Post [23]:
WALTERmwp ha scritto:(...) Ci sarebbero alcune cose per le quali cercherei delle conferme (...)
Facciamo chiarezza, se sei d'accordo, così anche chi ha seguito il thread si fa un'idea più definita.

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

0
voti

[32] Re: Interrupt timer0 su pic12f675

Messaggioda Foto Utentesorecaro » 25 set 2015, 22:34

Certo che voglio fare chiarezza, te ne sarei grato.
La variabile è la [*]incremento[/*]
Avatar utente
Foto Utentesorecaro
36 3 7
Frequentatore
Frequentatore
 
Messaggi: 233
Iscritto il: 26 feb 2013, 19:30

0
voti

[33] Re: Interrupt timer0 su pic12f675

Messaggioda Foto Utentesorecaro » 25 set 2015, 22:44

questo è il codice completo che "funziona"

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 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>50)     //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 1us
     delay_us(1);
     gpio.f4=1;
     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;
   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

[34] Re: Interrupt timer0 su pic12f675

Messaggioda Foto UtenteWALTERmwp » 25 set 2015, 23:04

Mi fa piacere che funzioni ma ho un dubbio che sia dovuto a quella costante.
Puoi, per cortesia, modificare "solo" la porzione di codice rimettendo 75 al posto di 50, in quel test, e provare ?

Grazie.

p.s.
nel Post [30] hai fatto riferimento alla costante 100, ma non veniva usata; ti riferivi forse a 75 ?
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
23,1k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 6823
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino

0
voti

[35] Re: Interrupt timer0 su pic12f675

Messaggioda Foto Utentesorecaro » 25 set 2015, 23:20

Walter ho fatto la prova che hai chiesto, con 75 la lampada "sballa".

La variabile in questione è
Codice: Seleziona tutto
if(incremento>50)     //se incrementa maggiore50 imposta flag per diminuire
  {
  aumenta=0;
  diminuisce=1;
  }

mi devi perdonare ma ho sbagliato io a scrivere nel commento maggiore di 75 mentre nel codice era maggiore di 100
Avatar utente
Foto Utentesorecaro
36 3 7
Frequentatore
Frequentatore
 
Messaggi: 233
Iscritto il: 26 feb 2013, 19:30

0
voti

[36] Re: Interrupt timer0 su pic12f675

Messaggioda Foto UtenteWALTERmwp » 25 set 2015, 23:43

sorecaro ha scritto:mi devi perdonare
figurati, non è il caso.

Ma la cosa non mi convince.
Contare fino a 75 invece che 50 significa solo, se interpreto correttamente, traslare progressivamente, nel tempo, l'impulso d'innesco sino a portarlo oltre i 90 gradi cioè nella parte di discesa della semionda.
La progressione dell'accensione dovrebbe andare dalla massima luminosità per ridursi (della metà se imposti il limite a 50).
Nel periodo in cui la variabile "incremento" aumenta di 1, la variabile "zero_crossing" fa in tempo a superare per 10 volte la variabile "incremento" ed essere azzerata altrettante volte, per ripartire nel conteggio.
Cosa intendi scrivendo che la lampada "sballa" ?
Grazie.

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

0
voti

[37] Re: Interrupt timer0 su pic12f675

Messaggioda Foto Utentesorecaro » 26 set 2015, 0:06

Ho fatto anche io dei conti e sinceramente non mi convincono, ma la lampada si accende e si spegne completamente
Quando scrivo che la lampada sballa significa che la lampada non segue una una discesa/salita graduale, ma aumenta, si spegne, si accende, diminuisce, e cosi via
Avatar utente
Foto Utentesorecaro
36 3 7
Frequentatore
Frequentatore
 
Messaggi: 233
Iscritto il: 26 feb 2013, 19:30

0
voti

[38] Re: Interrupt timer0 su pic12f675

Messaggioda Foto UtenteWALTERmwp » 26 set 2015, 0:52

La mia perplessità rimane.
Se non si comprende il motivo del presunto malfunzionamento, anche se pensi di avere stabilizzato la situazione, una modifica portata successivamente al programma, potrebbe comprometterti la gestione.
Per come leggo il codice (io posso fare solo questo) non mi spiego il fatto.
Con soglia a 50 tutto bene ( ! ? ) ma se metti 75 non funziona.
Ma almeno, se la soglia è 50, la variazione della illuminazione segue il comportamento che ti aspetti ?

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

0
voti

[39] Re: Interrupt timer0 su pic12f675

Messaggioda Foto Utentesorecaro » 26 set 2015, 1:01

Vorrei capire anche io perché 50, ma con questo valore la lampada aumenta e decresce in modo lineare, ho controllato anche la tensione della lampada, arriva a 220vac e scende a0vac ed in più rispetta i tempi ( tempo aumento = tempo diminuzione) Se ti vengono in mente altre prove non esitare a postarle, vorrei capire il perché di 50.
Avatar utente
Foto Utentesorecaro
36 3 7
Frequentatore
Frequentatore
 
Messaggi: 233
Iscritto il: 26 feb 2013, 19:30

0
voti

[40] Re: Interrupt timer0 su pic12f675

Messaggioda Foto UtenteWALTERmwp » 26 set 2015, 1:08

L'aumento, così come la diminuzione della luminosità ha un periodo di 5 secondi ?

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

PrecedenteProssimo

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 6 ospiti