Home
Accesso / Registrazione
 di 

Corso di programmazione per microcontrollori PIC - Ottava puntata - 3

Corso di programmazione per microcontrollori PIC

Nello specifico, ruotando a sinistra, viene spostato nel bit di destra il contenuto attuale del carry e posto il bit più a sinistra nel carry. Per comprendere meglio l’istruzione Rotate Left osserviamo la figura 1 riportata in questa pagina, tenendo presente che nel nel registro USCITA avevamo questa combinazione: “00000001”.

Ruotando questo dato a sinistra, avremo: “00000010”. Risulta quindi chiaro che l’azzeramento del Carry è indispensabile per evitare di caricare un 1, dando così la combinazione: “00000011”. Ma Poiché vogliamo accendere in sequenza un led per volta, quest’ultima combinazione risulta inadatta alla nostra applicazione. Arrivati all’ultima rotazione, avremo la combinazione: “10000000”. Alla successiva rotazione, però “perderemmo” l’uno nel Carry, e quindi si spegnerebbero tutti i led.

Per questo motivo, dopo il comando di rotazione viene testato il contenuto del Carry attraverso l’istruzione BTFSS STATUS,CARRY che esegue il seguente confronto: se non vi è un valore logico 1 nel Carry (cioè non siamo arrivati all’ultima rotazione) prosegui normalmente, altrimenti salta l’istruzione immediatamente successiva e prosegui.

Quindi se non siamo arrivati all’ultima rotazione, il programma esegue l’istruzione successiva, che rimanda all’etichetta MAIN (in questo caso il programma esegue una ulteriore rotazione), altrimenti salta questa istruzione e prosegue.

In quest’ultimo caso viene ricaricato nuovamente nel registro USCITA il Counter all’inizio del programma, ed è questo il motivo per cui troviamo in fondo al listato l’istruzione GOTO INIT (cioè salta alla label INIT), assemblate alla locazione 03FF (infatti l’istruzione ORG dice all’assemblatore di scrivere il programma da una certa locazione di memoria, nel nostro caso identificata dalla label PIC84, il cui valore è appunto 03FF).

Alla label INTI inizia quindi il programma vero e proprio, costituito per la prima parte da una serie di inizializzazioni: viene configurata la porta B come uscita, ponendo nel registro TRIS B il valore 00. Vengono poi inizializzati i due registri COUNT_1 e COUNT_2 col valore esadecimale FF, e viene inizializzato il registro USCITA a 1. Occorre notare come, non essendo possibile scrivere direttamente un numero in un registro, occorre trasferire prima tale numero nel registro W, attraverso l’istruzione MOVLW (che carica nel registro W un numero), e valore iniziale 00000001, per poi far ricominciare il programma dalla label MAIN.

Vediamo ora di comprendere il funzionamento della routine DELAY che viene richiamata dopo ogni rotazione, e che serve, come già detto, a rallentare lo scorrimento dei led. In pratica, questa routine lavora andando a decrementare prima il registro COUNT_1, dal valore 0FF fino a zero, poi ricarica COUNT_1 e decrementa COUNT_2. Quindi ogni decremento di COUNT_2 corrisponde a 256 (il valore decimale di 0FF) decrementi di COUNT_1.

Finiti anche i 256 decrementi di COUNT_2, vengono ripristinati tutti i valori e si torna all’esecuzione del programma principale. Per quantificare il ritardo introdotto dalla routine DELAY occorre calcolare i vari cicli macchina interessati dalla routine stessa. Abbiamo detto che per ogni decremento di COUNT_2 vengono eseguiti 256 decrementi di COUNT_1. Le istruzioni che vengono eseguite sono la DECFSZ e la GOTO. La DECFSZ impiega un ciclo macchina per essere eseguita, mentre la GOTO impiega due cicli macchina per essere processata (questi valori si trovano sul manuale dei micro).

 

 

Scrivi un commento all'articolo esprimendo la tua opinione sul tema, chiedendo eventuali spiegazioni e/o approfondimenti e contribuendo allo sviluppo dell'argomento proposto. Verranno accettati solo commenti a tema con l'argomento dell'articolo stesso. Commenti NON a tema dovranno essere necessariamente inseriti nel Forum creando un "nuovo argomento di discussione". Per commentare devi accedere al Blog

 

 

Login   
 Twitter Facebook LinkedIn Youtube Google RSS

Chi è online

Ci sono attualmente 1 utente e 18 visitatori collegati.

Utenti online

Ultimi Commenti