Continuiamo a salutare...

Con la scusa di continuare ad esaminare l'uso di PORTC, impariamo a conoscere un'altra 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, senza inserire un ritardo, 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.

Come alternativa è possibile modificare il codice all'interno del ciclo infinito nel modo seguente:

 movlw 0x0F ; copia in W il numero binario 0000 1111 (0x0F)
 movwf LATC ; copia il contenuto del registro W nel registro speciale LATC
            ; (quattro LED sono accesi, gli altri quattro spenti)
 movlw 0xF0 ; copia in W il numero binario 1111 0000 (0xF0)
 movwf LATC ; copia il contenuto del registro W nel registro speciale LATC
            ; (quattro LED sono spenti, gli altri quattro accesi)

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

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

   incf LATC  ; INCrement File register

La seconda 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 quinto 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)
  7. Altri esercizi alla pagina GPIO: esercizi

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" posto nell'Access Bank (LATC, nel caso specifico)
    • d=1, in quanto il risultato dell'operazione è salvato nel registro stesso
    (se le righe precedenti non sono chiare, è il caso di rileggere le pagine La memoria RAM e Le variabili usando l'assembler)
  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.

Data di creazione di questa pagina: marzo 2016
Ultima modifica: 23 novembre 2017


Licenza Creative Commons Attribuzione 4.0 Internazionale


Pagina principaleAccessibilitàNote legaliPosta elettronicaXHTML 1.0 StrictCSS 3

Vai in cima