Esercitazioni ASM - PIC18

 


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.

 

 

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