Introduzione al PICmicro 16F877 PIC16F877

Похожие документы
Architettura del PIC 18F452

I microcontrollori. In sostanza i pic hanno le seguenti caratteristiche:

Davide Gennaretti, Matteo Nicolini

INGEGNERIA E TECNOLOGIE DEI SISTEMI DI CONTROLLO Processori per sistemi di controllo

MICROCONTROLLORE PIC16F84A

ARCHITETTURA DI UN ELABORATORE! Ispirata al modello della Macchina di Von Neumann (Princeton, Institute for Advanced Study, anni 40).!

Gestione Degli INTERRUPT

Architettura dei Microcontrollori Microchip PIC18F

8 Microcontrollori PIC

Componenti principali. Programma cablato. Architettura di Von Neumann. Programma cablato. Cos e un programma? Componenti e connessioni

Componenti principali

Nicola Amoroso. Corso introduttivo sui microcontrollori A. S Microcontrollori Microchip PIC 8 bit. namoroso@mrscuole.

Introduzione ai microcontrollori PIC

Architettura dei Calcolatori Elettronici

Componenti e connessioni. Capitolo 3

Lezione 8. Figura 1. Configurazione del registro INTCON

Capitolo 3. Il microcontrollore PIC16F877: architettura e periferiche utilizzate

I PIC Partendo da Zero By link_89

INTRODUZIONE alla PROGRAMMAZIONE di MICROCONTROLLORI

Cosa è? Come lo si usa? Come iniziare? Author: Ing. Sebastiano Giannitto (ITIS M.BARTOLO PACHINO)

ARCHITETTURA DI UN SISTEMA DI ELABORAZIONE

Il processore. Istituzionii di Informatica -- Rossano Gaeta

Architettura dei computer

Corso introduttivo sui microcontrollori. Un sistema tastierino a matrice 4x4 da collegare alla nostra demoboard AnxaPic.

Corso introduttivo sui microcontrollori A. S Programmare i PIC in C. Timers Interrupts Prerequisiti: Lezione7 Lezione8.

Corso di programmazione Arduino DI MALVEZZI DAVIDE

Progetto 3: Termometro con convertitore A/D

Periferiche CPU. Misure e Sistemi Microelettronici Sistemi 6-1 SREG. Data Bus Address Bus Control Bus

Componenti di un processore

Reti logiche (2) Circuiti sequenziali

Alimentatore master. Introduzione

Esame di INFORMATICA Lezione 4

Architettura hardware

All interno di un ATmega16 troviamo moltissimi dispositivi trai quali, timer, gestori delle interupt personalizzabili, convertitori A/D, multiplexer

CONTATORE/TIMER PROGRAMMABILE CTC Z80 1. Piedinatura 2. Struttura interna 4. Modo timer 5. Modo Counter 8. Programmazione del CTC 13

Il Processore: l unità di controllo

Assembly. Modello x86

Modulo: Elementi di Informatica

Microcontrollori 12/03/2014. Progettazione Sistemi Elettronici 2013/2014 1

Come funzionano i computer

GESTIONE DEI TEMPI CON IL TIMER1 DEL PIC16F876

Lezione 1: L hardware

Architettura dei calcolatori

Struttura di un elaboratore

Elettronica dei Sistemi Programmabili A.A Microcontrollori. Introduzione allo sviluppo di progetti

Architettura Harvard: il PIC possiede memorie separate per i dati e le istruzioni.

Come è fatto un computer

Sistemi di Elaborazione delle Informazioni

luciano trapa I MICROCONTROLLORI (µc o MCU o microcomputer single chip) ED IL PIC 16 F 877 A

ISA Input / Output (I/O) Data register Controller

Elementi di informatica

Struttura CPU. Struttura e Funzione del Processore. Capitolo 12. Compiti CPU:

Lezione 1 Caratteristiche principali del PIC16C84 L'hardware

SISTEMA DI SVILUPPO MC-16

