17/12/2022
Rev 23/07/2024


PIC16F84 , (c'était ) la référence pour débuter
* j'ai meme commencé avec le SCMP sur Radio-Plans ..
..programmation en hexdecimal ! avec papier et stylo seulement

L'AVANT PROTEUS : MisismDE (gratuit)
L'AVANT ICSP : ICPROGR + POK508
.....
L'Application 16F84 avec XC8
Test avec outils de programmation Pickit3 et Pickit4
16F84 , mesure Humidite ,Temperature -> blueTooth Application
16F84 , mesures AM2302 sur LCD2x16 ( MPLABX XC8)
16F84 , mesures AM2302 sur LCD2x16 MikroC Pro 7.60 (ou Free, sans licence)

Apres mûres reflexions ..il vaut mieux se lancer de suite sur un 18F27K42.
....pas la peine de se rajouter des problemes avec un 16F84
quoique ...savoir les bases , ça peut servir .
et faire un programme avec 1ko , et de grosses restrictions, est tres instructif.




L'AVANT PROTEUS et MikroC ou MPLAB XC8

Une époque sansPROTEUS , MikroC ou MPLABX XC8

....et meme (surtout !) SANS PIC16F84 sous la main
Etude uniquement avec Papier,crayon ..
Mais avec cette petite application tres SYMPA pour pouvoir debuter (nota :
Encore OK, sous WIN10 !)
ou simplement tester de petites routines .
qui ne pèse que 4Mo ..... MPLABX IDE +XC8 > 3Go !



Mai 2006
misimDE version 1.79
avec JAVA environnement: j2re-1_3_1_11-windows-i586.exe
...voir Site: http://www.feertech.com/misim et
https://jsecom15k.sun.com/
Simulator PIC 16F84

Misimde179-complet.zip
exemple de
settings
lancement avec
misim179_.bat



les Plugins dispo. :



exemple application

; 12 juin 2015
; tourne sur PC ASUS Win 8.1
; sur Win XP PIV 2,6 Ghz
; 10 aout 2011 velo_11z.asm
; 02 juin 2007 velo_10z.asm misimDE version 1.7.9
; 12 mai 2005 velo_7z.asm rajout Interrupt sur entree RB0 et interrupt Tmr0
; 09 sept 2004 velo_6z.asm : modif routine BCD pour ne pas afficher les 0 non significatifs
; et afffichage KMs au format xxxx.x
; 02 sept 2004
; B0 simule capteur de Tour : ~ 3 impuls par tour de pedale
; 761 tour de pedale pour 1km avec roue de diam 700
; PI.D= 2,199114858 metre
; rapport 52/16 =3,250 developpé=7,147 M soit 139,9 tours de pedales par KM
; si 3,1 tour volant d'inertie par tour de pedale => 434 impuls= 1km ou 43 impuls=100M
; **** HARDWARE PLUGINS *****
; simple switch :&127Port A:3 Raz compteurs
; switch : Port B:0 (Tdp)
; LCD Display : 2x24, Port A:ERS, Port B:7654xxxx
; LED : Port A:4

;-------------------
; routine LCD 2lignes de 8 car 6 bits I/O : PortB 7 6 5 4 et PortA 0 1
; inclus routine delai4m.inc @4MHz
; programme simple pour decoder/ lire Telecommande Infrarouge Marantz 5200
;*******************************************************
; Quartz = 4MHz
; Cycle = 1/Fosc = 1uSec
;*******************************************************


le source du programme :
Velo_12z.asm

Running !



Nota:
ce point de depart m'a permis de developper ,par la suite, cette application
VELO


le seul Bemol :
difference de syntaxe avec MPLAB sur les mnémoniques ASM MCU !
copyright Microchip oblige...
mais facilement transposable ..




Entrons dans le mode REEL , avec un vrai PIC16F84

et L'AVANT ICSP (In Situ Serial Programming)

Pas d'ICSP sur le 16F84, nécessite donc d'etre installé sur un programmateur spécifique
et des manips de débrochage et rebrochage ensuite sur la carte d'application ..

J'avais pris à l'epoque le POK508 ( because..pas trop cher !)



avec un seul emplacement pour PIC 18 pins ..ou memoire 24LC256

Au debut , la liaison se faisait avec cordon Male Femelle RS232 au port COM1 DB9 (vrai RS232) d'un PC
* Adaptation avec convertisseur Trend TU-S9 pour liaison DB9 port RS232 --> USB Port COM virtuel PC
....Attention le port virtuel peut se placer automatiquement assez haut ex: PORT COM 33 !
dans ce cas passer par systeme parametres -> COM -> pour modifier le nom du PORT COM de 33 à COM2 par exemple

Logiciel de programmation
j'utilise ICPROG 1.0.5d Ok ....de Win98 à WIN10 en modifiant le raccourci ..forcage en WIN98



Icprogr_105d.zip

voir
ICPROG_sous_windows_XP_rev_2022-1216.pdf





L'application 16F84 MPLAB XC8

Avec ce petit 16F84 , MCC n'est pas dispo !
donc en direct live ...
Le but est de faire une liaison serie (TX seulement ) pour ce 16F84
Le module UART Soft est ecrit en simili ASM ...

* les registre de travails (ASM) sont definis à des adresses absolues
* #define _XTAL_FREQ 4000000 // car filtre ceramique 4MHz installé sur ma carte BlueBird Electronics PCB053
* RA2 definie comme sortie UART , RA4 sortie Led

Package exporté :
16F84_Tests_XC8.zip

Le source
main.c
avec le detail de la partie ASM


#define TX3_Pin RA2;
#define TX3_Pin_Dir TRISA2
#define LED_Dir TRISA4
#define LED RA4


Byte c3 __at (0x0020);
Byte RS_Count __at (0x0021);
Byte RS_tmp __at (0x0022);
Byte RS_Delay __at (0x0023);

void UART3_Write(uint8_t cc) // 16MHz 19200 bauds
{
c3=~cc; // complement du caractere !
// avec TX3_PIN => RA2
__asm(" movlw 8 ");
__asm(" movwf _RS_Count");
__asm(" bcf PORTA,2 ");
__asm(" call RSdelai2");
__asm(" L00:");
__asm(" rrcf _c3,1 ");
__asm(" btfsc STATUS,0 ");
__asm(" goto L10 ");
__asm(" bsf PORTA,2 ");
__asm(" goto L20 ");
__asm(" L10:");
__asm(" bcf PORTA,2 ");
__asm(" L20:");
__asm(" call RSdelai2 ");
__asm(" decfsz _RS_Count,1 ");
__asm(" goto L00 ");
__asm(" bsf PORTA,2 ");
__asm(" call RSdelai2 ");
__asm(" call RSdelai2 ");
__asm(" goto LA1");
__asm(" RSdelai2: ");
__asm(" MOVLW 28 ");
__asm(" MOVWF _RS_tmp ");
__asm(" RS00:");
__asm(" NOP");
__asm(" NOP");
__asm(" NOP");
__asm(" NOP");
__asm(" DECFSZ _RS_tmp,F ");
__asm(" GOTO RS00 ");
__asm(" NOP");
__asm(" NOP");
__asm(" NOP");
__asm(" RETURN ");
__asm(" LA1: ");
__asm(" nop");
}


on est donc ici à 4800 bds ( Car FOSC =4MHz au lieu de 16MHz)

Programmation ICProgr

images/t_ICProgr_POK508_16F84_programmation_OK_2022-12.gif

Banc de Test PIC16F84

images/t_Banc_de_test_16F84_2022-12.gif

Resultats
sur terminal PC YAT 4800bds
ecriture de 0 à 9 chaque seconde ..en boucle



Usage de SQA logic Analyser (signal RA2)

images/t_Test_16F84_Bluebird_et_SQA.gif images/t_SQA_Capture_chiffre_6_UART_4800bds.gif
liaison SQA sur signal UART capture envoi Chiffre 6 ( =0x36)

lien : Forum Fantaspic





17/12/2022

Tentatives de programmer le 16F84 avec des outils réscents :
Montage 16F84 sur bread board , avec le minima connecté ICSP RB7 et RB6 + MCLR + 0V + VCC
*Pickit3 stand alone ou Pickit Minus .... 16F84 NON connu, only 16F84A ...
BAD
* MPLAB IPE 6.00 ...Pickit3 .....16F84 Connu, mais connection
Impossible (meme avec alim externe)
* MPLAB IPE 6.00 ...Pickit4 et avec alim Externe ....
programmation OK
conclusion :
seul Pickit4 peut programmer mon 16F84, et ce ,d'une façon confortable .

sur bread board
rajout d'un Quartz encadré de 2x32 pf sur pins 15 16 (OSC1 OSC2)
rajout Led + R 2.7k sur sortie RA4
rajout d'une R =10K de tirage au +Vcc sur pin MCLR ..(
sinon problemo !)
la sortie RA2 -> Rx du Prolific cable -> terminal PC YAT 9600,8,N,1
Alim 5V

