Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

PIC e ricezione telecomando infrarossi

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[21] Re: PIC e ricezione telecomando infrarossi

Messaggioda Foto Utentesorecaro » 7 ott 2015, 22:35

il codice sotto funziona (naturalmente è da perfezionare), ora la domanda è: con questo codice riesco solo a creare un array di 25 elementi, con più elementi ho la memoria piena, è possibile ovviare a questo problema?
Codice: Seleziona tutto
signed char ricevo[25]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

unsigned bit flag_discesa; flag_salita; inizio_ricezione;  alto; basso;
unsigned bit stop_tempo; leggi; stop; start;
unsigned char tempo_trascorso;
unsigned char incremento_byte;

void interrupt(void){

     if(intcon.gpif){

           if((gpio.f4==1)&&(alto==0))
              {
              gpio.f1=1;
               INTCON.T0IE=1;
              tmr0=0;
              stop_tempo=0;
              tempo_trascorso=0;
              alto=1;
              start=0;
              }else if ((gpio.f4==0)&&(alto==1))
              {
               incremento_byte++;
              gpio.f1=0;
              tempo_trascorso=tmr0;
              tmr0=0;
              INTCON.T0IE=0;
              stop_tempo=1;
              alto=0;
               start=1;
               
               
                if(tempo_trascorso<10)
     {
      ricevo[incremento_byte]=0;
      }
      if(tempo_trascorso>16)
      {
       ricevo[incremento_byte]=1;
       }
               
               
               
               
               }
              intcon.gpif=0;

     }



    }

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void main() {                  ///////
incremento_byte=0;
stop_tempo=0;
alto=0;
basso=0;
start=0;
stop=0;
flag_discesa=0;
  leggi=0;
flag_salita=0;
inizio_ricezione=0;
tempo_trascorso=0;
   CMCON =  7;                         //Disabilita comparatore
   ADCON0 = 0b000000000;                //Disabilita convertitore A/D
   ANSEL =  0b00000000;                //Tutte le porte in digitale
   TRISIO = 0b00010000;                //Tutti i pin in OUT tranne gpio3
   OPTION_REG=0b00000101;              //abilita presaler 1:64 in modo da avere  un incremento del tmr0 ogni 64uS
    ioc=0b010000;
   INTCON.GPIE   =1;                   //abilita interrupt generale
   INTCON.T0IE=1;
   intcon.GIE=1;
  gpio.f5=0;
  gpio.f3=0;
  gpio.f2=0;
  gpio.f1=0;
  gpio.f0=0;
while(1){
////////////////////////////controlla impulso start di 13ms////////////////////////////////////////////////////////////

/*if(gpio.f4==0)
{

tmr0=0;
flag_discesa=1;
}
if((gpio.f4==1)&&(flag_discesa==1))
{
flag_salita=1;
}
if((gpio.f4==0)&&(flag_salita==1))
{
tempo_trascorso=tmr0;
}
if(tempo_trascorso>200)
{

inizio_ricezione=1;
flag_salita=0;
flag_discesa=0;
tempo_trascorso=0;

}*/

    if(incremento_byte>20)
         {
           leggi=1;
           incremento_byte=0;
           intcon.gie=0;
           }
           if(leggi==1)
           {
           gpio.f2=1;
           stop++;
         gpio.f5=ricevo[incremento_byte];
         delay_ms(500);
         gpio.f2=0;
         delay_ms(500);
         incremento_byte++;
         }
}
}
Avatar utente
Foto Utentesorecaro
36 3 7
Frequentatore
Frequentatore
 
Messaggi: 233
Iscritto il: 26 feb 2013, 19:30

0
voti

[22] Re: PIC e ricezione telecomando infrarossi

Messaggioda Foto Utentesorecaro » 7 ott 2015, 22:48

Ho notato un'altra cosa :cry: :cry: :cry: :cry:
Posso solo premere solo un pulsante, poi nulla più, il programma non fa più nulla



