Primo Utilizzo Su breadboard >> questo schema.

Похожие документы
Immagine 1: configurazione base su breadboard del PIC32. Immagine 2: PIC32MX2xx DIP pinout

TUTORIAL GPL_BENZINA CON PIC16F1826 (UTILIZZO DELL ADC)

Vogliamo far lampeggiare i led collegati come in figura ai bit della porta D del PIC 18F8722 presente sulla demo board in dotazione al laboratorio.

LAMPEGGIO LED TRAMITE TIMER INTERRUPT - PARTE 4 1

Davide Gennaretti, Matteo Nicolini

Corso introduttivo sui microcontrollori A. S La programmazione dei PIC Esempio: 2 led blinking [alternate ON-OFF ] con ritardo di 500 ms

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

PIEDINO NOME DESCRIZIONE

Corso di programmazione Arduino DI MALVEZZI DAVIDE

Nicola Amoroso. Corso introduttivo sui microcontrollori A. S La programmazione dei PIC TIMERS.

Arduino/Raspberry Board and GSM Library

Esercitazione Talentis. Marco Branciforte

Creazione nuovo progetto:

Laboratorio di Misure a Microcontrollore --- MAPI FOR DUMMIES ---

Corso Arduino Maggio Riccardo Binetti Lezione 1 - Blinking LEDs with style

Facciamo lampeggiare un led

Architettura del PIC 18F452

Internetworking V a nno

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

Iniziare a sviluppare usando STM32-comStick di HITEX

Corso introduttivo sui microcontrollori A. S Programmare i PIC in linguaggio C. Il CCS PCWH Pic-C Compiler

GENERATORE DI BASE TEMPI

Architettura dei Microcontrollori Microchip PIC18F

Come accedere dalla rete cliente a dispositivi sulla rete macchina con NAT 1:1

Progetto 3: Termometro con convertitore A/D

Raccolta Test di Laboratorio di Sistemi a Microcontrollore

ERRORI GENERATI DAL BIOS IN FASE DI AVVIO. Di Abe Wayer

Nicola Amoroso. Corso introduttivo sui microcontrollori PIC PWM.

1. Contenuti. 3. How to use Catalogue Software 3.1. Configuration 3.2. Update 3.3. Program and Read

Arduino - Tutorial #2 - Iniziamo a programmare

In questo tutorial decodificheremo i segnali provenienti da un telecomando qualsiasi e utilizzeremo gli stessi segnali per comandare Arduino a

Quaderni di Elettronica corso per creativi ed inventori

