Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Monitorare lo stato logico di un pin

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[1] Monitorare lo stato logico di un pin

Messaggioda Foto Utentericello9 » 7 gen 2013, 20:12

ciao a tutti,
in questi giorni sto litigando con la programmazzione del mio PIC.
In pratica devo monitorare lo stato di un ingresso che rimane ad ON per per 3000mS e
ad OFF per 64mS nella fase di rete trovata, mentre nella fase di assenza rete lo stato logico basso
dura 64mS mentre quello altoo 800mS.
Devo riuscire a distingure le due condizioni.
Pultroppo per errore nella costruzione del PCB non ho utilizzato un pin ad interrupt ma un semplice I/O.

Questo è il codice che ho provato ma c'è qulacosa che mi sfugge perche il led si accende per qualche
millisecondo e poi si spegne anche in presenza di rete.
Codice: Seleziona tutto
if (PIR1bits.TMR2IF==1 ) //ciclico ogni 1 mS
   {

     if(GSM_NET==1){
       conteggio_campo++;
       una_volta=0;
      }

    if(GSM_NET==0 && una_volta==0){
       if( conteggio_campo>1000){
           LED_BLU=1;
           presenza_linea=1;
          }
    else  {
           LED_BLU=0;
         presenza_linea=0;
    }
       una_volta=1;
       conteggio_campo=0;
        }
   PIR1bits.TMR2IF=0;  //reset flag interrupt timer2
  }
         



Grazie.
Marcello.
Avatar utente
Foto Utentericello9
195 1 3 7
Stabilizzato
Stabilizzato
 
Messaggi: 360
Iscritto il: 16 mar 2009, 0:13

0
voti

[2] Re: Monitorare lo stato logico di un pin

Messaggioda Foto Utentesimo85 » 8 gen 2013, 17:07

ricello9 ha scritto:Pultroppo per errore nella costruzione del PCB non ho utilizzato un pin ad interrupt ma un semplice I/O.

:-M :?: :?:

PS: che brutta identazione. :(
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

0
voti

[3] Re: Monitorare lo stato logico di un pin

Messaggioda Foto Utentericello9 » 8 gen 2013, 17:36

PS: che brutta identazione.

Hai ragione, ma l'ordine non è stato mai il mio forte.
Comunque hai qualche suggeriemnto da darmi?

Codice: Seleziona tutto

if (PIR1bits.TMR2IF==1 ) {      //ciclico ogni 1 mS
   if(GSM_NET==1){
      conteggio_campo++;
      una_volta=0;
      }
   if(GSM_NET==0 && una_volta==0){
      if(conteggio_campo>1000){
         LED_BLU=1;
         presenza_linea=1;
         }
      else{
          LED_BLU=0;
          presenza_linea=0;
          }
      una_volta=1;
      conteggio_campo=0;
     }
PIR1bits.TMR2IF=0;  //reset flag interrupt timer2
}
Avatar utente
Foto Utentericello9
195 1 3 7
Stabilizzato
Stabilizzato
 
Messaggi: 360
Iscritto il: 16 mar 2009, 0:13

0
voti

[4] Re: Monitorare lo stato logico di un pin

Messaggioda Foto Utentesimo85 » 8 gen 2013, 17:45

Più che altro non capisco questa frase
ricello9 ha scritto:Pultroppo per errore nella costruzione del PCB non ho utilizzato un pin ad interrupt ma un semplice I/O.

Non capisco cosa ti impedisce di usare l'interrupt.

Questa è una identazione decente.
Codice: Seleziona tutto
if(PIR1bits.TMR2IF == 1)
{            
   if(GSM_NET == 1)
   {
      conteggio_campo++;
      una_volta = 0;
   }
   
   if(GSM_NET == 0 && una_volta == 0)
   {
      if(conteggio_campo > 1000)
      {
         LED_BLU = 1;
         presenza_linea = 1;
      }
      else
      {
         LED_BLU = 0;
         presenza_linea = 0;
      }
   
      una_volta = 1;
      conteggio_campo = 0;
   }
   
   PIR1bits.TMR2IF = 0;   
}


L'interrupt flag del TMR2, non va azzerato subito?
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

0
voti

[5] Re: Monitorare lo stato logico di un pin

Messaggioda Foto UtenteTardoFreak » 8 gen 2013, 17:47

Piccolo OT. Questa è una indentazione che rende un sorgente leggibile.
Prima regola per i programmi: ORDINE!
Codice: Seleziona tutto
if (PIR1bits.TMR2IF == 1)     //ciclico ogni 1 mS
{
  if (GSM_NET == 1)
  {
    conteggio_campo++;
    una_volta = 0;
  }
  if (GSM_NET == 0 && una_volta == 0)
  {
    if (conteggio_campo > 1000)
    {
      LED_BLU = 1;
      presenza_linea = 1;
    }
    else
    {
      LED_BLU = 0;
      presenza_linea = 0;
    }
    una_volta=1;
    conteggio_campo=0;
  }
  PIR1bits.TMR2IF = 0;  //reset flag interrupt timer2
}


Azz! [user]Gohan[/user] mi ha preceduto. :mrgreen:
"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
Avatar utente
Foto UtenteTardoFreak
73,9k 8 12 13
-EY Legend-
-EY Legend-
 
Messaggi: 15754
Iscritto il: 16 dic 2009, 11:10
Località: Torino - 3° pianeta del Sistema Solare

0
voti

[6] Re: Monitorare lo stato logico di un pin

Messaggioda Foto Utentericello9 » 8 gen 2013, 21:19

gohan ha scritto:Non capisco cosa ti impedisce di usare l'interrupt.

perché ho utilizzato il pin RC0, che non ha l'interrupt sul cambio di stato.
Quindi suppongo che il conteggio che voglio fare non risulti molto preciso; ma chiedo a voi un parere perché non sono molto esperto.

gohan ha scritto:L'interrupt flag del TMR2, non va azzerato subito?

Penso che per eseguire quella parte di programma il microcontrollore non impieghi più di una manciata di microsendi, quindi azzerarlo alla fine o all'inizia presumo dia lo stesso risultato visto che l'interrupt è generato ogni millisecondo.
Avatar utente
Foto Utentericello9
195 1 3 7
Stabilizzato
Stabilizzato
 
Messaggi: 360
Iscritto il: 16 mar 2009, 0:13

0
voti

[7] Re: Monitorare lo stato logico di un pin

Messaggioda Foto Utentesimo85 » 8 gen 2013, 23:12

ricello9 ha scritto:Penso che per eseguire quella parte di programma il microcontrollore non impieghi più di una manciata di microsendi, quindi azzerarlo alla fine o all'inizia presumo dia lo stesso risultato visto che l'interrupt è generato ogni millisecondo.

Cosa dice il datasheet del microcontrollore (e di quale si tratta?)

PS: per conoscere il tempo di esecuzione totale è necessario disassemblare il programma e sommare il tempo di esecuzione di ogni istruzione (anche queste informazioni sono riportate nei datasheet).
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

0
voti

[8] Re: Monitorare lo stato logico di un pin

Messaggioda Foto Utentericello9 » 9 gen 2013, 0:19

Come microcontrollore sto usando un PIC18f26k22.
Nel datasheet alla sezione interrupt non specifica se l'azzeramento del flag è meglio farlo all'inizio o alla fine del programma .
The interrupt flag bits must be cleared by software before re-enabling interrupts to avoid repeating the same interrupt.



PS: per conoscere il tempo di esecuzione totale è necessario disassemblare il programma e sommare il tempo di esecuzione di ogni istruzione (anche queste informazioni sono riportate nei datasheet).

Ho fatto il dissassembly listing e la somma di tutti i cicli per ogni istruzione mi da 40, cioè con il mio quarzo da 16Mhz eseguo un'istruzione ogni 250 nS.
Per eseguire la porzione di codice che sta nell'interrupt generato dal timer2 impiego 10uS.
Quindi ho un buon margine prima di arrivare al millisendo.
Avatar utente
Foto Utentericello9
195 1 3 7
Stabilizzato
Stabilizzato
 
Messaggi: 360
Iscritto il: 16 mar 2009, 0:13

1
voti

[9] Re: Monitorare lo stato logico di un pin

Messaggioda Foto UtentePaolino » 9 gen 2013, 14:24

L'errore massimo che commetti è pari 1ms (anche se è poco meno di 1ms, ma per semplicità va bene 1ms).
Se la tempistica non è così stringente, potrebbe andar bene il tuo metodo.

Ciao.

Paolo.

P.S. Occhio solo alle variabili che superano il valore di 255: saranno da dichiarare come int.
"Houston, Tranquillity Base here. The Eagle has landed." - Neil A.Armstrong

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

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

0
voti

[10] Re: Monitorare lo stato logico di un pin

Messaggioda Foto Utentericello9 » 9 gen 2013, 17:28

L'errore massimo che commetti è pari 1ms (anche se è poco meno di 1ms, ma per semplicità va bene 1ms).


Ciao Paolino, non riesco a capire come hai fatto a stimare in un millisendo l'errore!
In teoria ad ogni millisecondo il mio timer2 mi abilita il flag, eseguo le mie istruzioni e poi azzero il flag dell'interrupt.
Se per eseguire quella porrzione di codice impiego circa 10uS, alla fine il timer2 mi andra in Overflow ogni 1000uS + 10uS= 1010uS.
Giusto?

Grazie.
Marcello.
Avatar utente
Foto Utentericello9
195 1 3 7
Stabilizzato
Stabilizzato
 
Messaggi: 360
Iscritto il: 16 mar 2009, 0:13

Prossimo

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 7 ospiti