Pagina 1 di 2

Monitorare lo stato logico di un pin

MessaggioInviato: 7 gen 2013, 20:12
da ricello9
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.

Re: Monitorare lo stato logico di un pin

MessaggioInviato: 8 gen 2013, 17:07
da simo85
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. :(

Re: Monitorare lo stato logico di un pin

MessaggioInviato: 8 gen 2013, 17:36
da ricello9
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
}

Re: Monitorare lo stato logico di un pin

MessaggioInviato: 8 gen 2013, 17:45
da simo85
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?

Re: Monitorare lo stato logico di un pin

MessaggioInviato: 8 gen 2013, 17:47
da TardoFreak
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:

Re: Monitorare lo stato logico di un pin

MessaggioInviato: 8 gen 2013, 21:19
da ricello9
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.

Re: Monitorare lo stato logico di un pin

MessaggioInviato: 8 gen 2013, 23:12
da simo85
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).

Re: Monitorare lo stato logico di un pin

MessaggioInviato: 9 gen 2013, 0:19
da ricello9
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.

Re: Monitorare lo stato logico di un pin

MessaggioInviato: 9 gen 2013, 14:24
da Paolino
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.

Re: Monitorare lo stato logico di un pin

MessaggioInviato: 9 gen 2013, 17:28
da ricello9
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.