risolto, dovevo riabilitare l'interrupt
Avatar utente
Foto Utentesorecaro
36 3 7
Frequentatore
Frequentatore
 
Messaggi: 233
Iscritto il: 26 feb 2013, 19:30

0
voti

[23] Re: PIC e ricezione telecomando infrarossi

Messaggioda Foto Utentesorecaro » 7 ott 2015, 23:55

Ora il problema è fare attivare un uscita del PIC in base al tasto premuto.
Il salvataggio del dato trasmesso dal telecomando è ok(controllato con oscilloscopio e led di controllo).
L'unica aggiunta al codice di prima è la somma dell'array. Ho preso solo gl'ultimi 8 bit
Se faccio il debug sul PC con mikroc sembra tutto ok, ma nella realtà non va.
Codice: Seleziona tutto
signed short ricevo[25]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
unsigned short dato;
unsigned bit  inizio_ricezione;  alto; basso;
unsigned bit stop_tempo; leggi; stop; start;
unsigned char tempo_trascorso;
unsigned char incremento_byte;

void interrupt(void){

     if(intcon.gpif){

           if((gpio.f4==1)&&(alto==0))
              {
              gpio.f1=1;
               INTCON.T0IE=1;
              tmr0=0;
              stop_tempo=0;
              tempo_trascorso=0;
              alto=1;
              start=0;
              }else if ((gpio.f4==0)&&(alto==1))
              {
               incremento_byte++;
              gpio.f1=0;
              tempo_trascorso=tmr0;
              tmr0=0;
              INTCON.T0IE=0;
              alto=0;

                if(tempo_trascorso<10)
     {
      ricevo[incremento_byte]=0;
      }
      if(tempo_trascorso>16)
      {
       ricevo[incremento_byte]=1;
       }
               }
              intcon.gpif=0;

     }



    }

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void main() {                  ///////
incremento_byte=0;
stop_tempo=0;
alto=0;
dato=0;
basso=0;
start=0;
dato=0;
stop=0;
leggi=0;
inizio_ricezione=0;
tempo_trascorso=0;
   CMCON =  7;                         //Disabilita comparatore
   ADCON0 = 0b000000000;                //Disabilita convertitore A/D
   ANSEL =  0b00000000;                //Tutte le porte in digitale
   TRISIO = 0b00010000;                //Tutti i pin in OUT tranne gpio3
   OPTION_REG=0b00000101;              //abilita presaler 1:64 in modo da avere  un incremento del tmr0 ogni 64uS
    ioc=0b010000;
   INTCON.GPIE   =1;                   //abilita interrupt generale
   INTCON.T0IE=1;
   intcon.GIE=1;
  gpio.f5=0;
  gpio.f3=0;
  gpio.f2=0;
  gpio.f1=0;
  gpio.f0=0;
while(1){
////////////////////////////controlla impulso start di 13ms////////////////////////////////////////////////////////////

  if(dato==224)
  {
  gpio.f0=1;
  }


    if(incremento_byte>25)
         {
           leggi=1;
           incremento_byte=0;
           intcon.gie=0;
           }
           if(leggi==1)
            {
           gpio.f2=1;
         gpio.f5=ricevo[incremento_byte];
         delay_ms(500);
         gpio.f2=0;
         delay_ms(500);
         incremento_byte++;
         if(incremento_byte>25)
         {
          dato=ricevo[24]+(ricevo[23]*2)+(ricevo[22]*4)+(ricevo[21]*8)+(ricevo[20]*16)+(ricevo[19]*32)+(ricevo[18]*64)+(ricevo[17]*128);
          incremento_byte=0;
         leggi=0;
         alto=0;
          intcon.GIE=1;
         }
         }       
     
}
}
Avatar utente
Foto Utentesorecaro
36 3 7
Frequentatore
Frequentatore
 
Messaggi: 233
Iscritto il: 26 feb 2013, 19:30

1
voti

[24] Re: PIC e ricezione telecomando infrarossi

