version 0.0 :
27 Avril 2015
rev 24/03/2023
PIC16F1847
16F1847 test d'un
PCF8754
16F1847
Pilotage LCD 4x20 en I2C via un PCF8754
16F1847
Test d'un encoder , Affichage via UART
16F1847
Mesure ADC avec reference Interne (ASM) , affichage viaUART
16F1847 Mes. de
temper. : 2x DS18B20 OWS numeric sensor + LCD 2x16 cars I2C +
UART / BlueTooh
avec Applications Android
:
Appinventor2 ou RFO
Basic..
Test d'un
dialogue I2C entre 2 PIC16F1847
part1
dialogue I2C
entre 2 PIC16F1847 part
2
Lire les mots de configiguration , MCU ID et
User ID. PIC16F1847
Test OLED 0,96" jaune et bleu 128x32 I2C1
..et UART1 (2021-03)
Le PIC 16F1847 :
en connectique PDip18
Utilisé avec Fosc Interne =8Mhz ( sans PLL)
Available RAM: 1008 [bytes], Available ROM: 8192 [bytes])
Pinout
Hardware :
PCF8574(T)
voir ici Test avec un PCF8574 avec 8 leds pour validation du
dialogue I2C
18f26K22_I2C_Hardw_PCF8574_2013_ok.c
LCD 4x20 cars , dialogue en mode I2C (via PCF8574)
avec PIC 16F1847 et
MikroC Pro 6.50
Le LCD 4x20 :
- ref: YwRobot LCM1602 IIC Arduino 20x4 (18.48)
ref : ODT OCM-20416D-A2023 LCD Module 8/4/1999
http://www.miniinthebox.com/fr/arduino....html
Livre SANS DOCUMENTATION
- couleur : fond bleu, caracteres blancs avec retroeclairage
- dimension utiles de l'ecran 86mm x 36mm et Hors tout :100x60x20
- livre avec interface I2C PCF8754 yW robot LCM1602 Arduino
- 4 pins de connection :
1- Gnd (fil noir)
2- +VCC (5V fil rouge)
3- SDA (fil jaune)
4-SCL (fil vert)
cavalier pour activer le retro-eclairage et potar (bleu) pour
regler le contraste d'affichage
attention à zero =RIEN NE S'AFFICHE !
Prototype
le bus I2C va sur le PCF8574T du LCD4x20
Adresse 0x4E
La liaision sortie UART -- interface --- RS232 sert au debugging
et tracage du programme
Usage de la bibliotheque I2C MikroC et code utilisé pour la
librairie LCD_I2C.
Le LCD est sensé etre à l'adresse 0x4E ( car c'est un PCF8574
et A0,A1,A2 reliees au +VCC)
Rappel : il n'ya pas de commutateur d'adresse sur ce modele de
LCD !
Au lancement du programme, un test presence device I2C est fait:
Si on a pas le message "Device found OK,at adresse :
78" .. pas la peine d'aller plus loin.!
Philips PCF8574T
adresse I2C : 0x4E
#define LCD_BL 0x08
#define LCD_EN 0x04
#define LCD_RW 0x02
#define LCD_RS 0x01
Adresses de lignes
#define LCD_LINE1 0x80 // 0x00 + bit D7=1
#define LCD_LINE2 0xC0 // 0x40 + bit D7=1
#define LCD_LINE3 0x94 // 0x14 + bit D7=1
#define LCD_LINE4 0xD4 // 0x54 + bit D7=1
Attention,il faut rajouter 80h à l'adresse
de debut
Affichage dynamique de la mesure ADC RA3 en point
et de la mesure en flottant recadré à droite, sur la 4em ligne
!
Compilation conditionnelle AVEC ou SANS UART..."ifdef With_UART"
L'UART1 est initialisé à 19200,8,N,1 pour sortie annexe
debugging
Resultats OK
sur le LCD :
sur le terminal RS232 :
Le projet MikroC :
16F1847_LCD_I2C.zip
source MikroC:
16F1847_LCD4x20_I2C_ADC_UART_150427.c
Test d'un Encoder avec
result sur UART
source MikroC:
16F1847_Encoder_Test_with_UART_141203.c
Mesure ADC avec
utilisation +Vref Interne 2,048V
Hardware:
![]() |
![]() |
DIP18 | Prototype de test |
le test est fait avec un potar de 2,2K entre VCC et Gnd, le
cursuer relié via 390 ohms à l'entree RA1
Usage de FOSC interne 8MHz
RA1 en entree Analogique
L'UART1 est sur RB1 RX et RB2 TXpar defaut .,
liaison directe (19200bds) à Prolic 2303 cordon TTL/USB PC COM
virtuel
La tension de reference Interne +2,048V est utilisée ici comme +VREF
ADC ,pour augmenter la resolution
Le PIC est alimenté en 3,3V.
Differents seuils de niveau de tension (exprimé en points)
permettent d'allumer une diode pour chaque pallier de tension.
Projet MikroC
source : _16F1847_UART_ADC_Test_Battery_170108.c
Chargeur : 16F1847_ADC_Test_Battery_170108.hex
Zipé : 16F1847_UART_ADC_Test_Battery_2017.zip
Mesure 2 temperatures avec sensor
numérique OWS DS18B20
affichage sur LCD I2C 2x16 cars + Uart
Hardware:
Capteurs : detail sur cette
page
Schéma , PIC Pinout liaisons
![]() |
![]() |
Schema ISIS 30/03/2017 | Pinout details |
Attention : Config particuliere de l'UART , pour
recuperer les pins dédiées à L'I2C1
Resultats sur LCD 2119 :
![]() |
![]() |
affichage local sur LCD 2x16 cars | Affichage distant sur Phone Startrail 2 Android |
SOFTWARE:
Projet MikroC :
projet zipé : _16F1847_OWS_2xDS18B20_Temp_LCD_I2C_170327.zip
source : _16F1847_OWS_2xDS18B20_Temp_LCD_I2C_170327.c
Nota:
rajout d'un flag "Special" dans la fonction LCD_Write_Chr_At(ligne,col,car,special);
pour pouvoir afficher les caracteres perso crées en CGRAM
Special=1 => caractere special CGRAM
Special=0 : caractere normal CGROM
Nota: Liaison BlueTooth avec module HC06-7D69Bconnecté sur la
sortie UART du PIC
APPLI Apinventor2
Designer :
Blocks
Source AIA 2:
HC06_Temp_DS18B20_Alarm_16F1847_170501.aia
Traitement des seuils Haut et Bas, Alarmes correspondantes
Executable
*.APK dispo sur site Appinventor
Application RFO-Basic sur phone StarAddict
II Android
La meme appli MikroC , envoie les 2 mesures capteurs OWS DS18B20,
toutes les 1,5sec ,via la trame de base
au format CSV (separateur = point virgule) :
"j=116;T1= 22.56;T2= 22.81" + CR
J : indice de progression T1 : tempearure exterieure , T2
temperature Interieure
Un module HC06-0539R est utilisé à lapalace du HC05.
L'appli Android tourne sur un Staraddict II Android
Pour simplifier la connectivité , j'ai dissocié tous les autres
Bluetooth environnant vu par la phone Staraddict 2
Une premiere fos appairé (code = 1234) , il est automatiquement
reconnu et connecté
Il faut cependant valider la conection : message vocal le
confirmant et Icone BT en haut à droite de l'ecran
Un fond d'ecran,
réalisé via Paint Shop Pro , affiche les 2 thermometres, ayant
chacun une echelle differente
-10 à +40 pour la temperature exterieure et +10 à +40°C pour
la temperature interieure
Le grafique d'evolution des 2 temperatures est affiché via des
petits cercles (diam 3pixels)
Le pas d'avance sensX est de ~2 sec.
2 cases à cocher permettent :
soit d'appliquer ou pas un filtre exponentinel fixé à K=0,2 sur
les 2 mesures
soit d'activer le stockage des 2 mesures sur un fichier texte
La ligne du bas de l'ecran, affiche à gauche, en bas, la trame
reçue via BlueTooth ( emise par le 16F1847)
La partie droite sert de STATUS géneral .. affiche au depart ,
la version du source *.bas, ou le nom du fichier de stockage ...
Le stockage, (activé par la case à cocher, s'effectue modulo 10
mesures ..
apparait alors une petite fentre pop up : Sauvegarde sur fichier
.. puis Saved.
Enlever la coche pour arreter le stockage ou le filtrage.
Usage des softwares de developpement :
BASIC! Launcher SciTE flavour Sc1 Version 3.5.5
pour developper le programme *.bas sur le PC
Liaison WIFI entre le PC et le phone Android STARADDICT II
Le Bluetooth est activé aussi sur le Phone ! et le modue HC06 a
été apparairé.
Le programe BASIC Laucher Version 0.8 tourne en
arriere plan sur le Phone Android.
un appui sur la touche F5 de l'editeur PC, envoie le fichier *.bas
dans le Phone et lance automatiquement
l'interpreteur RFO-Basic version 01.91
si le compte rendu coté Editeur SC1
PC est egal à 1
Le programme est alors en RUN et s'execute
sur le phone (si il ny a pas eu d'erreur programme)
source RFO basic :
DS18B20_x2_BT_16F1847_170503.bas
capture ecran Phone Staraddict II
Compilation du programme
Avec rfo-basic app builder.exe (1137Ko) version
2.6
Attention, NORTON le mets en
quarantaine ! passer outre
usage du Android-SDK 4.1
PROBLEMO ... avec Win10.1
meme en mode administrateur
App Builder n'est plus suportée .. because versions java >= 1.8
sous fenetre dos j'obtiens
C:\>java -version
java version "1.8.0_131"
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) Client VM (build 25.131-b11, mixed mode, sharing)
C:\>
à suivre
Retour sur mon vieux PC Win XP
Usage de RFO-AppBuilder V2.6 et de Basicv01.90.zip
Versions JAVA installées:
Verif . Avec commande fenetre DOS :
Microsoft Windows XP [version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.
C:\>java -version
java version "1.7.0_45"
Java(TM) SE Runtime Environment (build 1.7.0_45-b18)
Java HotSpot(TM) Client VM (build 24.45-b08, mixed mode, sharing)
C:\>
La compilation est OK
07/05/2017
Test run sur phone StarAddict II
..
l'appli demarre mais s'arrete sur erreur test Wifi ...
Cannot get WifiInfo: WifiService: Neither
user 10056 nor current process has android.permission.ACCESS_WIFI_STATE.
Line: wifi.infossid$,,mac$,ip$
Modif source programme pour enlever le test Wifi ..
DS18B20_x2_BT_16F1847_170509_wo_wifi.bas
Recompilation =>OK
Retest sur Staradict2 => OK
Application rev 11 mai 2017:
ajout : Hordatage datas stockées en CSV
DS18B20_1705_104.apk
Evolutions à faire :
Test du
compilateur basic
recyclage historique du grafique ..
Envoyer des commandes particulieres vers le MCU
usage module BLE à la place du module BT normal..
liens:
Application
similaire avec un 12F1840
Test Liaison I2C entre PIC16F1847 Maitre
et PIC16F1847 Esclave
Config Hardware :
2 planches à pain
avec liaison UART 19200,8,N,1 sur les 2 modules ( via des cordons
USB/TTL Prolific => 2 vue ecran Terminal Teratem)
la liaison I2C entre les 2 modules à 100Khz (R pull up de 2,7K
sur SCL et SDA)
Pins ICSP pour lien avec PickiT2.
j'ai utilisé la meme alim 3,6V (donc avec le meme 0V Gnd)
donc 1 PIC16F1847 MASTER I2C1 bus <---> I2C1 Bus PIC 16F1847
ESCLAVE
j'ai aussi un LCD2119 sur le bus I2C ..mais pas activé pour ce
test là. ..à suivre prochainement .. AVEC le LCD comme 2em
esclave
je suis parti d'un exemple donné par MikroE Libstock ref:
1470586910_i2c_master_slave_mikroc_pic.zip pour 16F887 .
qui est formateur, car s'appuye sur la note microchip AN 734 I2C
Maitre -esclave.
J'utilise l'adresse I2C 0x40 (sur 8 bits ,donc R/W=0) , et non
pas l "'adresse <<1" , qui est perturbant, par
rapport
à l'adressage habituel utilisé avec d'autres composants esclave
(LCD2119,DS1307..)
le bit R/W etant ,bien sur, manipulé en fonction de Ecriture=0
ou Lecture =1
La transposition 16F1847 n'est pas immediate .. UART specific , I2C1
specific .aun niveau des affectation PINS via registre APFCON0
et j'ai quand meme galéré plusieurs jours, avant d'obtenir un
echange OK
1ere version :
L'echange est TRES SIMPLE :
le maitre envoi 2 valeurs à l'esclave
celui ci en fait l'adittion
et retourne le resultat au Maitre, qui affiche ce resultat
un
rappel du Pinout
Les echanges entre PIC
Maitre :
Projet MikroC Maitre
Esclave
Projet MikroC Esclave
.
Evolution:
Prototype
utilisation de 2 breadboards
Connecteur ICSP sur chacun des PIC pour branchement Pickit2
UART avec TX sur RB5 pour se connecter au Display terminal
Teraterm via cordon Prolic (TTL/USB) à 19200,8,N,1
1 potar 4.7Ksur EA1 maitre => mesure Volt
1 potar 4,7K EA1 Esclave => mesure Temperature
LCD sur Bus I2C1 .. esclave @074, piloté par le PIC Maitre
PIC esclave sur le bus I2C1
Les 2 PICS sont alimentés en 3,7V , et utilisent FOSC interne 8
MHz
nota; le LCD comporte deja 2 R pull up de 2,7K sur SDA et SCL
LCD 2119 sur bus I2C1 , piloté par le Maitre à @0x74
La mesure analogique EA1 du maitre est envoyée à l'eclave ( 2
bytes)
L'esclave convertit la mesure en Vots (flottants 32 bits) et
renvoi cette valeur au Maitre qui l'affiche sur le LCD
L'esclave acquier aussi une mesure ADC1 , temperature, la
converti en degres Celcius et l'envoi au Maitre
Le maitre affiche la temperature sur la 2em ligne du LCD
L'esclave renvoi aussi l'indice de boucle J ( 0 à100)
L'esclave envoi une signature : string sur 16 cars " I am
the slave"
Le tout transite via une table d'change de 32 bytes
Table d'echange
Master project
Capture terminal:
Programme MikroC:
PIC16F1847_I2CMaster_Protocol.zip
Slave Project
Capture terminal
programme MikroC
PIC16F1847_I2CSlave_Protocol.zip
Lire
les mots de configuration , MCU ID et User ID. d'un PIC16F1847
Usage de la datasheet
du PIC , et descriptifs des zones située à partir
de 8000H
Usage de
SCANQUAD SQ50 analyser logique 4 canaux
Capture trame via outil Hard + soft Scanquad SQ50
(IKALOGIC)
trame vers PIC Esclave @0x40
Trame vers LCD2119 @0x74
nota:
Check dialogue I2C avec LCD
On definit un filtre avec l'adresse LCD = 0x74 ( sur 8 bits)
car on a aussi le PIC esclave en 0x40, sur le mem bus
Partie du programme MAITRE où on installe le repère d'observation..
strConstRamCpy(txt,"Indice Slave ");
Indice_Slave = I2C_MasterReadEx(0x40,3); // J value of slave
ByteToStr(Indice_Slave,CRam1);
strncpy(txt+12,CRam1,3);
UART1_Write_Text(txt);UART1_Write(' ');
// RA3 output -> CH1 Scanquad pour reperer la sequence I2C
Track_Signal=1;
LCD_Write_Text_At(1,1,txt);
Track_Signal=0;
Sur SCANQUAD on remarque qu'on ne peut pas voir en clair l'ascii
du string envoyé :
meme avec l'option affichage : HEX+ASCII
explication:
because les datas ne sont pas dans le domaine Ascii ! car rajout
de 0x80
=> ata correspondant à l'offset 1ere ligne du LCD + code
ascii
la preuve
avec l'editeur NotePad++
-Complements
----Converter
-------- Ascii -> Hex
on recupere l'equivalent du string Ascii
Indice Slave 10
49 6E 64 69 63 65 20 53 6C 61 76 65 20 31 30
et on rajoute manuellement 0x80 ! pour chaque
data sur la 1ere ligne LCD
C9 EE E4 E9 E3 E5 ... etc
Cela correspond bien à ce qui est affiché dans le champ
Packetview
les 3 lignes DATA..
A suivre ..