Salta la barra di navigazione [1] - Vai alla barra di navigazione [3] - Scrivimi una mail [4]

PIC18: helloREALworld in assembly

Assembly PIC18 - PIC18 in C - Sommario - Novità - Tutorial - Progetti - Risorse - Non solo elettronica

Il circuito stampato inserito in una breadboard

In fase di sviluppo Stesura preliminare In fase di sviluppo

In questa pagina è presentato un piccolo programma che utilizza la porta C come uscita digitale per accendere un gruppo di otto LED.

Per comprendere il contenuto di questa pagina è bene avere:

Purtroppo la curva di apprendimento è piuttosto ripida, soprattutto perché occorre gestire contemporaneamente hardware e software. (nota 1)

Questo programma non fa altro che accendere alcuni LED: un modo per salutare il mondo facendo il verso al più classico dei programmi C per PC (main(){printf "hello world";}. I passi necessari:

L'hardware

La parte significativa dell'hardware è costituito da otto LED con in serie una resistenza da qualche centinaio di ohm, connessi tra massa e gli 8 pin della cosiddetta porta C, cioè i piedini del circuito integrato da RC0 a RC7. Ecco lo schema elettrico parziale:

 

Come operazione preliminare occorre individuare sul foglio tecnico specifico del PIC18 in uso quali sono i pin RC0 → RC7 e quale è (o quali sono) il pin di massa (VSS). Il nome potrebbe cambiare, in particolare nella parte che segue lo slash (per esempio: la stringa /T1OSO/T1CK1 potrebbe mancare oppure essere diversa). Analogamente, la numerazione dei piedini potrebbe essere diversa.

Evidentemente lo schema appena riportato è parziale: mancano infatti per esempio tutti i segnali per il collegamento all'ICD e l'alimentazione. In pratica è possibile utilizzare PICdemo oppure PICdemo R2 oppure costruire su breadboard il circuito che ne realizza lo schema completo.

Otto LED su bradboard

Il software

Lo scopo di questo primo codice è accendere alcuni dei LED presenti nello schema. Il codice è diviso in due file, che trovate a fine pagina.

Configuration Bits

La funzione di questi bit è già stata descritta. Il file è specifico per un preciso modello di PIC18 ed è quindi è consigliabile generarlo da zero se non state utilizzando un PIC18F26K20. Non è necessario comprenderne fin da subito il contenuto, anche se è bene leggere i commenti in esso contenuti.

Il codice è scaricabile a fondo pagina.

Qualche dettaglio:

Codice assembly

Esaminiamo il codice, scaricabile a fondo pagina, in questo come in altri casi, non specifico per il modello di PIC18 in uso.

  #include "p18f26k20.inc"
Questa riga include nel file la definizione dei registri dello specifico PIC18 in uso. Deve necessariamente essere presente. Questo file viene fornito con l'assemblatore e non deve essere modificato. Questa riga come quasi tutte le seguenti non deve iniziare in prima colonna

  CODE 0x0000 ; processor reset vector - Code start here
Come in molti processori, il codice inizia all'indirizzo zero (è il cosiddetto vettore di reset). Questa riga informa il linker che qui comincia il codice, con la parola chiave CODE ed il numero 0x0 (nota 2)

  movlw 0 ; Clear working register (W)
Questa istruzione (MOVe Literal to W) copia "letteralmente" il numero 0 nel registro W (Working register, conosciuto in altri contesti come Accumulatore). Come per tutte le istruzione che si incontreranno è vivamente consigliata la lettura del foglio tecnico (un aiutino: pagina 431)

  movwf TRISC ; Copy W to TRIS register (set PORTC as output)
Questa istruzione (MOVe W to File register) copia il contenuto del registro W nel registro TRISC. Questo registro ha una funzione particolare: se posto a 0 configura tutte i pin della porta C come uscite digitali, esattamente quello che ci serve, visto che abbiamo collegato ad essa 8 LED. La funzione del registro TRIS e del successivo registro LAT verrà riesaminata poco più avanti.

  movlw B'11001011' ; Load in W binary number 1100 1011 (0xCB)
Questa istruzione copia "letteralmente" il numero binario 11001011 nel registro W. I numeri possono essere espressi in varie basi, sempre da specificare in modo esplicito (nota 3 e nota 5):
- Binario: B'110011001'
- Esadecimale: H'AB' oppure 0x1F (consigliato)
- Decimale: D'123' oppure .19

  movwf LATC ; Copy W to output latch (set some LED on, some off)
Copia il contenuto del registro W in LATC. Questo registro corrisponde a 8 latch collegati direttamente ai pin della porta C e quindi ai LED: scrivendo 1 il LED corrispondente si accende, scrivendo 0 il LED si spegna (quindi, nell'esempio, avremo nell'ordine due LED accesi, due spenti, 1 acceso, uno spento, due accesi)

sopra
Questa riga è, fino ad ora, la prima ed unica che inizia in prima colonna: è una label (etichetta) che identifica un indirizzo di memoria. Non corrisponde a nessuna istruzione macchina e semplicemente significa "questo punto qui del codice si chiama sopra").

  goto sopra ; loop forever
