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

PIC18: continuiamo a salutare... in assembly

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

In fase di sviluppo Stesura preliminare In fase di sviluppo

Con la scusa di continuiamo ad esaminare l'uso di PORTC, impariamo a conoscere una manciata di istruzioni Assembly del PIC18. L'hardware utilizzato è lo stesso mostrato nella pagina helloREALworld in assembly. Si consiglia di proseguire solo se è chiaro quanto in essa descritto.

Visto che lo scopo di questa pagina è prendere un po' di confidenza con alcune istruzioni Assembly, è vivamente consigliata la lettura in parallelo della spiegazione semplificata qui riportata con la spiegazione "ufficiale" presente nei fogli tecnici (nota 1).

Facciamo lampeggiare i LED

Questo programma accende quattro LED connessi a PORTC e spegne gli altri quattro; inizia quindi quindi un loop infinito che alterna l'accensione degli otto LED. A fondo pagina il codice completo.

L'unica istruzione nuova è:

    comf LATC  ; COMplement File register

Essa inverte il valore logico dei bit del registro speciale LATC (verificare la descrizione dell'istruzione sui fogli tecnici, dopo aver preso visione della nota 1!). In pratica: accende i LED spenti e spegne quelli accesi.

Questo programma, quando mandato in esecuzione, sembra non funzionare in quanto il tempo di esecuzione estremamente breve fa apparire ai nostri occhi tutti gli otto LED sempre accesi. Tre sono le soluzioni:

A titolo informativo i LED lampeggiano con un periodo di 24 µs, indicativamente 10 000 volte più velocemente di quanto visibile ad un essere umano. (nota 2 e terzo esercizio)

Questa osservazione deve essere estesa a tutti i programmi presenti in questa pagina

Accendiamo un solo LED

A volte vogliamo accendere e spegnere un solo LED, lasciando invariati gli altri sette appartenente a LATC. In questo vengono in aiuto le istruzione bit-oriented, ciò capaci di intervenite su uno solo dei bit che compongono un byte (nota 3)

L'istruzione nuova è:

    btg LATC,7   ; Bit ToGle

Essa, nell'esempio, inverte il valore del settimo bit del registro LATC, lasciando gli altri invariati. Il bit 7 è il bit più significativo (MSB) del registro, "quello di sinistra" per noi occidentali.

Esaminare il primo esercizio.

Supercar

Il programma presentato è un classicissimo: un LED acceso su otto che scorre continuamente da destra a sinistra e viceversa. Lo trovate a fondo pagina, in tre versioni.

Prima versione

La prima versione permette lo scorrimento in un solo verso:

    rlncf LATC ; Rotate Left No Carry File register

Questa istruzione trasforma LATC in un "registro a scorrimento" verso sinistra in cui l'ultimo bit è collegato al primo. Di seguito l'immagine, tratta dai fogli tecnici, che spiega più di molte parole:

Esaminare il secondo esercizio.

Seconda versione

Questo programma implementa lo scorrimento del LED da destra verso sinistra e, dopo lo spegnimento dell'ultimo LED, lo scorrimento nel verso opposto, in un loop infinito.

Sono presenti diverse nuove istruzioni. Due non vengono qui discusse in quanto oggetto del secondo esercizio:

   rlcf LATC ; Rotate Left Carry File register
   rrcf LATC ; Rotate Right Carry File register

La prima istruzione di "salto condizionato" permette di proseguire o meno sequenzialmente l'esecuzione del programma, seguendo rami diversificati:

    bnc sinistra ; Branch if Not Carry

In particolare, l'esecuzione prosegue alla label "sinistra" se il flag C vale 0, in pratica tornando indietro. Se invece il flag C vale 1, il programma prosegue sequenzialmente (facendo scorrere il LED al contrario).

L'ultima istruzione è moto simile a goto, in questo caso perfettamente interscambiabile (esercizio 4)

    bra sinistra ; BRAnch unconditionally

Terza versione

L'ultima versione è simile alla precedente. L'unica differenza è nel fatto che uno dei LED rimane sempre acceso.

L'istruzione nuova è:

    btfss LATC, 0 ; Bit Test File, Skip if Set

Per comprendere il funzionamento di questa istruzione occorre esaminare la riga con l'istruzione (33, nell'esempio) e le due righe successive:

Ovviamente nelle due righe successive è possibile avere qualunque istruzione, non solo un salto come in questo caso.

Conteggio

Questo programma conta da 3 a 9, visualizzando i numeri sui LED. Lo trovate a fondo pagina

Due delle nuove istruzioni qui presenti hanno un ovvio significato (da verificare comunque sui fogli tecnici!):

   clrf TRISC ; CLeaR File register
   incf LATC  ; INCrement File register

La terza nuova istruzione permette di confrontare il contenuto di un registro con il contenuto del registro W. Se sono uguali, viene saltata l'istruzione successiva, in modo simile a quanto già mostrato per l'istruzione btfss.

    cpfseq LATC ; ComPare File register with working register, Skip if EQual

Esaminare il quindo esercizio. Ed anche il sesto

Il codice

Esercizi

  1. Esaminare il funzionamento delle istruzioni bsf e bcf
  2. Analizzare le varianti dell'istruzione rlncf verso destra e verso sinistra, utilizzando o meno il flag C
  3. Verificare con il supporto dei fogli tecnici il tempo di esecuzione delle istruzioni che compongono il loop che fa lampeggiare i LED
  4. Esaminare il funzionamento dei "branch" che utilizzano gli altri flag. Individuare le differenze tra goto e bra
  5. Esaminare il funzionamento delle istruzioni cpfsgt e cpfslt
  6. Individuare ed esaminare le istruzioni aritmetiche (somma e sottrazione) e logiche (AND, OR, XOR)

Note

  1.  Tutte le istruzioni mostrate in questa pagina utilizzano "automaticamente" i seguenti due switch:

    • a=0, in quanto fanno riferimento esclusivamente ad un "registro speciale" (LATC, nel caso specifico)
    • d=1, in quanto il risultato dell'operazione è salvato nel registro stesso

    (se le righe precedenti sono al momento non chiare, poco male: in pratica si tratta del comportamento che appare più "logico" e che sarà meglio dettagliato in altri momenti)

  2. Tale tempo dipende ovviamente dal clock che il PIC18 utilizza, qui pari ad 1 MHz, molto meno del massimo consentito
  3. Alcuni registri per uso speciale NON sono compatibili con questo tipo di istruzioni.

Ultima modifica di questa pagina: 23 marzo 2016 - Una pagina simile: Le porte di I/O 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