Realizzazione hardware e software di un sistema di otto led

Materie:Appunti
Categoria:Sistemi

Voto:

1.5 (2)
Download:139
Data:27.08.2009
Numero di pagine:12
Formato di file:.doc (Microsoft Word)
Download   Anteprima
realizzazione-hardware-software-sistema-otto-led_1.zip (Dimensione: 220.74 Kb)
trucheck.it_realizzazione-hardware-e-software-di-un-sistema-di-otto-led.doc     363 Kb
readme.txt     59 Bytes


Testo

LABORATORIO DI SISTEMI
ALUNNO: Fratto Claudio
CLASSE: V B Informatico
ESERCITAZIONE N°: 1
OGGETTO: REALIZZAZIONE DELL’HARDWARE E DEL SOFTWARE DI UN SISTEMA CHE METTE IN ROTAZIONE OTTO LED, ATTRAVERSO L’UTILIZZO DI UN PIC
SCHEMA

FIGURA 1

DATI:
R= 10kΩ
Rd= 330Ω
C = 22pf
STRUMENTI UTILIZZATI COMPONENTI UTILIZZATI

1)
1) Alimentatore; 1) PIC 16f876;
2) Programmatore per PIC;
3) PC;
1) Una resistenza da 10kΩ;
2) Otto resistenze da 330Ω;
3) Due condensatori da 22pF;
4) Un oscillatore al quarzo a 4MHz;
5) PIC16f876;
6) Buffer SN74HC244N;
ALGORITMO
SORGENTE PROGRAMMA
#include
; Parola di configurazione:
__CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _BODEN_ON & _LVP_ON & _CPD_OFF & _WRT_ENABLE_OFF & _DEBUG_OFF & _CP_OFF
; Inizio area dichiarazione variabili
comodo RES 1 ; riserva un byte
CounterC RES 1 ; riserva un byte
CounterA RES 1 ; riserva un byte
CounterB RES 1 ; riserva un byte
; Fine area dichiarazione variabili
; Inizio subroutine: ciclo di ritardo creato automaticamente con PiKloops
; Ritardo = 0.99999800s with Oscillatore a 4MHz
delay_1_sec
MOVLW D'6'
MOVWF CounterC
MOVLW D'24'
MOVWF CounterB
MOVLW D'168'
MOVWF CounterA
delay_1_sec_loop
DECFSZ CounterA,1
GOTO delay_1_sec_loop
DECFSZ CounterB,1
GOTO delay_1_sec_loop
DECFSZ CounterC,1
GOTO delay_1_sec_loop
RETURN
; Fine subroutine: ciclo di ritardo creato automaticamente con PiKloops
; Inizio programma
Start ; etichetta di riferimento: inizio del programma
; imposto PORTB in output accedendo al banco 1 e azzerando il registro TRIS B
BCF STATUS,RP1 ; poni a 0 il bit RP1, contenuto nel registro di stato
BSF STATUS, RP0 ; poni a 1 il bit RP0, contenuto nel registro di stato
MOVLW 0X00 ; carica nel registro W il valore esadecimale 00
MOVWF PORTB ; copia il valore contenuto in W nella locazione di memoria ; di indirizzo corrispondente all’etichetta “PORTB”, cioè nel
; registro TRIS B

; PORT B impostata in output
; inizializzo a zero PORT B: ritorno al banco 0 e carico il valore esadecimale 00
: nel registro PORTB
BCF STATUS, RP0 ; poni a 0 il bit RP0, contenuto nel registro di stato
MOVWF PORTB ; copia il valore contenuto in W nella locazione di memoria ; di indirizzo corrispondente all’etichetta “PORTB”
; PORT B inizializzata a zero
; imposto le condizioni iniziali: variabile di comodo azzerata e bit del carry ad 1
MOVWF comodo ; copia il valore contenuto in W nella locazione di memoria
; di indirizzo corrispondente all’etichetta “comodo”, riservata
; in precedenza
BSF STATUS,C ; poni a 1 il bit C, contenuto nel registro di stato
RLF comodo, f ; ruota, con l’ausilio del carry,verso sinistra il contenuto
; della locazione di memoria di indirizzo corrispondente
; all’etichetta “comodo”
; condizioni iniziali impostate
ciclo ; etichetta di riferimento per il ciclo da ripetere
MOVF comodo, W ; copia il contenuto della locazione di memoria di indirizzo
; corrispondente all’etichetta “comodo” nel registro W
MOVWF PORTB ; copia il contenuto del registro accumulatore nella locazione
; di memoria di indirizzo corrispondente all’etichetta “PORTB”:
; il dato viene presentato in uscita sulla PORT B
RLF comodo, f ; ruota, con l’ausilio del carry,verso sinistra il contenuto
; della locazione di memoria di indirizzo corrispondente
; all’etichetta “comodo”

