Sedicesima parte del tutorial di Marco Gottardo sui PIC. Stesura di Marco Visentini. Mini shield Display LED universale a 4 digit.

Let's Go Pic!!!

Cap.16.

 

Micro-GT mini shield Display led universale a 4 digit

Autore Marco Visentini con la supervisione e introduzione di Marco Gottardo as "ad.noctis" 

Presentiamo un mini shield estremamente utile per le esercitazioni di controllo del display a 7 segmenti sia di tipo ad anodo comune che di tipo a catodo comune. 

Essenziale per i laboratori scolastici e la realizzazione di tesine. 

Nato per la Micro-GT mini è interfacciabile a qualsiasi microcontrollore.

Descrizione

Questo Mini shield sviluppato per la Micro-GT mini, ma funzionante con qualsiasi sistema a microcontrollore mette a disposizione 4 digit a 7 segmenti con i transistor di pilotaggio sia per il tipo a catodo comune  che anodo comune.

È possibile il controllo di ogni singolo punto decimale benché sia predisposto un canale preferenziale per l'accensione della virgola al digit centrale in modo da semplificare la realizzazione di orologi.

Sono disponibili gli accessi TTL per ogni punto di controllo con la seguente piedinatura:

 

connettore SV1

connettore SV2 

connettore SV3

connettore a vite X1

 

Analisi circuitale

Nello schema compaiono 8 display connessi 2 a 2 al medesimo bus dati.

In realtà saranno alloggiati nel medesimo zoccolo per mantenere la doppia funzionalità in modalità anodo comune o catodo comune.

Rimangono però sdoppiati i bjt di controllo che saranno di tipo NPN per il tipo a catodo comune e PNP per il tipo a catodo comune.

 

 

 

 

 

I segnali di comando sono di tipo TTL quindi a 5 volt DC, dato che sia i BC337 che il complementare BC327 hanno una hfe pari a 250, ed avendo una corrente massima di collettore compresa tra 0,8 e 1A, ne consegue che saturano con soli 2 mA in base.
 

 

 

 

Si consiglia di non saldare direttamente il display sul PCB ma di montare uno zoccolo DIL da 40 pin in modo da garantire l'intercambiabilità del display ad anodo/catodo comune quando si usa lo shield abbinato ad una Micro-GT mini per ragioni sperimentali.  

Quando invece lo si voglia impegnare a bordo macchina, una volta decisa la tipologia dei display si potrà evitare ilmontaggio dei 4 transistor e del connettore inutilizzato.

Per quanto riguarda il morsetto a vite è predisposto per fornire i riferimenti di tensione e massa direttamente prelevabili dai morsetti predisposti nella Micro-gt mini X2-1 => Vcc, e X2-2 => Gnd. 

Ne consegue che la resistenza di polarizzazione Rb vale 2k2Ω sia per i PNP che per gli NPN.

L'equazione di maglia è la seguente:

(Vin-Vbe)/2mA=2k2

 

Vediamo nei filmati youtube, commentati da ad.noctis as Marco Gottardo la funzionalità del display. Potrai anche scaricare i sorgenti e gli hex delle prove in modo da poter provare per conto tuo.



 

Nel primo esercizio è sviluppato un programma che esegue il countdown sul display meno significativo ciclando nelle cifre da 9 a 0 e poi si ripete.

/**********************************************
*    CONTEGGIO SUL DISPLAY DA 9 A 0    *
*          PIC 16F876A                                        *
*           27/03/2010                                          *
*                                                                          *
*        MARCO VISENTINI                               *
*     Gruppo G-Tronic Robotics                    *
**********************************************/

#include <pic.h>
#include "always.h"
#include "delay.h"
void main(){
TRISB=0;
TRISC=0;
while(1){
PORTB=0b01101111;
PORTC=0b00000001;   
DelayS(1);
PORTB=0b01111111;
DelayS(1);
PORTB=0b00000111;
DelayS(1);
PORTB=0b01111100;
DelayS(1);
PORTB=0b01101101;
DelayS(1);
PORTB=0b01100110;
DelayS(1);
PORTB=0b01001111;
DelayS(1);
PORTB=0b01011011;
DelayS(1);
PORTB=0b00000110;
DelayS(1);
PORTB=0b00111111;
DelayS(2);       
        }

}

 

vediamo come multiplexare i digit del display, ovvero come visualizzare due cifre in tempi alternati avendo l'impressione che siano contemporanemente presenti.


 

La seconda prova aggiunge il controllo multiplexato dei catodi comuni dei 4 display, ovvero il countdown viene fatto scorrere sui 4 digit disponibili.

Il video è molto elequiente.  È da notare la velocità con cui la Micro-GT mini riesce a caricare  ll file hex.

 

/**************************************************
* CONTEGGIO SUL DISPLAY DA 9 A 0   *
*                  PIC 16F876A                       *
*                    27/03/2010                        *
*                                                              *
*                 MARCO VISENTINI                *

*            Gruppo G-Tronic Robotics         *
*                                                               *
***************************************************/

