Prerequisiti: Lezione7 – Lezione8 Nicola Amoroso · Codice sorgente in linguaggioC [CCS Pic-C...

29
NA – L15 1 Corso introduttivo sui microcontrollori A. S. 2007 – 2008 Programmare i PIC in C Timers – Interrupts Prerequisiti: Lezione7 – Lezione8 Nicola Amoroso [email protected] http://www.mrscuole.net/anxapic/ http://www.mrscuole.net/anxapic/ http://www.mrscuole.net/anxapic/

Transcript of Prerequisiti: Lezione7 – Lezione8 Nicola Amoroso · Codice sorgente in linguaggioC [CCS Pic-C...

Page 1: Prerequisiti: Lezione7 – Lezione8 Nicola Amoroso · Codice sorgente in linguaggioC [CCS Pic-C PCWH Compilator] 4. ... Esercizio: uso di TMR0 (Timer0), TMR1 (Timer1) e int_RB0 (Int_EXT

NA – L15 1

Corso introduttivo sui microcontrollori

A. S. 2007 – 2008

Programmare i PIC in CTimers – Interrupts

Prerequisiti: Lezione7 – Lezione8

Nicola [email protected]

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Page 2: Prerequisiti: Lezione7 – Lezione8 Nicola Amoroso · Codice sorgente in linguaggioC [CCS Pic-C PCWH Compilator] 4. ... Esercizio: uso di TMR0 (Timer0), TMR1 (Timer1) e int_RB0 (Int_EXT

NA – L15 2

Programmare i microcontrollori in linguaggio CTimers - Interrupts

I timers e gli Interrupts sono elementi fondamentali per l’uso e la gestione di un

microcontrollore. Nelle lezioni 7 e 8 abbiamo già presentato questo elementi e

abbiamo visto degli esempi di gestione in linguaggio assembler. Vedremo ora

esempi di gestione e programmazione in linguaggio C rimandando alle lezioni

indicate per definizioni, indicazioni e suggerimenti.

Dopo semplici richiami vedremo un esercizio illuminante sull’uso e la gestione

di questi fondamentali componenti Hardware e software del nostro

microcontrollore.

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Page 3: Prerequisiti: Lezione7 – Lezione8 Nicola Amoroso · Codice sorgente in linguaggioC [CCS Pic-C PCWH Compilator] 4. ... Esercizio: uso di TMR0 (Timer0), TMR1 (Timer1) e int_RB0 (Int_EXT

NA – L15 3

Programmare i microcontrollori in linguaggio CTimers - Interrupts

I timers sono precisi contatori, che possono essereconfigurati per incrementarsi su fronti di segnaliesterni o su fronti di un segnale interno ottenuto dalclock di sistema, direttamente dall’hardware del pic.La frequenza del segnale con cui il registro vieneincrementato è pari a fosc/4 oppure a fosc/4opportunamente prescalato [fosc/4 diviso per unmultiplo di due (2, 4, 8, 16 … etc...)]

Fosc/4 è un segnale generato internamente al PIC dalcircuito di clock ed è pari alla frequenza di clockdivisa per quattro.

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Page 4: Prerequisiti: Lezione7 – Lezione8 Nicola Amoroso · Codice sorgente in linguaggioC [CCS Pic-C PCWH Compilator] 4. ... Esercizio: uso di TMR0 (Timer0), TMR1 (Timer1) e int_RB0 (Int_EXT

NA – L15 4

Programmare i microcontrollori in linguaggio CTimers - Interrupts

Gli interrupts sono dei componenti software-hardware, contenutiall’interno del PIC, in base ai quali il PIC, quando gli arriva un segnale diinterrupt, interrompe immediatamente quello che stava facendo ed esegueuna determinata funzione, detta funzione di interrupt, alla fine di questafunzione ritorna ad eseguire il codice che stava eseguendo prima dellainterruzione.

Volendo fare un paragone con il mondo reale possiamo dire che l'interruptrappresenta per il PIC quello che per noi rappresenta ad esempio lasuoneria del telefono.Per poter ricevere telefonate non dobbiamo preoccuparci di alzarecontinuamente la cornetta per vedere se c'é qualcuno che vuol parlare connoi, ma, grazie alla suoneria, possiamo continuare tranquillamente a fare lenostre faccende in quanto saremo avvisati dà questa ogni volta chequalcuno ci sta chiamando.Appena sentiamo lo squillo, possiamo decidere di interromperemomentaneamente le nostre faccende, rispondere al telefono e, una voltaterminata la conversazione, riprendere dal punto in cui avevamo interrotto.

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Page 5: Prerequisiti: Lezione7 – Lezione8 Nicola Amoroso · Codice sorgente in linguaggioC [CCS Pic-C PCWH Compilator] 4. ... Esercizio: uso di TMR0 (Timer0), TMR1 (Timer1) e int_RB0 (Int_EXT

NA – L15 5

Programmare i microcontrollori in linguaggio CTimers - Interrupts

Il PIC 16F877 ha tre timer individuati come timer0, timer1 etimer2.I timer 0 e 2 sono ad 8 bit mentre il timer 1 è a 16 bit; ciòimplica che i timer 0 e 2 tornano nella condizione iniziale dopo256 impulsi in ingresso mentre il timer 1 torna nellacondizione iniziale dopo 65536 impulsi in ingresso.I registri associati ai timer sono ciclici cioè dopo averraggiunto il valore massimo al successivo impulsoricominciano il conteggio da zero in fase UP o dal vaoremassimo in fase DOWN.Es per un registro a 8 bit … 254, 255, 0, 1, 2, … UP

… 2, 1, 0, 255, 254, … DOWN

Il passaggio per lo zero viene sempre individuato come condizione di overflow

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Page 6: Prerequisiti: Lezione7 – Lezione8 Nicola Amoroso · Codice sorgente in linguaggioC [CCS Pic-C PCWH Compilator] 4. ... Esercizio: uso di TMR0 (Timer0), TMR1 (Timer1) e int_RB0 (Int_EXT

NA – L15 6

Programmare i microcontrollori in linguaggio CTimers - Interrupts

I registri timer possono essere inizializzati ad un valoreiniziale, al successivo impulso in ingresso il conteggio iniziadal valore immesso e continua in modo sequenziale.

I timer Tmr0 (8 bit) e Tmr1(16 bit) sono utilizzati per impieghigenerici mentre Tmr2 (8 bit) è spesso associato per impieghiche coinvolgono sezioni Hw del controllore (ad esempio l’usodei pin CPP1 e CPP2 per la generazione di segnali PWMrichiedono l’uso di questo timer); vedremo in seguito unopportuno esempio d’uso.Il compilatore CCS PicC mediante il Pic wizard facilitanotevolmente l’uso di questi timer.

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Page 7: Prerequisiti: Lezione7 – Lezione8 Nicola Amoroso · Codice sorgente in linguaggioC [CCS Pic-C PCWH Compilator] 4. ... Esercizio: uso di TMR0 (Timer0), TMR1 (Timer1) e int_RB0 (Int_EXT

NA – L15 7

Programmare i microcontrollori in linguaggio CTimers - Interrupts

L’interrupt è una particolare caratteristica dei microprocessori in generaleche consente di intercettare un evento esterno, interromperemomentaneamente il programma in corso, eseguire una porzione diprogramma specializzata per la gestione dell’evento verificatosi eriprendere l’esecuzione del programma principale.

Ci sono infatti eventi che può far comodo rilevare in un qualsiasi momentodell’esecuzione del programma, come ad esempio l’arrivo di unacomunicazione seriale, l’overflow di un timer, oppure un fronte su di unpin. In questi casi entrano in gioco gli interrupt: ad un preciso eventorichiesto, il controllore interrompe quello che stava facendo e passa ad una“subroutine di interrupt”. Nel caso della seriale, tale subroutine siincaricherà di ricevere correttamente il byte trasmesso dall’esterno. Altermine della routine di interrupt il programma riprende dal punto in cui erastato lasciato.

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Page 8: Prerequisiti: Lezione7 – Lezione8 Nicola Amoroso · Codice sorgente in linguaggioC [CCS Pic-C PCWH Compilator] 4. ... Esercizio: uso di TMR0 (Timer0), TMR1 (Timer1) e int_RB0 (Int_EXT

NA – L15 8

Programmare i microcontrollori in linguaggio CTimers - Interrupts

Il PIC16F877 ha fino a 14 sorgenti (Hw-Sw) di interrupt:

• il cambiamento di stato sulla linea RB0 (external interrupt); • la fine del conteggio del registro TMR0 (TMR0 Overflow Interrupt);• il cambiamento di stato su una delle linee da RB4 a RB7 (PORTB Change Interrupt); • il cambamento di stato del modulo Comparatore (Comparator Change Interrupt); • interrupt sulla porta parallela (Parallel Slave Port Interrupt); • interrupt sulla porta seriale (USART Interrupt); • Receive Interrupt (Rx interrupt); • Transmit Interrupt (Tx interrupt); • la fine di una conversione A/D (A/D Conversion Complete Interrupt); • interrupt sul modulo LCD (LCD Interrupt); • la fine della scrittura su una locazione EEPROM (Data EEPROM Write Complete Interrupt); • la fine del conteggio del timer TMR1 (Timer1 Overflow Interrupt); • interrupt sul modulo Capture/Compare (CCP Interrupt); • interrupt sulla porta seriale sincrona (SSP Interrupt).

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Page 9: Prerequisiti: Lezione7 – Lezione8 Nicola Amoroso · Codice sorgente in linguaggioC [CCS Pic-C PCWH Compilator] 4. ... Esercizio: uso di TMR0 (Timer0), TMR1 (Timer1) e int_RB0 (Int_EXT

NA – L15 9

Programmare i microcontrollori in linguaggio CTimers - Interrupts

Vedremo con degli esempi come impiegare l’uso ditimers e interrupts nella gestione di un sistemacomunque il CCS PicC compiler semplificanotevolmente le impostazioni, per l’uso di questistrumenti, mediante il picC wizard.

Un semplice esempio nell’uso del timer0 e del timer1insieme alla gestione di un interrupt dovuto alcambiamento di stato del segnale sul pin RB0.

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Page 10: Prerequisiti: Lezione7 – Lezione8 Nicola Amoroso · Codice sorgente in linguaggioC [CCS Pic-C PCWH Compilator] 4. ... Esercizio: uso di TMR0 (Timer0), TMR1 (Timer1) e int_RB0 (Int_EXT

NA – L15 10

Programmare i microcontrollori in linguaggio CTimers – Interrupts

Esercizio: uso di TMR0 (Timer0), TMR1 (Timer1) e int_RB0 (Int_EXT – Interrupt su RB0)

Un trimmer, i cui pin estremi sono collegati tra 5 V e GND, ha il terzo pin (centrale) collegato conRA0; la tensione in ingresso dei Pin RA0 può variare tra 0 e 5 V quando il perno centrale del trimmerviene ruotato tra 0° e 270°.Leggere, convertire e visualizzare su display LCD il valore della tensione ai capi dei trimmer [input pinRA0] e contemporaneamente far lampeggiare (ON/OFF) un led collegato sul pin RD3 del nostromicrocontrollore. L’intervallo di tempo tra la condizione ON-OFF del led deve essere di circa 500 ms(0,5 secondi).Collegato sul pin RB0 del nostro controllore vi è un pulsante (switch-Button), normalmente apertoche se viene premuto deve attivare una routine di interrupt che dopo circa due secondi dallapressione del tasto, permette la emissione di un doppio beep da parte di un buzzer autoscillantecollegato dul pin RD2 del nostro microcontrollore.

Sviluppare l’esercizio seguendo le semplici fasi di sviluppo:

1. Analisi del problema, schematizzazione a blocchi (se necessario), con schema elettrico finale operativo

2. Impostazione del Software e relativo Flow – Chart

3. Codice sorgente in linguaggio C [CCS Pic-C PCWH Compilator]

4. Simulazione in ambiente Proteus VSM interfaccia ISIS

5. Presentazione del lavoro finale su demo-Board opportuna (Gp_Mbus …. AnxaPic4)

6. Opportuna documentazione conclusiva

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Page 11: Prerequisiti: Lezione7 – Lezione8 Nicola Amoroso · Codice sorgente in linguaggioC [CCS Pic-C PCWH Compilator] 4. ... Esercizio: uso di TMR0 (Timer0), TMR1 (Timer1) e int_RB0 (Int_EXT

NA – L15 11

Programmare i microcontrollori in linguaggio CTimers – Interrupts

Esercizio: uso di TMR0 (Timer0), TMR1 (Timer1) e int_RB0 (Int_EXT – Interrupt su RB0)

1. Una semplice analisi del problema porta a definire il seguente schema elettrico

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Page 12: Prerequisiti: Lezione7 – Lezione8 Nicola Amoroso · Codice sorgente in linguaggioC [CCS Pic-C PCWH Compilator] 4. ... Esercizio: uso di TMR0 (Timer0), TMR1 (Timer1) e int_RB0 (Int_EXT

NA – L15 12

Programmare i microcontrollori in linguaggio CTimers – Interrupts

Esercizio: uso di TMR0 (Timer0), TMR1 (Timer1) e int_RB0 (Int_EXT – Interrupt su RB0)

Una considerazione circuitale

Dallo schema elettrico riportato si nota la resistenza R5 = 470 Ω iningresso al pin RA0, cerchiamo di dare una semplice spiegazionerimandando ai Data-Shhet del Pic16F877 (sez. ADC) della Microchipper approfondimenti e ulteriori considerazioni.

In condizioni normali di funzionamento la corrente in ingresso almodulo ADC del Pic non supera i 500 nA quindi, nel nostro caso, incondizioni “normali” la caduta di tensione su R5 non supera i 235microVolt (470x500 10-9 = 235 10-6 V), valore irrilevante per il normalefunzionamento del sistema.

Se la tensione (per un qualsiasi errore) in ingresso al nostro modulo ADC supera il valore maximoammesso (5 V), dei diodi di protezione all’interno del modulo entrano in azione e permettono lasalvaguardia del modulo stesso, se però la corrente in ingresso al modulo supera dei valori limiteammessi questi diodi potrebbero bruciarsi e viene quindi meno la loro protezione. Microchip consiglial’inserimento di questa resistenza con valori limite non superiore a 1 KΩ per limitare la corrente suidiodi nel caso di sovratensioni in ingresso al modulo ADC. La stessa Microchip consiglia di nonsuperare il KΩ per non avere cadute di tensioni rilevanti durante il normale funzionamento. In generevalori compresi tra 330 Ω e 1 KΩ sono accettabili.

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Page 13: Prerequisiti: Lezione7 – Lezione8 Nicola Amoroso · Codice sorgente in linguaggioC [CCS Pic-C PCWH Compilator] 4. ... Esercizio: uso di TMR0 (Timer0), TMR1 (Timer1) e int_RB0 (Int_EXT

NA – L15 13

Programmare i microcontrollori in linguaggio CTimers – Interrupts

Esercizio: uso di TMR0 (Timer0), TMR1 (Timer1) e int_RB0 (Int_EXT – Interrupt su RB0)

2. Impostazione del Software e relativo Flow – Chart

“Pseudo funzioni per punti con evidenziazione delle cose da fare”

In condizioni di funzionamento normali il sistema deve leggere la tensione in ingresso epresentare il corrispondente valore su dispaly.

Il lampeggio del led viene controllato mediante la condizione di overflow di un timer (TIMER1 – 16bit) che genera un interrupt e la relativa routine controlla lo stato del led variando opportunamente illivello logico del segnale del pin RD3.

Quando viene premuto il pulsante collegato con il pin RB0, viene attivata una routine di interrupt chea sua volta attiva l’interrupt sulla condizione di overflow di un altro timer del Pic (TIMER0 – 8 bit).Questa routine di interrupt collegato con l’overflow di TIMER0 genera i due beep di avviso dopocirca 2 secondi dalla pressione del pulsante collegato su RB0

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Page 14: Prerequisiti: Lezione7 – Lezione8 Nicola Amoroso · Codice sorgente in linguaggioC [CCS Pic-C PCWH Compilator] 4. ... Esercizio: uso di TMR0 (Timer0), TMR1 (Timer1) e int_RB0 (Int_EXT

NA – L15 14

Programmare i microcontrollori in linguaggio CTimers – Interrupts

Esercizio: uso di TMR0 (Timer0), TMR1 (Timer1) e int_RB0 (Int_EXT – Interrupt su RB0)

Main function

1. Start2. Set system [Canale ADC – Abilito timer0 con prescaler opportuno –

Abilito timer1 con prescaler opportuno – Abilito interrupt su overflowtimer 1 – Abilito interrupt su scambiamento stato segnale ingresso RB0]

3. Init LCD4. Display messaggio iniziale5. Leggi e converti segnale in ingresso del canale ADC scelto6. Mostra su display i valori opportuni7. Continua dal punto 5.

2. Impostazione del Software e relativo Flow – ChartMain function

“Pseudo funzioni per punti con evidenziazione delle cose da fare”

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Page 15: Prerequisiti: Lezione7 – Lezione8 Nicola Amoroso · Codice sorgente in linguaggioC [CCS Pic-C PCWH Compilator] 4. ... Esercizio: uso di TMR0 (Timer0), TMR1 (Timer1) e int_RB0 (Int_EXT

NA – L15 15

Programmare i microcontrollori in linguaggio CTimers – Interrupts

Esercizio: uso di TMR0 (Timer0), TMR1 (Timer1) e int_RB0 (Int_EXT – Interrupt su RB0)

2. Impostazione del Software e relativo Flow – Chart Routines di Interrupt

“Pseudo funzioni per punti con evidenziazione delle cose da fare”

Routine di interrupt: overflow TIMER1 (circa 500 ms)

1. Complementa livello logico del segnale su RD32. Esci dalla routine

Routine di interrupt: cambiamento segnale su RB0

1. Disabilita interrupt su RB0 [In questo modo durante la fase di interrupt non viene intercettato nessun altro cambiamento su RB0]

2. Abilita interrupt su overflow TIMER0 [Da questo punto inizia la fase di conteggio di 2 secondi]

3. Esci dalla routine

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Page 16: Prerequisiti: Lezione7 – Lezione8 Nicola Amoroso · Codice sorgente in linguaggioC [CCS Pic-C PCWH Compilator] 4. ... Esercizio: uso di TMR0 (Timer0), TMR1 (Timer1) e int_RB0 (Int_EXT

NA – L15 16

Programmare i microcontrollori in linguaggio CTimers – Interrupts

Esercizio: uso di TMR0 (Timer0), TMR1 (Timer1) e int_RB0 (Int_EXT – Interrupt su RB0)

2. Impostazione del Software e relativo Flow – Chart Routines di Interrupt

“Pseudo funzioni per punti con evidenziazione delle cose da fare”

Routine di interrupt: overflow TIMER0 (circa 65,5 ms)

1. Incrementa variabile statica: TMR0_Ov ++2. TMR0_Ov >31 No Salta al punto 3.

2.1 Disabilita interrupt overflow Timer02.2 Beep2.3 Beep2.4 Riabilita interrupt su variazione segnale ai capi di RB0 (possiamo intercettare una nuova pressione del pulsante su RB0)

3. Esci dalla routine

In fase di setup supponiamo di impostare l’overflow del timer0 per un tempo pari a 65,5 ms; avremo quindi chedopo 31 condizioni di overflow saranno trascorsi circa 2 secondi (31 x 65,5 10-3 = 2,0305 sec).Incrementiamo una variabile di tipo Static [Cfr. Lez10-Lez14] per ogni condizione di interrupt; quando questavariabile sarà uguale a 31 saranno trascorsi circa 2 secondi.

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Page 17: Prerequisiti: Lezione7 – Lezione8 Nicola Amoroso · Codice sorgente in linguaggioC [CCS Pic-C PCWH Compilator] 4. ... Esercizio: uso di TMR0 (Timer0), TMR1 (Timer1) e int_RB0 (Int_EXT

NA – L15 17

Programmare i microcontrollori in linguaggio CTimers – Interrupts

Esercizio: uso di TMR0 (Timer0), TMR1 (Timer1) e int_RB0 (Int_EXT – Interrupt su RB0)

Come accennato nelle precedenti lezioni, alcuni moduli Hardware-Software del nostro

microcontrollore non sono abilitati di default; per attivare il loro funzionamento bisogna

opportunamente abilitarli in fase di setup.

Avevamo gia indicato questa condizione per l’ADC del nostro controllore e la stesso ribadiamo

per i TIMERS e gli INTERRUPTS dello stesso

Come al solito il CCS Pic Wizard Tool ci aiuta in questa fase di setup

Le abilitazioni necessarie:

1. Ingresso RA0 come ingresso analogico (Canale 0 ADC)

2. Timer0 (TMR0) con condizione di overflow pari a 65 ms circa (Prescaler opportuno)

3. Timer1(TMR1) con condizione di overflow pari a 500 ms circa (Prescaler opportuno)

4. Interrupt su variazione fronte segnale su RB0 (Int_Ext)

5. Interrupt su overflow Timer0 (Int_RTCC)

6. Interrupt su overflow Timer1 (Int_TIMER1)

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Page 18: Prerequisiti: Lezione7 – Lezione8 Nicola Amoroso · Codice sorgente in linguaggioC [CCS Pic-C PCWH Compilator] 4. ... Esercizio: uso di TMR0 (Timer0), TMR1 (Timer1) e int_RB0 (Int_EXT

NA – L15 18

Programmare i microcontrollori in linguaggio CTimers – Interrupts

Esercizio: uso di TMR0 (Timer0), TMR1 (Timer1) e int_RB0 (Int_EXT – Interrupt su RB0)

3. Codice sorgente – CCS Pic Wizard Tool General Tab

Impostazioni generali del sistema e relativo codice prodotto

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Page 19: Prerequisiti: Lezione7 – Lezione8 Nicola Amoroso · Codice sorgente in linguaggioC [CCS Pic-C PCWH Compilator] 4. ... Esercizio: uso di TMR0 (Timer0), TMR1 (Timer1) e int_RB0 (Int_EXT

NA – L15 19

Programmare i microcontrollori in linguaggio CTimers – Interrupts

Esercizio: uso di TMR0 (Timer0), TMR1 (Timer1) e int_RB0 (Int_EXT – Interrupt su RB0)

3. Codice sorgente – CCS Pic Wizard Tool Timers Tab

Abilitazione e impostazioni dei timers da utilizzare con opportuno prescaler e relativo intervallo di tempo di overflow

Prescaler

Overflow

PrescalerOverflow

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Page 20: Prerequisiti: Lezione7 – Lezione8 Nicola Amoroso · Codice sorgente in linguaggioC [CCS Pic-C PCWH Compilator] 4. ... Esercizio: uso di TMR0 (Timer0), TMR1 (Timer1) e int_RB0 (Int_EXT

NA – L15 20

Programmare i microcontrollori in linguaggio CTimers – Interrupts

Esercizio: uso di TMR0 (Timer0), TMR1 (Timer1) e int_RB0 (Int_EXT – Interrupt su RB0)

3. Codice sorgente – CCS Pic Wizard Tool Timers Tab Alcune considerazioni

Il clock di sistema è uguale a 4 MHz, la frequenza del segnale di clock per i Timers è pari a fsys/4 = 1 MHz.

Il Timer0 (RTCC) ha un prescaler pari a 256 abilitato quindi la frequenza del segnale di clock per TMR0 è

pari a 1/256 = 3,906 KHz il corrispondente periodo sara pari a 1/3906 = 256 µs.

Il registro associato al Timer0 è ad 8 bit quindi la condizione di overflow la otteniamo dopo 256 impulsi di

clock cioè dopo un tempo pari a: 256 x 256 10-6 = 65,5 ms. Ogni volta che si verifica questa condizione

(cioè ogni 65,5 ms) viene generato un opportuno segnale di interrupt.

Le stesse considerazioni valgono per il TIMER1, in questo caso però bisogna considerare che il valore del

prescaler è pari a 8 e il registro associato al TIMER1 è a 16 bit quindi la condizione di overflow avviene dopo

65536 impulsi di clock.

fTMR1 = (fsys/4)/8 = 125 KHz periodo associato = (1/125 103) = 8 µs

Intervallo temporale di overflow 65536 x 8 10-6 = 524 ms. Ogni volta che si verifica questa

condizione (cioè ogni 524 ms) viene generato un opportuno segnale di interrupt.

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Page 21: Prerequisiti: Lezione7 – Lezione8 Nicola Amoroso · Codice sorgente in linguaggioC [CCS Pic-C PCWH Compilator] 4. ... Esercizio: uso di TMR0 (Timer0), TMR1 (Timer1) e int_RB0 (Int_EXT

NA – L15 21

Programmare i microcontrollori in linguaggio CTimers – Interrupts

Esercizio: uso di TMR0 (Timer0), TMR1 (Timer1) e int_RB0 (Int_EXT – Interrupt su RB0)

3. Codice sorgente – CCS Pic Wizard Tool Analog Tab

Abilitazione ADC con opportuno canale (RA0)- L’ADC viene impostato a 10 bit

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Page 22: Prerequisiti: Lezione7 – Lezione8 Nicola Amoroso · Codice sorgente in linguaggioC [CCS Pic-C PCWH Compilator] 4. ... Esercizio: uso di TMR0 (Timer0), TMR1 (Timer1) e int_RB0 (Int_EXT

NA – L15 22

Programmare i microcontrollori in linguaggio CTimers – Interrupts

Esercizio: uso di TMR0 (Timer0), TMR1 (Timer1) e int_RB0 (Int_EXT – Interrupt su RB0)

3. Codice sorgente – CCS Pic Wizard Tool Interrupts Tab

Abilitazione Interrupt-Sono abilitati gli interrupts per condizione di overflow TIMER0 (RTCC), TIMER1(TIMER1) e segnale in ingresso su RB0 (EXT)

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Page 23: Prerequisiti: Lezione7 – Lezione8 Nicola Amoroso · Codice sorgente in linguaggioC [CCS Pic-C PCWH Compilator] 4. ... Esercizio: uso di TMR0 (Timer0), TMR1 (Timer1) e int_RB0 (Int_EXT

NA – L15 23

Programmare i microcontrollori in linguaggio CTimers – Interrupts

Esercizio: uso di TMR0 (Timer0), TMR1 (Timer1) e int_RB0 (Int_EXT – Interrupt su RB0)

3. Codice sorgente – CCS Pic Wizard Tool Il codice generato Sintassi uso Interrupts

Le routine di Interruptvengono dichiarate seguendouna opportuna sintassi. Ogniroutine deve iniziare con laopportuna direttiva.(#int_nome interrupt attivato)

Routine di Interrupt overflow TIMER0

Routine di Interrupt overflow TIMER1

Routine di Interrupt cambiamento segnale su RB0

Prima del loro utilizzo bisogna sempre abilitare i corrispondenti registri di Interrupts. Opportune built-In function del CCS Pic-C compiler ci

agevolano il lavoro.

Oltre alle abilitazioni dei singoli interrupt (flag di attivazione negli opportuni registri), bisogna sempre attivare il registro globale degli

interrupts; la built-In function “enable_interrupts(GLOBAL)” è indispensabile per l’utilizzo di qualsiasi interrupt.

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Page 24: Prerequisiti: Lezione7 – Lezione8 Nicola Amoroso · Codice sorgente in linguaggioC [CCS Pic-C PCWH Compilator] 4. ... Esercizio: uso di TMR0 (Timer0), TMR1 (Timer1) e int_RB0 (Int_EXT

NA – L15 24

Programmare i microcontrollori in linguaggio CTimers – Interrupts

Esercizio: uso di TMR0 (Timer0), TMR1 (Timer1) e int_RB0 (Int_EXT – Interrupt su RB0)

3. Codice sorgente – Il nostro esercizio Parte 1

Il set del sistema e gli opportuni driver per LCD e Buzzer sono inclusi nel codice sorgente

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Page 25: Prerequisiti: Lezione7 – Lezione8 Nicola Amoroso · Codice sorgente in linguaggioC [CCS Pic-C PCWH Compilator] 4. ... Esercizio: uso di TMR0 (Timer0), TMR1 (Timer1) e int_RB0 (Int_EXT

NA – L15 25

Programmare i microcontrollori in linguaggio CTimers – Interrupts

Esercizio: uso di TMR0 (Timer0), TMR1 (Timer1) e int_RB0 (Int_EXT – Interrupt su RB0)

3. Codice sorgente – Il nostro esercizio Parte 2 Le routines di Interrupt

Output_bit(LED, vled) Built-In functionIn uscita sul pin LED il valore vled

Complemento il valore di vled

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Page 26: Prerequisiti: Lezione7 – Lezione8 Nicola Amoroso · Codice sorgente in linguaggioC [CCS Pic-C PCWH Compilator] 4. ... Esercizio: uso di TMR0 (Timer0), TMR1 (Timer1) e int_RB0 (Int_EXT

NA – L15 26

Programmare i microcontrollori in linguaggio CTimers – Interrupts

Esercizio: uso di TMR0 (Timer0), TMR1 (Timer1) e int_RB0 (Int_EXT – Interrupt su RB0)

3. Codice sorgente – Il nostro esercizio Parte 2 Le routines di Interrupt Considerazioni

Le routine di interrupts sono implementate prima della funzione main(), sono facilmente individuali perché

ogni routine viene dichiarata con opportuna direttiva (#int_nome interrupt attivato).

Il nome della funzione è invece libero, nel codice generato mediante il tool CCS Pic Wizard, dopo la opportuna direttiva

viene indicato un nome per la funzione, comunque questo nome può essere cambiato a proprio piacimento; non

modificare mai la corrispondente direttiva.

Nel nostro esempio abbiamo cambiato i nomi proposti con: 1) RTCC_isr per overflow TIMER0, 2) EXT_intr_RB0

per interrupt su RB0, 3) TIMER1_isr per overflow TIMER1.

Buit-In functions utilizzate per gestione interrupts:enable_interrupts(INT_xxxx), disable_interrupts(INT_xxxx) Abilta o disabilita la intercettazione (quindi la

esecuzione della relativa routine) dell’interrupt corrispondente.

clear_interrupt(INT_xxxx) Disattiva il flag relativo all’interrupt considerato nell’opportuno registro degli interrupts.

E’ sempre buona norma disattivare il flag di interrupt prima della abilitazione di un interrupt, in questo modo siamo

sicuri che la routine di interrupt viene eseguita solo per un fronte di interrupt attuale e non per un fronte precedente che

ha lasciato il corrispondente flag attivo.

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Page 27: Prerequisiti: Lezione7 – Lezione8 Nicola Amoroso · Codice sorgente in linguaggioC [CCS Pic-C PCWH Compilator] 4. ... Esercizio: uso di TMR0 (Timer0), TMR1 (Timer1) e int_RB0 (Int_EXT

NA – L15 27

Programmare i microcontrollori in linguaggio CTimers – Interrupts

Esercizio: uso di TMR0 (Timer0), TMR1 (Timer1) e int_RB0 (Int_EXT – Interrupt su RB0)

3. Codice sorgente – Il nostro esercizio Parte 3Main function

Abilito solo gli interrupt s che servono in questa fase; altri interrupts li abilito successivamente.

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Page 28: Prerequisiti: Lezione7 – Lezione8 Nicola Amoroso · Codice sorgente in linguaggioC [CCS Pic-C PCWH Compilator] 4. ... Esercizio: uso di TMR0 (Timer0), TMR1 (Timer1) e int_RB0 (Int_EXT

NA – L15 28

Programmare i microcontrollori in linguaggio CTimers – Interrupts

Esercizio: uso di TMR0 (Timer0), TMR1 (Timer1) e int_RB0 (Int_EXT – Interrupt su RB0)

3. Codice sorgente – Il nostro esercizio Parte 4 Librerie per il buzzer della demo-Board

Le funzioni di gestione del buzzer della demo-Board - La presentazione iniziale su display

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Page 29: Prerequisiti: Lezione7 – Lezione8 Nicola Amoroso · Codice sorgente in linguaggioC [CCS Pic-C PCWH Compilator] 4. ... Esercizio: uso di TMR0 (Timer0), TMR1 (Timer1) e int_RB0 (Int_EXT

NA – L15 29

Programmare i microcontrollori in linguaggio CTimers – Interrupts

Esercizio: uso di TMR0 (Timer0), TMR1 (Timer1) e int_RB0 (Int_EXT – Interrupt su RB0)

4. Simulazione con Proteus VSM Ambiente ISIS

file: ADC_IntRB0_TMR0.DSN

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/