CALL delay_1_sec ; richiamo della subroutine che crea un ritardo di 1msec

GOTO ciclo ; ripeti le istruzioni presenti dopo l’etichetta di riferimento
; “ciclo”
END ; fine del programma
RELAZIONE
L’esperienza effettuata in laboratorio si è articolata in tre fasi:
1) la prima fase consisteva nel realizzare l’algoritmo ed il relativo codice, scritto nel linguaggio compreso dai PIC, di un software che mettesse in rotazione otto led;
2) la seconda fase consisteva nel programmare il PIC utilizzato attraverso il programmatore e nel progettare la parte hardware in modo tale da funzionare al meglio (scegliere componenti da utilizzare, ecc.), e realizzarlo in pratica;
3) la terza fase consisteva nel testare il circuito realizzato in precedenza e verificarne il corretto funzionamento.
• CENNI TEORICI SUI PIC
La sigla PIC sta per "Programmable Interface Controller". In altre parole un PIC è un sistema a microprocessore integrato contenuto in un unico chip che comprende, oltre alla CPU, anche una memoria per i programmi (generalmente una memoria EPROM), una memoria per i dati (generalmente una memoria RAM) ed un blocco di I/O. Essendo la memoria dati distinta da quella programmi ciascun PIC è caratterizzato da un’architettura Harvad. Il PIC è comunemente conosciuto con l’appellativo di microcontrollore.
I PIC più moderni sono inoltre caratterizzati da più timer, da alcuni comparatori (che sono in grado di confrontare livelli di tensione), dai convertitori analogici – digitali e da alcune interfacce seriali utili per il collegamento del PIC stesso con dei dispositivi esterni.
Caratteristica fondamentale dei microcontrollori è il loro ridottissimo set di istruzioni; sono caratterizzati, a differenza dei microprocessori, da una filosofia di progettazione RISC (Reduced Instruction Set Computer).
Generalmente per programmare un microcontrollore si utilizza una connessione di tipo seriale.
I microcontrollori più diffusi sono: il PIC16F84 e il più moderno PIC16F876.
IL PIC16F876
Il PIC16F876 è un dispositivo dotato di 28 pin che lavora con una frequenza massima di clock pari a 20 MHz e dispone un set di 35 istruzioni. Esso è caratterizzato da:
a) 8 kword, ciascuna delle quali composta da 14 bit, che compongono la memoria flash dei programmi;
b) 256 byte di memoria EPROM per i dati;
c) 368 byte di memoria RAM anche questa per i dati;
d) 3 porte di I/O:
1) la PORT A caratterizzata da 6 linee;
2) la PORT B caratterizzata da 8 linee;
3) la PORT C caratterizzata da 8 linee.
Ciascuna linea può essere programmata in modo indipendente dalle altre come linea di input o come linea di output.
PIEDINATURA DEL PIC
ARCHITETTURA INTERNA
• La CPU
Il dispositivo più importante presente all’interno di un PIC è la CPU che riesce a comunicare con tutte le altre periferiche interne attraverso una serie di canali di comunicazione chiamati “bus”.
Il compito della CPU è quello di eseguire il programma caricato sul PIC elaborandone i dati e le informazioni;
• La ALU
La ALU (Arithmetic Logic Unit) è la componente più complessa di un microcontrollore poiché contiene tutta la circuiteria che si occupa di tutte le funzione di calcolo e di manipolazione dei dati durante l’esecuzione di un programma.