Recompilation MPLABX XC8 pour 9600 bds ( puisque FOSC = 8MHz)
Configuration projet : rajout Usage du Tools : Pickit4
Chargement du programme ..OK



Mise à jour 17/12/2022
16F84_Tests_9600.zip


Test OK

images/t_MPLABX_IDE_600_XC8_Test_16F84_9600bds.gif




16F84 , mesure Humidite ,Temperature -> blueTooth Application

Hardware :


Schema

rev 2024-0723

images/t_16F84_DHT22_Test_schema_2024-0723.gif

Prototype
Monté sur une mini breadboard orange de 45x35mm
PIC16F84, quartz 8MHz
RA0 entree signal AM2302 ( =DHT22)
RA1 sortie led rouge avec R=2.7K
option (sans LCD):
RA2 sortie TX3 uart software à 9600 bds
ou connectée sur RX HC05 bluetooth Esclave en SPP
R=10K en pullup sur MCLR

LCD 2x16 classique :
Rcontraste 2,7k à 4,7K , R serie led backlight 470 ohms
Commandes RB0 =>RS , RB2=> Enable
R/W LCD au Gnd
mode 4 bits parrallele D0..D3 -> Gnd
3 versions soft:
UART3 (sans LCD)
LCD D4..D7 avec coté PIC RB3-RB6
LCD D4..D7 avec coté PIC RB4-RB7

