ESERCITAZIONE # 3
USO dei PORT come ingressi e uscite digitali
Oltre a comandare carichi in uscita, i port degli embedded possono essere
configurati come ingressi digitali, ovvero per ricevere segnali a livello logico.
Per le ragioni già indicate nell' esercizio precedente, i default dopo il
reset configurano i port come ingressi digitali o ingressi analogici.
Quindi, se utilizziamo un port in cui non sono presenti funzioni analogiche,
dopo il reset tutti i pin del port saranno disponibili come ingressi digitali.
Se, invece, utilizzeremo un port con funzioni analogiche, sarà necessario
escluderle per poter usare i pin in modo digitale.
Il nostro esercizio prevede di collegare un LED al bit 0 di PORTC e
un pulsante al bit 0 di PORTB.
Al momento della pressione del pulsante il LED si accenderà e rimarrà acceso
fino a che il pulsante è premuto.
Nota: per semplificare al massimo questo esercizio, non si tiene conto dei
rimbalzi del pulsante per cui se questi sono presenti in modo massiccio, in
effetti il LED verrà azionato on/off fino al termine dei rimbalzi.
La durata di questi rimbalzi è dell' ordine dei millisecondi e quindi non
visibile a occhio, ma solo attaverso uno strumento come un oscilloscopio.
Questo effetto spiacevole può venire semplicemente eliminato con un semplice
algoritmo, detto debounce software o con un hardware aggiuntivo (debounce
hardware), che saranno oggetto di un' altra esercitazione successiva.
per ora, ci limitiamo a prendere atto del fenomeno e tenere a mente la sua
esistenza.
Il LED è posti tra il pin e il gnd (Vss, massa) con la
rispettiva resistenza in serie e quindi saranno accesi quando il pin,
configurato come uscita, sarà portato a livello 1.
Il pulsante è collegato tra il pin e la Vss con una resistenza di pull-up verso
la Vdd; questa, per PORTB, è ridondante, in quanto su questo port si possono
attivare pull-up integrati. Però, questo è possibile solo su PORTB, mentre
qualsiasi altro pin richiederà il pull-up esterno.
Ovviamente, dovendo visualizzare il risultato, il progetto imposta Pickit3 come
debugger e viene utilizzata la Uniboard, direttamente alimentata a 5V dal Pickit.
Si dovranno semplicemente collegare il pin PC0 ad un dei LED
della scheda, mentre si collegherà a PB0 il pulsante.
Questo pulsante può essere benissimo quello del RESET, che non viene usato
durante l' esercizio.
Il Pickit è inserito direttamente nella spina ICSP/ICD e permette un debug passo passo delle
istruzioni.
Ovviamente sarà possibile utilizzare Pickit2 senza variazioni se non la diversa impostazione nell'
ambiente MPLAB; oppure anche REAL ICE o ICD, sempre con il semplice cambio
nel setup di MPLAB, tenendo presente che non tutti i tools sono
in grado di alimentare l' hardaware.
Inoltre è sempre possibile utilizzare SIM senza alcun hardware o
debugger collegato.
|
Una descrizione particolareggiata delle funzioni dei PORT è consultabile
qui.
Per chi non avesse chiare le connessioni, qui trova una pagina dedicata.
L' esercizio richiede le seguenti risorse:
- MPLAB IDE installato
- Pickit3 (o Pickit2)
- 28-40pin UniBoard con PIC18F2321
0 4321 (o 2221 o 4221 o altro hardware similare)
- due cavetti jumper da 14-15 cm
Il listato sorgente è una estensione di quello già visto negli altri
esercizi e che fa da base per tutti i seguenti, aggiungendo gli elementi
necessari al nuovo lavoro.
Da un punto di vista strutturale il programma agisce in questo modo:
- Azzeramento dei latch del PORTC. Questa operazione preliminare serve per pre
determinare il livello che i pin assumeranno nel momento in cui
saranno configurati come uscite. In questo caso il LED collegato a PC0 si
troverà a livello basso, quindi sarà spento.
- Imposizione della direzione uscita per i bit 0 dei PORTC; PORTB
dopo il reset è già configurata come ingressi e una linea nel CONFIG
esclude da PORTB le funzioni analogiche.
- Test dello stato del pulsante e relativa azione sul LED.
- Il micro è bloccato in un loop infinito di test e comando.
FLOWCHART
|
Non è assolutamente un optional escludere dalla
documentazione un flowchart che descriva graficamente il lavoro del
programma. Sopratutto qui, dove è in funzione una azione di test e
scelta conseguente.
La forma del diagramma di flusso rende immediato quello che altrimenti
richiederebbe molte parole.
Il diagramma di flusso è molto semplice.
Il core del programma ruota attorno al continuo test dello stato del
pulsante ed alla conseguente accensione o spegnimento del LED.
Per evitare l' uso non certo consigliabile di
indirizzi assoluti o del simbolo $ sono state create due labele, ledoff
e loop che consento il rinvio del program counter in modo da creare i
loop necessari alla corretta esecuzione del test e del conseguente
azionamento del pin PORTC,0.
|
Vediamo il listato nei dettagli.
Come inizio, è sempre presente una testata di descrizione del programma e delle sue
funzioni e la già descritta definizione del processore usato.
;*****************************************************************
; Esercitazioni PIC18 - Esercitazione # 3
;*****************************************************************
; Esempio di uso dei PORT come in e out
; Author : afg
; Version : E18_2_00
; Date : 09/10/2010
;-----------------------------------------------------------------
; Descrizione: Il sorgente PORTC,0 come uscita e PORTB, 0 come
; ingresso.
; Un pulsante collegato a PB0 sarà testato e quando chiuso
; provocherà l' accensione del LED.
;-----------------------------------------------------------------
; Note : Processore PIC18F2321
; Oscillatore interno a 1 MHz (clock interno 250 us)
; senza la necessità di componenti esterni
; Debug con MPLAB IDE e PickKit3
; Previsto per funzionare con tutti gli enhanced
;*****************************************************************
LIST P=18F2321 ; Utilizziamo il PIC18F2321
radix dec
; con base decimale per le operazioni
; matematiche
#include "P18F2321.INC"
; Include l' header file
; questo header è fornito dallo stesso Assembler e non richiede
; alcun file addizionale
|
Segue quindi la configurazione del processore. Rispetto alle configurazioni
precedenti, qui viene aggiunta una linea che disabilita le funzioni analogiche
dal PORTB, che, per default al reset, altrimenti sarebbero attivate.
;---------------------------------------------------------------------
; Configurazione minima dei debug del processore
;
; Disabilita analogica dal PORTB
CONFIG PBADEN = OFF
; Background debugger enabled su RB6 e RB7 per il debug con il
; Pickit o altro, attraverso ICSP/ICD
CONFIG DEBUG = ON
; Single-Supply ICSP disabled
CONFIG LVP = OFF
; Uso dell' oscillatore interno, port su RA7 e FOSC/4 su RA6
CONFIG OSC = INTIO1
; PWRT disabled per il debug
CONFIG PWRT = OFF
; Brown-out in hardware only
CONFIG BOR = ON
; Soglia BOR 4.2V
CONFIG BORV = 1
; Funzione del pin MCLR abilitata
CONFIG MCLRE = ON
; WDT disabilitato
CONFIG WDT = OFF |
Assegniamo un paio di locazioni in RAM con la direttiva CBLOCK/ENDC.
Nel caso di questo programma, non hanno alcuna funzione. Serviranno nelle
esercitazioni successive.
;----------------------------------------------------------------------
;Assegna registri di memoria RAM
CBLOCK 0x00 ; blocco di RAM a partire da 0x00
d1 ; riserva 2 bytes per un contatore
d2
ENDC ; fine blocco RAM
|
Nell' area degli Equates inseriamo alcune definizioni che ci serviranno
durante il programma.
Da notare che utilizziamo il registro LATC al posto di PORTC dato che è più
adeguato e che gli enhanced prevedono questa possibilità per eliminare il problema
dell' R-M-W.
Invece utilizziamo PORTB in lettura dello stato del pulsante, in quanto questo
riporta l' effettiva situazione logica dei pin al momento della lettura.
;----------------------------------------------------------------------
; Equates
;
; assegnazioni per il LED
#define
LED
LATC,0 ; LED collegato a
RC0
; assegnazione per il pulsante
#define Pulsante PORTB,
0
|
Ecco il "programma" vero e proprio, con ampi commenti che
descrivono le funzioni svolte da ogni riga.
Per i salti viene usata l' istruzione bra
(BRanch Always) tipica degli enhanced.
;=====================================================================
; Inizio programma
; Il programma:
; - imposta i pin RA0, RB0, RC0 come uscite
; - porta questi pin a livello alto
; se ad essi c'è collegato un LED verso massa, esso verrà acceso
ORG 0x00
; Programma inizia a 0x00 - vettore del reset
Start nop
; dummy - linea utile solo ai fini del debug
; inizializza a 0 i latch di uscita dei PORTC
; questo serve per avere subito a livello 0 i pin che saranno
programmati come uscite
; non ha effetto sui pin programmati come ingressi.
clrf LATC
; inizializza PORTC,0 come output
; agendo sul registro di direzione
bcf
TRISC,0
; PORTB è già input
per default al reset e quindi non richiede
; alcuna azione
; Ora passiamo al test dello stato del pulsante
; se è chiuso, il pin PB0 è collegato alla Vss, ovvero è a livello
0
; - in questo caso il LED dovrà essere acceso
: se è aperto, il pin PB0 è mantenuto a livello 1 dal pull-up
; - in questo caso il LED sarà spento
; Viene applicata una label loop in quanto questo è il punto
; per il rientro nel loop per il pulsante non premuto.
; Mentre la label ledoff costituisce il rientro del loop per
; il pulsante premuto.
ledoff bcf
LED
; LED spento
loop btfsc
Pulsante ; se Pulsante =
0 salta istruzione successiva
bra
ledoff
; Pulsante = 1, salta ledoff
bsf
LED ;
Pulsante = 0, accendi led
; il programma entra in un loop infinito
sul
; test pulsante - azionamento LED
bra
loop
;=====================================================================
; Subroutines
; area vuota
;********************************************************************
; Direttiva di fine sorgente
END
|
La fine del sorgente è determinata come al solito dalla direttiva END.
Da notare che il programma vero e proprio, invece, non termina, dato che
permane nel loop di analisi dello stato del pulsante.
Avviando lo step-by-step potremo seguire il flusso delle istruzioni ed
osservare nella finestra degli SFR lo stato del pulsante e l' accensione di LED.
Se si incontrano errori nella compilazione è opportuno verificarli con la
lista di descrizione degli errori e correggere dove si è sbagliato.
Il file compresso di questa esercitazione è scaricabile dall'
area di download.
|