Seminario sui Microcontrollori Davide Gennaretti, Matteo Nicolini AA 2003-04 II Facoltà di Ingegneria Elettronica Cesena
Cosa sono i microcontrollori? Piccoli computer concentrati in un chip Un Datapath con Una ALU. Decoder per POCHE istruzioni. Registri generali (e funzione) Eventuale Interrupt Controller RAM x dati. EPROM (o FLASH) x codice. Porte di I/O digitale. Altre periferiche Timer interno AD Converter USART (seriale) EEPROM dati
A cosa servono i micro? Tutto quello che è difficile fare a componenti discreti, ma metterci un PC è troppo! Applicazioni stand alone, semplici e poco costose: Distributori Automatici Strumenti intelligenti Centraline: Macchine automatiche Automotive Sistemi Distribuiti
Caratteristiche Essenziali Facile ed affidabile, basta non chiedere troppo Facilità di lavoro Semplice montaggio su scheda E tutto dentro (oggi anche il clock!) Non serve progettare una MotherBoard! Semplice Programmazione ASM con poche, semplici istruzioni Disponibili compilatori Asm, C, basic, Molte funzionalità Hardware integrate Affidabilità e robustezza Una volta programmato VA! Limiti nelle prestazioni Flessibilità (c e quello che c è ) Potenza di calcolo limitata
Cosa offre il Mercato Tutto e di più: attenzione alla scelta. Varie Marche Microchip, Motorola, STM, NEC, etc Vari tagli Processore: RISC, 8 bit e 16 Bit (pochi a 32). Memorie: 1K-1M (codice), 128-16K (dati). Pinout: da 8 pin a 80. Interrupt, Power Saving, Periferiche: Porte digitali Comunicazione Seriali, Parallela, CAN, USB, etc. ADC DAC driver PWM comparatori Analogici Timer, Oscillatori secondari Varie tipologie di programmazione Assembler, Compilatori C, Basic, etc.
Noi qui oggi parliamo del Microchip PIC Caratteristiche Hardware Architettura Interna Organizzazione di Memoria Istruzioni e Stack Dati (RAM e EEPROM) Instruction Set Main Code vs Interrupt Routine Service Programmazione in C poi vediamo. Alimentazione e Reset Oscillatore di Sistema Porte di Ingresso e Uscita Porte con funzioni Speciali: PortA ADC PortB Interrupt On Change PortC USART e SPI-I2C Periferiche: Timer 1
PIC 18x: Caratteristiche HW
PIC 18x: Architettura Interna Instruction Path: PC Flash Program Memory Istruzione Corrente: Decodifica Esecuzione Data Path: ALU su W-Register e MUX-Value Porte, Periferiche Configuration: Oscillatore WatchDog
Organizzazione della Memoria Due blocchi di memoria separati (Harward Architecture): Instruction Memory (& Stack): 21 Bit di Program Counter 2 Interrupt location (2 Level IRQ) Single Bank Instruction Memory Data Memory (& EEPROM): 4/16 Banks da 256 byte SFR nella parte ALTA, GPR in basso.
PIC 18x: Instruction Set Aritmetiche e Logiche su Byte e Letterali Operazioni su Singolo Bit Controllo Programma e Stack (Interrupt, Subroutines)
Main Flow vs Interrupt Routine Service (IRS) Cosa succede quando arriva un interrupt? Alla partenza (dopo ogni Reset) si parte dalla locazione 0000H, e si salta al Main, che fa le inizializzazioni, attiva il Global Interrupt Enable e parte il suo ciclo infinito. All arrivo di un Interrupt (di livello 0) il PIC passa a eseguire la locazione 0008H, che rimanda alla IRS0, dove è eseguito il segmento relativo al Interrupt che si è attivato, poi si ritorna al Main Flow. 0000H (Reset Vector) 0008H (IRQ0 Vector) 0018H (IRQ1 Vector) 0020H (Main Start) 2000H (IRS Start) Goto Main (0020H) Goto IRS0 (2000H) Goto IRS1 (2000H) Main Flow: Inizializzazioni, GIE=1 CICLO INFINITO (Macchina a Stati) IRS0: Test Interrupt Flag: Se TMR1IF Segmento Timer1 Se ADCIF Segmento ADC Return from Interrupt
PIC 18x: Programmazione in C ovvero come faccio convivere la gestione degli Interrupt con la programmazione in C void main () { Impostazioni iniziali Direzione delle PORTE Valore iniziale delle PORTE Periferiche di Comunicazione Timer Altre Periferiche Attivazione del GIE (Global Interrupt Enable) Ciclo infinito while (1) { Macchina a Stati, che attiva: Comunicazioni Misure } } Temporizzazioni Void isr () { BASE DATI = STATO Int Time; Char * RX-Seriale; Int Dato-ADC; If ( timer ) { routine gestione timer Aggiorna Time } If ( RX Seriale ) { Salva il byte ricevuto nel buffer RX-Seriale } If ( ADC Conversion Finita ) { Salva il dato letto nel buffer }... }
Alimentazioni Due versioni per ogni Chip Flash (F) Alimentazione e Reset Funzionamento a 5V, ± 10% Velocità anche molto alta Flash Low Voltage (LF) Da 2 Volt a 5,5V Velocità ridotta Rete R-C per il Power On Reset (POR) Basso costo
Diverse soluzioni possibili (mediante il registro di configurazione del PIC) Oscillatore di Sistema Quarzo o Risonatore Ceramico Altissima Precisione Velocità di Clock anche molto alta Consumo elevato Innesco lento Due pin necessari (osc. IN-OUT) Oscillatore Esterno (Quarzo o no) Solo un pin necessario (osc. IN) Maggior Costo Rete R-C Bassa precisione (10-20%) Basso costo Solo un pin necessario
Porte di Ingresso/Uscita Digitali Organizzate in PORT da 8 bit ciascuno: Registro di Direzione TRIS (contiene 1 nei bit relativi ai pin che saranno USCITE) Registro di Valore PORT (contiene 1 nei bit relativi ai pin che saranno ALTI) Read-Write diretto Alta corrente di uscita RIN 8
Porte con Funzioni Speciali: PortA ADC possibile uso come ingressi analogici: (ADC da 8-10 bit) TRIS e PORT Registri di Controllo ADC
Porte con Funzioni Speciali: Port B IRQ On Change; Port C RS232 PortB: IRQ On Change PortC: USART & (I2C o SPI)
Periferiche: Timer 1 Timer 0,1,2: sono CONTATORI PROGRAMMABILI con ingresso ESTERNO o INTERNO (CLK); Prescaler fisso (1,2,4,8) e Conteggio a 8 o 16 bit. A fine conteggio attivano un INTERRUPT (TMR1IF)
Demo: MPLAB ICD2 PICDEM2+ Software MPLAB (PC) Editor Compilatore C Debugger Interfaccia USB In Circuit Debugger 2 Programmatore Debugger Solo quattro fili PIC 18F242 su Scheda di Test PICDEM2 Plus: Led e Tasti, Display LCD Ingressi Analogici RS232, etc
Schema Elettrico
MPLAB: esempi di programma Analisi delle Routine di Basso livello Inizializzazione Porte LCD Setup e Attivazione ADC Setup del Timer, IRS Setup e Utilizzo RS232 Conteggio di S2 e visualizzazione sui LED Solo fronte di Salita Debounce Uscita anche sul LCD Lettura del ADC Scrittura sul LCD Frame Rate? Timer. Uscita sulla RS232.
MPLAB
Organizzazione del software void main () { Impostazioni iniziali Direzione delle PORTE Valore iniziale delle PORTE Periferiche di Comunicazione Timer Altre Periferiche Eventuale attivazione del GIE (Global Interrupt Enable) Ciclo infinito while (1) { Macchina a Stati, che attiva: } } LCD ADC Temporizzazioni Seriale
Organizzazione del software Libreria di funzioni che vengono incluse nel main flow Chiamata diretta ad alto livello Implementazione a basso livello trasparente Maggior leggibilità del software
Utilizzo delle porte ovvero operazioni di INPUT-OUTPUT su TASTI, LED Inizializzazione Porte Rilevazione della pressione di un tasto Conteggio del numero di pressioni del tasto Problema del bounce Scrittura sui LED collegati a PORTB
Utilizzo delle porte ovvero operazioni di INPUT-OUTPUT su TASTI, LED e LCD Inizializzazione Porte Inzializzazione LCD Cancellazione LCD Scrittura su LCD (cont=) Rilevazione della pressione di un tasto con debounce SW Scrittura del risultato su LCD
Utilizzo del convertitore AD ovvero lettura di un segnale analogico e sua visualizzazione a display Inizializzazione Porte Inzializzazione LCD Inizializzazione ADC Cancellazione LCD Scrittura su LCD (adc=) Rilevazione della pressione di un tasto Conversione analogico-digitale Conversione dei dati binari in esadecimale Scrittura su LCD in esadecimale