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
Banc de Test PIC16F84
Resultats
sur terminal PC YAT 4800bds
ecriture de 0 à 9 chaque seconde ..en boucle
Usage de SQA logic
Analyser (signal RA2)
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
16F84 , mesure
Humidite ,Temperature -> blueTooth Application
Hardware :
Schema
rev 2024-0723
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
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
!
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 |
connecteur |
HC05 |
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é
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 :
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 :
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 ..!.
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