La memoria
Come già detto sopra, la memoria di ciascun microcontrollore, essendo quest’ultimo caratterizzato da un’architettura Harvad, si divide in due tipi:
1) la memoria programmi: di tipo EEPROM cioè una memoria cancellabile elettricamente che può essere quindi riscritta. È composta da 1024 locazioni a 14 bit, alle quali si aggiungono 8 locazioni riservate allo stack nelle quali vengono memorizzati gli indirizzi di ritorno delle subroutine. Quando il dispositivo viene avviato, il PC (Program Counter) punta alla prima locazione di questa memoria in cui è contenuto il primo codice del programma da eseguire;
2) La memoria dati: di tipo RAM che è comunemente chiamata FILE REGISTER. Esso è composto da un’insieme di locazioni di memoria RAM, chiamate registri, che sono direttamente visibili dal programma stesso. È possibile quindi leggere, scrivere e modificare ogni locazione del FILE REGISTER. Alcune di queste locazioni, quelle che sono poste negli indirizzi più bassi, svolgono una funzione speciale per il PIC e non possono essere utilizzate per scopi diversi da quelli per cui sono state riservate. Le restanti possono essere utilizzate per registri di uso generale dal programmatore.
Il FILE REGISTER è suddiviso in quattro banchi di memoria composti ognuno da 127 locazioni di memoria. Per accedere ad un singolo banco bisogna ricorrere a due bit di indirizzamento, RP0 e RP1, contenuti nel registro di stato.
SCHEMA DEL FILE REGISTER
SCHEMA DI INDIRIZZAMENTO
RP1
RP0
BANCO 0

BANCO 1

1
BANCO 2
1

BANCO 3
1
1

3) Lo stack: è quella parte di memoria in cui è possibile memorizzare temporaneamente più indirizzi per poi recuperarli quando servono. La memorizzazione nello stack avviene secondo la struttura LIFO (Last In – First Out) ciò significa che l’ultimo indirizzo memorizzato sarà il primo ad essere recuperato;
4) Il registro w: è l’unico registro connesso direttamente con la ALU; è comunemente chiamato registro accumulatore. È una singola locazione di memoria che può quindi contenere soltanto un valore ad 8 bit. Caratteristica fondamentale del registro accumulatore, che lo differenzia da tutti gli altri, è il fatto che la ALU per far riferimento allo stesso non deve fornire nessun indirizzo di memoria ma vi può accedere in maniera diretta;
5) Il Program Counter: è un particolare registro che ha la funzione di memorizzare l’indirizzo della locazione di memoria che contiene la prossima istruzione da eseguire. È un registro che si incrementa automaticamente.
• Il Watch Dog Timer (WDT)
Il Watch Dog Timer è in pratica un oscillatore interno al PIC, ma completamente indipendente dal resto della circuiteria, il cui scopo è di rilevare eventuali blocchi della CPU del microcontrollore, resettando eventualmente il PIC per riprendere la normale esecuzione del programma. Per rilevare un eventuale blocco della CPU durante l'esecuzione del programma principale, è inserita all'interno di questo, un’istruzione speciale, la:
CLRWDT (CLeaR Watch Dog Timer)
la quale azzera ad intervalli regolari il Watch Dog Timer non consentendogli di terminare il suo conteggio. Se la CPU non effettua questa istruzione prima del termine del conteggio allora si assume che il programma si è bloccato per qualche motivo e si effettua il Reset della CPU.

• Il Registro di Stato (STATUS REGISTER)
Il registro di stato è composto da alcuni bit impostati alla sola lettura ed altri che possono essere sia letti che modificati. Questi bit, chiamati anche flag che vengono identificati con una propria sigla, indicano lo stato aritmetico della ALU, lo stato dell’hardware del PIC e consentono l’indirizzamento per l’accesso ai vari banchi del FILE REGISTER.
Esso è memorizzato alla locazione di indirizzo 03(16) ed è composto da 8 bit.
SCHEMA DEL REGISTRO DI STATO
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
IRP
RP1
RP0
TO
PD
Z
DC
C
FUNZIONE DI OGNI SINGOLO BIT
IRP
È utilizzato per l’indirizzamento indiretto ai banchi del FILE REGISTER;
RP1
È utilizzato, insieme al bit RP0, per l’indirizzamento diretto ai banchi del FILE REGISTER (vedi “schema di indirizzamento” foglio7);
RP0
È utilizzato, insieme al bit RP1, per l’indirizzamento diretto ai banchi del FILE REGISTER (vedi “schema di indirizzamento” foglio7);
TO
Viene posto a zero quando il WDT va un time – out;
PD
Viene posto a zero quando viene eseguita un’istruzione di SLEEP (il PIC viene messo in STAND – BY);
Z
È il flag dello Zero: viene posto ad 1 se il risultato di un’operazione logica o aritmetica è 0; ad uno se il risultato è diverso da 0;
DC
È il flag del Digit Carry: viene posto ad 1 se è presente un riporto da un’operazione effettuata nel semi – byte meno significativo;
C
È il flag del Carry: viene posto ad 1 se è presente un riporto nel risultato di un’operazione
• Le porte di I/O
Come già detto in precedenza, il PIC16F876 dispone di tre porte di I/O: la PORT A (6 linee); la PORT B (8 linee); la PORT C (8 linee). Ciascuna linea può essere impostata o in input o in output. Per la gestione delle linee, quindi per la loro impostazione, il PIC dispone di tre registri contenuti nel banco due del FILE REGISTER: TRIS A, per la PORT A; TRIS B, per la PORT B; TRIS C, per la PORT C. Tutti questi registri sono locazioni di memoria ad otto bit; ciascun bit rappresenta una singola linea della porta a cui fa riferimento. Se il bit viene impostato a 0, la linea a cui si riferisce sarà impostata in output; se il bit viene impostato a 1, la linea a cui si riferisce sarà impostata in input.

