ESERCITAZIONE # 7
Istruzioni di Rotate
In questa esercitazione verifichiamo l' effetto delle istruzioni di Rotate.
I PIC enhanced dispongono di 4 diverse istruzioni di rotazione:
rrncf |
Rotare Right No Carry |
ruota a destra senza interessare il carry |
rlncf |
Rotate Left No Carry |
ruota a sinistra senza interessare il carry |
rrcf |
Rotate Right with Carry |
ruota a destra attraverso il carry |
rlcf |
Rotate Left with Carry |
ruota a sinistra attraverso il carry |
Qui utilizziamo le prime due, caricando un registro RAM con un bit a livello
1 facendo scorre questo bit avanti e indietro.
Se al bit associamo un LED, questo si accenderà, ottenendo su una striscia di 8
LED, un effetto del genere di quello del famoso KITT Car.
Il flow chart è questo.
|
Dopo la necessaria inizializzazione del port di comando dei LED come
uscita, azzerando tutti i bit (tutti i LED sono spenti).
Successivamente viene posto a 1 il bit 0 del latch, col risultato di
accendere il primo LED.
Quindi il programma è composto da due loop.
Il primo loop consiste nel ruotare il contenuto del latch (nel latch
stesso) facendo scorrere il bit a 1 dalla prima all' ultima posizione.
Una pausa di visualizzazione è interposta tra ogni rotazione e la
successiva.
Quando il bit 7 del latch è a 1, questo vuol dire che sono state
effettuate 7 rotazioni.
Ora si attiva un altro loop che ruota il bit nella direzione opposta,
fino a riportarlo al bit 0.
A questo punto il ciclo riprende indefinitamente.
La routine di tempo è eseguita semplicemente con il decremento di
due contatori.
variando questa routine si potrà modificare la pausa tra uno shift e l'
altro.
|
Il nostro esercizio prevede di collegare LED ai bit 3:0 di PORTC
, che saranno accesi a coppie.
La gestione relativa è, anche qui, realizzata con macro per semplificare il
sorgente.
Per l' esecuzione pratica si dovranno semplicemente collegare i pin PC0:3 ai
LED della UniBoard (o del proprio hardware).
Il Pickit è inserito direttamente nella spina ICSP/ICD e permette un debug passo passo delle
istruzioni.
Per chi non avesse chiare le connessioni, qui trova di seguito 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)
- otto 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.
Analogamente all' esercizio 6, inseriamo nel sorgente una variabile per
permettere di avere ambiente debug o release.
;---------------------------------------------------------------------
; Condizione di compilazione
; Selezionare la modalità richiesta
DebugOn equ
1 ; condizioni di
debug
;DebugOn equ 0 ; condizioni di release
;---------------------------------------------------------------------
; Condizioni comuni
; Single-Supply ICSP disabled
CONFIG LVP = OFF
; Uso dell' oscillatore interno, port su RA7 e FOSC/4 su RA6
CONFIG OSC = INTIO1
; Funzione del pin MCLR abilitata
CONFIG MCLRE = ON
; WDT disabilitato
CONFIG WDT = OFF
; Brown-out in hardware only
CONFIG BOR = ON
; Condizione di debug
#if DebugOn == 1
; Background debugger enabled su RB6 e RB7 per il debug con il
; Pickit o altro, attraverso ICSP/ICD
CONFIG DEBUG = ON
; PWRT disabled per il debug
CONFIG PWRT = OFF
; Soglia BOR 4.2V
CONFIG BORV = 1
#else
; Condizioni di release
; debug disabilitato
CONFIG DEBUG = OFF
; BORV a 2.7V per alimentazione a batteria
CONFIG BORV = 2
; Power On Timer abilitato
CONFIG PWRT = ON
#endif |
Il programma vero e proprio è assai semplice e ricalca il flow chart appena
visto:
;----------------------------------------------------------------------
; Inizio programma
; vettore di RESET
ORG
0x00
Main nop
; per debug
clrf
LATC
; preset POTC a 0
clrf
TRISC
; tutto PORTC come uscita
bsf PORTC, 0
; bit 0 di PORTC = 1
; questo accende il led collegato a PC0
; Ciclo primario
mainlp
call
pausa ; pausa
per visualizzazione
rrncf
LATC, f ; ruota il
latch di PORTC a destra
call
pausa ; pausa
per visualizzazione
; quando il bit a 1 si
trova nella posizione 7 sono state
; effettuate tutte le rotazioni possibili all' interno del byte
btfss
LATC, 7
; bit 7 = 1 ?
bra
mainlp
; no - altro loop
; si - inizia rotazione opposta
mainlp1
call
pausa ; pausa
per visualizzazione
rlncf LATC, f
; ruota il latch di PORTC a sinistra
call
pausa ; pausa
per visualizzazione
; quando il bit a 1 si
trova nella posizione 0 sono state
; effettuate tutte le rotazioni possibili all' interno del byte
btfss LATC,
0 ; bit 0 =
1 ?
bra
mainlp1
; no - altro loop
bra
mainlp
; si - inizia rotazione opposta
|
La solita struttura a decremento già vista serve a realizzare la pausa.
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.
|