V.O. 17 dec 2015
Rev .05/08/2019
Cliker PIC18F47J53
Le
materiel d'étude et de démonstration(2015)
Prototype
de test
ADC12
bits et Afficheur LCD 2119 2x16 bus I2C
Liaison
UART2 Remappable <-> RS232 avec Terminal Virtuel PC (via
cordon USB-TTL Prolific)
Liaison USB au
MikroE HID Terminal
Test One Wire
Capteur temperature DS18B20
(2016)
Test Oled
Display 0.96" Jaune et Bleu 128x32 SSD1306 en I2C (2016)
version OLED pour 18F26K22
Tracker GPS
pour tests Liaison entre 2 modules Transceivers HC12 (2019)
a suivre..
Carte de
developement MikroE Clicker for PIC18F47J53
17/12/2015
MikroE Manuel utilisateur
![]() |
![]() |
Référence Mikroe : 1487 19$ H.T. | MCU diagram |
Carte comportant :
un MCU 18F47J53 44 pins
un quartz 16Mhz
un regulateur 5V -> 3,3V
une liaison USB ( Alim et Programmation)
un emplacement Mikrobus Click
une connection laterale 5 pins : ICSP
un connecteur 10 pins : lateral 8 I/O + alim 3,3V
2 BP : T1 sur RD3 et T2 sur RD2
2 leds : LD1 sur RA0 et LD2 sur RA1
nota: carte equivalente au PUINGUINO !..avec une connectique
differente
Schema de la carte
HARDWARE :
La carte est alimentée en 3,3v via la liaison
USB 5V -> regulateur de tension => 3,3V alim
MicroChip : Datasheet
du PIC18F47J53
MikroE : Doc
sur cette carte Clicker
Emplacement pour 1 carte fille Click
mikroBus
![]() |
![]() |
MikroBUS Pinout | Liaison PIC18F47J53 et MikroBus |
Prototype
de Test :
Mapping I/O pour utiliser UART2 :
La connectique RD5 et RD6 est bien repérée RX et TX sur le
MikroBus
3 librairies sont necessaire pour utiliser l'UART2
* activer la bibliotheque PPS Peripheral Pin Select
* La librairie UART ( classique)
* la librairie UART_Remappable
Connection des Pin RD5 et RD6 sur l'UART2 :
Liaison via un cable USB/TTL
![]() |
![]() |
Cable PL2303HX USB<-> TTL | liaison direct <-> UART2 |
Cablage :
Noir : Ground 0V
Vert : TX ----> sur RX UART2
Blanc : RX -<-- sur TX UART2
Rouge (+5V USB) ..NON CONNECTE (PIC alimenté en 3,3V)
Nota: les pins PORTD sont 5V tolerants.
Datasheet
Prolific inrterface
prolific Driver : PL2303 Windows
Port COM Virtuel
L'alim 3,3V du LC2119 est dispo sur les pins laterales de la
carte
Nota: cet interface se comporte IDEM que via l'interface 2Tr ->
DB9 PC Vrai port RS232
Software :
Usage de MikroC Pro 6.62 (enregistré!)
Le 1er test software delivré par MikroE .. ne marche pas au 1er
coup !
J'ai trouvé d'ailleur une init contradictoire avec celle de la
datasheet concernant les Entrees Analogiques
1er Test :
Utilise uniquement les ressources de la carte : 2
BP et 2 Leds
Clignotement des 2 leds F(action sur boutons)
18F47J53_Click_Timer0_Leds_Blink..
2em
test :
Mesure ADC 12 Bits sur RA2
.. via un potar alimenté en 3,3V
Rajout du LCD2119 en I2C.. 2x 16 char
Pins I2C2 natives sur RD1 et RD0.. pas besoin du PPS
Usage de ma bibliotheque LCD2119.h .. no problemo
Affichage valeur brute en Points 0 a 4095 et en volts 0,000 a 3,266V
Rajout filtrage arytmetique glissant sur 8
valeurs, affichage en Degres C. ex: 25.456°C
Rajout de UART2 :
Ca se complique a causse des
allocation de Pin aux ressources MCU..
Il faut RELIER / AFFECTER L' UART2 aux pins RD5 et RD6 par
logiciel.
La aussi, l'exemple mikroC est foireux , car ne doit pas
correspondre au 18F47J53 !
Ce sont bien les
numeros RPn de PIN qui sont considéres ICI, pas les numeros
de pin PHYSIQUES du MCU..
Reception Buffer en mode interruption ..envoi d'un
string de 118 bytes en 1 fois ...OK (buffer de 120 cars maxi)
Test envoi commandes clavier: "LD2 ON" ou "LD2 OFF"
.. OK
le projet complet : 18F47J53_Timer0_LCD_I2C2_EA2
3em test :
Rajout terminal HID.. a
suivre
4em test :
Rajout Capteur de temperature Numerique
One Wire DS18B20
Principales Caractéristiques :
-marque yuanbotong
-modele: d108051
-Matiere: acier inoxydable
-Caractéristiques:
Puce DS18B20 température de la sonde, la sonde étanche, en
acier inoxydable,
longueur de câble: 100cm; -Alimentation: 3.0 ~ 5V;
9 ~ 12 chiffres de résolution réglable; .. 3,83?
Wiring: RED (VCC) Yellow (DATA) Black or Green (GND)
DS18B20 data sheet
Montage de test :
nota : la plaque d'essai ne sert que pour relier les 3 pins du DS18B20
+ R de rappel au +3,3V
Le montage est alimenté via la liaison USB (en +5V) , Alim
locale en 3,3V sur la carte Click
DS18B20 et LCD 2119 sont alimentés en 3,3V
Le signal DS18B20 O.W.S. rentre sur RE0 du PIC
Un cordon USB-TTL est connecté sur l'UART2 du PIC .
Le PC affiche aussi les donnees via la liaison USB <-> Port
COM 23 virtuel , logiciel HTerm 08.23 .
La resolution (12bits) est de 0,0625°C
SOFTWARE :
Rappel:
Dans tous Projet il est necessaire d'indiquer ou rappeler :
le type de MCU,
la tension d'alim
Le type de compilateur et version
les bits de config,
la frequence FOSC
le resultat de compilation
L'exemple MikroC ne me donnait qu'une resolution de 0,625 au lieu
des 0,0625 possible annoncés en mode 12 bits.
A l'aide de la data sheet , j'ai donc repris la demarche pour
comprendre comment on determine la mesure finale
voir le diagramme suivant ...
On retouve la partie entiere de la mesure en °C dans les 2
premiers bytes de la memeoire intermediare (scratchpad RAM)
mais , melangée avec la partie decimale et le signe.
Il suffit d'isoler les bon bits et de les concatener pour
reconstituer la partie entiere de la mesure
On la multiplie par 10 000 , et on pose la virgule separatrice
entre unites et decimales,
et on rajoute en fin , la partie decimale (exprimee en 1/10000eme
de degré modulo 625 correspond a 1/16 em de degré
La partie decimale etant sur 4 bits => possibilité 0 a 15 ,
16 pas de 0,0625°C
Pour les valeurs negatives de temperature ,le bit de signe (poids
fort 2^8) du 2em byte = 1
on applique le complement a 2 +1 ( notion de base en logique !)
sur les 2 bytes..
J'attends les grands froids pour test en reel des valeurs
negatives ! ( je sais , il y a le frigo,mais loin de mon bureau)
La precision absolue donnée pour ce capteur est de +-0,5°C ,
grand devant la resolution 0,0625°C
mais ce qui compte c'est surtout la fidelité, repetabilité et
eventuellement hysteresie.
Difficile a apprecier sans un four ETALON ....mais avec un offest
de compensation d'etalonnage,
un filtrage sur quelques mesures, on devrais atteindre un
resultat proche de +-<=0,1°C.
C'est toujours mieux qu'avec un LM35DZ analogique.
La fonction Mesure DS18B20 recupere cete mesure sous 3 formats :
entier long 32 bit , texte , flottant
La mesure est cadrée a droite , sur 9 caracteres.
Le detail du module mesure DS18B20 , dans le main programme, pour
afficher ,au moins 1 fois ,les 9 registres du Scratchpad RAM DS18B20
Ce PIC a la particularité d'avoir un ADC sur 12 bits ! donc 4096
pts 0 a 4095 pour 0 a 3,3V
On peut SIMPLIFIER ce programme, via la compilation conditionelle,
si on a pas encore
pratiqué un des modules. ... il faut toute fois avoir au minimum
l'UART ou le LCD pour visualiser un resultat !
Meme si les PC n'ont plus de port COM, il existe multe solutions
pour avoir un port virtuel COM via USB
voir meme via bluetooth.
Compilation conditionnelle :
pour aciver les modules suivants :
#define With_UART2
#define With_ADC12
#define With_TMR1
#define With LCD2119
#define With_DS18B20
choix d'oscillateur interne ou externe :
#define OSCILLATEUR_INTERNE
Test ou pas de la valeur FOSC , si UART utilisé !
#define TEST_FOSC
Infos (non utilisées par le programme):
#define Project "18F47J53_LCD_UART2_I2C2_ADC_DS18B20_2016.mcppi"
#define PROCESSOR 18F47J53
#define POWER_SUPPLY_3_3V .... bien
qu'alimenté via USB 5V, la carte comporte un regulateur 3,3V
Pour désactiver un module :
il suffit de mettre un commentaire devant le #define .. ex: //define
UART2 => UART NON utilisé
Le fichier source C , autodocumenté , comprend le maximum de
renseignements , liens xml vers docus.
a noter :
fonction decimal vers ascii en simil flottant : char * Decimal_less_9_999_to_Ascii( unsigned
int k)
fonction Long32bits vers ascii simili flottant avec 4 decimales :
char * Long32bits_to_Ascii_4decimales(
long L1)
pour eviter l'usage de flottant et Maths consommant beaucoup de
ressources.
meme si , avec ce PIC, on pourrait utiliser des fonctions
evoluees tel que Sprintf ou Printout
Resultat sur Terminal Virtuel PC
Testé OK avec FOSC a 4MHz et 8MHz
Test Presence Device a l'adresse : 116 present .. OK ......... Le LCD 2119 est bien sur le
bus I2C
Projet:18F47J53_LCD_UART2_I2C2_ADC_DS18B20_2016.mcppi
Click 18F47J53
Ver: 01-01-2016
Init PPS for UART2 :
Fosc = 4000 KHz .... FOSC
Interne 4MHz
Check delay de 5000mS entre # et @
#
@
DS18B20 device present..sur pin RE0 ..Ok .....
le capteur est bien sur le bus O.W.
Version perso from scratch .. resolution 0,0625°C
91 1 75 70 127 255 12 16 7 21.687
Mesure ADC 12bits sur RA2
EA2= 1,705 1.374EA2= 1705 ou 1.374 volts ou 15.387°C filtre DS18B20
(txt) : +21.6875 long 4 decimales: 21,6875
EA2= 2,166 1.745EA2= 2166 ou 1.745 volts ou 15.769°C filtre DS18B20
(txt) : +21.6875 long 4 decimales: 21,6875
EA2= 1,783 1.436EA2= 1783 ou 1.436 volts ou 15.858°C filtre DS18B20
(txt) : +21.7500 long 4 decimales: 21,7500
EA2= 2,179 1.756EA2= 2179 ou 1.756 volts ou 15.857°C filtre DS18B20
(txt) : +21.8125 long 4 decimales: 21,8125
EA2= 1,783 1.436EA2= 1783 ou 1.436 volts ou 15.855°C filtre DS18B20
(txt) : +21.8125 long 4 decimales: 21,8125
EA2= 2,182 1.758EA2= 2182 ou 1.758 volts ou 15.855°C filtre DS18B20
(txt) : +21.8750 long 4 decimales: 21,8750
EA2= 1,785 1.438EA2= 1785 ou 1.438 volts ou 15.855°C filtre DS18B20
(txt) : +21.9375 long 4 decimales: 21,9375
9:32:23.187> Fosc = 4000 KHz
9:32:23.250> Check delay de 5000mS entre # et @
9:32:23.250> #
9:32:28.187> @ ............
on a bien 5 secondes ecoulees !
et testé a 48Mhz, avec //#define OSCILLATEUR_INTERNE
9:50:59.953> Init PPS for UART2 :
9:51:01.953> Fosc = 48000 KHz .. FOSC: Q=16MHz + PLL + divisuer =>
48Mhz
9:51:01.953> Check delay de 5000mS entre # et @
9:51:01.953> #
9:51:06.953> @ ..........
on a toujours bien 5 secondes ecoulees !
9:51:06.953> DS18B20 device present..sur pin RE0 ..Ok
9:51:08.015>
9:51:08.015> Version perso from scratch .. resolution 0,0625°C
9:51:08.765> 83 1 75 70 127 255 12 16 45 21.187
9:51:11.328> Mesure ADC 12bits sur RA2
9:51:12.078> EA2= 1,737 1.399EA2= 1737 ou 1.399 volts ou 15.377°C
filtre DS18B20 (txt) : +21.1875 long 4 decimales: 21,1875
9:51:14.328> EA2= 1,782 1.436EA2= 1782 ou 1.436 volts ou 15.375°C
filtre DS18B20 (txt) : +21.1875 long 4 decimales: 21,1875
9:51:15.453> EA2= 2,177 1.754EA2= 2177 ou 1.754 volts ou 15.773°C
filtre DS18B20 (txt) : +21.2500 long 4 decimales: 21,2500
Test mesure temperature négative
dans le compartiment Congelateur de mon frigo ... réchauffement
climatique oblige !
// 19-01-2016
// test avec temperature congelmateur -22°C ... BAD affichage en
LONG
// car NON signé et ne traite que du positif
donc modif pour afficher Temp DS12B20 en Flottant et LONG signé
3 decimales sur le LCD
J'ai utilisé un thermocouple K associé a mon multimetre pour
connaitre la temperature "réelle" ?
et comparer avec celle donnée par le capteur DS18B20
![]() |
Le temps de reponse du thermocouple + multimetre est de l'ordre
de 40 secondes ( 5 teta ou >96% de l'echelon)
entre la temperature ambiante de + 19°C et la température
finalie -18°C (dans le congelateur)
Par contre, pour le capteur DS18B20 (qui est encapsulé dans une
gaine inox) , il est l'ordre de 6 minutes
pour atteindre plus de 96% de l'echantillon (6 mn a 5 teta ), l'echelon
a 63% étant de l'ordre de 80 sec.
Je n'ai pas de thermometre ou appareil plus precis pour verifier
la justesse de mesure de la sonde DS18B20.
CON"s : temps de réponse lent,
PRO's : mesure Numerique & tres bonne résolution
Apres on peut discuter pendant 107 ans sur la precision ..etc
Dossier MikroC complet :
18F47J53_UART2_LCD_I2C2_LM335_ADC12b_DS18B20_2016.zip
ou clicker sur l'image ci dessous
contenu de l'archive zip :
5em test :
Test Afficheur OLED 128x64 (ou 32) SSD1306
en I2C
rev 14/12/2016
Documentation OLED SSD1306
Usage du Click 18F47J53 alimenté via le port USB , mais utilise le +3,3V élaboré
sur la carte.
Le module OLED est raccordé via 4 piins
.1) +Vcc 3,3V
.2) Gnd (0V)
.3) SCL du bus I2C2 --fil vert ---RD0 MikroBus
.4) SDA du bus I2C2 -- fil jaune --RD1 mikroBus
La liaison UART2 (optionelle) est utilisée pour suivre / tracer
le programme.
Au lieu de mettre une tempo definie., entre les differents
affichages, .on attend l'appui d'une touche clavier ou timeout de
3sec
Le prototype :
cable USB pour Programmation via bootloader USB, et pour
alimentation du montage.
cable USB Prolic 2303 relié directement sur UART2 du PIC18 (
pour affichage sur terminal Teraterm)
Le schema :
Affichage display terminal :
![]() |
![]() |
matricage Lignes colonnes |
SOFTWARE:
Nota: software fortement inspiré de la documentation et software
du fabriquant (supposé etre) HELTEC
Specificité du PIC18F47J53 :
On retouve la config assez particuliere de l'UART2 ( optionnelle)
Le bus I2C2 Hardware est utilisé ici ,pour piloter le display
OLED SSD1306
Problemo : Afficheur vendu pour 128x64 .. mais interlignage apparent ???
d'ou ,une grosse perte de temps a chercher un probleme inexistant
..
Utilisation d'une fonte 6x8 => 21 caracteres sur 4 lignes (0,1,2,3
pages)
Fonte de 16x16 =>2 lignes de 10 caracteres , avec position Y
modulo 8 !
MikroC :
Source :Clicker_18F47J53_Oled_SSD1306_128x32_161213.c
Chargeur: Clicker_18F47J53_Oled_SSD1306_Heltec_161213.hex
projet complet : Clicker_18F47J53_Oled_SSD1306_128x32_161213.zip
r
![]() |
![]() |
![]() |
Display filled with 0xFF car | .........Taille 2 ..rev 08/2019 | .......taille 1 ... rev ev 08/2019 |
![]() |
![]() |
![]() |
.....taille 1 | ...... Taille 3 | load BMP image |
une ecriture en page 4 a 7 n'est pas visible .. mais apparait
si je change l'origine de la page a 4 au lieu de 0
En commutant , via la commande 0xD3 ,0x40 => affichage des
pages 0 a 3
En commutant, via la commande 0xD3 , 0x60 => affichage des
pages 4 a 7
![]() |
![]() |
affichage obtenu avec image BMP1 Heltec | Backside of my display .. AUCUNE REFERENCE |
il semble pourtant que l'affichage saute 1 ligne entre
les pixels ! PROBLEME NON RESOLU !
L' AFFICHEUR est-il défectueux ou
specifique ? ou une config inadaptée ..malgré
multes essais négatifs.
Je n'en ai pas d'autre pour verifier .
![]() |
![]() |
Display of BMP1 .. miniinthebox | original backside .. miniinthebox |
Tracker GPS pour Tests Liaisons entre 2
Modules HC12
lien
sur HC12
Hardware :
Le prototype
un GPS Ublox 7N dialogue en liaison Serie a 9600 bauds ( partie
COMPAS en I2C non utilisée ,ici )
un module affichage OLED 128x32 , I2C , compatible SSD1306
un capteur de temperature OWS DS18B20 ( R de rappel 6,8K entre
signal et + Vcc) -> RA2
2 ports UARTS sont utilisés :
UART2 Rx a 9600 bds pour la reception des trames GPS
UART1 Tx a 1200 bds pour l'envoi au transceiver HC12 (rx)
Carte Clicker PIC18F47J53
possede 3K de Ram 115 K de ROM
L'OLED necesite pas mal de place pour stocker les fontes de
characteres et eventuellement des images BMP.
Le PIC de la carte Clicker possede un Bootloader interne , et
donc permet le transfert du programme *.Hex,
via la lision USB de la carte. ( sans programmateur externe genre
Pickit4)
De meme , pour les tests , l'alim se fait via le cordon
USB, donc via liaison au PC ou sur une POWER
BANK
un régulateur embarqué ASM1117-3,3 genere le 3,3V necessaire
aux élements connectés.
Le schéma :
Le GPS fonctionne tres bien, meme a l'interieur , a 2m d'une
fenetre.
Le Programme
Commence par une exeption
La config FOSC interne n'est pas accessible si on veut conserver
le mode HID bootloader
qui impose, because USB, une FOSC de 48MHz
FOSC interne peut etre forcée par la liaison ICSP ...
*Init HARDWARE
*Init UART2 apresMapping des Entree/sortie
* int UART1 directe
*Présentation du programme
Nota: visible que si l'UART2 est connectée a un terminal (
Teraterm) ou MikroE terminal UART, via un cordon Prolific USB
*Init I2C pour l'acces a l'ecan OLED
*Armement Timer0 a 100mS et son interrupt associée
*petite demo des possibilites de l'ecran OLED
*Arment des Interrupts RX UART2 et RX UART2
Boucle principale :
Si le flag de reception UART2 ( UART2 RX <-- GPS Tx)
Uart2_ DataReady est levé dans le temps imparti part Timer0 ( 11x
100mS soit 1,1sec )
Traitement des datas reçues via une machine d'état , et
un maxima de carateres reçus ( 256)
La machine d'etat repére la sequence "$GPRMC" =>
debut de stockage dans buffer2
sachant que la trame qui m'interesse "$GPGGA"
sera forcément dans les 256 caracteres maximum pouvant suivre ..
La sequence complete delivrée par le GPS est de 516 caracteres
en 9 trames, j'ai pas besoin de tout cela..
Le GPS envoi toutes les trames chaque seconde.
On a donc largement le temps de recevoir ces 256 bytes ( la
moitié,en 1100mS (timeOut Timer0)
Une fonction d'affichage, décortique et isole les elements
vitaux de la trame GPGGA, soit
sur la sortie UART1:
La longitude,Latidtude,Altitude et autres parametre
qualitatif de la reception du signal au niveau du GPS (HOP, Nb de
satellites )
Les infos brutes sont corrigées , puis envoyé sur l' UART1 TX
relié au HC12 (emetteur) ( et eventuellement aussi a un terminal
PC)
Les infos sont aussi condensées au format KML GoogleEarth
sur la sortie UART2 :
Message Attente Message GPS + la temperature du sensor DS1820.
Sur l'afficheur OLED :
Premiere ligne Jaune : Indice de la boucle programme / ou Mesure
de temperature DS18B20 ,
en alternance de boucle programme, suivant indice pair ou impair
.
2em ligne : Longitude
3em : Latitude
4em : Altitude
si le GPS perd pied, affichage de X,Y,Z ou 0.000
Les Leds LD1 et LD2 clinotent a chaqur tour de boucle programme
Fonction specifiqe a 'aides des Boutons Poussoirs:
Appui sur BP1 ( pendant minimum 1 cycle soit 1
sec) :
affichage de toutes les donnes (utilies) du GPS
Lon : 5.197115 N Lat : 45.824413 E
Alt : 224.4 Satel: 11 HDOP : 0.88 Fix: 1
Appui sur BP2 ( pendant 1 sec minimum) :
Affichage reduit au format KML :
KML : 5.197132,45.824413,215.5
c'est ce format minimaliste qui sera utilisé pour tracker le
lien entre les HC12
Appui sur BP1 ET BP2 permanent :
Affichage long + buffer2 (reception GPS)
Decodage Trame GPGGA .. OK
Lon : 5.197166 N Lat : 45.824418 E Alt : 220.1 Satel: 08 HDOP : 1.25
Fix: 1
.Reception sur UART2 RX = GPS :
$GPRM,103806.00,A,4549.46614,N,00511.83015,E,0.050,,040819,,,A*7A
$GPVTG,,T,,M,0.050,N,0.093,K,A*2C
$GPGGA,103806.00,4549.46614,N,00511.83015,E,1,08,1.25,220.1,M,47.3,M,,*58
goto Boucle !
Pour l'instant je n'ai que le terminal en face du PIC ..
mais le but est de mettre une appli coté recepteur PC pour
renvoyer un compte-rendu
de bonne ou mauvaise reception , des que l'emetteur sera hors de
portée.
(l'emetteur enverra chaque seconde la trame au format KLM..)
Le dernier relevé GPS permettant de connaitre Precisément celle
ci .
Une appli RapidQ Basic pemettra une reponse automatique et un
stockage Log du test complet.
nota :Le format KML permet de suivre le tracé sur GoogleEarth
apres encapsulation de la trame GPS.
PIC18F UART2 ==> Reception GPS ( ou terminal COM16 a 9600
bauds)
PIC18F UART1 RC7=RX , RC6=TX ==> HC12 (ou terminal COM15 a
4800 bds)
HC12-Bleu -> terminal COM3 a 9600 bauds ( pour passer la
commande AT+RX , sinon dialogue a 1200 bauds)
affichage alterné sur la 1ere ligne (Jaune)
![]() |
![]() |
Programme MikroC :
projet : _18F47J53_GPS_UART1_UART2_DS18B20_OLED.zip
source : Clicker_18F47J53_UART1_Oled_SSD1306_DS18B20_GPS7N_UART2_190805.c
Chargeur : Clicker_18F47J53_UART1_Oled_DS18B20_GPS7N_UART2_190805.hex
La suite avec des HC12 version 2-6
video :
Proto_Tracker_HC12_190805.webm