VO 10/07/2016
rev 22/01/2017
TEST Interface 8 digits 7 segment MAX7219
avec PIC18F45K22
Affichage
sur 8 digits 7 segments
Amelioration
partie Mesure LM335
La carte Ready For PIC 18F45K22
Lien sur Presentation Ready For
PIC 18F45K22 board
Interface 8 digits 7 segment MAX7219
HARDWARE :
Lien pour plus de details sur le MAX7219 :
Version pour Demo Board 16F887
Le module d'affichage est relié au PIC18F45K22 à la carte Ready
For PIC via 5 fils
2 fils : alimentation 5V bornier PWR +V et GND
3 fils SPI :
RC3 ->Clk ouput to -> CLK MAX7219
RC5 -> SDO output to -> DIN MAX7219
RC2 - >output to CS MAX7219
RC4 - SDI non connecté
La liaison USB assume 3 fonctions :
Alimente l'ensemble en 5V. nota: Strap
Alim coté 5V
le chargement du programme avec le logiciel MikroE Bootloader
Une laison Port COM Virtuel avec UART1 (ici COM13)
RC6 et RC7 UART1 sont relié au circuit FTDI de la carte
ce qui permet aussi l' acces au USB serial Terminal MikroE
Schema de principe :
liaison SPI1 Hardware extrait Datasheet :
SOFTWARE (MikroC)
void MAX7219_Init(void);
void MAX7219_Mode_BCD(void);
void MAX7219_Mode_7seg(void);
void MAX7219_Affiche_ON (void);
void MAX7219_Affiche_OFF (void) ;
void MAX7219_Efface(void);
void MAX7219_Affiche_Long(unsigned long L);
void MAX7219_Affiche_HELP();
unsigned char MAX7219_LookupCode (char cx);
void MAX7219_Write (unsigned char reg_number, unsigned char
dataout);
void MAX7219_Display_Char (char digit, char character) ;
void MAX7219_Luminosite_Maxi(void);
void MAX7219_Luminosite_Mini(void);
void MAX7219_Display_Text(char * T);
void MAX7219_Luminosite(int Lu); // reglage 0 à 3
void MAX7219_Display_Temp(char ici,char * T);
void fltToa (float x, unsigned char *str,char precision); // 972
bytes;
void floattostr1(float n_decimal,char *texto_); // 2608 bytes
Le MAX7219 possede un decodage interne BCD
permettant l'affichage direct de valeur 0 à 9
A noter :
void floattostr1(float n_decimal,char *texto_);
Formatte la sortie sur un nombre immuable de digits , avec Nb de
decimales variables , mais gamme limitée à +- 9999.9
void MAX7219_Display_Temp(char ici,char
* T);
est adapatée à la mesure de temperature : affichage maxi 655.35
°C. Le point decimal est inclus dans le digit
void MAX7219_Affiche_Long(unsigned long
L);
Affiche un entier long , mais limité par le nombre de digit
99999999 maxi (en mode BCD)
void MAX7219_Display_Text(char * T);
Affiche du Texte en ASCII .. (en Mode 7seg)
Projet zipé:
18F45k22_Max7219_8digits_with_UART_160710.zip
contenu du zip:
Partie Mesure de Temperature avec LM335
:
*brochage LM335 , vue de dessus
Shema du Bloc
Breadboard deporté :
![]() |
![]() |
schema mesure LM335 + references | montage sur mini breadboard 400 pts |
Le potar permet de regler au mieux la tension de sortie du LM335
à 2930 mV pour Tamb=20°C
Pour augmenter la resolution et stabilité de mesure,utilisation
d'un effet loupe, grace
à l'usage de tension de reference +Vref=4.096V et -Vref =2.50V
Cela mobilise respectivement les 2 entree RA3 et RA2 ..
Les fonctions biblio MikroC: Init_ADC et Read ADc ne
convienent plus dans ce cas
car utilisent par defaut VSS (0V) et VCC (+5V) comme references
ADC.
On programme donc directement les registres du PIC .. pour EA0
void Init_ADC_Vref_externes(void)
{
//REGISTER 17-1: ADCON0: A/D CONTROL REGISTER 0
ADCON0=0x01; // channel 0 par defaut et ADON=1 enabled
//REGISTER 17-2: ADCON1: A/D CONTROL REGISTER 1
// bit 3-2 PVCFG<1:0>: Positive Voltage Reference
Configuration bits
//01 = A/D VREF+ connected to external pin, VREF+
ADCON1.PVCFG1=0;
ADCON1.PVCFG0=1;
// bit 1-0 NVCFG<1:0>: Negative Voltage Reference
Configuration bits
//01 = A/D VREF- connected to external pin, VREF
ADCON1.NVCFG1=0;
ADCON1.NVCFG0=1;
// REGISTER 17-3: ADCON2: A/D CONTROL REGISTER 2
// bit 7 ADFM: A/D Conversion Result Format Select bit
ADCON2.ADFM=1; // Right justified
// bit 5-3 ACQT<2:0>: A/D Acquisition time select bits 100
= 8 TAD
ADCON2.ACQT2=1;
ADCON2.ACQT2=0;
ADCON2.ACQT2=0;
// bit 2-0 ADCS<2:0>: A/D Conversion Clock Select bits
ADCON2.ADCS2=0; // 001 = FOSC/8
ADCON2.ADCS1=0;
ADCON2.ADCS0=1;
}
Les sorties references tensions sont connectées sur les entrees
RA2 et RA3
La mesure LM335 (ajustée par potar) connectée sur RA0
La procedure peut etre eventuellement modifiée/adaptée pour
lire les autres channels ADC..
le bloc 2 ref + Lm335 est relié via un connecteur HE10
à la Carte READY FOR PIC 18F45K22
HARDWARE :
![]() |
prototype |
2.927-2.730=187 => 18.7°C
Nota:
le point decimal est inclus dans le
meme afficheur ( OU avec 2 fontes caracteres)
via une procedure specifique d'affichage
Resultat sur terminal:
Projet MikroC :
18F45K22_MAX7219_LM335_170103.hex
_18F45k22_Max7219_8digits_LM335_with_UART_170103.c
Test (peu academique !) avec Tout l'ensemble
dehors à 0°C
![]() |
![]() |
LM335 en local sur breadboard, à l'exterieur | (autre) LM335 deporté via 1 M de cable à l'exterieur |
C'est bien mieux avec la partie electronique (VRef ) à l'interieur
..
DECEVANT ! On
mesure 4,13°C au lieu de 0 degres !
Les tensions de reference n'ont pas bronché ! ça c'est un plus .
Le LM335 delivre 2,779 -2,730 => delta 49 mV soit 4,9°C !..
assez coherent avec l'affichage
Probleme etalonnage capteur ?
pourtant déja reglé autour de 20°C amb, via le potar de
reglage
PAS GLOP ...
Le detail de la Data Sheet montre que le version LM335 (sans le A!)
peut accuser un certain decalage de mesure..
d'ou la NECESSITE de CALIBRER l'Offest
et la PENTE de conversion en unite physique(°C)
Offset theorique -23°C => -25°C
Pente theorique 0,156 => 0,160
Avec ces reglages je reste à +-0,2°C en comparatif avec mon
thermometre à alcool , verifié pour -5°C à +20°C.
J'en resterai là .. sinon il faut utiliser un LM335A
trié
ou changer de type de capteur : DS18B20 OWS temperature Sensor..
ou PT1000.
Test avec un AUTRE LM335
=> l' erreur globale reste < |0,5°C| sur la plage testé
temp ambiante de +21 °C à -8°C !
le soft corrigé :
_18F45k22_Max7219_8digits_LM335_with_UART_170107.zip
_18F45k22_Max7219_8digits_LM335_with_UART_170107.c
Max7219_inc.c
Video :
MAX7219_8x7seg_Test.webm