rev0 11/10/2020
Rev 08/05/2022


MCU : PIC18F47K42 ( en Dip 40)



MCU 18F47K42 DIP40 PinOut
Datasheet MCU (PIC18FxxK42 DS 40001919B rev 2017)

Tests divers sur ce MCU :
avec MikroC version 7.60 :

* Uart1 Hardware (Interrupt RX) ,
*
LCD 4bits 2x16 I2C Hardw (voir video)
* RTC DS3231 I2C Hw
*
ADC 12 bits sur RA1
*
UART1 et UART2 avec interrupt sur RX

à suivre aussi .. coté PIC18F27K42 !.



LIENS UTILES :

Présentation carte Microchip IrDA Demo Board1 102-00032
Timer2 : capture,compare,PWM
Ressources configuration broche PWM


PinOut 18F47K42 monté sur IRDA Board






Liaison UART 1 Hardware

Connection Interface Prolific TTL/USB , sur connecteur J15 : RC7 et RC6 du MCU
Terminal YAT 19200,8,N,1 coté PC.

Utilisation quasi "standard" des Pins RC6=Tx et RC7=RX Uart1
au niveau Hardware (PPS) , UART1 est par défaurt sur RC6,RC7..
ainsi que de la librairie UART1 MikroC
FOSC interne MCU à 64Mhz
config UART1 : 19200 (,8,N,1 par défaut).


Affectation des pins via PPS :

Unlock_IOLOCK();

// UART1 (optionnel ! )
//RC6PPS = 0x13; //RC6->UART1:TX1;
//U1RXPPS = 0x17; //RC7->UART1:RX1;

// UART2
RB5PPS = 0x16; //RB5->UART2:TX2;
// U2RXPPS = 0x0A; //RB2->UART2:RX2;

// Sets pin RC2 to be PWM Output
PPS_Mapping_NoLock(_CCP1, _OUTPUT, _RC2);

// NCO
RA5PPS = 0x26; //RA5->NCO1:NCO1;
Lock_IOLOCK();

ATTENTION , interaction Hardware:
Si le MCU transmet bien sur TX vers le PC, mais que la reception RX ne fonctionne pas ...
* soit retirer le circuit MCP2150 ( Com infra rouge) qui interfere sur le niveau de RC7 RX
* soit, solution soft, Mettre un 0 sur RC0 => Reset du MCP2150 en permanence,
pour ne pas perturber le niveau de RC7.
Les tests de reception via interruptions sont alors OK

Mettre à Zero , la sortie RC0 :
sbit Reset_MCP2150 at RC0_bit ;
sbit Reset_MCP2150_dir at TRISC.B0 ;
Reset_MCP2150_dir=0 ; // pour usage de RX interrupt
Reset_MCP2150=0 ;


8 Leds connectées sur sorties PORTD
mais Led sur RD5 associée à PWR LCD



Afficheur LCD 2x16 :
Le LCD se pilote directement avec la librairie MikroC LCD , no problemo !
Respecter un delay de quelques mS apres positionnement du curseur.
ATTENTION :
Il faut mettre RD5 à 1 pour alimenter le LCD
// to power on the LCD
sbit LCD_PWR at RD5_bit;
sbit LCD_PWR_direction at TRISD.B5;
LCD_PWR=1;

Partie IRDA et UART carte IRDA Board

images/IRDA_board_16F877_sch.jpg

Video : IRDA_Board_18F47K42_test_LCD2x16_2020_10.webm





Rajout RTC DS3231 sur le bus I2C

Module RTC DS3231 , alimenté via +5V et Gnd de J15
Raccordement SCL sur RC3 de J15
Raccordement SDA sur RC4 de J15

Adrese I2C Eeeprom locale (sur le module RTC) 24C32 = 0xA0 !
Gestion I2C SPECIFIQUE sur ce PIC

RTC DS3231 with Lithium Ion Battery LIR2032 3.6V ...........nota: with Eeprom 24C32 4K bytes at I2C @ 0xA0