Messaggioda Foto UtenteWALTERmwp » 8 ott 2015, 0:48

Ciao Foto Utentesorecaro adesso non entro nel merito del programma, invece mi permetto un suggerimento: prima di re-inserire il codice in un Post, controlla più volte, magari lo fai già, però verifica meglio.
Scrivo questo perché ne ho visti tre nelle ultime due ore.

Non è un problema e non lo è proprio in assoluto ma credo diventi sconveniente per l'OP, in tal caso tu, ma vale in generale, perché ogni volta viene segnalato il codice con un comportamento indesiderato e se qualcuno volesse indagare quasi non farebbe in tempo trovandosi ad "inseguire" l'indicazione successiva.

La "fretta" di cercare il supporto degli interlocutori, comprensibile ma, senza prendersi il tempo di riguardare con calma ( ... vedi ad esempio abilitazione interrupt ...), potrebbe stancare chi magari fosse disposto a dare una mano.

Questa è solo una mia osservazione, non scrivo sia sistematico ma può accadere.

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

0
voti

[25] Re: PIC e ricezione telecomando infrarossi

Messaggioda Foto UtenteIlGuru » 8 ott 2015, 12:49

sorecaro ha scritto:riesco solo a creare un array di 25 elementi, con più elementi ho la memoria piena, è possibile ovviare a questo problema?


Certo, fino ad un certo punto.
Invece di
Codice: Seleziona tutto
signed char ricevo[25]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};


Puoi usare
Codice: Seleziona tutto
long long ricevo //numero di 32 bit;

//Per inserire uno 0:
ricevo = ricevo << 1;

//Per inserire un 1:
ricevo = ricevo << 1;
ricevo |= 1;

//Per estrarre l'ultimo numero inserito:
num = ricevo & 1;
ricevo = ricevo >> 1:


Così usi solo 4 byte invece di 32.
\Gamma\nu\tilde{\omega}\theta\i\ \sigma\epsilon\alpha\upsilon\tau\acute{o}\nu
Avatar utente
Foto UtenteIlGuru
4.129 1 10 13
Master
Master
 
Messaggi: 1372
Iscritto il: 31 lug 2015, 23:32

0
voti

[26] Re: PIC e ricezione telecomando infrarossi

Messaggioda Foto Utentesorecaro » 8 ott 2015, 13:14

Foto UtenteIlGuru grazie per l'aiuto. Stasera proverò a fare come hai consigliato ma prima devo risolvere il problema della somma del dato. Ancora non capisco cosa non va e soprattutto il perché non mi attiva l'uscita gpio.f0
Avatar utente
Foto Utentesorecaro
36 3 7
Frequentatore
Frequentatore
 
Messaggi: 233
Iscritto il: 26 feb 2013, 19:30

0
voti

[27] Re: PIC e ricezione telecomando infrarossi

Messaggioda Foto Utentesorecaro » 8 ott 2015, 14:37

Foto UtenteWALTERmwp hai perfettamente ragione, purtroppo a volte la fretta mi si mangia e vorrei che funzionasse tutto subito. :-) farò tesoro del tuo consiglio
Avatar utente
Foto Utentesorecaro
36 3 7
Frequentatore
Frequentatore
 
Messaggi: 233
Iscritto il: 26 feb 2013, 19:30

0
voti

[28] Re: PIC e ricezione telecomando infrarossi

Messaggioda Foto UtenteWALTERmwp » 8 ott 2015, 15:02

sorecaro ha scritto: :-) farò tesoro del tuo consiglio
grazie, e buon lavoro.

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

0
voti

[29] Re: PIC e ricezione telecomando infrarossi

Messaggioda Foto Utentesorecaro » 8 ott 2015, 20:53