Queste riga realizza in loop infinito: l'istruzione goto effettua un salto incondizionato alla label sopra, di fatto bloccando l'esecuzione del processo.

Queste due ultime righe spesso vengono scritte senza andare a capo (nota 6):
sopra goto sopra

Le porte

Tutti i piedini del PIC 18 hanno molteplici funzioni. Per ora concentriamoci solo sulle porte di Input/Output, in particolare sulla modalità di output da utilizzare per "scrivere" su ciascun LED 1 piuttosto che 0 (accenderlo o spegnerlo)

I piedini di I/O del PIC18 sono raggruppati in gruppi di massimo otto, che possiamo indicare con il termine porta X, dove X è una lettera che, a seconda del modello, varia da A ed E. Per poter accendere un LED connesso tra le uscite di questa porta e massa sono necessarie due operazioni:

  1. Configurare ciascun piedino della porta come uscita, attraverso il registro con funzione speciale TRISx (Special Function Register, SFR). In particolare per configurare un piedino come uscita occorre scrivere 0 (zero). Per ricordarsi: zero è l'iniziale di... Output
  2. Scrivere 1 in binario su ciascun piedino collegato ad un LED da accendere, attraverso il registro con funzione speciale LATx

La documentazione dettagliata è disponibile, per esempio, in una sezione del data book dal titolo indicativo di PORTC, TRISC and LATC Registers. (Nota 4). Per il PIC18F26K20 si trova a pagina 119: è vivamente consigliato leggere le prime righe di tale capitolo!

Assemblaggio del codice

I due file appena creati (con nome qualunque, ma estensione .asm) devono essere salvati nella sezione source file del progetto.

Al termine, il progetto deve presentarsi simile a quanto di seguito mostrato:

Progetto MPLAB X in Assembly

Il progetto evidenziato in grassetto è quello principale (tasto destro → Set as Main Program).

Compilazione, programmazione ed esecuzione

Le operazione di compilazione del codice, trasferimento del codice dal PC al PIC18 ed esecuzione sono realizzate tramite una serie di icone, dal nome auto-esplicativo, leggibile passandoci il mouse sopra:

Le icone

In generale l'ultima icona permette di effettuare automaticamente anche le operazioni precedenti, per cui è in assoluto quella più usata.

Per evitare comportamenti a volte incomprensibili, un paio di avvertenze:

Il debug

Il debug del codice si effettua attraverso:

Icone per il debig

Durante le sessioni di debug passo-passo le finestre appaiono come si seguito mostrato: in particolare è evidenziato un breakpoint alla linea 14, in rosso, e la posizione attuale del Program Counter alla linea 17, in verde.

Una sessione di debug

Una volta che il programma si comporta come progettato, il PIC18 può essere programmato definitivamente (con gli stessi strumenti già visti) e reso autonomo, semplicemente scollegando l'ICD e fornendo l'alimentazione.

Codice

Esercizi

  1. Collegare il LED ad una porta diversa da C (per esempio: porta A, porta B...): individuare quali pin sono fisicamente presenti e quali sono i registri da modificare
  2. Altre esercizi al termine della pagina continuiamo a salutare...

Note

  1. Una pagina simile, con codice C: helloREALworld
  2. In seguito verranno mostrati anche altri "vettori" e quindi la struttura del codice subirà alcune modifiche
  3. Tutte le lettere utilizzate per rappresentare numeri possono indifferentemente essere maiuscole o minuscole
  4. Per il momento ignoriamo lo SFR PORTx, descritto tra i Suggerimenti, in ordine sparso
  5. É importante notare che, se non si specifica la base dei numeri, viene usata la direttiva radix che di default è impostato ad esadecimale (e non a decimale, come sembrerebbe essere logico)
  6. La riga sopra goto sopra equivale alla riga goto $, considerata a volte da evitare, ma comoda in alcune situazioni particolari quali la scrittura delle macro

Ultima modifica di questa pagina: 29 marzo 2016 - Una pagina simile: helloREALworld in C


Assembly PIC18

Licenza Creative Commons Attribuzione 4.0 Internazionale


EN - Pagina principale - Sommario - Accessibilità - Note legali e privacy policy - Posta elettronica

XHTML 1.0 Strict - CSS 3