PIC e Linux: 1) gestione di un pulsante

Normalmente i corsi per imparare a programmare i PIC iniziano facendo accendere il primo led, magari con un lampeggio.

Ho deciso invece di partire con qualcosa appena un po’ più complesso, giusto per non annoiare nessuno.

In questo corso farò sempre riferimento, per le parti teoriche, a due ottime risorse on-line, settorezero, di Giovanni Bernardo, e Laurtec, di Mauro Laurenti.

Lo scopo di questi post è solo quello di applicare al mondo Linux, con gli strumenti open source SDCC e PIKLAB, gli stessi concetti che vengono ampiamente presentati e trattati negli altri siti indicati.

Cominciamo quindi premendo un pulsante e cambiando lo stato di un LED. Anzi, già che ci siamo, mettiamo tre pulsanti e tre led.

Il riferimento teorico, i collegamenti elettrici, e altre riflessioni utili sono reperibili su questa lezione di settorezero

Per i pulsanti utilizzerò una tecnica che consente di evitare effetto rimbalzo o incertezze nella pressione, anche con i pulsanti più scadenti e traballanti, ma ad un prezzo: lo schema proposto funziona “al rilascio del pulsante”, cioè gli effetti si vedono non quado il pulsante viene premuto, ma quando viene rilasciato.

Il cuore del programma è il seguente:

void main() {
TRISD = 0b11111000;
TRISB = 0b11111111;
LATD = 0;
while(1) {
   if(PORTBbits.RB0==0) {
       while(PORTBbits.RB0==0);
       LATDbits.LATD2 = 1 -LATDbits.LATD2;
   }
   if(PORTBbits.RB1==0) {
       while(PORTBbits.RB1==0);
       LATDbits.LATD1 = 1 -LATDbits.LATD1;
   }
   if(PORTBbits.RB2==0) {
       while(PORTBbits.RB2==0);
       LATDbits.LATD0 = 1 -LATDbits.LATD0;
   }
   ritardo();
}
}

Come si può vedere è molto semplice (ed anche poco efficiente, ma quando vedremo gli interrupt questo stesso esempio lo faremo molto meglio): la prima pressione del pulsante consente di entrare nell’IF, poi però il processo si blocca in un while che termina solo se si rilascia il pulsante. Appena il pulsante viene rilasciato, viene invertito il valore del bit a cui è collegato il led. Ovviamente ci sono tre IF in quato gestisco tre pulsanti diversi.

Tutto il ciclo si ripete con un ritardo definito dalla apposita funzione:

void ritardo() {
  int i;
  for (i=0;i < 20000; i++);
}

Per completare il tutto mancano solo le configurazioni iniziali: in particolare disabilito il WDT per evitare che il programma si resetti da solo e imposto l’oscillatore del quarzo ad alta velocità.

Tutte le configurazioni possono ovviamente essere scritte utilizzando il “config generator” di piklab, come spiegato nel tutorial.

Ecco il link per scaricare il file di esempio:

Annunci

2 pensieri riguardo “PIC e Linux: 1) gestione di un pulsante

  1. ciao, mi fa piacere che il tema SDCC abbia degli estimatori
    Il valore 20000 è semplicemente un numero grande, tuttavia potresti ricondurlo, in maniera molto approssimata e imprecisa, anche ad un tempo. Tieni conto infatti che ogni istruzione (non tutte le istruzioni, ma per le somme, quelle usate nel ciclo for, il concetto fila) viene eseguita in 4 cicli, quindi un quarzo a 20Mhz esegue 5 milioni di istruzioni al secondo, pertanto ogni istruzione di somma viene eseguita in 1/5.000.000 secondi, cioè 0,0000002 secondi. Se vuoi ottenere, molto approssimativamente, 1 millesimo di secondo, devi eseguire 5000 somme, ad esempio con for(i=0; i< 5000; i++);

  2. Ciao,
    prima di tutto Grazie per la guida a piclab e per la “traduzione” in sdcc del corso di settorezero. Volevo chiederti una cosa, ma 20000 nella funzione ritardo rappresenta un millesimo della frequenza di clock (e quindi un millisecondo) o è semplicemente un numero “grande”?
    Grazie
    Marco

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...