Lez. 4 L hardware. Prof. Pasquale De Michele Gruppo 2

Corso di Sistemi di Elaborazione A.A. 2008/2009

Il Processore. Informatica di Base -- R.Gaeta 27

Programmazione del microcontrollore PIC 16F84

Esercitazione : REALIZZAZIONE IMPIANTO SEMAFORICO

Laboratorio di metodi di acquisizione dati. Giorgio Maggi

OPEN DRIVE OPEN DRIVE

Circuiti sequenziali

UNA INTRODUZIONE AL MONDO DEI MICROCONTROLLORI

APPUNTI FAMIGLIA PIC16F87X SUI MICROCONTROLLORI. prof. Duilio De Marco, prof. Ercole Mitrotta, prof. Giorgio Tombola

Interfacciamento di periferiche I/O al μp 8088

I bistabili ed il register file

Транскрипт:

Introduzione al PICmicro 16F877 I PICmicro (o più brevemente PIC) sono circuiti integrati prodotti dalla Microchip Technology Inc. che implementano microcontrollori (µc), cioè dei componenti che integrano in un unico dispositivo tutti i circuiti necessari a realizzare un completo sistema digitale programmabile. I PIC costituiscono una famiglia molto ampia di µc da 8, 16 e 32 bit, destinate ad un ampio insieme di applicazioni, dal semplice azionamento di motori elettrici fino ad applicazioni DSP e mission critical. In ogni caso i PIC più diffusi sono ad 8 bit, per i quali Microchip detiene una quota dominante del mercato, giacché i diversi prodotti si caratterizzano per costi molto contenuti (pochi euro per unità) ed estrema affidabilità frutto di molti anni di presenza sul mercato. Denominatore comune a tutti i PIC è la presenza di un cospicuo numero di periferiche integrate per interfacciarsi al mondo esterno (Timer, comparatori, ADC, porte parallele, USB ). Internamente essi dispongono di tutti dispositivi tipici di un sistema a microprocessore, ovvero: Una CPU (Central Processor Unit) ovvero una unita' centrale di elaborazione il cui scopo e' interpretare le istruzioni di programma. Una memoria FLASH in cui sono memorizzare in maniera permanente le istruzioni del programma da eseguire. Una memoria RAM (Random Access Memory) utilizzata per memorizzare le variabili utilizzate dal programma. Una serie di LINEE di I/O (Input/Output) ovvero linee di ingresso e uscita per pilotare dispositivi esterni o ricevere impulsi da sensori, pulsanti, ecc. Una serie di dispositivi ausiliari al funzionamento quali generatori di clock, bus, contatori, ecc. PIC16F877 Il PIC 16F877 è uno dei modelli ad 8 bit più diffusi. E disponibile con diversi package PDIP, PLCC, QFP. Di seguito si riporta la piedinatura del package DIP (Dual In Line) che consente di usare il µc anche su schede millefori, insieme ad un diagramma a blocchi che descrive gli elementi base del 16F877 e ad un elenco delle principali caratteristiche (per ulteriori informazioni si faccia riferimento al datasheet dell integrato scaricabile gratuitamente dal sito www.microchip.com):

Architettura Harvard (14 bit bus istruzioni-8 bit bus dati), RISC con 37 istruzioni macchina di cui si riporta la tabella (a queste vanno aggiunte un insieme di direttive per il compilatore che in quanto tali non hanno corrispondenti in linguaggio macchina):

Le istruzioni sono codificate con 14 bit; L esecuzioni di un istruzione dura 4 periodi di clock (4 fasi per istruzione: fetch, decode, operand assembly, execute) eccetto i rami di programma che richiedono 2 cicli;