images/t_Proto_16F84_8MHz_AM2303_HC05_2024-0707b.gif


SOFTWARE

MPLABX XC8
sortie sur Terminal YAT , via UART software (bit bang) sortie TX3 sur Pin RA2
pas de RX terminal !!!
Le probleme majeur sur c ePIC et le peu de RAM dispo : 68 bytes

Probleme avec table Texte [25]
//main.c:61:: error: (1250) could not find space (25 bytes) for variable _Texte
meme apres usage de Compiler Advisor....
=> Byte Texte[22]; // maxima possible !

images/t_Compiler_advisor_16F84_DHT22_Test_2024-07.gif

on gagne 6 bytes de RAM , en payant la licence ....ça fait cher l'octet!

J'ai donc utilisé 1 seule table de 22 bytes en RAM pour tous les messages à afficher
La fonction UART3 TX est en ASM integré...
Mesures rafraichies avec interval (delay) de 2 secondes
Sortie sur YAT terminal

RA2 UART3 9600 bds
001 Temp = 27.4°C RH = 66.8%
002 Temp = 28.0°C RH = 64.4%
003 Temp = 28.1°C RH = 63.3%
004 Temp = 28.2°C RH = 62.2%
005 Temp = 28.3°C RH = 61.4%
006 Temp = 28.4°C RH = 60.6%
007 Temp = 28.4°C RH = 60.0%
008 Temp = 28.4°C RH = 59.4%
009 Temp = 28.5°C RH = 59.0%
010 Temp = 28.5°C RH = 58.6%
011 Temp = 28.5°C RH = 58.3%
012 Temp = 28.5°C RH = 58.0%
013 Temp = 28.4°C RH = 57.7%
014 Temp = 28.4°C RH = 57.4%
015 Temp = 28.4°C RH = 57.2%
016 Temp = 28.4°C RH = 57.0%
017 Temp = 28.4°C RH = 57.2%