Dopo varie prove ora riesco ad attivare due uscite con il telecomando.(come al solito sbagliavo io a fare i conti)
L'unico problema che sto riscontrando è che a volte il PIC si blocca nella routine di interrupt e non fa più nulla. Dico questo perché nel codice ho inserito l'uscita gpio.f1 come flag di controllo, se dopo aver premuto il tasto la porta gpio.f0 rimane a 0 il PIC si blocca, non riceve più nessun dato, ma se ritorna a 1 allora tutto ok. Come posso fare per uscire in modo forzato da questa situazione??
Codice: Seleziona tutto
unsigned short ricevo[25]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
unsigned short dato;
unsigned bit  inizio_ricezione;  alto; basso;
unsigned bit stop_tempo; leggi; stop; start;
unsigned char tempo_trascorso;
unsigned char incremento_byte;

void interrupt(void){

     if(intcon.gpif){

           if((gpio.f4==1)&&(alto==0))
              {
              gpio.f1=1;                        /////////flag controllo
               INTCON.T0IE=1;
              tmr0=0;
              stop_tempo=0;
              tempo_trascorso=0;
              alto=1;
              start=0;
              }else if ((gpio.f4==0)&&(alto==1))
              {
               incremento_byte++;
              gpio.f1=0;                                   //flag controllo
              tempo_trascorso=tmr0;
              tmr0=0;
              INTCON.T0IE=0;
              alto=0;

                if(tempo_trascorso<10)
     {
      ricevo[incremento_byte]=0;
      }
      if(tempo_trascorso>16)
      {
       ricevo[incremento_byte]=1;
       }

               }
              intcon.gpif=0;

     }



    }

/////////////////////////////////////8//////777//////////////////////////////////////////////////////////////////////////
void main() {                  ///////
incremento_byte=0;
stop_tempo=0;
alto=0;
basso=0;
start=0;
dato=0;
stop=0;
leggi=0;
inizio_ricezione=0;
tempo_trascorso=0;
   CMCON =  7;                         //Disabilita comparatore
   ADCON0 = 0b000000000;                //Disabilita convertitore A/D
   ANSEL =  0b00000000;                //Tutte le porte in digitale
   TRISIO = 0b00010000;                //Tutti i pin in OUT tranne gpio3
   OPTION_REG=0b00000101;              //abilita presaler 1:64 in modo da avere  un incremento del tmr0 ogni 64uS
    ioc=0b010000;
   INTCON.GPIE   =1;                   //abilita interrupt generale
   INTCON.T0IE=1;
   intcon.GIE=1;
  gpio.f5=0;
  gpio.f3=0;
  gpio.f2=0;
  gpio.f1=0;
  gpio.f0=0;
while(1){


         if(incremento_byte>25)
        {
        intcon.gie=0;
          dato=(ricevo[24]+(ricevo[23]*2)+(ricevo[22]*4)+(ricevo[21]*8)+(ricevo[20]*16)+(ricevo[19]*32)+(ricevo[18]*64)+(ricevo[17]*128));
          incremento_byte=0;
         leggi=0;
         alto=0;


          if(dato==184)/////////TASTO SINISTRO/////////////////////////////////
            {
  gpio.f0=1;
  Delay_ms(1000);
  gpio.f0=0;
    intcon.GIE=1;
    }
    if (dato==164)/////////TASTO DESTRO/////////////////////////////////
    {
    gpio.f2=1;
    delay_ms(1000);
    gpio.f2=0;
    intcon.gie=1;

    }


          }
          }

          }



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

0
voti

[30] Re: PIC e ricezione telecomando infrarossi

Messaggioda Foto UtenteIlGuru » 8 ott 2015, 21:14

Forse scattano anche altri interrupt dove però non resetti il relativo flag quindi entra sempre nella isr. disabilita tutti gli interrupt che non usi.
\Gamma\nu\tilde{\omega}\theta\i\ \sigma\epsilon\alpha\upsilon\tau\acute{o}\nu
Avatar utente
Foto UtenteIlGuru
4.129 1 10 13
Master
Master
 
Messaggi: 1372
Iscritto il: 31 lug 2015, 23:32

PrecedenteProssimo

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 2 ospiti