velocità operativa: DC clock di ingresso fino a 20MHz 8k x 14 words di Memoria Programma di tipo Flash 368 x 8 bytes di Memoria Dati (RAM) 256 x 8 bytes di Memoria EEPROM capacità di gestione interrupt fino a 14 sorgenti; stack hardware profondo 8 livelli (indica il numero di chiamate ricorsive a sottoprogramma che possono essere effettuate); intervallo di tensione nel quale il dispositivo può operare: 2.0V 5.5V; Timer0: timer/contatore ad 8 bit con prescaler ad 8 bit; Timer1: timer/contatore a 16 bit con prescaler, Timer2: timer/contatore ad 8 bit con un periodo di registro di 8 bit, prescaler e postscaler; due moduli Capture, Compare, PWM; convertitore A/D a 10 bit multicanale; porta seriale sincrona (Synchronous Serial Port, SSP) con SPI (modo Master) e I2C (Master/Slave); porta seriale USART (Universal Synchronous Asynchronous Receiver Transmitter) con indirizzi ad 8 bit più bit di parità (9 bit totali); porta parallela PSP (Parallel Slave Port) ad 8 bit, con i controlli esterni RD. Per utilizzare un PIC è fondamentale conoscere l organizzazione della memoria interna in modo da poter dimensionare ed allocare correttamente i programmi e le variabili che si richiedono per l esecuzione. Il PIC 16F877 dispone di tre tipi di memoria: Memoria Programma di tipo Flash E una memoria di tipo FLASH (quindi non volatile) di dimensione 8kx14 destinata a contenere il programma che il PIC deve eseguire, il quale rimarrà spesso immutato per l intera vita del dispositivo. Dalla dimensione della memoria si evince che il programma da scrivere al più potrà contenere 8k istruzioni. Per essere scritta necessita di un programmatore hardware, da collegare ad un calcolatore, attraverso cui scaricare il programma oggetto compilato con un apposito tool software di sviluppo. La memoria flash ha inizio all indirizzo 000h (reset vector) che costituisce la locazione di memoria a cui si riporta il Program Counter (PC) dopo un reset o comunque all inizio dell esecuzione di un programma. Essa è divisa in 4 pagine di 2k ciascuna (0-7FFh; 800-FFFh; 1000-17FFh; 1800-1FFFh), così come mostrato nello schema riportato di seguito:

Il PC è il registro che punta all istruzione da eseguire ed è ampio 13 bit (2 13 =8k). Esso è incrementato ad ogni ciclo istruzione (4 cicli di clock) e passa da una pagina all altra in maniera trasparente, per cui non è necessario specificare la pagina di memoria alla quale bisogna riferirsi. Un indirizzo particolare è l interrupt vector (004h) al quale il PC punta nel caso intervenga un interrupt e dal quale bisogna iniziare ad allocare l interrupt handler, cioè la procedura di servizio prevista per l interrupt in questione. Memoria RAM- Register File E una memoria scrivibile dinamicamente di ampiezza 368x8 bit. In pratica contiene 368 elementi di ampiezza 1 byte che rappresenta la minima dimensione indirizzabile della memoria dati. Questa memoria volatile è utilizzata soprattutto per immagazzinare variabili necessarie durante l esecuzione di un programma. Essa non è interamente disponibile all utente in quanto deve contenere sia SFR (Special Function Register) che GPR (General Purpose Register). Gli SFR sono locazioni di memoria riservate a contenere variabili necessarie per monitorare e gestire in maniera dinamica il core e le periferiche integrate nel µc (registri STATUS, INTCON, OPTION_REG ). In genere queste locazioni sono indirizzate attraverso nomi simbolici, definiti in un file di configurazione richiamato prima della esecuzione di un programma mediante direttive del compilatore. I GPR sono, invece, liberamente utilizzabili dall utente per creare le proprie variabili. A tal fine a opportuno riportare la mappa del file register:

Come si vede dalla figura il file register è diviso in 4 banchi (Bank0...Bank3) che possono essere selezionati mediante i bit RP0 ed RP1 del registro STATUS la cui descrizione è riportata di seguito.

