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.