Usage de SW2 = BP sur rentree RA5 , pour forcage Init RTC DS1307 à une date et heure par defaut
si il est maintenu appuyé pendant la phase d'initialisation => message "Init RTC DS1307 par defaut"
sinon, relit simplement le contenu du DS1307 , maintenu à jour grace à sa pile LIRC2032.
Affichage alternatif sur la 1ere ligne " LCD2x16 & UART" ou " Time: 17:10:35 ", toutes les 4 secondes .
Possibilité de remettre à la date et heure via la commande Terminal : U;07;06;14;19;09;06;#<CR>
( exemple pour le 7 juin 2014 à 19H09)

Acquisition voie 0 = Potar de la carte .
Alimentation MCU en 5,0 .. Usage de +VREF = 4,096V pour simplifier les calculs ! 1 point=1mV
Moyennage sur 8 valeurs consecutives et affichage en point + Volts (en flottant) sur la 2em ligne du LCD
Envoi aussi sur le terminal des 8 valeurs intermediaires (en points) suivant l'etat d'un flag modifié par la commande DS1= visu, ou DS0 = pas visu
Les valeurs : moyenne en point , sur 12 bits ( 0 à 4095) et en flottant (0,000 Và 4,095 V) sont aussi affichées sur le terminal.

Commandes des leds LD0 à LD3 (sur RD0 ..RD7) via la commande terminal Dx1 ou Dx0, avec x representant le numero de led (ou bit)
D21 allume led 2 , D20 eteint led 2..
On ne commande pas la Led D5 .. qui sert à valider l'affichage LCD..



ADC 12 bits avec Vref 4,096V
(suppose que Vcc=5V minimum!)

Hardware :

Ce PIC gere les ADC avec 12Bits de resolution
Configuration avec -Vref=Gnd=0V et +VRef=4,096V, de sorte à avoir une resolution de +-1bit => +-1mv

Code MikroC 7.60
// _ADC_INTERNAL_VREFH High voltage reference set to internal VDD.
// _ADC_INTERNAL_FVRH1 High voltage reference set to 1.024V.
// _ADC_INTERNAL_FVRH2 High voltage reference set to 2.048V.
// _ADC_INTERNAL_FVRH4 High voltage reference set to 4.096V.
CPrint(" ADC_Init_Advanced (0 à +VCC pour 0 à 4095 pts) EA1=RA1=potar \r\n");
ADC_Init_Advanced(_ADC_INTERNAL_VREFL | _ADC_INTERNAL_FVRH4); // gnd et +Vref

Attention :
il faut que VCC soit superieur à la réference plus 1V
ex: +Vcc=5V pour _ADC_INTERNAL_FVRH4

Pour affichage sur terminal :

CPrint(" EA1 Volt brut =");
CRam1[0]=0;
WordToStr(EA1,CRam1);
UART1_Write_Text(CRam1);
UART1_Write(TAB);
F1= (float)EA1 *0.1; // 4096mV /4096 ; // avec 10mV/degre LM35DZ
CRam1[0]=0;
Float2Ascii (F1,CRam1,2);
UART1_Write_Text(CRam1);
CPrint(" °C");
CRLF1();


pour affichage sur mini-LCD OLED
#ifdef With_mini_OLED
sprintf(CRam1,"EA1=%4u ->%3.2f C",EA1,F1);
OLED_ShowStr(0,2,CRam1,2);
#endif



EEPROMs :

Gestion EEPROM PIC
256 bytes
pour affichage des messages sur terminal ..permet d'economiser de la RAM ....no comment
D'autres messages sont en ROM Code

Rajout EEPROM I2C 24LC256 32Kbytes et Gestion stockage sur la carte IRDA Board
ATTENTION : delai OBLIGATOIRE de 5mS apres chaque ecriture individuelle...
Rajout : sauvegarde date et heure dans les 6 premiers bytes de l'Eeprom au format : MMJJHHMMSS<CR>
puis chaque mesure moyenne en point..
Demarrage sauvegarde sur Eprom 24LC256 par appui sur SW2
On affiche alors en 1ere ligne LCD la valeur de l'index de stockage qui evoulue par pas de 2 , car stoke : 1 entier = 2 bytes
On peut stopper à tout moment le stockage , par appui sur SW2.
qui lance la relecture complete de l'EEPROM, avec affichage du contenu sur le terminal
date et heure de debut, Numero de mesure, et valeur en Volt (flottant) au format X.xxx
Une fois l'edition terminé , on revient en mode affichage alterné sur ligne 1 et stockage arreté.
Un nouvel aapui sur SW2 , relance, continue le stockage au point d'arret precedent , sans sauver date et heure
Un appui simultanné sur SW2 et SW3 , fait une RAZ Index de la memoire 24LC256 et stoppe le stockage
Un nouvel appui sur SW2 relancera donc le stockage de la date et heure au debut de l'eeprom..etc...


