Controllo di 4 led tramite 4 interruttori
Si realizzi con un PIC16F84 un circuito e la programmazione in C per leggere la posizione di 4 interruttori collegati ai pin da RB0 a RB3. Ogni interruttore accende e spegne uno dei 4 led collegati ai pin da RA0 a RA3 e all'alimentazione.
Schema elettronico
Programma in C
#include "pic.h"
void setup(void)
{
nRBPU=0; // resistenze di pull-up abilitate
TRISA = 0x00; // tutte uscite
TRISB = 0xFF; // tutti ingressi
PORTA = 0xFF; // tutti i led spenti
}
void loop(void)
{
PORTA=PORTB;
}
void main(void)
{
setup();
while(1) loop();
}
NOTA: in genere nel linguaggio C l'assegnazione di un bit di un registro
viene fatta con la scrittura di tutto il registro utilizzando le seguenti definizioni:
#define bitset(var,bit) ((var) |= 1 << (bit))
#define bitclr(var,bit) ((var) &= ~(1 << (bit))
Per cambiare il bit RA0 nel registro PORTA si potrebbe usare:
bitset(PORTA,RA0);
bitclr(PORTA,RA0);
Programma per far lampeggiare un led
Si realizzi con un PIC16F84 un circuito e la programmazione in C per far lampeggiare un led collegato al pin RA0.
Schema elettronico
Programma in C
#include "pic.h"
unsigned long time=0;
void interrupt isr(void)
{
time++;
TMR0=0x06; // per contare 250 volte
T0IF=0;
}
void delay(unsigned long millis) // pausa in millisecondi
{
time=0;
TMR0=0x06;
while(time<millis);
}
void setup(void)
{
TRISA=0x00;
TRISB=0xFF;
T0CS=0; // clock interno a 4 MHz
PSA=0;
PS2=0; // divide per 4
PS1=0;
PS0=1;
T0IE=1;
GIE=1;
}
void loop(void) // lampeggio 4 led
{
RA0=0;
delay(1000);
RA0=1;
delay(1000);
}
void main(void)
{
setup();
while(1) loop();
}
Barra di 8 led con luce che aumenta
Si realizzi con un PIC16F84 un circuito e la programmazione in C per accendere un solo led alla volta su una barra di 8 led collegata ai pin da RB0 a RB7. Il led acceso scorre lungo la barra. Quando arriva al termine si inizia da capo. Con il deviatore collegato a RA0 si determina se il led accesso scorre verso il basso o verso l'alto.
Barra di 8 led con luce che va su e giu
Si realizzi con un PIC16F84 un circuito e la programmazione in C per accendere un solo led alla volta su una barra di 8 led collegata ai pin da RB0 a RB7. Il led acceso scorre lungo la barra e torna indietro. Quando arriva al termine si inizia da capo. Con il deviatore collegato a RA0 si determina se il led accesso scorre verso il basso o verso l'alto.
Controllo di una barra di 8 led
Si realizzi con un PIC16F84 un circuito e la programmazione in C per accendere un led alla volta su una barra di 8 led collegata ai pin da RB0 a RB7. Quando arriva al termine si inizia da capo. Con il deviatore collegato a RA0 si determina se il led accesso scorre verso il basso o verso l'alto.
Schema elettronico
Programma in C
#include "pic.h"
void setup(void)
{
TRISA=0xFF; // all inputs
TRISB=0x00; // all outputs
}
void wait(void)
{
unsigned long i=1000;
while(i) i--;
}
void loop(void)
{
PORTB=0b11111110;
wait();
for (int i=0;i<8;i++)
{
PORTB<<=1;
wait();
}
}
void main()
{
setup();
while(1) loop();
}
Controllo di 1 led tramite 1 pulsante
Si realizzi con un PIC16F84 un circuito e la programmazione in C per leggere un pulsante e comandare un led. Il led si accende quando il pulsante viene premuto, si spegne quando il pulsante viene di nuovo premuto, poi il programma si ripete.
Schema elettronico
Programma in C
#include "pic.h"
unsigned long time=0;
void interrupt isr(void)
{
time++;
TMR0=0x06; // per contare 250 volte
T0IF=0;
}
void delay(unsigned long millis) // pausa in millisecondi
{
time=0;
TMR0=0x06;
while(time<millis);
}
void setup(void)
{
nRBPU=1; // resistenze di pull-up disattivate
TRISA=0x00;
TRISB=0xFF;
T0CS=0; // clock interno a 4 MHz
PSA=0;
PS2=0; // divide per 4
PS1=0;
PS0=1;
T0IE=1;
GIE=1;
PORTA=0xFF;
}
void loop(void) // lampeggio 4 led
{
while(!RB0);
RA0=0;
while(RB0);
delay(1);
while(!RB0);
RA0=1;
while(RB0);
delay(1);
}
void main(void)
{
setup();
while(1) loop();
}
Controllo di una pressa tramite 2 pulsanti
Si realizzi con un PIC16F84 un circuito e la programmazione in C per controllare una pressa in sicurezza. La chiusura della pressa avviene solo se si premono uno dopo l'altro i due pulsanti e l'apertura avviene solo se si rilasciano uno dopo l'altro i due pulsanti.
Schema elettronico
Programma in C
#include "pic.h"
unsigned long time=0;
void interrupt isr(void)
{
time++;
TMR0=0x06; // per contare 250 volte
T0IF=0;
}
void delay(unsigned long millis) // pausa in millisecondi
{
time=0;
TMR0=0x06;
while(time<millis);
}
void setup(void)
{
nRBPU=0; // resistenze di pull-up abilitate
TRISA=0x00;
TRISB=0xFF;
T0CS=0; // clock interno a 4 MHz
PSA=0;
PS2=0; // divide per 4
PS1=0;
PS0=1;
T0IE=1;
GIE=1;
PORTA=0xFF;
}
void loop(void) // lampeggio 4 led
{
while(RB0); // conferma pressione
while(RB1); // conferma pressione
delay(1);
while(!RB0 && !RB1) RA0=0; // attesa rilascio
while(!RB0); // conferma rilascio
while(!RB1); // conferma rilascio
delay(1);
while(RB0 || RB1) RA0=1; // attesa pressione
}
void main(void)
{
setup();
while(1) loop();
}
Il robot e la calamita
Un robot dispone di due sensori e di un braccio dotato di una calamita.
Un microcontrollore PIC16F84 controlla il robot tramite due sensori (collegati a RB0 e RB1) e un uscita (RA0) collegata all'attivazione del braccio.
Quando un altro robot si avvicina il PIC attende il momento giusto e poi fa scendere la calamita sull'altro robot.
Se un solo sensore sente l'avversario (per esempio RB0=1), si attende 0,9 secondi e poi si cala la calamita (RA0=1),
Se sono attivi entrambi i sensori si attiva subito la calamita.
Scrivere il relativo programma in C.
Il programma sarà composto dalle seguenti parti:
1) inizializzazione del PIC
2) sottoprogramma di ritardo
3) programma di gestione
Disegnare lo schema elettronico .
Il cancello automatico
Un cancello automatico dispone di due pistoni e di un paletto di blocco.
Un microcontrollore PIC16F84 controlla il cancello.
Il processo è il seguente:
● si attende l’auto segnalata da una fotocellula davanti al cancello (RB1=1)
● si attende che venga premuto un pulsante (RB0=1)
● si attiva la salita del paletto di blocco del cancello (RB3=1)
● si attende 2 secondi
● si attivano i pistoni che fanno aprire il cancello (RB2=1)
● si attende che un microinterrutore segnali che il cancello è aperto (RB3=1)
● si disattivano i pistoni che fanno aprire il cancello (RB2=0)
● si attende 10 secondi
● si verifica che l'auto non sia più presente (RB1=0)
● si attivano i pistoni che fanno chiudere il cancello (RB4=1)
● si attende che un microinterrutore segnali che il cancello è chiuso (RB5=1)
● si disattivano i pistoni che fanno chiudere il cancello (RB4=0)
● si attiva la discesa del paletto di blocco del cancello (RB3=0)
● si torna all'inizio
Ipotizzando di avere un clock a 4 MHz, scrivere in linguaggio C il programma dividendolo nelle seguenti parti: inizializzazione dei pin, inizializzazione dell'interrut, interrupt, main.
Disegnare e dimensionare lo schema elettronico (la fotocellula sarà disegnata come un interruttore, non si può utilizzare deviatori).
Sottoprogramma Delay
Si ipotizza di montare un quarzo da 4 MHz.
Ogni istruzione impiega 4 cicli di clock, ovvero 1 us.
Il Delay impiega 2 istruzioni (2 us) per ogni iterazione se la variabile è di tipo unsigned char,
in quel caso si calcola che occorrono 3.500.000 iterazioni per attendere 7 secondi.
Non è possibile caricare 3.500.000 in una sola variabile unsigned char (max 255).
Allora si utilizza una variabile di tipo int su due byte (va da -32768 a 32767, 65536 combinazioni)
e un doppio ciclo.
Un ciclo di decremento della variabile di tipo int viene gestita in 18 us (si vede sul disassembly con MpLab).
Per il Delay vengono utilizzati due cicli nidificati (uno dentro l'altro), il tempo impiegato dal ciclo
interno è (18*40)+2 = 740 us. Il tempo impiegato dal Delay è (740 + 18)*10000 = 758.000 us = 0,75 s
Sottoprogramma Delay
Si ipotizza di montare un quarzo da 4 MHz.
Ogni istruzione impiega 4 cicli di clock, ovvero 1 us.
Ipotizzando che Delay impiega 2 istruzioni per ogni iterazione,
si calcola che occorrono 15 milioni di iterazioni
per attendere 30 secondis.
Il segmento che gira
Si realizzi con un PIC16F84 un circuito e la programmazione in C per accendere uno dopo l'altro i 6 led collegati ai pin da RA0 a RA4 e a RB7 di un display (l'anodo dei led è collegato all'alimentazione).
Schema elettronico
Il segmento che gira avanti e indietro
Si realizzi con un PIC16F84 un circuito e la programmazione in C per accendere uno dopo l'altro i 6 led collegati ai pin da RA0 a RA4 e a RB7 di un display (l'anodo dei led è collegato all'alimentazione). Quando l'interruttore S1 cambia stato, l'ordine di accensione si inverte.
La barra che si illumina a comando
Si realizzi con un PIC16F84 un circuito e la programmazione in C per leggere i byte memorizzati nella Eeprom e utilizzarli per accendere 13 led di una barra collegati ad pin RB0-7 e ai pin RA0-4 (l'anodo dei led è collegato all'alimentazione).
La barra che si illumina in base ai comandi scritti sulla Eeprom
Si realizzi con un PIC16F84 un circuito e la programmazione in C per scrivere e leggere i byte memorizzati nella Eeprom e utilizzarli per accendere 13 led di una barra collegati ad pin RB0-7 e ai pin RA0-4 (l'anodo dei led è collegato all'alimentazione).
Led intermettente gestito a interrupt con il Timer0
Si realizzi con un PIC16F84 la programmazione in C per fare accendere e spegnere un led con il Timer0.
Contapersone
Si vuole utilizzare un microcontrollore PIC16F84 per
realizzare un dispositivo che segnala il superamento della capienza massima di un cinema.
Il processo è il seguente:
● viene attivato il timer0 in modo che conteggi il tempo massimo possibile
● a interrupt ogni 500 ms il PIC fa lampeggiare (con duty cycle=50%) un led verde collegato a RB2
● un tornello segnala il passaggio di uno spettatore, il PIC attende RB0=1, poi attende RB0=0, poi incrementa una variabile che rappresenta il numero di persone entrate
● se si supera la capienza della sala (500 persone) il PIC fa lampeggiare a interrupt il led rosso collegato a RB3 (sempre ogni 500 ms con duty cycle 50%)
● si attende il pulsante di reset (RB1=1) per tornare all'inizio del programma
1) Disegnare il diagramma di flusso del programma.
2) Ipotizzando di avere un clock a 4 MHz, scrivere in linguaggio C il programma dividendolo nelle seguenti parti: inizializzazione dei pin, inizializzazione dell'interrut, interrupt, main.
3) Disegnare e dimensionare lo schema elettronico (la fotocellula sarà disegnata come un interruttore, non si può utilizzare deviatori).
char allarme=0;
char persone=0;
char tempo=0;
interrupt isr()
{
TOIE=0;
tempo++;
if (tempo==37)
{
if (allarme)
{
RB3=!RB3;
RB2=0;
}
else
{
RB2=!RB2;
RB3=0;
}
tempo=0;
}
TOIF=0;
TOIE=1;
}
loop()
{
while(!RB0);
while(RB0);
pezzi++;
if(persone>=500) allarme=1;
while(!RB1);
allarme=0;
persone=0;
}
main()
{
setup();
while(1) loop();
}
Il contapezzi
Si vuole utilizzare un microcontrollore PIC16F84 per realizzare un dispositivo contapezzi.
Il processo è il seguente:
● una fotocellula segnala il passaggio di un pezzo sul nastro trasportatore, il PIC attende RB0=1, poi attende RB0=0, poi incrementa una variabile che rappresenta il numero di pezzi contati
● viene attivato il timer0 in modo che conteggi il tempo massimo possibile
● a interrupt ogni 200 ms il PIC fa lampeggiare (con duty cycle=50%) un led verde collegato a RB1
● se si supera i 1000 pezzi il PIC fa lampeggiare a interrupt il led rosso collegato a RB2 (sempre ogni 200 ms
con duty cycle 50%)
● si attende il pulsante di reset (RB3=1) per tornare all'inizio del programma
1) Disegnare il diagramma di flusso del programma e dell'interrupt.
2) Ipotizzando di avere un clock a 4 MHz, scrivere in linguaggio C il programma dividendolo nelle seguenti parti: inizializzazione pin e timer, inizializzazione dell'interrupt, interrupt, main.
3) Disegnare e dimensionare lo schema elettronico (la fotocellula sarà disegnata come un interruttore, non si può utilizzare deviatori).
La foratrice
Una cella di foratura dispone di un trapano a colonna dotato di un pistone.
Un microcontrollore PIC16F84 controlla il processo di foratura.
Il processo è il seguente:
● si attende che venga premuto il pulsante (RB0=1)
● si controlla che lo sportello di protezione (RB1=1) sia chiuso, se non lo è si torna all'inizio
● si attiva un pistone (RB2=1) che fa scendere il trapano (il trapano torna nella posizione di riposo grazie a una molla)
● si attende la discesa del trapano per 1 secondo
● si accende il motore del trapano (RB3=1)
● si controlla che il pulsante sia premuto e lo sportello sia chiuso, quando non è più verificata una di queste due condizioni si disattiva subito motore e pistone e si riparte dall'inizio
1) Disegnare il diagramma di flusso del programma.
2) Ipotizzando di avere un clock a 4 MHz, scrivere in linguaggio C il programma dividendolo nelle seguenti parti: inizializzazione dei pin, inizializzazione dell'interrut, interrupt, main.
3) Disegnare e dimensionare lo schema elettronico (la fotocellula sarà disegnata come un interruttore, non si può utilizzare deviatori).
La pressa
Si vuole utilizzare un microcontrollore PIC16F84 per realizzare il controllo di una pressa.
Il processo è il seguente:
● si attende la pressione dei due pulsanti di attivazione della pressa, posti a una distanza di 1 metro tra di loro, RB1=1 e RB2=1
● si chiude la pressa (RB0=1)
● si attende un tempo di 16 secondi esatti (utilizzare il timer e l'interrupt)
● si disattiva la pressa
● si attende che i pulsanti siano stati rilasciati entrambi e si torna all'inizio
il pulsante di reset (RB1=1) per tornare all'inizio del programma
1) Disegnare il diagramma di flusso del programma.
2) Ipotizzando di avere un clock a 4 MHz, scrivere in linguaggio C il programma dividendolo nelle seguenti parti: inizializzazione pin e timer, inizializzazione dell'interrupt, interrupt, main.
3) Disegnare e dimensionare lo schema elettronico (la fotocellula sarà disegnata come un interruttore, non si può utilizzare deviatori).
Giochi di luci
Si vuole utilizzare un microcontrollore PIC16F84 per realizzare tre giochi di luci.
Il processo è il seguente:
● a interrupt si accendono 12 led secondo tre modalità: lampeggio ogni secondo, lampeggio ogni 3 secondi, lampeggio ogni 6 secondi, con duty cycle del 50% in ogni modalità
● nel main si attende la pressione di un pulsante RB0 e al suo rilascio si cambia modalità
1) Disegnare il diagramma di flusso del programma e dell'interrupt.
2) Ipotizzando di avere un clock a 4 MHz, scrivere in linguaggio C il programma dividendolo nelle seguenti parti: inizializzazione pin e timer, inizializzazione dell'interrupt, interrupt, main.
3) Disegnare e dimensionare lo schema elettronico (la fotocellula sarà disegnata come un interruttore, non si può utilizzare deviatori).
Insegna luminosa
Si vuole utilizzare un microcontrollore PIC16F84 per realizzare il controlo di un insegna luminosa.
Il processo è il seguente:
● il PIC attende il livello logico basso da un sensore di luce (RB0=0), in modo da attivare l'insegna quando è buio
● ad interrupt si accendono in sequenza le seguenti uscite:
- RB1 e RB2
- dopo 0,8 secondi RB3 e RB4
- dopo 0,8 secondi RB5 e RB6 e si spengono tutte le altre
- dopo 0,4 secondi RB7 e RA0
- dopo 0,4 secondi si spengono tutte
- dopo 0,4 secondi si ritorna all'inizio
1) Disegnare il diagramma di flusso del programma e dell'interrupt.
2) Ipotizzando di avere un clock a 4 MHz, scrivere in linguaggio C il programma dividendolo nelle seguenti parti: inizializzazione pin e timer, inizializzazione dell'interrupt, interrupt, main.
3) Disegnare e dimensionare lo schema elettronico (la fotocellula sarà disegnata come un interruttore, non si può utilizzare deviatori).
Il sumorobot
Si vuole utilizzare un microcontrollore PIC16F84 per realizzare il controlo di un minisumo robot.
Il processo è il seguente:
● il PIC attende che venga premuto il pulsante di partenza (RB0=1)
● attende 5 secondi
● accende i due motori per andare avanti (RA0=1, RA2=0, RA2=1, RA3=0)
● l'interrupt si sentono due sensori di prossimità (RB4 e RB5) con la seguente modalità:
- se RB4=1 (siamo sul bordo bianco) si torna indietro (RA0=0, RA2=1, RA2=0, RA3=1) per 2 secondi e si gira verso destra il robot per altri 2 secondi (RA0=1, RA2=0, RA2=0, RA3=1)
- se RB5=1 (siamo sul bordo bianco) si torna indietro (RA0=0, RA2=1, RA2=0, RA3=1) per 2 secondi e si gira il verso sinistra il robot per altri 2 secondi (RA0=0, RA2=1, RA2=1, RA3=0)
L'utilizzo del timer è facoltativo
1) Disegnare il diagramma di flusso del programma e dell'interrupt.
2) Ipotizzando di avere un clock a 4 MHz, scrivere in linguaggio C il programma dividendolo nelle seguenti parti: inizializzazione pin, inizializzazione dell'interrupt, interrupt, main.
3) Disegnare e dimensionare lo schema elettronico (la fotocellula sarà disegnata come un interruttore, non si può utilizzare deviatori).
Il tornello del cinema
Un impianto elettronico deve contare le persone che entrano in un cinema tramite un tornello che invia un livello logico alto su RA0 ogni volta che una persona entra. Poi su RA0 torna il livello logico basso.
L'impianto viene acceso ogni giorno alle ore 19 e alle 24 viene spento.
Ogni volta che cambia il film proiettato il gestore registra il numero totale degli spettatori attraverso un display e preme il bottone di reset (collegato a RA1) per azzerare il conteggio degli spettatori.
Disegnare lo schema elettronico.
Scrivere il programma in C di gestione del PIC.
Traccia per la soluzione:
il PIC ha 13 pin disponibili come ingressi o uscite, 2 sono impegnati come ingressi dal sensore e dal reset, gli altri sono disponibili come uscite per uscire con un numero binario che verrà convertito con un convertitore binario-7segmenti per essere inviato a 4 display 7 segmenti.
Per programmare il PIC possiamo sfruttare la eeprom per immagazzinare i dati di conteggio. Per questo occorre utilizzare un altro pin (RA2) come ingresso per attivare la memorizzazione sulla eeprom.
A questo punto si può calcolare il numero di pin liberi e il numero di spettatori massimo che si può contare, ovvero quello che sarà possibile mostrare sul display
Per scrivere il programma si parte dalla procedura di inizializzazione: tre ingressi (RA0-RA2) e gli altri pin uscite.
Si scrive la procedura di lettura e di scrittura della eeprom. Si scrive il main.
Il main inizia con la lettura della eeprom (il numero di spettatori precedente), poi si potrebbe impostare come un ciclo senza fine:
- una lettura dei tre ingressi
- quando RA0=1 avviene l'incremento del numero degli spettatori e si aggiorna l'uscita in modo da visualizzare il nuovo numero
- quando RA1=1 si azzera il conteggio
- quando RA2=1 si scrive il conteggio nella eeprom
Il circuito sarà composto da un PIC, un pulsante di reset, un pulsante che rappresenta l'ingresso dello spettatore, un pulsante di memorizzazione, gli altri pin si collegano ad un encoder binario-7segmenti (un blocco) e poi a quattro display.
Il cronometro di gara
Un PIC deve gestire un cronometro da gara di corsa. Il piedino RA0 viene collegato al pulsante che dà il via alla gara.
Il piedino RA1 viene collegato al sensore che segna il passaggio del primo concorrente dal traguardo (con un fronte di salita dal livello logico basso a quello alto).
Disegnare lo schema elettronico.
Scrivere il programma in C di gestione del PIC.
Traccia per una delle soluzioni possibili :
il PIC ha 13 pin disponibili come ingressi o uscite, 2 sono impegnati come ingressi dal sensore e dal pulsante, gli altri sono disponibili come uscite per uscire con un numero binario che verrà convertito con un convertitore binario-7segmenti per essere inviato a 4 display 7 segmenti.
Per programmare il PIC possiamo utilizzare il timer e l'interrupt per contare il tempo.
A questo punto si può calcolare il numero di pin liberi e il tempo massimo che si può contare, ovvero quello che sarà possibile mostrare sul display.
Per scrivere il programma si parte dalla procedura di inizializzazione: due ingressi (RA0-RA1) e gli altri pin uscite.
Si inizializza il timer che conterà da 0 a 255 e l'interrupt a fine conteggio (al passaggio da 255 a 0), che serve a contare il numero di cicli da 0 a 255.
Il main inizia con un ciclo senza fine:
- una lettura dei due ingressi
- quando RA0=1 avviene l'azzeramento del conteggio del tempo (si parte da t=0)
- quando RA1=1 il conteggio si blocca
Il circuito sarà composto da un PIC, un pulsante di azzeramento, un pulsante che rappresenta il sensore del traguardo, gli altri pin si collegano ad un encoder binario-7segmenti (un blocco) e poi a quattro display.