Timer1 con le PLIB

Esperimenti con forme d'onda

Attenzione! Le PLIB sono dal luglio 2015 sconsigliate per nuovi progetti Attenzione!

Questa pagina affronta l'uso dei moduli Timer1 e ECCP (Enhanced Capture, Compare, and PWM) in modalità Compare Mode, utilizzando le PLIB

Il modulo ECCP in modalità "compare"

Utilizzando il modulo ECCP insieme a Timer1 è possibile generare in modo totalmente hardware frequenze programmabili. Questo da una parte semplifica il lavoro del PIC18, dall'altra permette di generare intervalli temporali che dipendono esclusivamente dalla precisione del clock. Si osserva che nella descrizione seguente non sono necessarie le capacità enhanced, quindi la descrizione dovrebbe essere corretta anche per i PIC18 più vecchi.

Due sono i blocchi fondamentali:

In sintesi il funzionamento di Timer1 + ECCP è simile a quello di un contatore asincrono il cui modulo dipenderà dal contenuto del registro CCPR1; quindi il conteggio di Timer1 inizia da zero e termina ad un valore programmabile inferiore a 65536. Se fa notare che il termine asincrono è stato usato impropriamente in quanto la struttura interna è in realtà interamente sincrona.

Lo schema del ECCP in modalità "compare"

Il codice di esempio configura ECCP per azzerare Timer1 ed attivare un interrupt allo scopo di far lampeggiare un LED un paio di volte al secondo. Sono utilizzate le PLIB, ma leggete la richiesta del terzo esercizio.

Il circuito è semplicemente un LED ed una resistenza connessi a PORTC0:

Un LED connesso a RC0

Leggiamo il codice. La funzione main():

L'attività della ISR è particolarmente semplice:

Si noti che, nel caso particolare, il LED poteva essere collegato direttamente al pin CCP1 (pin 13), liberando completamente il processore da questa incombenza (quarto esercizio).

Il modulo ECCP è molto più flessibile di quanto mostrato: si legga quanto proposto nell'approfondimento.

Un altro esempio, associato all'uso dell'ADC lo trovate in questa pagina.

Interrupt multiple e priorità

Disporre di due sorgenti di interrupt indipendenti come Timer0 e Timer1 ci permette di visualizzare come opera un sistema in cui sono presenti più attività "contemporanee".

Il codice, presente a fine pagina, esegue tre attività diverse e indipendenti, ma con il vincolo che il processore è uno solo:

La descrizione dettagliata del codice è la stessa già presentata per Timer0 e Timer1.

Osserviamo quello che succede sul grafico reali delle tre uscite, misurato dopo le fasi iniziali del programma:

  1. Al tempo zero di riferimento è attivo main() e quindi RED cambia continuamente stato
  2. Dopo circa 0,8 ms dal tempo zero, RED interrompe il suo funzionamento ed il controllo passa a my_isr_high(), alias GREEN, per poco più di 0,2 ms
  3. Quindi riprende il lavoro di RED, dallo stato rimasto nell'istante di sospensione (nell'esempio l'uscita PORTC0 è rimasta casualmente alta)
  4. Dopo poco più di 2 ms dal tempo zero, my_isr_low(), alias BLUE, interrompe il funzionamento di RED, per poco più di 1 ms.
  5. Al termine, RED riprende il suo lavoro (questa volta l'uscita PORTC0 è rimasta casualmente bassa)
  6. Dopo 4,8 ms dal tempo zero il controllo torna nuovamente a GREEN, che lo lascia poco dopo
  7. Dopo 8,5 ms dall'inizio, il controllo torna a BLUE
  8. Dopo un ulteriore breve intervallo il controllo passa a GREEN, che ha priorità maggiore e quindi interrompe l'attività di BLUE
  9. Dopo 0,2 ms il controllo torna a BLU, visto che non ha ancora finito il sui lavoro.
  10. Infine il processore tornerà a RED, passaggio non mostrato nel grafico

Interrupt multiple

Aspetti da osservare:

Codice

Esercizi

  1. Scrivere il codice che utilizza Timer1 per far lampeggiare un LED utilizzando PLIB, come già fatto con Timer0

Approfondimento


Data di creazione di questa pagina: luglio 2014
Ultima modifica: 31 luglio 2015


Licenza Creative Commons Attribuzione 4.0 Internazionale


Pagina principaleAccessibilitàNote legaliPosta elettronicaXHTML 1.0 StrictCSS 3

Vai in cima