PIC16F876 - verifica
ESERCIZIO 1 - Misura della distanza di un oggetto da 2 sensori
Un microcontrollore PIC16F876 viene utilizzato per misurare la distanza di un oggetto da due sensori a infrarossi collegati i pin AN0 e AN1.
Il PIC attende che l'ingresso RB1 vada alto per almeno 1 secondo, al termine legge AN0, poi AN1, calcola la media della distanza.
Se la media è inferiore a 0x2FC il PIC accende un led gradualmente da 0 al 100% su RC2 in due secondi, spenge il led e torna all'inizio.
Scrivere il programma in linguaggio C.
ESERCIZIO 2 - Lettura di 2 sensori e visualizzazione
Scrivere un programma in linguaggio C per il microcontrollore PIC16F876 per leggere due sensori di prossimità CNY70 attraverso il pin RA0 e RA1.
Il livello di prossimità deve essere memorizzato in due variabili.
Il programma poi legge un pulsante collegato all'ingresso RA2 e visualizza la tensione maggiore su un display a 7 segmenti a 2 cifre pilotato dai pin RB0'-7 collegati a 2 decoder BCD-7segmenti.
ESERCIZIO 3 - Il livello della batteria
Scrivere un programma in linguaggio C per il microcontrollore PIC16F876 per leggere i valori di tensione di due batterie AAA attraverso i pin RA0 e RA1.
Il livello di tensione deve essere memorizzato in due variabili, il programma poi legge un pulsante collegato all'ingresso RB0, se il pulsante viene premuto, il PIC accende i led tra i due led collegati a RC1 e RC2 per indicare la carica delle due batterie con una luminosità proporzionale alla tensione misurata sull'ingresso corrispondente.
I led rimangono accesi per un tempo corrispondente a 10 secondi, poi si torna all'inizio.
ESERCIZIO 4 - La taratura dei sensori
Scrivere un programma in linguaggio C per il microcontrollore PIC16F876.
Il programma legge un pulsante collegato all'ingresso RB0, se il pulsante viene premuto per almeno tre secondi, il PIC legge i valori di tensione di due sensori attraverso i pin RA0 e RA1, il PIC calcola la media e la assegna alla variabile generale BIANCO.
Il Pic attende 2 secondi.
Il programma rilegge il pulsante collegato all'ingresso RB0, se il pulsante viene premuto, il PIC legge i valori dei due sensori, calcola la media e la assegna alla variabile generale NERO.
Il Pic attende 2 secondi, poi si torna all'inizio.
ESERCIZIO 5 - Il salvataggio
Scrivere un programma in linguaggio C per il microcontrollore PIC16F876.
Il programma consiste nella gestione a interrupt di due motori in corrente continua mediante un driver L298.
Il PIC legge un pulsante collegato all'ingresso RB0, se il pulsante viene premuto e rilasciato, il PIC attende 5 secondi. Poi il PIC va sempre avanti.
A interrupt il PIC legge ogni 16 ms i valori di tensione di due sensori CNY70 attraverso i pin RA0 e RA1.
Se il PIC verifica che uno dei due valori letti è inferiore alla media tra le due variabili generale BIANCO e NER, il PIC attiva le procedura salvataggio1() o salvataggio2() in funzione del sensore.
ESERCIZIO 6 - Batteria scarica
Scrivere un programma in linguaggio C per il microcontrollore PIC16F876.
Il programma attiva il Brown-out Reset in modo da verificare il livello delle batterie. Se avviene il reset il PIC accende un led collegato a RC0 per segnalare le batterie scariche.
Bozza risposta
main()
{
if (BOR) RA=1; // Il bit BOR si trova nel registro PCON nel banco 1
setup();
...
}
ESERCIZIO 7 - Il sensore da tarare
Scrivere un programma in linguaggio C per il microcontrollore PIC16F876 per tarare due sensori di prossimità di un sumorobot attraverso i pin RA0 e RA1. Il programma verifica che il pulsante di taratura sia premuto (pin RB1) per almeno tre secondi. Poi legge il bianco attraverso due ingressi analogici (RA0 e RA1), memorizza le variabili lette e accende un led rosso (pin RC1) per 1 secondo con il 70% di luminosità, poi attende di nuovo che il pulsante venga premuto, infine legge nuovamente i due ingressi (il nero), accende il led rosso (pin RC1) con il 100% di luminosità e calcola il valore di soglia tra il nero e il bianco. Alla fine del programma si ripete dall'inizio.
ESERCIZIO 8 - Test delle batterie
Riscrivere, correggendo e modificando, il programma seguente, scritto in linguaggio C, per il microcontrollore PIC16F876 per leggere i valori di tensione di tre batterie AAA attraverso il pin RA0, RA1 e RA2, il livello di tensione deve essere memorizzato in tre variabili, il programma poi legge un pulsante collegato all'ingresso RB0, se il pulsante viene premuto, il PIC accende un led tra i tre led collegati a RC3, RC4, RC5 per indicare le batterie con minor carica, contemporaneamente il PIC accende progressivamente un led collegato al pin RC1 in 3 secondi e poi lo spegne gradualmente sempre in 3 secondi. Al termine vengono spenti i led e si torna all'inizio.
Bozza correzione
#include <pic.h>
void DelayMilliSecondi(unsigned long j) // delay 10 sec - j = 310.000
{
unsigned long i;
i=0; // 4 MHz clock
while( i<=j ) // 34 us
i++;
}
void setup()
{
ADCON1=0b10000110 // all digital - right justified
TRISA=0xFF; // all inputs
TRISB=0xFF; // all inputs
TRISC=0x00; // led on RC1
PORTC=0x00; // all leds off
PR2=0xFF; // pwm period - low frequency
CCP1CON=0x0C; // enable pwm
T2CON=0x04; // enable TMR2
CCPR1L=0x00; // clear duty cicle
ADCON1=0b10000000; // right justify - all adc pins
... // setup timer0 e interrupt
}
unsigned int LeggiADC(unsigned char channel)
{
unsigned char a;
int j;
channel<<=3;
ADCON0=0b10000001 | channel; // adc clock - channel select - adc on
DelayMilliSecondi(1); // channel delay
GO_DONE=1; // adc start
while(GO_DONE); // wait adc end
a=ADRESL; // a = LS adc result
j=(ADRESH*256)+a; // j=MSB*256+LSB example: 0b00000001*256+0b00000000
DelayMilliSecondi(1); // adc delay
return(j);
}
void WritePwm(unsigned char pulse)
{
CCPR1L=pulse; // assign duty cicle
}
loop()
{
unsigned int valoreADC[3];
unsigned char ch;
while(!RB0)
for(ch=0;ch<=2;ch++)
valoreADC[ch]=LeggiADC(ch);
if (valoreADC[0]<valoreADC[1])
{
if (valoreADC[0]<valoreADC[2]) RC3=1;
else if (valoreADC[2]<valoreADC[0]) RC5=1;
}
else
{
if (valoreADC[1]<valoreADC[2]) RC2=1;
else if (valoreADC[2]<valoreADC[1]) RC5=1;
}
if (RC3)
ImpostaPWM(valoreADC[0]);
if (RC4)
ImpostaPWM(valoreADC[1]);
if (RC5)
ImpostaPWM(valoreADC[2]);
DelayMilliSecondi(310000);
ImpostaPWM(0);
}
void main(void)
{
setup();
while(1) loop();
}
ESERCIZIO 9 - Il tornello del cinema
Un impianto elettronico deve contare le persone che entrano in un cinema (capienza 50 postia massimo) tramite un sensore che invia un fronte in salita e poi un fronte in discesa su RA0 ogni volta che una persona entra.
L'impianto viene acceso all'ingresso della prima persona e viene resettato tramite il pin RA1=1 quando finisce il film. La sera l'impianto viene spento.
Il PIC deve fornire sulle uscite PORTB in codice binario il numero totale degli spettatatori che sono entrati.
Il gestore puo' azzerare il numero premendo per almeno 5 secondi un pulsante collegato a RA2.
All'uscita il gestore preme il pulsante RA2 e il PIC registra sulla Eeprom il numero totale degli spettatori entrati e azzera il conteggio sulla capienza della sala.
Il PIC avverte se la capienza della sala è stata superata fancendo lampeggiare alternativamente due led collegati a RA3 e a RA4.
Scrivere il relativo programma in linguaggio C per il microcontrollore PIC16F876.