rev0 14/01/2014
Rev 05/10/2020
MCU : PIC16F877
Presentation
carte Microchip IrDA Demo Board1 102-00032 (MikroC
version démo)
Test
formatage de l'affichage en flottant sur le LCD (MikroC version
démo)
Test avec RTC
DS1307 et Eeprom 24KC256 sur bus I2C (
MikroC enregistré)
Mesure Tension
Secteur 230V AC 5 (MikroC enregistre)
Chargement d'une EEPROM
24LC256 32K par un fichier de donnée
Tests PWM
5bits 180KHz , Duty Cycle ajustable (via UART RX
Interrupt) ou Entree ADC RA0 (09 / 2020)
Tests PWM
10bits 5KHz .....via UART ou ADC RA0 (02/10 / 2020)
Tests PWM 8
bits, en 3 gammes de prescaler avec PIC16F887 (05/10 / 2020)
LIENS UTILES :
Timer2 : capture,compare,PWM
Ressources configuration broche PWM
16F877
et IrDA Demo Board Microchip 102-00032
Fevrier 2008
Test avec le programme
microchip livré avec la carte
![]() |
|
Connecteur RJ pour l' ICSP !! | Test liaison IR avec PC et cle IR Shangai |
Alim : 9V DC par pile ou bloc alim 9V DC AC/DC
OSCILLATOR 20MHZ TTL ECS-100AX-200 ECS Inc.
MCP2150 pour liaison IRDA avec coupleur optique en U14= TFDU4300
Emplacement pour EEprom 24LC256
docu technique Microchip ICI .
http://ww1.microchip.com/downloads/en/DeviceDoc/51516b.pdf
Le PC est equipé d'une clé à 10, marque Shangai , qui
necessite un driver KS-959.sys
les test realisées avec le logiciel Microchip pre-installé sur
la carte et en face l'appli IRDA , sont OK.
Les sources ne sont pas fournies ! VRAIMENT DOMMAGE..
![]() |
![]() |
![]() |
schema 1 | Attention Mettre RD5=1 pour usage du LCD |
14-01-2014
Test formatage de l'affichage en
flottant sur le LCD
(avec MikroC version limitéee 2K )
utilise la librairie michrochip LCD , mais Attention: ne pas oublier RD5=1 , sinon pas d'
affichage (quand meme) déroutant !!!
Ne pas oublier non plus de passer les Pin RA en TOR
au lieu d'Analogique (par defaut au reset.) via ADCON=6.
MikroC en version limitee 2K :
source : 16F877_Irdaboared_Float2asc_140114.c
chargeur :16F877_Irdaboard_Float2asc.hex
Test mesure ADC channel 1 voie RA0
Cette voie est reliée au potar VR1 sur la carte..
Pour Conserver RA0 en ANA et RA1,2,3 en Sortie TOR , cette fois
ADCON1=0x0E.
Usage de float2ascii,pour afficher 0,000 à 4.999V
MikroC en version limitee 2K :
source :16F877_Irdaboared_ADC1_140114.c
chargeur :16F877_Irdaboard_ADC.hex
![]() |
![]() |
Test reel, voie RA0 sur potar de la carte | L'elastique,c'est pour tenir renfoncé la plug cassée |
Juin 2014
Test avec version MikroC
enregistrée, donc NON limitée..
Connection Interface 2T, sur RC7 et RC6 pour exploiter l'UART
raccordes sur J15, RC6 et RC7 ..vers interface 2T
![]() |
![]() |
![]() |
![]() |
||
![]() |
||
carte raccordéee au Pickit2, alim 9V et interface 2T | schema complet | ![]() |
Le module transmet bien sur TX vers le PC, mais la reception RX ne fonctionne pas
...
ATTENTION:
soit retirer le circuit MCP2150 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
Rajout RTC DS1307 sur le bus I2C
Module RTC DS1307 Miniinthebox, alimenté via +5V et Gnd de J15
Raccordement SCL sur RC3 de J15
Raccordement SDA sur RC4 de J15
Adrese I2C Eeeprom 24C32 = 0xA0 !
![]() |
![]() |
RTC DS 1307 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;6;19;09#035#013
( exemple pour le 7 juin 2014 à 19H09)
Acquisition voie 0 = Potar de la carte .
Moyennage sur 32 valeurs consecutives et affichage en point +
Volts (en flottant) sur la 2em ligne du LCD
Envoi aussi sur le terminal des 32 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 et en flottant sont aussi
affichées sur le terminal.
Commandes des leds LD0 à LD3 (sur RD0 ..RD3)
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 Led D5 .. qui sert à valider l'affichage LCD..
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
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...
15/07/2014 A VERIFIER
SI INTERFERENCE 24C32 du module RTC DS1307
En transfert Byte par Byte , il peut y avoir ecriture
simultanée dans les 2 eeprom ,meme adresse
idem pour a lecture, par contre le mode Page , non encore testé
ne devrait pas survivre à cette cohabiation forcéee
A SUIVRE ...
Resultat sur terminal VBRAY:
En resumé: Application point de depart ,pour Datalogger
Eeprom: 16F877_Irdaboard_EEPROM_RS.ihex
Source MikroC : 16F877_Irdaboard_Float_LCD_RS_PicEEprom_24LC256_DS1307_140607.c
Chargeur Hex : 16F877_IRDAboard_LCD_RS_ADC_PWM.hex
Mesure
Tension Secteur 230V AC
schema original
Schema Modifié
But: mesurer la tension du secteur
base de calcul :
On prevoit la possibilité de Secteur +10% => 253 V
Transfo 230V/12V
Le generateur 50Hz necessite une valeur crete crete et non pas
RMS
d'ou , en partant de 12V +10% => 13,2V et 13,2*1,414 => 18,6V
crete
On etablit le rapport diviseur de façon à obtenir ,pour le maxi=253V,
La mesure Maxi sur l'entrée ADC du PIC devra etre alors de 5V
pour obtenir 1023 pts
La mise à l'echelle , en unite phisyque , se fera donc avec 1023/4.04=253
Le reglage fin par potar 10 tours, permettant une calibration en
divisant simplement par 4.
Division qui se resume par 2 decalage à Droite..
On a la relation finale:
253V AC --> 18,6V crete -> 5V ->1023pts => 1023/4.04=>
253 (V)
Avec -10% ......................-<> 16,79V crete -> 4.39V
-> 898 pts -> 222 V
Au lieu de 253-25.3=227V
erreur due à la pauvre resolution de mesure : +-1 point => +-4V
!!
A Suivre : Liaison
IRDA ! au lieu de liaison RS232
Chargement d'une EEPROM 24LC256 32K par un
fichier de donnée
En réponse à cette question : Programmer une 24LC256 sans acheter un
programmateur dedié pour
Le fichier de donnée à charger est constitué de datas 8 bits
representées en ascii, sur 2 digits, en hexadecimal
Fichier au format CSV, separateur ";" , et terminaison
de chaque ligne de 64 datas par un code <CR>
La terminaison du fichier etant un codage remarquable, ic le code
CD3
La taille du fichier test est de 46 857 bytes .. pour 15 616
bytes de datas utilse .. celle qui seront chargées dans l'EEPROM
32K.
Un microcontroleur ,avec une liaison UART Hardware et une liaison
I2C HARDWARE , peu gerer cela/
Le fichier à envoyer , se fera par la liaisoin Serie UART , via
un terminal PC, sous le format 19200,N,8,1 protocole RTS/CTS.
Le cable de laision devra donc comorter la gestion de ces siganux
!
Pour ma part , j'ai utilisé le meme interface
hardware que pour le programmateur de AT89C2051.
Nota: la ligne RTS n'est pas exploitée..
HARDWARE :
Je me suis servi de ma carte Microchip 16F877 IrDA Demo Board 1,
qui a quelques particularites:
8 leds sur le port D
Bloc Oscillateur externe 20MHz
LCD 2x16
I2C Eeprom emplacement DIP 8 avec adresses A0,A1,A2 = 0
le hardware minimaliste étant:
UART .....RC6,RC7
I2C1 ..... RC3,RC4 avec Pull up 4,7K
CTS ... sortie RC5
Qxx MHz oscillateur ( on peut mettre une autre valeur que 20MHz)
MCLR tiré au +5 via 6,8K
Terminal VBRAY ( tourne encore ) sour WIN10, mais il n'y a plus
de scroll ecran.
Le fichier à charger : 64bytesHEX.csv
sous excel , 64ytesHEX.csv remis en forme avec
format 0# pour les valeurs Hexadecimales < 10 ( etait sur 1
seul char !)
// 1 ligne de 64 data => 192 chars +CR =193
// 244 lignes de 192 chars utiles
// 244 x 64 datas => 15 616 datas.
// taille fichier 46857 bytes
// lecture par shunks de 64 chars .. des que 64 Bytes data
extirpés des 192 chars d'une ligne
// rangement en ligne dans la Page Eeeprom des 64 datas =>
ecriture dans EEPROM
Nota :
on aurait pu charger le fichier "brut de pomme " ,
toutes les datas en binaire , 1 unsigned char = 1 byte de data,
sans separateur,
et 1 seul CR ou DC3 en fin de fichier , soit un fichier de 15617
octets.
Le separateur ";" et le <CR> amenent un plus :
démontre qu'on a la meme modularité au niveau du dump final
eeprom.
SOFTWARE :
La principale difficulté est le peu de RAM dispo avec ce PIC16F877
, et surtout la mauvaise gestion des bank RAM par MikroC
Alarme IRP Bit .. meme avec une
taille de buffer de 90 bytes , alors qu'il y a
> 150 bytes dispo en RAM, mais dans d'autres BANK RAM.
Ce probleme n'existe pas pour les 18F .. mais ici 16F877
IMPOSé .
Le Buffer RAM n'est donc que de 64 bytes .. la Page EEPROM est
aussi de 64 bytes !
Au fur est a mesure de la lecture des 192 characteres par ligne ,
avec 3 chars par donnes ( ex: "FF;" les 2 carac
Hexadecimaux de la valeurs + le separateur ";")
192/3= 64 donnees , qu' on stoke dans la table de 64 bytes,
puisqu'elle est pleine
on la transfert dans la page EEPROM 24LC256, puis on continue
ainsi
On a donc 1 pages EEPROM pour chaque ligne de characteres .. à
terme 244 lignes -> 244 pages ( de 0 à 243)
A la fin du fichier, par detection de DC3, on lance le DUMP de l'eeprom
, pour en verifier (visuelement) le contenu .
Le projet complet MikroC
File_To_24LC256_via_16F877.zip
source : _16F877_File_2_Eeeprom_24LC256_CTS_180307.c
chargeur : 16F877_Irdaboard_File_To_24LC256_CTS.hex
le résultat : DUMP de l'eeprom
Test_Relecture
_24LC256_chargee_par_file_64bytesHex_180306.log
Cette application serait plus facile et performante avec un 18F26K22
avec 3896 bytes RAM à acces linéaire,
ou un 18F4685 ayant > 3K RAM compatible pins.
plutot que le 16F877 avec 368 bytes RAM seulement , repartis en
plusieurs bank.
Tests PWM 5bits à 180KHz avec 16F877
Sept 2020
Hardware :
carte Microchip IRDA Demo Board1 avec 16F877
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 -> SQA Analyser
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
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;
Mettre à Zero , la sortie RC0
pour mettre Hors Service le cicuit MCP2150 gerant les
signaux IRDA ( Com infra rouge)
afin de gerer indépendament, UART RX sur pin RC7
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 ;
L'init PWM est faite ici , au niveau des registres MCU ,
au lieu d'utiliser la librairrie PWM MikroC
donc plus portable pour d'autre PIC.
.. necessite d'avoir la datasheet du 16F877 sous les yeux !
TMR2IE_bit=0;
//PWM1_Init(2000);
SQA=1;
TRISC2_bit=0; // RC2 PWM output
// REGISTER 8-1: CCP1CON REGISTER/CCP2CON REGISTER (ADDRESS 17h/1Dh)
//bit 3-0 CCPxM3:CCPxM0: CCPx Mode Select bits 11xx = PWM mode
CCP1CON=0x0C;
// TMR2 used for CCP1 PWM output
//REGISTER 7-1: T2CON: TIMER2 CONTROL REGISTER (ADDRESS 12h)
// TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 TMR2ON T2CKPS1 T2CKPS0
//The input clock (FOSC/4)
// pass trough a prescale option of 1:1=00, 1:4=01 or 1:16=10,
selected by control bits
//T2CKPS1:T2CKPS0 (T2CON<1:0>).
// bit 6-3 TOUTPS3:TOUTPS0: Timer2 Output Postscale Select bits
de 1/1=0000 à 1/16 =1111
//T2CON = 0b00000100; // TMR2 ON, postscale 1:1, prescale 1:1
// Post Scaler
Timer2
// ne sert à rien dans la fonction PWM !
TOUTPS3_bit=0;
TOUTPS2_bit=0;
TOUTPS1_bit=0;
TOUTPS0_bit=0;
// prescaler Timer2
T2CKPS1_bit=0;
T2CKPS0_bit=0;
// at 20/ 4 Mhz tick=0,2µS 180 Khz =>
5.55µS => 27x0.2=5.4µS
PR2 = 27-1; // PR2 set to total PWM period of 10 ticks (5.5uS) at
20Mhz
DutyVal=14; // 50%
CCPR1L=DutyVal; //PWM1_Set_Duty(DutyVal) ;
SQA=1;
TMR2ON_bit=1; // PWM1_Start();
SQA=0;
Remarque Importante :
la valeur du Duty Cycle CCP1RL NE PEUT PAS depasser celle de PR2
Il en resulte une
resolution sur 5 bits seulement
sur la valeur de Duty Cycle , soit de 1 à 26 dans le cas present
où PR2=26 .
// voir PWM_calculs.xls
// Duty value : at 180KHz !
Duty value | % duty |
2 | 1 |
3 | 10 |
7 | 25 |
14 | 50 |
16 | 60 |
20 | 75 |
24 | 90 |
26 | 98 |
L'analyser IKALogic Analyser connecté sur la sortie PMW RC2
et avec SQA=RD1 comme trigger montre bien le résultat
La valeur de "Duty Cycle" est saisie de 2
manieres :
* Via la liaison UART Terminal YAT et la commande "Duty=xx"
, avec xx variant de 0 à 26 soit 0 à 100%
stocké dans DutyVal et appliquée au registre CCPR1L....
*ou soit en réglage continu via la commande ANA_ON
la valeur moyenne de 16 mesures sur l'ADC 0 à 1024 est
recalibrée (sur 5 bits) soit 0..31 , et stockée dans DutyVal
et appliquée à CCPR1L à chaque tour de boucle principale (
every 1sec)
La commande ANA_OFF desactive la connection à ADC RA0, Duty
Cycle memorisé sur dernier valeur lue
et attend une eventuelle commande Clavier
ATTENTION
Ce PIC n'a que 384 bytes de RAM , repartis en blocs de 96bytes
non contigus
si un message IRP_bit apparait dans la fenetre "Messages" à la
compilation = MEFIANCE et effets de bords !
MikroC NE SAIT PAS GERER les banques 16F en mode
linéaire ! il faut le faire en MANUEL !
La reponse MikroC => passer en 18F !
Ce qui oblige à reduire la taille de la table de reception UART
..et utiliser une declaration an adresse absolue Bank0
// voir
PWM_calculs.xls
Projet MikroC :
16F877_Irdaboard_Test_PWM_180Khz_5b_2020_1002.zip
source : 16F877_Irdaboard_Test_PWM_180Khz_5b_2020_1002.c
Chargeur :16F877_Irdaboard_Tests_PWM_5b_180Khz_2020.hex
Version PWM 10bits à Freq=5KHz
Duty cyle cde 0 à 1023
Usage des 2 bits CCP1X et CCP1Y en plus de CCPRL 8 bits pour
former une commande sur 10 bits
Init PWM Fequency :
FOSC/4 =20/4 Mhz => 1 cycle = 0,2µS
Prescaler 1/4 => 0,8µS
5Khz= > T=200µS
200/0.8= 250 => PR2=250-1=249
TMR2IE_bit=0;
SQA=1;
//bit 3-0 CCPxM3:CCPxM0: CCPx Mode Select bits 11xx = PWM mode
CCP1CON=0x0C;
CCP1CON.CCP1X=0;
CCP1CON.CCP1Y=0;
// Post Scaler
Timer2 1/1
// inutilisé en PWM
TOUTPS3_bit=0;
TOUTPS2_bit=0;
TOUTPS1_bit=0;
TOUTPS0_bit=0;
// prescaler Timer2 1/4
T2CKPS1_bit=0;
T2CKPS0_bit=1;
// at 20/4 Mhz =>tick=0,2µS * prescaler=4 => 0.8µS pour 5
Khz soit 200µS => 250
// PR2 = 250-1; // PR2 set to total PWM period of 250 ticks *0.8
= 200µS => 50KHz
PR2=250-1 ; // 5Khz
DutyVal=512; // 50%
CCPR1L=DutyVal>>1; //PWM1_Set_Duty(DutyVal) ;
CCP1CON.CCP1X=( (DutyVal>>1) & 0x0001); // MSB
CCP1CON.CCP1Y=(DutyVal & 0x0001); // LSB
SQA=1;
TMR2ON_bit=1; // // PWM1_Start();
SQA=0;
Duty Cycle Value , fonction de valeur analogique
EA0 ( 0 à 1023)
TMR2ON_bit=0;
DutyVal= EA0 ;
k=EA0;
CCP1CON.CCP1Y= (k & 0x0001); // 1 bit LLSB B0
CCP1CON.CCP1X= ((k>>1) & 0x0001) ; // 1 bit LMSB B1
CCPR1L=(k>>2); // 8 bits B2...B9
TMR2ON_bit=1;
Nota : en mode PWM 10bits on ne peut pas depasser 19KHz (at Fosc=20MHz)
Résultats :
Projet : mikroC
02/10/2020
_16F877_Irdaboard_Test_PWM_5Khz_10b_2020_1002.zip
_16F877_Irdaboard_Test_PWM_5Khz_10b_2020_1002.c
16F877_Irdaboard_Tests_PWM_5KHz_10b_via_UART_or_EA0_2020.hex
Avec MCU
16F887
monté sur carte Microchip IRDA Board Demo ( à la place du 16F877)
* avec le 16F877 je ne disposait que du Quartz 20MHz !
SQA Analyser sur RC2 et RD6 (trigger)
Guère de differences entre 16F877 et 16F887 ,si ce n'est :
* Oscillateur Interne HFINTOSC dispo :125Khz à 8MHz
* Selection ADC via ANSEL et ANSELH au lieu de ADCON1
* Auto bauds UART
* la gestion PortD parralelle disparait !
* PWM évolué sur CCP1 (pont simple, demi et entier dans les 2
sens) => 4 pins de sorties
* PortB individual Pin can be used as interrupt pin ( instead of
RB7-RB4 + RB0)
*** je n'ai pas bien compris :
Le postscaler pourrait etre utilisé pour avoir une frequence
de rafraichissemeny servo, differente de celle de la sortie PWM
et
Test à FOSC interne=8MHz
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..
config terminal YAT :
Terminal1_PWM_test.yat
Projet MikroC
_16F887_Irdaboard_Tests_PWM_at_8Mhz_2020_1004.zip
_16F887_Irdaboard_Tests_PWM_at_8Mhz_2020_1004.c
16F887_IRDA_board_Tests_PWM_with_Fosc_8Mhz_2020.hex
nota: avec Q=20MHz pour FOSC,
possibilité de generer du PWM à 500Khz ,
voir 1MHz , mais avec une tres faible résolution (2 bits)