Di seguito si riporta la tabella di selezione dei banchi di memoria: Memoria EEPROM La memoria di tipo EEPROM è una memoria di tipo flash, ampia 256 byte, che può essere scritta senza l ausilio di una circuiteria esterna, grazie a pompe di carica interne al PIC che innalzano le tensioni per un tempo necessario al completamento della scrittura. Questo tempo è, però, molto maggiore rispetto alla latenza di scrittura di una RAM volatile, tanto che la procedura di scrittura avviene attraverso 4 SFR dedicati, sincronizzati con l unità di controllo tramite timer: EEDATA (8 bit contiene il dato da scrivere); EEADR (8 bit per indirizzare 256 locazioni); EECON1 ed EECON2 registri di controllo. In genere questa particolare memoria dati è utilizzata per contenere dati variabili rispetto alla natura del programma ma costanti rispetto all utilizzo del singolo dispositivo (es.: la chiave di un sistema di decodifica; il codice di un antifurto ). Porte di I/O Il PIC16F877 dispone di un totale di 33 linee di I/O organizzate in 5 porte denominate porta A, B, C, D ed E. Le porte sono quasi tutte multiplexate, cioè, attraverso una opportuna configurazione, esse possono essere utilizzate per diverse funzioni (ingresso, uscita, ingresso per l ADC, uscita per la PWM ). Porta A La PORTA è una porta a 6 bit bidirezionale (può operare sia da ingresso che da uscita) cui corrispondono 6 pin RA0-RA5. Il corrispondente SFR per settare la direzione è TRISA. Settando un bit del TRISA ad 1 il corrispondente pin funzionerà in uscita; viceversa, ponendo un bit del TRISA a 0 il corrispondente pin funzionerà da ingresso. L SFR PORTA è il registro che contiene i valori da proporre in uscita se i pin sono settati come output, oppure memorizza il valore in ingresso se i pin sono settati come input. Lo schema circuitale di un pin della porta è mostrato in figura:

In pratica impostando a 1 il contenuto dei flip-flop attraverso le porte AND ed OR si disabilita il CMOS in uscita per cui il pin funziona da ingresso, viceversa si abilita il funzionamento della rete di pull-up o di pull-down dell inverter in modo che esso possa imporre il valore desiderato. Quando il pin funziona da ingresso, il dato può essere inviato direttamente al registro se il valore di tensione corrispondente è adeguato, altrimenti può essere utilizzato il trigger di Schmitt per adeguare i livelli di tensione. Porta B La porta B è una porta bidirezionale di 8 bit ed il corrispondente registro di direzione dati è TRISB. Anche qui settando un bit del registro TRISB si pone il corrispondente driver di uscita nella modalità di ingresso ad alta impedenza, mentre mettendo il bit a 0 il contenuto del latch di uscita passa sul pin selezionato. Il registro per il trasferimento dei dati è PORTB. Ogni pin della porta B ha internamente un transistor di weak pull-up, cancellando un singolo bit di controllo, il bit RBPU (OPTION<7>), è possibile accendere tutti i pull-up. Il weak pull-up viene automaticamente spento quando la porta è configurata come uscita. I pull-up sono disabilitati all accensione dal Power-on Reset. Quattro pin della porta B, RB7:RB4, hanno una caratteristica di interrupt su cambiamento di stato. Soltanto i pin configurati come ingressi possono causare un interrupt. I pin di ingresso (tra RB7:RB4) vengono comparati con il vecchio valore accumulato dall ultima lettura di PORTB, il disaccoppiamento prodotto da questa comparazione è mandato su una porta OR per generare il RB Port Change Interrupt con il bit di flag RBIF (INTCON<0>). L interrupt può svegliare il dispositivo dallo SLEEP, cioè farlo tornare attivo uscendo dalla modalità di funzionamento a basso consumo di potenza. Per lo schema a blocchi dei pin si veda la pagina 44 del datasheet. Porte C, D, E Anche la porta C è composta di 8 linee bidirezionali. Ciascun pin è individualmente configurabile come ingresso o uscita tramite il registro TRISC. I pin della porta C hanno in ingresso un buffer Trigger di Schmitt.