Projet MikroC
Zip :
IRDA_Board_18F47K42_UART1_LCD_2x16_Chars_CGRAM_2020_1024.zip
Source :
IRDA_Board_18F47K42_UART1_LCD_2x16_Chars_CGRAM_2020_1025.c
chargeur :
IRDA_Board_18F47K42_Tests_UART1_LCD2x16_Chars_CGRAM_2020_10.hex





Tests PWM 8 bits à 5KHz avec 18F47K42


Hardware :

carte Microchip IRDA Demo Board1
Pickit3 relié à la carte via cordon adaptateur 6 Pins -> RJ45
Alim externe 9V DC ( ou AC possible !) regulateur 5V sur la carte

Ressources :
Oscillateur Q20Mhz
LCD 2x16 sur la carte
8 leds CMS sur Port D
Potar ver entree RA0 analogique
Pin RC2 PWM output -> MOSFET IRLZ14 -> Ampoule 12V 5W -- alim externe 12V
pins RC6 (TX) et RC7 (RX) -> cordon Prolific TTL/USB <-> Terminal YAT
pin RD1 -> SQA trigger
BP SW2 sur RA5
BPSW3 sur RA4
BP Reset
pin Gnd

Réglage PWM :
Les 3 plages de reglages PWM peuvent etre testée ici
via les commandes prédéfinies ou via clavier :
HI =(High) = prescaler=1/1
ME=(Medium)=presclaer 1/4
LO=(Low)=prescaler 1/16
La valeur de Duty 8 bits , soit 0 à 255 peut etre entree directement au clavier
via Duty=xxx (avec xxx=1 à 254)
ou via les commandes prédefinies 25%,50%,75%
ou via ANA_ON
Duty reglable par la valaur de EA0 (potar sur la carte!)
commande ANA_OFF ou Duty=xxx pour retour à valeur via le clavier seulement.
dans cet exemple PR2=255 pour conserver la résolution Maxi (8 bits)de reglage Duty..

voir aussi :
Version PWM 10 bits avec 18F27K42




TEST Interruptions UART1 et UART2 ( en interrupt sur RX)
07/05/2022
HARDWARE
Montage simple : PIC sur breadboard
images/t_P18F47K42_Pinout_2.gif

Alim 5V sur pins 11 et 32
Gnd sur pins 12 et 31
Led sur pin 6 ...RA4
Pull up 10K sur pin 1 MCLR/VPP
UART1 :
pin 25 ...RC6 TX1
pin 26 ...RC7 RX1
UART2 :
pin 38 .....RB5 TX2
pin 35 .... RB2 RX2
pin 2 .. RA0 analog input


Resultat :

images/t_Test_program_18F47K42_UART1_UART2_interrupt_RX1_RX2_ok_2022-05.gif


Deux PC terminaux YAT sont utilisés , dans mon cas
YAT UART1 sur Com3 avec cordon Prolific
YAT UART2 sur COM55 avec mini interface CH340G

Software

Utilisation de FOSC interne 64MHz
Aiguillage des Pins via PPS
Test prealable : envoi direct via registre transmition UART ABC sur UART et DEF sur UART2
Mode interruptions : Legacy

Projet :
UART1_UART2_tests_18F47K42_2022-05.mcppi
Config :
UART1_UART2_tests_18F47K42_2022-05.cfg
Source:
_18F47K42_UART1_UART2_2022_0508.c
chargeur :
UART1_UART2_tests_18F47K42_2022-05.hex
Programme complet : _18F47K42_2xUart_2022-05.zip



paulfjujo@free.fr