iot

In questo secondo passo da zero facciamo lampeggiare il LED in modo che abbia un'intermittenza non regolare, in pratica cerco un lampeggio rapido con un periodo più lungo di spegnimento; l'effetto deve essere quello di una luce che segnali una presenza. Un comportamento come quello in figura.

sequenzaEsiste un modo semplice per ottenere questo risultato, dobbiamo rimettere mano ai files di configurazione, sempre tramite il tool MCC, e modificare il periodo in cui il timer0 va in overflow da 1s a 100ms. In questo modo otterremo 5 accensioni per ogni secondo. Sarà sufficiente creare una variabile globale che tenga conto del numero di accensioni in modo da eseguire la commutazione del LED solo quando la variabile ha valore compreso tra zero e tre.

Schermata 2017 11 26 alle 19.06.43

Premendo il bottone "Generate" si ottiene la modifica del file tmr0.c che era stato generato in precedenza quando avevamo imposto il periodo del timer0 a 1s. Vediamo in cosa consistono le modifiche.

Porzione del file tmr0.c  prima della modifica:

Schermata 2017 11 27 alle 09.11.49

Porzione del file tmr0.c dopo la modifica:

Schermata 2017 11 27 alle 09.12.21

Si può vedere che le due variabili TMR0H e TMR0L associate al registro TMR0 sono cambiate. Quest'ultimo è un registro a 16 bit il cui valore è il valore corrente del timer0 che viene incrementato ad ogni fronte di salita del segnale scelto come sorgente del clock. Il valore del registro TMR0 viene indirettamente impostato tramite il campo "Requested period" del tool MCC visto in precedenza. Come avviene?

Il programma (MCC) calcola quanti impulsi di clock servono per mandare in overflow il timer nel tempo richiesto e imposta il registro di conseguenza; quindi se noi impostiamo 1s, sapendo che ogni fronte di salita del clock arriva in 16us, dobbiamo inserire nei registri un valore di

65535 - 1s/16us = 65535 - 62500 = 3035 (0x0BDB)

che, a meno di una piccola approssimazione è il valore inserito nella vecchia versione del file. Provo a rappresentare il ragionamento nella figura che segue.   

calcolo tmr0

Adesso non resta che vedere il loop principale in main.c:

Schermata 2017 11 28 alle 06.42.19

Viene creata la variabile blinkCount e viene inizializzata a zero; ogni volta che il timer va in overflow il valore della variabile viene incrementato di una unità. Il LED cambia di stato soltanto quando la variabile è tra zero e tre, in pratica si accende due volte poi resta spento fino a quando la variabile arrivata a nove non viene riazzerata.

download project