FASE 1:
Per realizzare il codice sorgente di un programma che mettesse in rotazione otto led da caricare su un PIC16F876, si è prima passati alla progettazione su carta di un algoritmo (vedi ‘ALGORITMO’ foglio2). Dall’analisi del problema è risultato utile utilizzare una variabile di comodo per effettuare le operazioni di rotazione (shift a sinistra) e non effettuare la rotazione stessa direttamente sulla locazione di memoria della PORT B, impostata in output.
Una volta progettato l’algoritmo si è passati alla stesura del codice scritto utilizzando il set di istruzioni messe a disposizione dal PIC.
ANALISI DELLE ISTRUZIONI UTILIZZATE
Come già detto in precedenza il PIC16F876 è dotato di un set di 35 istruzioni di base che si dividono in tre gruppi:
a) Byte – oriented: cioè quelle istruzioni che agiscono su un registro di 8 bit e tutte le operazioni effettuate vanno a modificare il contenuto del registro stesso;
b) Bit – oriented: cioè quelle istruzioni che agiscono su un singolo bit di un registro;
c) Literal and control: cioè quel gruppo di istruzioni che agiscono su una costante ad 8 bit la quale va a modificare un registro in base all’operazione che si effettua.
Questi gruppi di istruzioni possono avere una serie di parametri che, nella loro sintassi, devono essere utilizzati; i parametri sono identificati da:
a) f: sta a rappresentare una locazione di memoria;
b) d: sta a rappresentare la destinazione dell’istruzione;
c) b: sta a rappresentare il peso del bit su cui deve essere eseguita l’operazione;
d) k: sta a rappresentare una costante ad 8 bit o un’etichetta; questo parametro può essere utilizzato solo con istruzioni del gruppo Literal and control;
• ISTRUZIONE “BCF” : “Bit Clear F”
Sintassi: BCF f, b
Descrizione: Questa istruzione azzera il bit b del registro presente all’indirizzo f senza modificare nessun bit del registro di stato.

• ISTRUZIONE “BSF” : “Bit Set F”
Sintassi: BSF f, b
Descrizione: Questa istruzione pone a livello logico alto il bit b del registro presente all’indirizzo f senza modificare nessun bit del registro di stato.
• ISTRUZIONE “MOVLW” : “MOVe Literal to W”
Sintassi: MOVLW k
Descrizione: Questa istruzione carica nel registro accumulatore il valore costante k senza modificare nessun bit del registro di stato.
• ISTRUZIONE “MOVF” : “MOVe F”
Sintassi: MOVF f, d
Descrizione: Questa istruzione copia il contenuto della locazione di memoria corrispondente all’etichetta f nella locazione di memoria corrispondente all’etichetta d, che può essere anche il registro w o la stessa locazione di memoria del dato da copiare. Questa istruzione va a modificare il bit dello Zero del registro di stato.
• ISTRUZIONE “MOVWF” : “MOVe W to F”
Sintassi: MOVWF f
Descrizione: Questa istruzione copia il contenuto del registro accumulatore nella locazione di memoria corrispondente all’etichetta f, senza modificare nessun bit del registro di stato.

