Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Registro CMCON PIC16F628

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[41] Re: Registro CMCON PIC16F628

Messaggioda Foto UtenteWALTERmwp » 1 ott 2014, 12:12

Ho qualche difficoltà nel seguire le variazioni che apporti di volta in volta.
Ti suggerirei quanto segue facendo riferimento al codice e alle condizioni d'uso (quarzo compreso) riferite al tuo Post [29], quindi a quel momento.
All'interno della ISR intervieni così:
Codice: Seleziona tutto
    if(TMR2IF)
    {
        TMR2IF=0;
        flagT2=1;
    }
mentre all'interno del while della funzione start() intervieni così:
Codice: Seleziona tutto
    if (flagT2>0)
    {
        flagT2=0;
        if (tempo>248)
            tempo=100;
        tempo++;
    }

... ovviamente aggiungi la dichiarazione di flagT2.
Proviamo a vedere se cambia qualcosa ?

Saluti

p.s.
Foto UtenteDavide90, ho dimenticato, integro qui nello stesso Post.
I due loop "while" sostituiscili col semplice test come di seguito:
Codice: Seleziona tutto
    if(tempo<tempoon)
    {
        MOTORE1OUT=1;
        MOTORE2OUT=1;
    }
    else
    {
        MOTORE1OUT=0;
        MOTORE2OUT=0;
    }

... sempre che l'assegnazione a zero valga sino al raggiungimento della soglia di [248].
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
30,2k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 8982
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino

0
voti

[42] Re: Registro CMCON PIC16F628

Messaggioda Foto UtenteDavide90 » 2 ott 2014, 13:30

Ciao, ho provato la tua soluzione, i tempi si allungano a 2 ms per l' oFF e 5,6 ms per lo stato ON.

La soglia a zero deve rimanere fino al raggiungimento di 248
Avatar utente
Foto UtenteDavide90
29 6
Frequentatore
Frequentatore
 
Messaggi: 130
Iscritto il: 5 lug 2012, 11:34

0
voti

[43] Re: Registro CMCON PIC16F628

Messaggioda Foto UtenteWALTERmwp » 2 ott 2014, 15:09

Davide90 ha scritto:Ciao, ho provato la tua soluzione, i tempi si allungano a 2 ms per l' oFF e 5,6 ms per lo stato ON.
, puoi inserire il codice sorgente con il quale hai ottenuto questi risultati ?

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

0
voti

[44] Re: Registro CMCON PIC16F628

Messaggioda Foto UtenteDavide90 » 3 ott 2014, 8:40

eccolo:

Codice: Seleziona tutto
void interrupt ISR(void){
   
  if(TMR2IF)
    {
        TMR2IF=0;
        flagT2=1;
    }
}


Codice: Seleziona tutto
void start(){
    // imposto le porte come input o output
    INTCON=0b10101101;
    T2CON=0b0000100;// Timer2
    PR2=40;//Timer2
    PIE1=0b00000010; // Abilito il flag Interrupt TMR2IE
    // Configuro le porte A come uscite
    CMCON=0x07;
    OPTION_REG=0b00000000; //Prescaler =1/2
    TRISA=0b00001111; //Tutte le porte sono input
    TRISB=0b11110000;// solo le porte RB7>RB4 sono input( per sfruttare gli interrupt)
    // imposto le porte come livello basso
    PORTA=0;
    PORTB=0;
   
    // imposto il valore di partenza del TMR0
    TMR0=236;

    while(1){
       
          if (flagT2>0)
    {
        flagT2=0;
        if (tempo>248)
            tempo=100;
        tempo++;
    }
       
       
        tempoon=200;
     
     if(tempo<tempoon)
      {
        MOTORE1OUT=1;
        MOTORE2OUT=1;
        }
        else
         {
         MOTORE1OUT=0;
          MOTORE2OUT=0;
           }
     }
}


la viariabile flagT2 è stata dichiarata come variabile globale esterna al main ed alla funzione start
Avatar utente
Foto UtenteDavide90
29 6
Frequentatore
Frequentatore
 
Messaggi: 130
Iscritto il: 5 lug 2012, 11:34

0
voti

[45] Re: Registro CMCON PIC16F628

Messaggioda Foto UtenteWALTERmwp » 3 ott 2014, 10:56

Confermi che la ISR prevede solo il timer 2 ?

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

0
voti

[46] Re: Registro CMCON PIC16F628

Messaggioda Foto UtenteDavide90 » 3 ott 2014, 11:01

no, la ISR completa prevede anche l' intercettazione di RBIF e timer0

eccola completa.
Codice: Seleziona tutto
void interrupt ISR(void){
   
  if(TMR2IF)
    {
        TMR2IF=0;
        flagT2=1;
    }
   


    if (RBIF){
        RBIF=0;
     //interrupt per capire la posizione dello stick
       //Motore4
        if(PORTBbits.RB7)
        {
            impulsoM1=impulsoStick;

        }

        //Motore3
        if(PORTBbits.RB6)
        {
            impulsoM2=impulsoStick;
        }
        //Motore2
        if(PORTBbits.RB5)
        {
            impulsoM3=impulsoStick;
        }
        //Motore1
        if(PORTBbits.RB4)
        {
            impulsoM4=impulsoStick;
        }


    }
    if (T0IF) // l' interrupt è stato causato dall' overflow del timer0
    { //l'interrupt è generato ogni 10 microsecondi
     
      T0IF=0;
      TMR0=236;
      if (impulsoStick>248)
      impulsoStick=100;
      impulsoStick++;




     /*
   
      */
    }
  // fine interrupt service routine
}
Avatar utente
Foto UtenteDavide90
29 6
Frequentatore
Frequentatore
 