LO HAI MAI REALIZZATO CON UN PIC? - I PICMICRO E I DISPLAY GRAFICI (PRIMA

Gestione Degli INTERRUPT

8^ parte: Pilotare Motori passo-passo unipolari usando l integrato ULN2003A. Author: Ing. Sebastiano Giannitto (ITIS M.

Tutorial MPLAB X 3.15

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

Interfacciamento di periferiche I/O al μp 8088

CORSO DI PROGRAMMAZIONE MICROCONTROLLORI

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

Introduzione alla scheda Arduino/Genuino

Tutorial su Codelite. Luca Ceriani 2011 Federico Cerutti

Realizzate il circuito come indicato nello schema seguente:

Programma svolto di INFORMATICA. Classe 3M - indirizzo MERCURIO A.S. 2010/2011

D.A.M. Bros Robotics -

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

Fondamenti di Informatica AA 2016/2017

Linguaggio macchina. 3 tipi di istruzioni macchina. Istruzioni per trasferimento dati. Istruzioni logico/aritmetiche

Componenti principali

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

8^ parte : Come pilotare i motori passo-passo unipolari. Author: Ing. Sebastiano Giannitto (ITIS M.BARTOLO PACHINO)

Relazione Tecnica Sensore di Temperatura con interfacciamento microcontroller Arduino 1.3

LO HAI MAI REALIZZATO CON UN PIC? LA LAMPADA SIBILLA! 1

Giochiamo CON I LED. Quello che vedremo è un semplice. progettare & costruire di ROBERTO D AMICO. Tutorial PIC18 (parte seconda)

G&G ESEMPIO1 PROGRAMMAZIONE Progetto FACILEPLC Pag. 1 di 6

Manuale Utente WL-RO2G

CTU Presenta. Contest Automation con Arduino. IK0XBX - Francesco

Componenti e connessioni. Capitolo 3

ARDUINO. Colleghiamolo al PC/MAC - FUNZIONA?

INFORMATICA - SISTEMI

QS-LCD10A. Manuale Utente per la gestione del dispositivo. Display LAN di sportello/postazione per sistemi multi-servizio

Display numerico con i LED

Транскрипт:

Guida PIC32MX220F032B. La scelta è ricaduta su questo modello per il fatto che viene prodotto su package DIP e dunque facilmente utilizzabile. Pinout O Pinning Osserviamo ora un po' più da vicino questo integrato. Ci sono alcune differenze rispetto, ad esempio, ai PIC16. In particolare sono presenti alcuni piedini che nelle altre versioni più piccole non ci sono: AVDD (28) AVSS (27) VCAP (20) VBUS (15) Primo Utilizzo Su breadboard >> questo schema. Da notare che è importantissimo rispettare tutte le connessioni indicate sullo schema. Questo circuito è testato e funzionante. Collegamento Con Il Programmatore PicKit 3.

Una volta collegato apriamo MPLAB X col compilatore adatto XC32 PicKit 3 Guida Alla Programmazione Una volta che ambiente e compilatore saranno pronti creiamo un nuovo progetto. Seguiamo il wizard in questo modo e avremo così pronta la nostra postazione di lavoro.

Il nostro progetto è pronto. Ora basta solo creare il file principale main.c. Con un click destro aggiungiamo un nuovo file C

Per trovarci quindi con il nostro file sorgente che andremo così a riempire: Includiamo le librerie necessarie Impostiamo i configuration bits del microcontrollore Creiamo il metodo main Dunque andiamo a copiare questo codice nel file appena creato.

1#include <plib.h> 2 3// DEVCFG3 4// USERID = No Setting 5#pragma config PMDL1WAY = OFF // Peripheral Module Disable Configuration (Allow multiple reconfigurations) 6#pragma config IOL1WAY = OFF // Peripheral Pin Select Configuration (Allow multiple reconfigurations) 7#pragma config FUSBIDIO = OFF // USB USID Selection (Controlled by Port Function) 8#pragma config FVBUSONIO = OFF // USB VBUS ON Selection (Controlled by Port Function) 9 10// DEVCFG2 11#pragma config FPLLIDIV = DIV_2 // PLL Input Divider (2x Divider) 12#pragma config FPLLMUL = MUL_20 // PLL Multiplier (20x Multiplier) 13#pragma config UPLLIDIV = DIV_12 // USB PLL Input Divider (12x Divider) 14#pragma config UPLLEN = OFF // USB PLL Enable (Disabled and Bypassed) 15#pragma config FPLLODIV = DIV_2 // System PLL Output Clock Divider (PLL Divide by 2) 16 17// DEVCFG1 18#pragma config FNOSC = FRCPLL // Oscillator Selection Bits (Fast RC Osc with PLL) 19#pragma config FSOSCEN = OFF // Secondary Oscillator Enable (Disabled) 20#pragma config IESO = OFF // Internal/External Switch Over (Disabled) 21#pragma config POSCMOD = OFF // Primary Oscillator Configuration (Primary osc disabled) 22#pragma config OSCIOFNC = OFF // CLKO Output Signal Active on the OSCO Pin (Disabled) 23#pragma config FPBDIV = DIV_1 // Peripheral Clock Divisor (Pb_Clk is Sys_Clk/1) 24#pragma config FCKSM = CSDCMD // Clock Switching and Monitor Selection (Clock Switch Disable, FSCM Disabled) 25#pragma config WDTPS = PS1048576 // Watchdog Timer Postscaler (1:1048576) 26#pragma config WINDIS = OFF // Watchdog Timer Window Enable (Watchdog Timer is in Non-Window Mode) 27#pragma config FWDTEN = OFF // Watchdog Timer Enable (WDT Disabled (SWDTEN Bit Controls)) 28#pragma config FWDTWINSZ = WISZ_25 // Watchdog Timer Window Size (Window Size is 25%) 29 30// DEVCFG0 31#pragma config JTAGEN = OFF // JTAG Enable (JTAG Disabled) 32#pragma config ICESEL = ICS_PGx1 // ICE/ICD Comm Channel Select (Communicate on PGEC1/PGED1) 33#pragma config PWP = OFF // Program Flash Write Protect (Disable) 34#pragma config BWP = OFF // Boot Flash Write Protect bit (Protection Disabled) 35#pragma config CP = OFF // Code Protect (Protection Disabled) 36 37void main(void){ 38 //inizializzazione 39 while(1){ 40 //ciclo principale 41 } 42} Siamo ora pronti a programmare il microcontrollore. Ovviamente, come abbiamo visto nello schema, l'alimentazione verrà presa direttamente dal programmatore. Per abilitare questa funzione apriamo le proprietà del progetto.

Guida PIC32MX - Lezione 2 Dopo una lunga fase di preparazione siamo pronti a scrivere il nostro primo programma. Nulla di che, ovviamente, ma ci darà la possibilità di verificare se tutto funziona correttamente. Riprendiamo proprio da dove ci eravamo fermati. Abbiamo visto che il microcontrollore necessita di alcuni parametri di settaggio, detti configuration bits. Nei paragrafo seguente cercheremo di capire come mai è stata proposta la configurazione precedente. Configuration Bits Chi ha già dimestichezza con in microcontrollori Microchip potrà tranquillamente tralasciare questo paragrafo perchè il discorso è simile a tutti gli altri modelli. Ci tengo però ad affrontare, anche se in breve, questo argomento perchè lo ritengo fondamentale. 1#pragma config PMDL1WAY = OFF // Peripheral Module Disable Configuration (Allow multiple reconfigurations) 2#pragma config IOL1WAY = OFF // Peripheral Pin Select Configuration (Allow multiple reconfigurations) 3#pragma config FUSBIDIO = OFF // USB USID Selection (Controlled by Port Function) 4#pragma config FVBUSONIO = OFF // USB VBUS ON Selection (Controlled by Port Function) Nelle prime due righe si specifica la possibilità di configurare più volte le varie funzioni (SPI, PWM, ecc) da assegnare ai vari pin. Le altre due, invece, riguardano il modulo USB che probabilmente descriverò in un altra lezione. Per un'applicazione che fa uso dell' USB potrete comunque vedere un articolo che ho scritto riguardo ai PIC18F. 1#pragma config FPLLIDIV = DIV_2 // PLL Input Divider (2x Divider) 2#pragma config FPLLMUL = MUL_20 // PLL Multiplier (20x Multiplier) 3#pragma config UPLLIDIV = DIV_12 // USB PLL Input Divider (12x Divider) 4#pragma config UPLLEN = OFF // USB PLL Enable (Disabled and Bypassed) 5#pragma config FPLLODIV = DIV_2 // System PLL Output Clock Divider (PLL Divide by 2) Tralasciando UPLLIDIV e UPLLEN che riguardano sempre il lato USB ci concentriamo sugli altri 3 settaggi. Questi riguardano il PLL che fornirà la frequenza di clock al microcontrollore. Il segnale fornito dall'oscillatore selezionato verrà diviso 2 volte, moltiplicato per 2o ed infine diviso 2 volte. Si prenderà quindi tale segnale e lo si moltiplicherà per 5. 1#pragma config FNOSC = FRCPLL // Oscillator Selection Bits (Fast RC Osc with PLL) 2#pragma config FSOSCEN = OFF // Secondary Oscillator Enable (Disabled) 3#pragma config IESO = OFF // Internal/External Switch Over (Disabled) 4#pragma config POSCMOD = OFF // Primary Oscillator Configuration (Primary osc disabled) 5#pragma config OSCIOFNC = OFF // CLKO Output Signal Active on the OSCO Pin (Disabled) 6#pragma config FPBDIV = DIV_1 // Peripheral Clock Divisor (Pb_Clk is Sys_Clk/1) 7#pragma config FCKSM = CSDCMD // Clock Switching and Monitor Selection (Clock Switch Disable, FSCM Disabled) 8#pragma config WDTPS = PS1048576 // Watchdog Timer Postscaler (1:1048576) 9#pragma config WINDIS = OFF // Watchdog Timer Window Enable (Watchdog Timer is in Non-Window Mode) 10#pragma config FWDTEN = OFF // Watchdog Timer Enable (WDT Disabled (SWDTEN Bit Controls)) 11#pragma config FWDTWINSZ = WISZ_25 // Watchdog Timer Window Size (Window Size is 25%)

Con queste righe andiamo a specificare il tipo di oscillatore primario FNOSC (interno con pll), secondario FSOSCEX (disabilitato) e qualche altra impostazione per ora trascurabile sempre riguardante il clock (IESO, POSCMOD, OSCIOFNC). Inoltre sarà possibile far funzionare le periferiche quali PWM, PMP, ecc ad una frequenza inferiore a quella dell'oscillatore primario, questo tramite FPBDIV. Gli ultimi 5 parametri riguardano una funzione che andremo ad approfondire nelle prossime lezioni, ovvero il WATCHDOG (letteralmente cane da guardia). Questa funzione altro non fa che resettare il micro in caso di malfunzionamento software. 1#pragma config JTAGEN = OFF // JTAG Enable (JTAG Disabled) 2#pragma config ICESEL = ICS_PGx1 // ICE/ICD Comm Channel Select (Communicate on PGEC1/PGED1) 3#pragma config PWP = OFF // Program Flash Write Protect (Disable) 4#pragma config BWP = OFF // Boot Flash Write Protect bit (Protection Disabled) 5#pragma config CP = OFF // Code Protect (Protection Disabled) Passiamo ora all'ultima parte della configurazione. PWP, BWP, CP riguardano la protezione del codice. JTAGEN abilita la porta di programmazione JTAG, ma noi non la useremo. Novità rispetto ai microcontrollori più piccolini è la possibilità di selezionare quali piedini avranno la funzione di PGD e PGC per la programmazione. In questo caso, tramite ICESEL abbiamo scelto 4 e 5. Accendere Un LED Alla "noiosa" descrizione dei parametri di configurazione segue la preparazione hardware. In questo caso è molto semplice. Consideriamo un pin di I/O, ad esempio RB4 (pin 11). Il nostro scopo sarà quello di pilotare il LED facendolo lampeggiare. Ci vorremmo trovare quindi un segnale ad onda quadra con periodo dell'ordine del secondo. Per ottenere questo risultato procederò razionalmente (solo per questa volta). Vediamo quindi nel dettaglio cosa deve fare il programma: 1.Configurare il microcontrollore (Configuration bits) 2.Setup dei registri che controllano le periferiche (in questo consideriamo come periferica l'i/o) 3.Accendere il LED 4.Aspettare un tempo T 5.Spegnere il LED 6.Aspettare un tempo T 7.Ritornare al punto 3 Porta I/O Dovremo quindi scrivere su un pin di i/o. Ad esso si accede mediante alcuni registri che ci troveremo già mappati (con un nome facile da ricordare). Il costruttore fornisce lo schema logico del generico piedino.

Ad ogni pin sono associati 3 bit: TRISx che permette di scegliere se il piedino è di ingresso oppure di uscita PORTx per leggere tale piedino, se TRISx è posto a 1 (ingresso) LATx per scrivere, se TRISx è posto a 0 (uscita) Delay Siamo pronti per scrivere un po' di codice. Iniziamo con la funzione di ritardo. La mia proposta di soluzione è un po' sperimentale. In sostanza dovremo scrivere un ciclo che faccia una serie di operazioni nulle. Il problema risiede nello stimare quante di queste operazione andranno fatte affinchè passi circa mezzo secondo. Sappiamo che il clock è a 40Mhz, dunque scriviamo: 1void delayhalfsecond(){ 2 int i = 10000000; 3 while(i>0) i--; 4} La mia ipotesi è che la CPU lavori ad 1.5 MIPS/Mhz, ovvero a 60MIPS. Dunque in un secondo eseguo 60 milioni di operazioni. Ad ogni iterazione eseguo tre operazioni (confronto, decremento e salto), quindi mi trovo a 20 milioni di iterazioni al secondo. Perciò affinchè trascorra mezzo secondo dovrei eseguire 10 milioni di tali iterazioni. Questo è vero solo senza recupero operandi, ovvero se la variabile i è tenuta in cache. Resta perciò da verificare se i conti che ho fatto sono validi sperimentalmente. Il Programma L'inizializzazione del dispositivo andrà opportunamente separata dal programma principale.

1//libreria in cui sono mappati i vari registri 2#include <plib.h> 3 4// DEVCFG3 5// USERID = No Setting 6#pragma config PMDL1WAY = OFF // Peripheral Module Disable Configuration (Allow multiple reconfigurations) 7#pragma config IOL1WAY = OFF // Peripheral Pin Select Configuration (Allow multiple reconfigurations) 8#pragma config FUSBIDIO = OFF // USB USID Selection (Controlled by Port Function) 9#pragma config FVBUSONIO = OFF // USB VBUS ON Selection (Controlled by Port Function) 10 11// DEVCFG2 12#pragma config FPLLIDIV = DIV_2 // PLL Input Divider (2x Divider) 13#pragma config FPLLMUL = MUL_20 // PLL Multiplier (20x Multiplier) 14#pragma config UPLLIDIV = DIV_12 // USB PLL Input Divider (12x Divider) 15#pragma config UPLLEN = OFF // USB PLL Enable (Disabled and Bypassed) 16#pragma config FPLLODIV = DIV_2 // System PLL Output Clock Divider (PLL Divide by 2) 17 18// DEVCFG1 19#pragma config FNOSC = FRCPLL // Oscillator Selection Bits (Fast RC Osc with PLL) 20#pragma config FSOSCEN = OFF // Secondary Oscillator Enable (Disabled) 21#pragma config IESO = OFF // Internal/External Switch Over (Disabled) 22#pragma config POSCMOD = OFF // Primary Oscillator Configuration (Primary osc disabled) 23#pragma config OSCIOFNC = OFF // CLKO Output Signal Active on the OSCO Pin (Disabled) 24#pragma config FPBDIV = DIV_1 // Peripheral Clock Divisor (Pb_Clk is Sys_Clk/1) 25#pragma config FCKSM = CSDCMD // Clock Switching and Monitor Selection (Clock Switch Disable, FSCM Disabled) 26#pragma config WDTPS = PS1048576 // Watchdog Timer Postscaler (1:1048576) 27#pragma config WINDIS = OFF // Watchdog Timer Window Enable (Watchdog Timer is in Non-Window Mode) 28#pragma config FWDTEN = OFF // Watchdog Timer Enable (WDT Disabled (SWDTEN Bit Controls)) 29#pragma config FWDTWINSZ = WISZ_25 // Watchdog Timer Window Size (Window Size is 25%) 30 31// DEVCFG0 32#pragma config JTAGEN = OFF // JTAG Enable (JTAG Disabled) 33#pragma config ICESEL = ICS_PGx1 // ICE/ICD Comm Channel Select (Communicate on PGEC1/PGED1) 34#pragma config PWP = OFF // Program Flash Write Protect (Disable) 35#pragma config BWP = OFF // Boot Flash Write Protect bit (Protection Disabled) 36#pragma config CP = OFF // Code Protect (Protection Disabled) 37 38//ritardo di mezzo secondo 39void delayhalfsecond(){ 40 int i = 10000000; 41 while(i>0) i--; 42} 43 44//inizializzazione del dispositivo 45void setup(void){ 46 TRISBbits.TRISB4 = 0; //RB4 è un output 47 LATBbits.LATB4 = 0; //Inizializzo RB4 a 0 48} 49 50//programma principale 51void main(void){ 52 setup(); //chiamo il setup 53 while(1){ 54 //ciclo infinito 55 LATBbits.LATB4 = 1; //accendo il led 56 delayhalfsecond(); //aspetto mezzo secondo 57 LATBbits.LATB4 = 0; //spengo il led 58 delayhalfsecond(); //aspetto mezzo secondo 59 } 60} Siamo quindi riusciti ad eseguire il nostro primo programma. Molto semplice, ma che al tempo stesso ci fa capire come ragionare per scrivere programmi un po' più complessi. L'importante è tenere a mente la struttura del ciclo principale. Contrariamente ad altri programmi, il ciclo infinito è indispensabile. Infatti una volta terminato il programma avviene il reset del microcontrollore, cosa molto indesiderata!