V.O 21/02/2019
rev 26/06/2019

PIC18F27K22

Presentation du PIC18F27K42 et Hardware utilisé
Montage de test, et schéma
Circuit imprimé Base 18F27K42
Test RTC DS3231 en I2C
Test LCD2119 en I2C
video



Materiel :

datasheet 18F27K42



Tests PIC 18F27K42

Ce nouveau PIC presente de grosses differences par rapport au 18F26K22
sur la gestion I2C Hardware, (par contre, Au niveau SOFT I2C .. c'est idem la meme chose)
Une RTC et un LCD seront utilisés ...

RTC DS3231




avec une liaison UART1 :-
-> cordon Prolix PL2303 (Noir=Gnd Vert=Rx=RC7 Blanc=Tx=RC6 ) assurant la convertion TTL/USB





Montage de test :

PIC18F27K42
Utilisation de FOSC interne 64Mhz, via config Bits
Liaison I2C1 sur RC3 et RC4, avec R pull up de 2,8K avec RTC DS3231
Liaison UART sur RC6 (Tx) et RC7(Rx) avec Teraterm PC application via cordon TTL/USB
Liaison ICSP avec Pickit 4 et MPLAB IPE V5.00 application PC
une entree dédiée au Forcage de la date et Heure

schema:

images/t_Base_Test_18F27K42_schema_wh5_190226.gif images/t_Base_18F26K22_vue_photo_190220.gif
schema version 18F26K22 ISIS photo circuit (sprint layout 6) version originale

schema avec diptrace: Base_18F27K42_rev_190226.wh5
Design circuit imprimé: Base_18F26K22_190220_sprint_layout.zip

Montage

images/t_Base_Test_18F27K42_190225.gif

Developpement avec MikroC 7. version 7.30 beta ...
donc avec quelques bugs possibles


circuit réel (réalisé par JLCPCB)
Commandés le 19/02 .. reçus le 25/02/2109

coté cuivre coté composants

* avec quelques petits défauts de conception au niveau de l'alignement au pas de 1,27mm
voir *
rev3 (26-06-2019) du circuit imprimé

RTC DS3231 :

La commande Ecriture

issu de la doc MikroE :
// for PIC18F K42 and K83 family
unsigned short I2Cx_Wr(char slave_address, char *ptrdata, unsigned short count, unsigned short END_mode);

slave_address: slave address.
ptrdata: pointer to the received data.
count: number of bytes to be received.
END_mode: mode in which the I²C module will be set after the reading.
Available modes : Value Description
_I2C_END_MODE_RESTART I²C bus will issue a restart.
_I2C_END_MODE_STOP I²C bus will issue a stop.


La RTC (Neuve) doit etre initialisée .



Une premiere commande permet de démarrer l'horloge RTC et d'obtenir le cligotement , à 1HZ,
sur la sortie SQWE de la RTC
soit tmp[10] une table qui sera utilisée pour les transfert datas I2C
* dans l'élément tmp[0] , on doit mettre la 1ere adresse (registre) pointé dans le device connecté, ici 0x0E
* dans l'élement tmp[1], la valeur de la donnéee à écrire, ici 0x40 (ou 0B0100000)

et donc dans l'instruction on retrouve :
L'adresse du device sur 7 bits ( adresse sur 8 bits en mode SOFTWARE I2C)
#define DS3231_ADDR 0x68 // 0xD0 en I2C software !
le pointeur sur la table --> tmp
le nombre de bytes conecernés -> 2
le mode de retour (Ack ou Nack) -> mode STOP

tmp[0]=0x0E;
tmp[1]=0b01000000;
I2C1_Wr( DS3231_ADDR, tmp, 2, _I2C_END_MODE_STOP );


Pour Initialiser completement la RTC avec des valeurs plausibles,
on va pré-remplir les registres avec une date et heure donnée.

soit la meme table tmp[10] utilisée pour les transfert datas I2C
dans l'élément tmp[0] , on doit ECRIRE, mettre la 1ere adresse (registre) pointé dans le device connecté
ici 0x00, adresse registre secondes
puis ecrire les datas dans les elements suivants
tmp[1]=valeur Sec
tmp[2]=valeur Mn
.. etc .
I2C1_Wr( DS3231_ADDR, tmp, 7, _I2C_END_MODE_STOP );

exemple: ex: 20 fevrier 2019 , mardi, 14:59:50

tmp[0]=0;
tmp[1]=0x50; //Reset second to 0 sec. and stop Oscillator
tmp[2]=0x59; //write min
tmp[3]=0x14; //write hour;
tmp[4]=0x02; ///write day of week
tmp[5]=0x20; // write date
tmp[6]=0x02; // write month
tmp[7]=0x19; // write year 2019
I2C1_Wr( DS3231_ADDR, tmp, 7, _I2C_END_MODE_STOP );


Une fois initialisée, la RTC est autonome ( avec sa pile LIR2032 )
ATTENTION : utiliser une CR2032 est risqué , Ubat=3,4V au lieu de 4,1V max pour LIR2032

Verification en affichant le contenu de la RTC:
on va donc LIRE les registres RTC
issu de la doc MikroE

// for PIC18F K42 and K83 family
unsigned short I2Cx_Rd(char slave_address, char *ptrdata, unsigned short count, unsigned short END_mode);


il faut d'abord faire connaitre , à partir de quel registre , on veut lire , donc envoyer cette adresse registre ..donc ECRIRE

tmp[0]=0 ; // adresse 0x00 pour les secondes
I2C1_Wr( DS3231_ADDR, tmp, 1, _I2C_END_MODE_RESTART );


puis ensuite, ire les 6 registre , en 1 seule instruction de LECTURE

I2C1_Rd( DS3231_ADDR, tmp, 7, _I2C_END_MODE_STOP );

Particularité, les données lues, seront rangées à partir de l'indice 0 de la table
on recupere donc les secondes dans tmp[0] .. ainsi que les autres valeurs dans la table tmp

second=tmp[0];
minute=tmp[1];
heure=tmp[2];
jS=tmp[3];
if (jS>6) jS=0;
jour=tmp[4];
mois=tmp[5];
Annee=tmp[6];


Resultat:




SOFTWARE :
Projet MikroC :

-PIC18F27K42_UART1_RTC_I2C_HW_Test_190220.zip
source commenté : PIC18F27K42_UART1_RTC_DS3231_Hardw_I2C_Test_190220.html


Test LCD 2119 2x16 car , en liaison I2C .
27/02/2019

images/t_Base_18F27K42_Tests_190227b.gif

REMARQUE :
Test ADC 12bits , potar de 2,2K 10 tours pour simuler le LM35DZ
Gamme de mesure 1024 mV pour 4096 points !
Petit doute sur l'init ADC par la lib ADC MikroC, suite instabilité de mesure ADC
voir : void My_ADC_Init (), redéfinissant Clock ADC ..

Reprise du programme de gestion LCD2119 , en I2C Hardware , specifique au 18F27K42
source mikroC : LCD2119_Hardw_I2C_for_K42.c
Caracteres Speciaux : redefinition de Degre et Euro.
Nota: Ce LCD n'a pas de caractere "Blanc" par défaut pour effacer l'ecran !

Affichage alterné : Date et Heure , EA1 en points ou en °C
Led Jaune sur sortie SQWE 1HZ de la RTC
Led Rouge s'active si reception sur UART1 ( cordon Prolific USB/TTL Teraterm COM13 19200,8,N,1)
Mise à l'heure RTC via la liaison UART1 => exemple de cde : / U;27;02;19;12;10;03;#<CR>
pour le 27 fev 2019 12H10 Mercredi

Projet MikroC :



Software
complet : _18F27K42_Tests_UART_I2C_HW_ADC_LCD_190228.zip

Videos :
Base_18F27K42_Tests_LCD2119_19022.webm




../common/GIF/LTC1286p.jpg

retour à l'index