#include <pic.h>
#include "always.h"
#include "delay.h"
void main(){
TRISB=0;
TRISC=0;
while(1){
PORTB=0b01101111;
PORTC=0b00000001;    
DelayS(1);
PORTB=0b01111111;
PORTC=0b00000010;
DelayS(1);
PORTB=0b00000111;
PORTC=0b00000100;
DelayS(1);
PORTB=0b01111100;
PORTC=0b00001000;
DelayS(1);
PORTB=0b01101101;
PORTC=0b00000001;
DelayS(1);
PORTB=0b01100110;
PORTC=0b00100010;
DelayS(1);
PORTB=0b01001111;
PORTC=0b01000100;
DelayS(1);
PORTB=0b01011011;
PORTC=0b00001000;
DelayS(1);
PORTB=0b00000110;
PORTC=0b00000001;
DelayS(1);
PORTB=0b00111111;
PORTC=0b00000010;
DelayS(2);        
        }

}
 



 

da questo link puoi scaricare il file hex e i sorgenti della visualizzazione del countdown

download esercizio countdown con lo shift

 

L'ultimo esercizio proposto riguarda la realizzazione di un cronometro, modificabile anche come orologio a 24 ore che visualizza minuti ore su 4 digit disponibili.

Il software è presentato nella sua funzionalità minima e lasciato al lettore del corso Let's GO PIC!!! per completare la realizzazione come utile esercizio.

/**********************************************
*  CONTEGGIO SUL DISPLAY DA 9 A 0     *
*                  PIC 16F876A                                *
*                  27/03/2010                                   *
*                                                                          *
*               MARCO VISENTINI                         *
*         Gruppo G-Tronic Robotics                 *
**********************************************/

#include <pic.h>
#include "always.h"
#include "delay.h"

