Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Interrupt timer0 su pic12f675

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

1
voti

[21] Re: Interrupt timer0 su pic12f675

Messaggioda Foto UtentePaolino » 24 set 2015, 13:42

Domanda: perché poni a 255 il tmr0?
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.
"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: 4187
Iscritto il: 20 gen 2006, 11:42
Località: Vigevano (PV)

0
voti

[22] Re: Interrupt timer0 su pic12f675

Messaggioda Foto Utentesorecaro » 24 set 2015, 14:04

Paolino imposto il valore 255 perché facendo cosi comincio subito a contare i vari impulsi che mi servono per calcolare il ritardo. Una volta che il timer0 ha generato il primo owerflow carico il suo valore in modo tale da avere un owerflow ogni 100us.Almeno é questo il ragionamento che ho fatto.
Avatar utente
Foto Utentesorecaro
36 3 7
Frequentatore
Frequentatore
 
Messaggi: 233
Iscritto il: 26 feb 2013, 19:30

0
voti

[23] Re: Interrupt timer0 su pic12f675

Messaggioda Foto UtenteWALTERmwp » 25 set 2015, 0:19

Ho dato un'occhiata al codice cercando di capire quello che intenderesti ottenere.
Non ho verificato invece l'impostazione del timer del microcontrollore quindi assumo sia corretto quanto hai riportato.

Ci sarebbero alcune cose per le quali cercherei delle conferme ma per il momento, se vuoi, potresti provare ad agire come di seguito, poi vediamo.
Il tmr0 non inizializzarlo a 255 ma impostalo da subito a 156.
All'interno del test della flag di interrupt del timer modifica il test in questo modo:
Codice: Seleziona tutto
if((zero_crossing>incremento)&&(zero_crossing>=10))

Ti suggerirei inoltre di inizializzare tutte le variabili che dichiari e che poi utilizzi.
Poi, quel "delay_us(50);" dentro alla IRQ è, per "etica", dal mio punto di vista, un errore, ma non mi pare sposti la questione per quanto sopra ho riportato.
Mi dai qualche riscontro ?
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

[24] Re: Interrupt timer0 su pic12f675

Messaggioda Foto Utentesorecaro » 25 set 2015, 10:02

Walter mwp per prima cosa grazie. Stasera proverò il codice con le modifiche che hai consigliato. Per quanto riguarda le variabili le inizializzo nel main portandole a zero, é sbagliato fare così?
Per il delay nella ISR hai perfettamente ragione, non é una cosa bella da vedere, appena riesco a risolvere il problema dell'accensione cercherò di risolvere anche questo
Avatar utente
Foto Utentesorecaro
36 3 7
Frequentatore
Frequentatore
 
Messaggi: 233
Iscritto il: 26 feb 2013, 19:30

0
voti

[25] Re: Interrupt timer0 su pic12f675

Messaggioda Foto UtenteWALTERmwp » 25 set 2015, 10:40

sorecaro ha scritto:Per quanto riguarda le variabili le inizializzo nel main portandole a zero, é sbagliato fare così?
è 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.

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

[26] Re: Interrupt timer0 su pic12f675

Messaggioda Foto Utentesorecaro » 25 set 2015, 11:10

Farò come hai consigliato, inizializzeró tutte le variabili :D
Avatar utente
Foto Utentesorecaro
36 3 7
Frequentatore
Frequentatore
 
Messaggi: 233
Iscritto il: 26 feb 2013, 19:30

0
voti

[27] Re: Interrupt timer0 su pic12f675

Messaggioda Foto Utentesorecaro » 25 set 2015, 21:39

WALTERmwp

ho apportato le modifiche che mi hai consigliato, ma ancora nulla. La lampada fa quello che vuole.
Avatar utente
Foto Utentesorecaro
36 3 7
Frequentatore
Frequentatore
 
Messaggi: 233
Iscritto il: 26 feb 2013, 19:30

0
voti

[28] Re: Interrupt timer0 su pic12f675

Messaggioda Foto UtenteWALTERmwp » 25 set 2015, 21:47

Riporta lo stato del codice sorgente completo, così come lo hai compilato.

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

[29] Re: Interrupt timer0 su pic12f675

Messaggioda Foto Utentesorecaro » 25 set 2015, 22:10

Codice: Seleziona tutto
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
       {
}
     }
Avatar utente
Foto Utentesorecaro
36 3 7
Frequentatore
Frequentatore
 
Messaggi: 233
Iscritto il: 26 feb 2013, 19:30

0
voti

[30] Re: Interrupt timer0 su pic12f675

Messaggioda Foto Utentesorecaro » 25 set 2015, 22:20

[quoteWALTERmwp[/quote] FUNZIONA :D :D :D :D :D
Ho impostato il conteggio massimo a 50. Lo sbaglio era che incrementavo la variabile impulso di zero ogni passaggio per lo zero, quindi dovevo impostare il valore massimo a 50 e non 100. Ti ringrazio per la pazienza. Ora provo ad impostare l'effetto incrociato
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