Quando si abilitano le funzioni periferiche, bisogna definire i bit del registro TRIS per ogni pin della porta. Infatti alcune periferiche controllano i bit TRIS, alcune settando i pin corrispondenti come ingressi, altre come uscite. La porta D ha le stesse caratteristiche della C, ma può essere configurata come una porta microprocessore di 8 bit (parallel slave port) settando il bit di controllo PSPMODE (TRISE<4>). In questo modo i buffer in ingresso sono di tipo TTL. La porta E possiede tre pin (RE0/RD/AN5, RE1/WR/AN6 e RE2/CS/AN7) che sono individualmente configurabili come ingressi o uscite ed hanno in ingresso un Trigger di Schmitt. I pin della porta E sono multiplexati con ingressi analogici e quando vengono selezionati come tali, in lettura danno 0. Il registro TRISE controlla la direzione dei pin RE anche quando vengono usati come ingressi analogici; in questo caso l operatore deve assicurare che siano degli ingressi. Un reset di accensione configura i pin come ingressi digitali. Quando il bit PSPMODE (TRISE<4>) è settato, i pin della porta E cominciano il controllo degli ingressi I/O per la porta microprocessore. In questa modalità l utente deve assicurarsi che i bit TRISE<2:0> siano settati, e che essi siano configurati come ingressi digitali. Bisogna anche assicurare che il registro ADCON1 sia configurato per I/O digitali, così che i buffer di ingresso siano TTL. Anche per gli schemi circuitali di queste porte ci si riferisca al datasheet. Interrupt L interrupt è una particolare caratteristica dei microprocessori che consente di intercettare un evento esterno, interrompere momentaneamente il programma in corso, eseguire una porzione di programma specializzata per la gestione dell evento verificatosi e riprendere l esecuzione del programma principale. Ci sono infatti eventi che può far comodo rilevare in un qualsiasi momento dell esecuzione del programma, come ad esempio l arrivo di una comunicazione seriale, l overflow di un timer oppure una commutazione su un pin. In questi casi entrano in gioco gli interrupt: ad un preciso evento richiesto, il controllore interrompe quello che stava facendo e passa ad una subroutine di interrupt che ad esempio, nel caso della seriale, si occuperà di ricevere correttamente il byte trasmesso dall esterno. Al termine della routine di interrupt il programma riprenderà dal punto in cui era stato lasciato. Il PIC 16F877 ha 14 sorgenti di interrupt elencate di seguito:

Qualunque sia l evento abilitato, al suo manifestarsi il PIC interrompe l esecuzione del programma in corso, memorizza automaticamente nello STACK il valore corrente del PROGRAM COUNTER e salta all istruzione presente nella locazione di memoria 0004h denominata Interrupt Vector. E a questo punto che nel codice bisogna inserire la subroutine di gestione degli interrupt denominata Interrupt Handler. Potendo abilitare più interrupt, tra i primi compiti dell interrupt handler è la verifica di quale, tra gli eventi abilitati, ha generato l interrupt e l esecuzione della parte di programma relativo. Questo controllo può essere effettuato utilizzando gli interrupt flag. Siccome qualunque interrupt genera una chiamata alla locazione 0004h, nel registro INTCON sono presenti dei flag che indicano l evento che ha generato l interrupt, ad esempio: INTF (INTCON<1>), se vale 1 l interrupt è stato generato dal cambiamento di stato sulla linea RB0 (IntPin Interrupt); TOIF (INTCON<2>), se vale 1 l interrupt è stato generato al termine del conteggio del timer 0 (RB Port Change Interrupt); RBIF (INTCON<0>), se vale 1 l interrupt è stato generato dal cambiamento di stato di una delle linee RB7:RB4 (TMR0 Overflow Interrupt). INTCON contiene anche il bit di abilitazione degli interrupt periferici (PEIE, Peripheral Interrupt Enable bit), che abilita o disabilita l interrupt periferico dal vectoring quando viene rispettivamente settato o azzerato. Di seguito si riporta lo schema dei registri e la descrizione dei singoli bit:

Il bit di abilitazione globale degli interrupt, (GIE, Global Interrupt Enable, INTCON<7>), abilita se settato, o disabilita, se resettato, tutti gli interrupt; esso viene inizializzato a 0 da un reset. La disabilitazione individuale di ciascun interrupt può essere fatta agendo sui bit corrispondenti del registro INTCON. Quando viene generato un interrupt il PIC disabilita automaticamente il bit GIE (Global Interrupt Enable) del registro INTCON in modo da disabilitare tutti gli interrupt mentre è già in esecuzione un interrupt handler. Per poter ritornare al programma principale e re-inizializzare a 1 questo bit occorre utilizzare l istruzione di ritorno da un interrupt (RETFIE), che permette così di eseguire tutti gli interrupt sospesi. Generalmente i bit di flag devono essere cancellati dal software prima di riabilitare l interrupt globale, al fine di evitare interrupt ricorsivi. Quando viene eseguita una istruzione che cancella il bit GIE, ogni interrupt che era in sospeso per l esecuzione nel prossimo ciclo viene ignorata. La CPU eseguirà una NOP (nessuna operazione) nel ciclo immediatamente seguente l istruzione che cancella il bit GIE. Timer Il PIC 16F877 dispone di tre timer: timer0, 1 e 2, abbastanza simili tra loro ma con alcune differenze importanti. Il timer0 ha le seguenti caratteristiche: E un timer/contatore ad 8 bit; E leggibile e scrivibile; Può essere pilotato da un clock interno o esterno: Può generare un interrupt da overflow;

Un diagramma del timer è mostrato in figura: I registri coinvolti nell utilizzo del timer0 sono: TMR0 ed OPTION_REG. TMR0 contiene il valore conteggiato dal timer e può essere sia letto che scritto nel caso si voglia far partire il conteggio da un valore diverso da 0. OPTION_REG è riportato in figura: T0SE consente di selezionare il fronte, di salita o di discesa, del segnale di ingresso da utilizzare come trigger per incrementare il valore del timer; T0CS seleziona la sorgente che può essere un segnale esterno oppure il clock stesso la cui frequenza è divisa per 4. PSA abilita l utilizzo del prescaler la cui funzione è quella di ridurre la frequenza di incremento del registro TMR0; PS2:PS1 selezionano il fattore di divisione del prescaler in accordo alla seguente tabella: Quando il contenuto del registro TMR0 raggiunge il valore FFh viene settato il flag TMR0IF nell SFR INTCON al fine di richiedere un interrupt. Se il tale flag è abilitato dal bit T0IE dello stesso SFR allora l interrupt sarà servito altrimenti risulta mascherato.

Il timer1 è un timer/contatore a 16 bit il cui valore istantaneo è memorizzato in due registri a 8 bit: TMR1L e TMR1H che contengono rispettivamente gli 8 bit meno e più significativi del valore conteggiato. Entrambi i registri possono essere letti e scritti. Lo schema del timer 1 è riportato nella figura seguente: Il principio di funzionamento è molto simile al timer1, compresa la presenza del prescaler. I registri coinvolti nel funzionamento del timer1 sono riportati nello schema seguente, in cui i bit non interessati sono riportati in grigio: Il settaggio dei parametri è effettuato attraverso il registro T1CON descritto nella tabella seguente:

Il timer2 è un timer ad 8 bit con prescaler e postscaler. Ha un funzionamento molto simile al timer0 e 1 con la differenza che esso è utilizzato come base dei tempi per il generatore il segnale PWM (pulse-width modulated) generatato dal modulo CCP (Capture-Compare-PWM) che costituisce anche l uscita del convertitore DAC. Lo schema a blocchi del timer è mostrato nella seguente figura: I registri coinvolti nel funzionamento del timer2 sono i riportati di seguito così come il dettaglio del registro T2CON dedicato al controllo dei parametri del timer: