Esercitazioni ASM - PIC18

 


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:

  1. 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.
  2. 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.
  3. Test dello stato del pulsante  e relativa azione sul LED.
  4. 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.

 

 

Copyright © afg. Tutti i diritti riservati.
Aggiornato il 04/04/11.