• ISTRUZIONE “RLF” : “Rotate Left F through carry”
Sintassi: RLF f, d
Descrizione: Questa istruzione ruota i bit contenuti nella locazione di memoria corrispondente all’etichetta f verso sinistra (dal bit meno significativo a quello più significativo) passando attraverso il bit del Carry contenuto nel registro di stato: il bit più significativo viene memorizzato nel bit del carry il cui contenuto viene spostato nel bit meno significativo del registro f.
L’istruzione non modifica, oltre al bit del Carry, nessun altro bit del registro di stato.
• ISTRUZIONE “CALL”: “subroutine CALL”
Sintassi: CALL k
Descrizione: Questa istruzione richiama la subroutine memorizzata all’indirizzo corrispondente al parametro k che può essere o il valore numerico dell’indirizzo, o l’etichetta corrispondente all’indirizzo.
Quando la CPU del PIC incontra una istruzione CALL, memorizza nello STACK il valore del registro PC + 1 (PC sta per Program Conter) in modo da poter riprendere l'esecuzione dall'istruzione successiva alla CALL, quindi scrive nel PC l'indirizzo della subroutine saltando all'esecuzione di quest'ultima. Il valore originale del PC viene ripristinato all'uscita della subroutine con l'esecuzione dell'istruzione di ritorno RETURN.
L’istruzione non modifica nessun bit del registro di stato.
• ISTRUZIONE “RETURN”: “RETURN from subroutine”
Sintassi: RETURN
Descrizione: Questa istruzione deve essere posta alla fine del codice di ogni subroutine in modo da determinarne la sua fine ed indicare alla CPU del PIC di riprendere l’esecuzione del programma principale; ciò significa che la CPU va a riprendere il valore del PC memorizzato nello stack quando è stata effettuata la chiamata alla subroutine.
• ISTRUZIONE “GOTO”: “GO TO address”
Sintassi: goto k
Descrizione: Questa è un’istruzione di salto assoluto. Essa determina un salto del programma in esecuzione all'indirizzo k che può essere specificato utilizzando direttamente il valore numerico dell'indirizzo oppure la relativa etichetta.
L’istruzione non modifica nessun bit del registro di stato.
Finita la fase di stesura del codice si è passati alla sua compilazione per ottenere il file “.hex” da poter caricare, attraverso il programmatore, sul PIC. La compilazione è avvenuta tramite il software linux Piklab, attraverso il quale, con un tool integrato, è stato possibile creare la subroutine di ritardo in maniera automatica (il tool è stato in grado di fornire il codice da anteporre all’etichetta di inizio del programma principale). Sempre con un tool del software è stato possibile definire la “parola di configurazione” del PIC, impostando di fatto tutte le caratteristiche del dispositivo utilizzato: tipo di oscillatore, attivazione del WDT, ecc.;
• FASE 2:
Una volta ottenuto il file “.hex”, sempre con l’ausilio di Piklab, si è stati in grado di programmare il PIC. Per fare ciò si è utilizzato il programmatore del PIC collegato al PC attraverso la porta seriale.
Ultimata la progettazione e la realizzazione del software si è passati alla progettazione della parte hardware. Effettuando l’analisi del problema è risultato necessario utilizzare:
1) un cristallo al quarzo che svolgesse nel migliore dei modi la funzione di clock per il PIC;
2) due condensatori da porre in parallelo al cristallo secondo lo schema elettrico fornito dai produttori del dispositivo stesso;
3) una resistenza da 10kΩ da inserire in serie tra la tensione di alimentazione ed il pin 1 del PIC;
4) otto resistenze da 330Ω da inserire prima di ciascun led in modo da limitare la corrente nei dispositivi stessi che altrimenti potrebbero bruciarsi e comportarsi come un corto circuito;
5) un buffer, di amplificazione pari ad uno, che, essendo caratterizzato da un’elevata impedenza di ingresso, fa si che la corrente presente ai pin di ingresso sia nell’ordine dei μA. Di conseguenza il PIC non fornisce la potenza necessaria per accendere i LED, potenza che è invece fornita dall’alimentazione esterna del buffer.
Terminata la fase di analisi si è quindi stati in grado di passare alla fase di realizzazione pratica del circuito di FIGURA1 (vedi foglio1) su una breadboard.
• FASE 3:
Terminate le fasi di progettazione e realizzazione, sia software che hardware, si è passati a verificare la corretta funzionalità del circuito e del software realizzati.
Per fare ciò si è alimentato sia il PIC che il buffer con una tensione pari a 5V.
Una volta alimentato entrambi i dispositivi il risultato ottenuto era quello che si era prefisso: i led si accendevano, uno per volta ed in maniera sequenziale, partendo da quello posto più a destra, verso sinistra.
Quindi è possibile affermare che il circuito montato ed il software realizzato funzionavano in maniera corretta.
Claudio Fratto Esercitazione N°1 Laboratorio di Sistemi 17-12-2008
1

Esempio