void main(){
int cont;
char min;
char ore;
char sec;
char min1;
char min2;
char ore1;
char ore2;
TRISB=0;
TRISC=0;
sec=0;
min=0;
ore=0;
min1=0;
min2=0;
ore1=0;
ore2=0;
cont=0
;
 
while(1){
PORTC=0b00000000;
PORTB=0b10000000;

DelayMs(1);
sec=sec+1;
 
if (sec==60){
    sec=0;
    min1=min1+1;
   
    }
    if (min1==10){
        min2=min2+1;
        min1=0;
        }
        if (min2==6){
        min2=0;
        ore1=ore1+1;
        }
        if (ore1==10){
            ore1=0;
            min1=0;
            ore2=ore2+1;
                if (ore2==2){
            ore1=0;
        }
            }
           
        if ((ore2==2)&&(ore1==4)){
            ore1=0;
            ore2=0;
        }
        if (min1==0){

           
PORTB=0b10111111;           
            PORTC=0b00000001;
            DelayMs(1);
            PORTC=0b00000000;
            }
           
        if (min1==1){
            PORTB=0b00000110;
            PORTC=0b00000001;
            DelayMs(1);
            PORTC=0b00000000;

            }
           
        if (min1==2){
            PORTB=0b11011011;
            PORTC=0b00000001;
            DelayMs(1);
            PORTC=0b00000000;

            }
           
        if (min1==3){
            PORTB=0b01001111;
            PORTC=0b00000001;
            DelayMs(1);
            PORTC=0b00000000;

            }
           
        if (min1==4){
            PORTB=0b11100110;
            PORTC=0b00000001;
            DelayMs(1);
            PORTC=0b00000000;

            }
           
        if (min1==5){
            PORTB=0b01101101;
            PORTC=0b00000001;
            DelayMs(1);
            PORTC=0b00000000;

            }
           
        if (min1==6){
            PORTB=0b11111100;
            PORTC=0b00000001;
            DelayMs(1);
            PORTC=0b00000000;

            }
           
        if (min1==7){
   
            PORTB=0b00000111;
            PORTC=0b00000001;
            DelayMs(1);
            PORTC=0b00000000;

            }
           
        if (min1==8){
            PORTB=0b11111111;
            PORTC=0b00000001;
            DelayMs(1);
            PORTC=0b00000000;

            }
           
        if (min1==9){
            PORTB=0b01101111;
            PORTC=0b00000001;
            DelayMs(1);
            PORTC=0b00000000;

            }
           
           
        if (min2==0){
            PORTB=0b00111111;
            PORTC=0b00000010;
            DelayMs(1);
            PORTC=0b00000000;

            }
           
        if (min2==1){
            PORTB=0b00000110;
            PORTC=0b00000010;
            DelayMs(1);
            PORTC=0b00000000;

            }
           
        if (min2==2){
            PORTB=0b01011011;
            PORTC=0b00000010;
            DelayMs(1);
            PORTC=0b00000000;

            }
           
        if (min2==3){
            PORTB=0b01001111;
            PORTC=0b00000010;
            DelayMs(1);;
            PORTC=0b00000000;

            }
           
        if (min2==4){
            PORTB=0b01100110;
            PORTC=0b00000010;
            DelayMs(1);
            PORTC=0b00000000;

            }
           
        if (min2==5){
            PORTB=0b01101101;           
            PORTC=0b00000010;
            DelayMs(1);
            PORTC=0b00000000;

            }
           
        if (min2==6){
            PORTB=0b01111100;           
            PORTC=0b00000010;
            DelayMs(1);
            PORTC=0b00000000;

            }
           
        if (ore1==0){
            PORTB=0b00111111;           
            PORTC=0b00000100;
            DelayMs(1);
            PORTC=0b00000000;

            }
        if (ore1==1){
            PORTB=0b00000110;
            PORTC=0b00000100;
            DelayMs(1);
            PORTC=0b00000000;

            }
           
        if (ore1==2){
            PORTB=0b01011011;           
            PORTC=0b00000100;
            DelayMs(1);
            PORTC=0b00000000;

            }
           
        if (ore1==3){
            PORTB=0b01001111;           
            PORTC=0b00000100;
            DelayMs(1);
            PORTC=0b00000000;

            }
           
        if (ore1==4){
            PORTB=0b01100110;           
            PORTC=0b00000100;
            DelayMs(1);
            PORTC=0b00000000;

            }
           
        if (ore1==5){
            PORTB=0b01101101;           
            PORTC=0b00000100;
            DelayMs(1);
            PORTC=0b00000000;

            }           
        if (ore1==6){
            PORTB=0b01111100;           
            PORTC=0b00000100;
            DelayMs(1);
            PORTC=0b00000000;

            }
           
        if (ore1==7){
            PORTB=0b00000111;           
            PORTC=0b00000100;
            DelayMs(1);
            PORTC=0b00000000;

            }
           
        if (ore1==8){
            PORTB=0b01111111;           
            PORTC=0b00000100;
            DelayMs(1);;
            PORTC=0b00000000;

            }
           
        if (ore1==9){
            PORTB=0b01101111;           
            PORTC=0b00000100;
            DelayMs(1);;
            PORTC=0b00000000;

            }
           
        if (ore1==10){
            PORTB=0b00111111;           
            PORTC=0b00000100;
            DelayMs(1);
            PORTC=0b00000000;

            }
           
            if (ore1==9){
            PORTB=0b01101111;           
            PORTC=0b00000100;
            DelayMs(1);
            PORTC=0b00000000;

            }
           
           
        if (ore2==0){
            PORTB=0b00111111;           
            PORTC=0b00001000;
            DelayMs(1);
            PORTC=0b00000000;

            }
           
        if (ore2==1){
            PORTB=0b00000110;
            PORTC=0b00001000;
            DelayMs(1);
            PORTC=0b00000000;

            }
           
        if (ore2==2){
            PORTB=0b01011011;           
            PORTC=0b00001000;
            DelayMs(1);
            PORTC=0b00000000;

            }
            
    /*    }

       
if
       
PORTB=0b01011011;   
PORTC=0b00000001;
DelayMs(1);
PORTB=0b00000110;
PORTC=0b00000010;
DelayMs(1);
PORTB=0b01011011;
PORTC=0b00000100;   
DelayMs(1);
PORTB=0b00000110;
PORTC=0b00001000;
DelayMs(1);



PORTB=0b00000111;
PORTC=0b00000100;
DelayS(1);
PORTB=0b01111100;
PORTC=0b00001000;
DelayS(1);
PORTB=0b01101101;
PORTC=0b00000001;
DelayS(1);
PORTB=0b01100110;
PORTC=0b00100010;
DelayS(1);
PORTB=0b01001111;
PORTC=0b01000100;
DelayS(1);
PORTB=0b01011011;
PORTC=0b00001000;
DelayS(1);
PORTB=0b00000110;
PORTC=0b00000001;
DelayS(1);
PORTB=0b00111111;
PORTC=0b00000010;
DelayS(2);    */   
        }

}

Scarica dal link sottostante il progetto hitech C16 per PIC 16F876A il cronometro digitale:

ESERCIZIO.zip

 



 

I gerber del PCB del mini shield sono disponibili per la realizzazione professionale.

Se volete un vostro esemplare del PCB della Micro-GT mini chiedetela pure con messaggio privato.

 

Con questo abbiamo presentato un versatile strumento che tornerà molto utile non solo a studenti che devono presentari tesi e tesine ma anche agli hobbisti e in qualche caso ai professionisti.

I programmi software presentati sono semplici e utili a livello dimostrativo della funzionalità, potreste produrne di vostri molto più potenti.

Buon divertimento a tutti con il corso  Let's GO PIC!!!

 

   This opera "Let's GO PIC16" By G-Tronic Robotics group is licensed under a:

Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Italy License