Messaggi: 130
Iscritto il: 5 lug 2012, 11:34

0
voti

[47] Re: Registro CMCON PIC16F628

Messaggioda Foto UtenteWALTERmwp » 3 ott 2014, 11:25

Può darsi che la questione alla fine sia semplice e banale, anche se al momento non ho rilevato incongruenze ma l'esigenza in casi simili è quella, più che altro, di poter fare riferimento al medesimo codice.
Mi fa piacere che tu prenda in considerazione quello che ti scrivo ma dovrebbe valere anche per il resto.
Già in precedenza siamo rimasti sfasati ma arrivati al Post [41] ti ho scritto che avrei fatto riferimento al codice contenuto nel Post [29] che in seguito però è cambiato; arrivati al Post [43] ti ho chiesto di riportarmi di nuovo il codice ma, ancora una volta, dopo averlo visto, mi è sorto il dubbio sul contenuto della ISR e se non te lo avessi esternato non avresti poi aggiunto quello che avevi escluso dal Post stesso.
Se, per diversi motivi, non si riesce a rimanere "allineati" si finisce per "parlare" sulla base di cose diverse convinti invece che siano uguali.
Io non ho problemi a continuare, se la cosa ti interessa, però dovremmo cercare anche d'arrivare al dunque.
In alternativa puoi proseguire in altro modo.

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

1
voti

[48] Re: Registro CMCON PIC16F628

Messaggioda Foto UtenteDavide90 » 3 ott 2014, 11:54

hai perfettamente ragione, ho totalmente ignorato il riferimento al post [29], questo pomeriggio riprovo con quel codice e ti posto i risultati.

Grazie per la collaborazione!
Avatar utente
Foto UtenteDavide90
29 6
Frequentatore
Frequentatore
 
Messaggi: 130
Iscritto il: 5 lug 2012, 11:34

0
voti

[49] Re: Registro CMCON PIC16F628

Messaggioda Foto UtenteDavide90 » 6 ott 2014, 14:40

Ho provato con questo codice, post [29] ed i tuoi ultimi suggerimenti del post [41]
il periodo è di 8,4 ms
on = 3,8 ms
off = 4,6 ms
Codice: Seleziona tutto
// variabili globali
unsigned int tempo=100;
unsigned int impulsoStick=100;
unsigned int impulsoM1=0;
unsigned int impulsoM2=0;
unsigned int impulsoM3=0;
unsigned int impulsoM4=0;
unsigned int impulsoquotamax=0;
unsigned int tempoon=0;
unsigned int tempooff=0;
unsigned int flagT2=0;

void start();


void main(void){

    start();// chiamo la funzione di inizializzazione

}

void start(){
    // imposto le porte come input o output
    INTCON=0b10101101;
    T2CON=0b0000100;// Timer2
    PR2=40;//Timer2
    PIE1=0b00000010; // Abilito il flag Interrupt TMR2IE
    // Configuro le porte A come uscite
    CMCON=0x07;
    OPTION_REG=0b00000000; //Prescaler =1/2
    TRISA=0b00001111; //Tutte le porte sono input
    TRISB=0b11110000;// solo le porte RB7>RB4 sono input( per sfruttare gli interrupt)
    // imposto le porte come livello basso
    PORTA=0;
    PORTB=0;

    // imposto il valore di partenza del TMR0
    TMR0=236;

    while(1){
        if (flagT2>0)
    {
        flagT2=0;
        if (tempo>248)
            tempo=100;
        tempo++;
    }
       tempoon=170;
        tempooff=(248-tempoon)+100; //qualche sensore sta comunicando di inibire una direzione

 
    if(tempo<tempoon)
    {
        MOTORE1OUT=1;
        MOTORE2OUT=1;
    }
    else
    {
        MOTORE1OUT=0;
        MOTORE2OUT=0;
    }



     }
}




void interrupt ISR(void){
            if(TMR2IF)
    {
        TMR2IF=0;
        flagT2=1;
    }

    if (RBIF){
        RBIF=0;

    }
    if (T0IF) // l' interrupt è stato causato dall' overflow del timer0
    { //l'interrupt è generato ogni 10 microsecondi

      T0IF=0;
      TMR0=236;
      if (impulsoStick>248)
      impulsoStick=100;
      impulsoStick++;




     /*

      */
    }
  // fine interrupt service routine
}


Altre soluzioni?
Avatar utente
Foto UtenteDavide90
29 6
Frequentatore
Frequentatore
 
Messaggi: 130
Iscritto il: 5 lug 2012, 11:34

0
voti

[50] Re: Registro CMCON PIC16F628

Messaggioda Foto UtenteDavide90 » 6 ott 2014, 18:42

Il problema dei tempi errati sembra debba essere attribuito all'interrupt del timer0. Da quello che sto notando, variando il valore di tmr0, e lasciando invariato tutto il resto (come nel precedente post), lo stato di on e off varia sensibilmente, é possibile che l'interrupt del timer0 mi faccia perdere qualche interrupt del timer 2( dilatando cosi i tempi)?
Avatar utente
Foto UtenteDavide90
29 6
Frequentatore
Frequentatore
 
Messaggi: 130
Iscritto il: 5 lug 2012, 11:34

PrecedenteProssimo

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 6 ospiti