Test prealable du module HC05
connecté , tout seul, directement au terminal PC
via un cable USB/TTL prolific
Le +5V USB alimente le HC05

avec module HC05-8701B => name : Temper_Ext
direct sur cable prolific relié au PC (terminal YAT)

USB -- converter + Cable prolific --> connecteurs ----> blanc 5pins - HC05 enfiché sur ce connecteur

Prolific
cable

connecteur
5 pins

HC05
pin

Rouge

Rouge

+VCC

Vert

Noir

RXD

Blanc

Vert

TXD

Noir

Blanc

Gnd


pour
modifier la vitesse de dialogue UART
en utilisant le mode AT

YAT Terminal

AT
OK
AT+VERSION
VERSION:3.0-20170609
OK
AT+ADDR?
+ADDR:98D3:21:F48701
OK
AT+UART?
+UART:19200,0,0
OK changement pour
AT+UART=9600,0,0 vitesse application 16F84
OK
changer ensuite la vitesse sur YAT !
AT
OK
AT+VERSION
VERSION:3.0-20170609
OK
AT+UART?
+UART:9600,0,0
OK

HC05 RX connecté à RA2 UART PIC


Usage de BT Simple Terminal sur Phone Altice S62
BlueTooth activé et apparairage réalisé

images/t_BT_simple_Terminal_DHT22_16F84_20240707.gif


Nota : le chargement du programme 16F84se passe tres bien avec l'environnement MPLX IDE V6.00
et le Pickit4 ...mais il faut alimenter le PIC via une source externe ..

package :
_16F84_DHT22_Tests_2024-07.zip
chargeur :
_16F84_DHT22_Tests_2024-07.X.production.hex
source :
main_16F84_DHT22_Tests_2024-07.X.c




16F84 , mesures AM2302 sur LCD2x16
( version MPLABX XC8)


Programmation laborieuse , car la version LCD occupe plus de place .
et on a que 68 bytes de RAM sur ce PIC et 1Ko de programme
ça rentre au chausse-pieds !

Memory Summary:
Program space used 3FFh ( 1023) of 400h words ( 99.9%)
Data space used 34h ( 52) of 44h bytes ( 76.5%)
EEPROM space used 0h ( 0) of 40h bytes ( 0.0%)
Configuration bits used 1h ( 1) of 1h word (100.0%)
ID Location space used 0h ( 0) of 4h bytes ( 0.0%)


j'ai du abandonner la presentation via message d'invite sur le LCD , pas assez de place
j'ai privilégier le clignotement de la led Rouge ..pour verifier que le programme tourne
//strConstRamCpy(Texte,"16F84 at 8Mhz ");
//LCD_Pos(1,0);
//LCD_Print(Texte);
// strConstRamCpy(Texte,"Mesure AM2302 ");
// LCD_Pos(2,0);
// LCD_Print(Texte);


* Note 1: la mise au point a été laborieuse du fait de la trop petite taille memoires de ce PIC
..plutot prévu pour utilisation de l'ASM !
avec un 16F1847 ..very easy ...pourrait gerer le LCD et L'UART hardware.


Prototype :

images/t_16F84_DHT22_LCD_2x16_2024-0711.gif

HARDWARE:

schema version LCD

LCD sur port B
B0,B1,B2 partie commandes
B4..B7 Datas
* note 2: La pin R/W LCD peut etre reliée directement au 0V ( libererait pin RB1)
AM2302 sur Pin RA0 avec pull-up 4.7k au +VCC
Q=8MHz (oscillateur)
Led Rouge sur RA3 ,reliée à +VCC via R=2.7K
RA2 dispo pour version UART3 9600bds
Pin4 MCLR tirée au +Vcc via 10K

schema version LCD

SOFTWARE version LCD

#define TX3 PORTAbits.RA2 // for UART3
#define TX3_Pin_Dir TRISAbits.TRISA2 // for UART3
#define LED_Dir TRISAbits.TRISA3
#define LED PORTAbits.RA3
#define DHT22_Pin PORTAbits.RA0
#define DHT22_Pin_Dir TRISAbits.TRISA0


void Pulse_En (void);
void LCD_Delay_20ms(void);
void LCD_Cde(unsigned char cmd);
void Init_XC8_LCD (void);
void LCD_Put(char data);
void LCD_Print(char *str);
void LCD_Pos(char L,char posX);


_16F84_DHT22_LCD_Tests_2024-0711.X.hex
main_16F84_DHT22_Tests_LCD2x16_2024-0711.X.c

modifications :
... rajout break dans fonction test etat port ...pour eviter un blocage programme sur timeout...
probleme detecté seulement en version MikroC !

librairie LCD :
LCD_2x16_lib_X.c
LCD_2x16_lib_X.h

main_16F84_DHT22_Tests_LCD2x16_2024-0714.X.c
_16F84_DHT22_Tests_2024-0714.X.zip





LCD 2x16 et AM2302
version en MikroC Pro 7.60 .
.OK aussi en version MikroC Free !

Hardware :


images/t_LCD_DHT22_2024-0722.gif
port Data RB4...RB7
port Commande RB0... RB2


difference avec version XC8 ...
rajout du break dans la version MikroC !
tombe en marche en XC8, sans le break !

if( PORTA.B0==0)
bit_clear(value, (7 - i)); // Clear bit (7 - i)
else
{
bit_set(value, (7 - i)); // Set bit (7 - i)
k=0;
while( PORTA.B0==1)
{ // Wait until pin goes low
k++;
if (k > 100)
{Time_out = 1;
break;
}
Delay_us(1);
}
}


Projet MikroC Pro 7.60:

usage de la lib Lcd MikroC !
usage de Pickit4 et MPLABX IPE pour le chargement du programme

Pickitminus avec 16F84A ICSP seulement ..!.

16F84 pas dans la liste de Pickit3minus ?

usage de MPLABX IPE (stand alone) ..OK

images/t_MPLABIPE_Picki4_16F84_ok.gif


Version avec port Data LCD RB4-RB7 (MSB)

compilation conditionnelle avec

avec :
#define RETRAITE128
voir :
https://fantaspic.fr/viewtopic.php?f=10&t=1444&p=22262#p22262

caractere 178 pour le sigle degré sur LCD
_16F84_DHT22_LCD_2024-0722_RB4-RB7_178.zip
_16F84_DHT22_LCD2x16_RB4-RB7_2024-0723_MC.c
_16F84_DHT22_LCD_RB3-RB6_2024-0723_178.hex
sinon :
avec caractere 228 pour le sigle degré sur LCD
_16F84_DHT22_LCD_MC_2024-0713.zip
_16F84_DHT22_LCD_2x16_RB4-RB7_223_MC_2024-0723.c
_16F84_DHT22_LCD_2x16_RB4-RB7_MC_2024-0714.hex
_16F84_DHT22_UART3_9600bds_2024_0713.ihex

autre choix port Data LCD RB3-RB6:
caractere 228 pour le sigle degré ... testé sur un LCD 4x20
Lcd data sur RB3-RB6...OK
_16F84_DHT22_LCD_2x16_RB3-RB6_MC_2024-0713.hex




retour à l'index general