version 0.0 24 avril 2014
rev .15/11/2020....

Ready for PIC 18F45K22 .. Applications

Presentation de la carte de developpement MikroE READY FOR PIC (2014)
LCD 2x16 COG 16 mode // 4 bits sur connecteur HE10 .. en 5V!
Big LCD 2x16 mode // 4 bits.. en 5V
LCD 2x16 LCD 2119 avec liaison I2C .. en 3,3V
UART1 , UART2 , ADC , LCD COG16.. en 5V
Utilisation de l' UART via USB (Terminal YAT) , LCD COG16 et entree ANA4 (2020_1115)
Mesure Temperature capteur One Wire DS18B20, UART1 , LCD COG16. en 5V
Affichage et pilotage de 8 leds RGB + 8 leds normales via UART

3 methodes pour decortiquer une trame de texte contenant des valeurs numeriques séparées par un ";"


La Carte Ready For Pic 18F45K22 USB de MikroE
Un bon rapport qualité/prix pour cette carte bien organisée et documentée
(PS: je n'ai pas d'action chez Mikroelectronica, je paie plein bu !)
Cette carte est alimentée , pour ce test, que par le port USB.
Attention : risque de disjonction du port USB , à la mise sous tension (connection), reintialisation software port USB

sous MikroC
avec version enregistrée MikroC Pro V7.60
Le PIC18F45k22 a un bootloader incorporé
et un composant FTDI sur la carte pour interfacer l'UART PIC en USB.
La liaison USB permet de programmer le PIC via son bootloader avec le programme "Bootloader.exe"
passe via le port virtuel FTDI-UART COM12 à 115200 bds,8,N,1 dialogue Software.
Le but est de tester l'ensemble : CARTE + liaison USB avec le PC + Bootloader
De meme , l'application utilisera l 'UART1 du PIC , relié au PC via l'USB , terminal virtuel Vbray sur COM12

La liaison USB port virtuel UART

Le driver FTDI doit etre installé sur le PC
De meme que le logiciel Bootloader.exe, que l'on peut lancer ,soit à partir de l'IDE Mikro Pro C , soit directement
On peut voir l'affichage des message emis par l'UART1 .. via ce port virtuel USB-UART

images/RFP_18F45K22_terminal_USB_COM12.jpg

Test de 3 versions de LCD

Version COG16
Test prealable avec le COG16 , qui comporte le connecteur (HE10) qui va bien !
raccordé sur le PORT B ( deja testé avec d'autres PIC.)
ATTENTION, ne fonctionne qu'en 5V d'alim.

images/COG_LCD_2x16.gif images/RFP_18F45K22_et_COG16_140423.jpg
LCD Cog16 de MikroE test prealable avec le COG16 sur le port B


Modif sur le port Mikroprog connector

Coupure des pistes reliant les pins impaires et paires, afin de pouvoir connecter éventuellement un Pickit3 en ICSP
Attention, NE PAS EFFACER LE BOOTLOADER si usage de l'ICSP !
Attention, ne pas oublier les straps de connections sur le connecteur MikroCProgr
sinon , les connection du port B ne sont plus reliees au pins correspondantes du MCU


images/RFP_for_Pic_18F45K22_connect_ICSP.jpg

Fichier source (MikroC ):
Programe source et chargeur : 18F45K22_RFP_COG16_MC.zip


Big LCD 16268C 2x16 cars

connection sur un autre port , pour verifier la versatilité de la bibliotheque MikroC LCD

../_18FxxKxx/images/Big_LCD_16268C_94_V0.jpg images/RFP_18F45K22_BIG_LCD2x16_140423_a.jpg
Cet afficheur provient d'une carte HS Connair HS Programme running.. test OK
images/t_RFP_18F45K22_Big_LCD_sch.jpg images/RFP_18F45K22_BIG_LCD2x16_140423_b.jpg
Schema avec Big LCD Tres facile les connections via fils Femelle-femelle


Fichiers Source et chargeur (MikroC) : 18F45K22_RFP_Big_LCD_MC.zip

Conclusion :
Ce LCD , piloté en mode 4 bits , est vraiment compatible HD44780, facile à mettre en oeuvre.
et offre un affichage TRES CONFORTABLE .
A noter : R de 2,7K au 0V à la place du potar de reglage de contraste.



Application utilisant l' UART, le LCD COG16 et l'entree ANA4

ATTENTION : l
'entree ANA4 est sur la pin RA5 !!!
L'UART est relié, via l' interface USB FTDI existant sur la carte , à la liaison USB, qui assume aussi l'alimentation 5V,
de la carte .
Nota: le cavalier "SUPPLY SELECT" doit etre sur 5V .. sinon le LCD ne fonctionnera pas.
Usage du "MikroE Bootloader" pour charger le programme via la liaison USB , qui meme à 115200 bds , est
TRES LENTE !
Par contre on a la liaison operationnelle sur le terminal YAT PC , sans rajouter de cable !

images/t_RFP_18F45K22_terminal_YAT_via_USB.gif /// FOSC interne 16MHz
CONFIG1H : $300001 : 0x00A8
CONFIG2L : $300002 : 0x0018
CONFIG2H : $300003 : 0x003C
CONFIG3H : $300005 : 0x00BD
CONFIG4L : $300006 : 0x0081
CONFIG5L : $300008 : 0x000F
CONFIG5H : $300009 : 0x00C0
CONFIG6L : $30000A : 0x000F
CONFIG6H : $30000B : 0x00E0
CONFIG7L : $30000C : 0x000F
CONFIG7H : $30000D : 0x0040

/ LCD module connections
sbit LCD_RS at LATB2_bit;
sbit LCD_EN at LATB3_bit;
sbit LCD_D4 at LATB4_bit;
sbit LCD_D5 at LATB5_bit;
sbit LCD_D6 at LATB6_bit;
sbit LCD_D7 at LATB7_bit;
   



Software :
18F45K22_UART_Test_UART_ADC_COG16_msutera_2020_1115.zip
_18F45K22_UART_Test_UART_ADC_COG16_msutera_2020_1115.c
18F45K22_UART_ADC_COG16_2020_11.hex




LCD 2119 2x16 cars, dialogue via I2C

Alimentation PIC et LCD en 3,3V
commutateur carte Ready for PIC sur 3,3V
Afficheur piloté en I2C via I2C1 Hardware
connection via breadboard pour pouvoir rajouter les 2 R de rappel 2,7K sur le bus I2C
et la resistance de 220 ohms limitation Led Backlight
Modif hardware pour Backlite minimum permanent ::
pont entre 1 et 7 et R=750 entre 2 et 6 sur le connecteur haut (libre opposé)
et suppresion de la liaison pin 5 et 6 du connecteur bas pour R=220

Pas de biblio MikroC existante ...

HARDWARE :
il y a 2 connecteur sur ce LCD , un en Haut et un en bas..
Heureusement, au niveau du soft on peut definir où est le Haut ...
La carte Ready for PIC utilise l'USB pour :
* alimenter le tout (ici en 3,3V )
* programmer le PIC via MikroE Serial bootloader
* utiliser l'UART terminal mikroE
L'UART du PIC etant interfacé enUSB via une puce FTDI
ce qui en rend l'usage tres souple.
Docu sur LCD :
PCF2119X_rev12.pdf

images/t_LCD2119_test_Ready_for_Pic_18F45K22.gi images/t_PCF2119_Pinout.gif
Test LCD2119 Ready for PIC 18F45K22 Pinout LCD 2119

Directory : C:\_MikroC\_MesProjets_MikroC\_18F45K22_ReadyForPic\
Projet : 18F45K22_UART_LCD2119.mcppi
source: 18F45k22_Uart1_ADC0_LCD_2119_I2C_150906.c
FOSC Q=8Mhz x 4 (PLL) => 32MHZ OBLIGATOIRE pour le bootloader
Hardware : Ready for PIC 18F45K22
Power supply: SUPPLY SELECT SWITH on 3.3V
RS232 UART1 19200,8,N,1 --- FTDI--USB__terminal virtuel COM23 Windows 8.1
LCD : LCD2119 2x16 cars I2C link 2 wires
LED LED + 390 ohms on RA4 output

SOFTWARE
source en MikroC pro 6.50 et projet zipé : 18F45k22_Uart1_ADC0_LCD_2119_I2C.zip

1ere version avec PIC18F87J50


// 06 sept 2015
/// version avec UART1 pour debugging
// rajou erase ligne , cls , fonction ecriture texte
// la 1ere ligne LCD affiche la mesure de l'ADC voie RA0
// la 2em ligne LCD affiche le message recu par UART1
// Interrupt on Timer0 .. every 1 sec
// Interrupt on RX UART1

images/LCD_adresse.gif

L'adrese de ce LCD est bien 0x74, testé OK via la fonction check_device(device).
La 1ere ligne est à l'adresse DDRAM 0x80 ... 0x9F.
La 2em ligne est à l'adresse DDRAM 0x80+0x40 = 0xC0 .. 0xCF.

liste des fonctionalites:
int LCD2119_Init(void);
void RAZ_UART1(void);
void Init_Timer0(void);
void UART1_Write_CText(const char *txt1);
void strConstRamCpy(char *dest, const char *source);
void CRLF1(void);
void LCD_CLS(void);
void LCD_Clear(void); // <-- PB >> au lieu de space.. à suivre
int LCD2119_Init(void);
void LCD_RAZ_Ligne(int L);
void LCD_Write_Text(unsigned int Ligne,unsigned int Col,char * t1);
void check_device(unsigned char dev_address);


  images/t_PCF2119_I2C_codes.gif
  codes de commande I2C

Log on UART1 terminal Vbray
Version : 07-09-2015 b
18F45k22 Ready for PIC : Test LCD 2119 2x16 en I2C
MikroC Pro v 6.50 Q=8MHZ x PLL => 32MHz
Projet : 18F45K22_UART_LCD2119.mcppi
Fosc = 32000 KHz
Init I2C1 100Khz
Device at adresse : 116 found OK
Init Display LCD2119
Nb Step = 6
Ecriture sur 1ere ligne du LCD : 18F Ready for PIC
Ecriture sur 2em ligne du LCD : LCD2119 07/09/15
Mes.1 ADC0= 140
Mes.2 ADC0= 140
Mes.3 ADC0= 140
Mes.4 ADC0= 140


A suivre .. autres fonctions .. bargraph...



UART1, UART2, LCD COG16 4bits // 2x16 cars, ADC

voir les caracteristiques de la carte

La liaison USB assume ici , 3 fonctions
- Alimentation 5V de la carte
- Programmation via USB serial bootloader
- Laison RS232 via device FTDI sur port virtuel COMxx (COM23 sur mon PC)
* L'alimentation externe 9VDC est optionnelle dans ce cas precis.
Le schema de la carte modifié pour la circonstance :

images/t_Ready_for_Pic_18F45K22_2_UART_LCD_sch.gif

images/t_ReadyFoPic_18F45K22_2_UART_LCD_ADC_proto.gi

// Hardware : Carte Ready for PIC 18F45K22 avec bootloader
// liaison 1 via USB <--> FTDI <--> UART1 115200 bauds
// Laison UART2 sur connecteur PORT D <--> interface 2TR <-> PC
// LCD COG 16 sur connecteur PORT B en mode 4 bits
// Led sur port A4
// EA sur RA0
Cette carte apporte un reel confort de programmation .
Nota: Il n'est pas indispensable d'avoir cette carte et un PIC avec bootloader, il suffit alors d'utiliser
un PICKIT3 et le mode ICSP pour charger le programme, et utiliser le COM1 d'une façon classique
avec interface RS232 et une alim. 5V externe


SOFTWARE :

// 23 nov 2015
/// projet : 18F45K22_UART1_UART2_LCD_COG.mcppi
// Usage de MikroC Pro version 6.62 (enregistrée )

Usage des outils MikroE:
MikroE Serial Bootloader à ne pas confondre avec le HID bootloader (pur USB !)
La laison s'effectue à 115200 bauds.
Apres avoir compilé le programme source *.c et tous les autres fichiers adjoints (*.h, * cfgsch,*.ihex...)
et No errors, la carte etant reliée au PC via USB, alimentée, faire reset sur la carte pour que le Mikrobootloader
reconnaisse la presence du bootloader isntallé dans le PIC .. on a laors le status "CONNECT" qui apparait
Clicker sur "CONNECT"
Ouvrir le fichier *.hex à charger
Le charger
On voit le ruban vert deroulant .. le chargement du fichier..
A la fin on doit avoir ,
CECI
Il faut faire un RESET sur la carte pour que le programme d'application soit lancé !

Le programme d'application peut tout à fait utiliser cette liaison physique via un cable USB , pour exploiter
l'UART1 en 19200,8,N,1 ( on pourrait choisir la meme vitesse que celle du mode programmation !)
avec cette fois un autre outil Mikroe
MikroE USART Terminal
on retrouve le COM23 ! of course !

Le PIC18F4522 a 2 UARTS.
Usage de l'UART2 en VRAIE LIAISON RS232
je me suis fait piégé (encore une fois , du déja vécu, en plus !) car le LCD ne fonctionnait plus, ni la liaison UART2
En fait, ne pas lire trop vite la data sheet qui precise RB6 ,RB7 comme PINs pour UART2
Ce n'est vrai que pour la version DIP28 PIC18F25K22, un petit indice de renvoi,
precise RD6,RD7 pour la version DIP40 ...
RD6 TX -> ecran , RD7 RX <- Clavier .. niveaux TTL 5V (donc interface RS232 necessaire)

La partie configuration des bits est un etape TRES IMPORTANTE
Une fois realisé, sauvegarder cette config dans un fichier avec un nom explicite
ex:
P18F45K22_internal_FOSC_16Mhz_No_PLL.cfgsch
Une sequence de test est incluse dans le source , à effectuer au moins une fois , pour etre sur
de la valeur FOSC utilisée par le MCU dans VOTRE programme
//#define TEST_FOSC // activer pour vérifier la config FOSC
dans cette application, utilisation de FOSC interne à 16Mhz
car avec le bootloader incorporé on ne peut pas changer la config issue de l'usage du Quartz installé
sinon il faudrait viere le bootloader et utilise l' ICSP .

Le programme comporte des fichiers annexes tels que :
#include "Timer0_routines.h" // init Timer0 500mS
#include "../common/UART1_UART2_routines.h "
#include "../common/String_routines.h" // autres fonctions String hors librairie MikroC
#include "ADC_Routine.h" // version utilisant les registres du PIC
#include "Interrupts_routines.h"
Ce qui permet d'alleger le programme source principal
Usage d' options de compilation conditionelles ,
si on a pas bsoin de certaines fonctionalités
exemple : #ifdef With_Timer0
ou dans le module interruption #ifdef With_UART2
permet de tester chaque fonctionalité separement ...

#ifdef DEBUGGING .. permet , si on lance le programme en mode debugger
de passer outre des tempos tres longues ou test bloquant , car le Hardware n'est pas simulé.
Tout le monde ne possede pas la version Pro de PROTEUS !

Le debugger de MikroE permet deja pas mal de chose ..
Pour ma part ,je prefere utiliser un port UART .. encore faut-il que celui ci soit OK!
Via le mode interrupt, on peut envoyer des commandes clavier pour modifier le comportement
du programme : ex: FLOAT ou INTEGER ( ou autres commandes !)
permet de comparer le calcul d'une moyenne arithmetique glissante sur 8 valeurs
avec calculs en Flottant ou simplement en Entier.
Les calculs en flottant PRENNENT ENORMEMENT de RESSOURCES MCU.
Meme si la version INTEGER est moins précise, elle peut etre utilsée sur de petit MCU

Difference resultat de traitement Moy INT Moy FLT

points moyenne INT moyenne Float
166 8.2 8.09
414 20.5 20.21
793 39.1 38.70
1011 49.8 49.42


voir
unsigned int Mesure_Moyenne_Glissante_Temperature(int M1)
et
float Mesure_Temperature_Filtree(int M1)
le traitement est fait pour une mesure de temperature via un LM35DZ 0 à 500°C 10mV/°C
La partie ADC utilise ici , les registres du PIC et non pas la librairie ADC MikroC
Il faut savoir qu'il y a beaucoup de difference de registre ADC suivant les PIC utilisés..

Incorporation de la documentation dans le source ..
//ac:Terminal_UART1_USB
// ac:FTDI_Terminal
// ac:USB_serial_Bootloader ²
// ac:Schema_ReadyForPIC
// ac:Datasheet_18F45K22
les images ou pdf associées doivent toujours rester dans le meme directory de depart.
On peut envisager un lieu de stockage de documents communs à plusieurs projet ..pour eviter les doublons.

Utilisation de la Flash ROM pour stoker les textes , au lieu de la RAM
Ce n'est pas vital,ici,car ce PIC possede beaucoup de RAM
MAIS ela peut etre indispensable pour les PIC ayant peu de RAM !

Le projet complet MikroC:



Le dossier complet zippé ( source C,*.h ...etc)
_18F45K22_ReadyForPic_2Uarts
l
e contenu du zip



DS18B20 capteur temperature One Wire

Mesure avec résolution de +- 0,0625°C
et affichage temperature Capteur sur LCD 2x16 car et sur UART1
Affiche le numero de serie "ID number 64 bits" , sur la 1ere ligne LCD
Utilise la liaison existante USB/FTDI UART1
projet similaire avec 18F47J53


Le montage Hardware:


images/t_Ready_For_PIC18F45K22_DS18B20.gif

La plaque d'essai (BreadBoard ou "Planche à pain" sic RPC , ne sert qu'à relier les 3 fils du cable sonde DS18B20 !
Le LCD est sur le PORTD
L'UART1 est deja connecté via le module FTDI embarqué sur la carte, en Port Virtuel COM USB
Nota: On peut aussi relier RC6 et RC7 via un MAX1232 à un port COM RS232 PC !
Le capteur utilise l'entree RE0, et est alimenté en 5V local, via la Breadboard


Le projet MikroC :
issu de l'original MikroE Libstock
Version amenagée :
Ready_For_PIC18F45K22_DS18B20.zip
testé OK à 4, 8 et 48MHz
Alim VCC=5V.

Resultat sur Terminal PC HTerm port virtuel (USB) COM23

Mikroc Pro 6.620
version :02-01-2016
Source :18F45K22_DS18B20_OneWire.c
18F45K22 Ready for PIC
LCD COG2x16 mode 4 bits sur PORTD
UART1 via USB -> COM23 Vbray Terminal
Test specifiq. capteur OWS DS18B20

Fosc = 8000 KHz
Check delay de 5000mS entre # et @
#
@
init UART1 19200,8,N,1
Init LCD COG 2x16 mode 4 bits
Code ID identification 64 bits = B8031564C783FF28
Code hexa Famille : 18B20: Temp = 21,3125
Temp = 21,3125
Temp = 21,1875
Temp = 21,1875
Temp = 21,1875
Temp = 21,1875




Affichage et reglage de 8 leds RGB + 8 led normales (via cdes UART)
10/01/2016


But :
Evaluer cette carte equipée de 8 leds RGB
ajuster les couleurs de chaque Led RGB , sans pour autant disposer de 3 PWM Hardware dans le PIC
Commande aussi des 8 autres Led (classique)
Pilotage via Terminal Virtuel sur la liaisonUSB

HARDWARE :

La Carte 8 leds RGB comporte 3 commandes pour les couleurs RGB
et 8 commandes pour activer chacune des 8 Leds RGB
ATTENTION Logique negative !
il faut un Zero pour activer , allumer 1 led RGB , une commande pour designer la LED + 1 cde pour le choix de couleur
Utilise la liaison existante USB/FTDI UART1 de cette carte Ready For PIC 18F45K22

images/8Leds_RGB.gif images/t_Leds_RGB_schema.gif
Carte KEYES RGB V2 K845041 schema et laisons





La Carte Easyled 8 leds est enfichée sur le PORT B :



Le tout est alimenté via la liaison USB ( ou via la connection 9V DC externe)
La liaison USB sert à l'alimentation 5V, la programmation et aussi à la liaison Terminal Virtuel COM 23

images/t_Test_8leds_RGB_160110.gif
   


La carte e 8 leds RGB est directement reliée à la carte Ready for PIC avec :
- des fils F-F sur les pins du PORT D0-D7
- Liaison +VCC repris sur le + du PORT A
- 3 fils connections RGB via fils F-F sur respectivement le PORT RC0,RC1,RC2

SOFTWARE :

J'utilise 2 timers en mode interruption pour generer un PWM qui est aiguillé sur chaque led , suffisament rapidement pour que
l'effet P.O.V. ( Persistence Of Vision = Persitence retinienne) laisse apparaitre un eclairage continu des leds..
En realité chaque couleur est activée pendant 0.5mS maximum sur 12mS !
Le Timer4 calé sur 508µS , gere le depart du signal PWM et ARME Le Timer2 qui recoit comme parametre , La consigne , valeur de 1 à 250 permettant
de regler/ tenir un temps de conduction (Etat Allumé) .
Le Maxi Timer2 est TOUJOURS inferieur au Timer4 (immuable), est c'est lui, lorsqu'il arrive à son terme de comptage ,qui eteint la Couleur/Led
On peut donc ainsi regler la luminosité de chaque couleur
On est donc synchronisé sur la base de 508µS , on change de couleur .. avec 3 couleurs (RGB) cela donne la periode de changement de Led soit 508x 3 = 1524µs ,
On balayage ainsi les 3c * 8 Leds en 1508 x 8= 12 192 µS ou ~12,2 ms => Rafraichissement à 81 Hz
Malgre un taux d'interruption elevé , l'interrupt RX UART à 38400 bauds passe tres bien
Un flag est armé des qu'on rencontre le caractere CR dans le buffer de reception qui se remplit à chaque caractere arrivé.
Si le flag est armé, on interdit les interruption pendant le traitement de la demande reçue, pour éviter les interferences
surout lorsqu'on veut changer de couleur !
Les couleurs sont rangees dans un tableau de taille 8 x 3 ( 3 valeurs d'intensite de couleurs par led)
et on a la possibilité de le SAUVEgarder en EEPROM du PIC.. ou de le LISTer ou de le Charger (LOAD)
Au lancement du programme on charge la table qui est en EEPROM(celle du PIC).
On peut agir aussi sur les 8 autres Leds normale ,via une commande individuelle 1 ou 0, (LED1=1 ou LED2=0 ou commande globale ON/OFF
La commande HELP , liste toutes les options possibles.

HELP
Cde LED portB avec x=num led de 0 à 7, etat 1 ou 0 ex: LED1=1 ou LED1=0
Cde Globale LEDs PortB avec : LEDs_ON ou LEDs_OFF
Cde Reglage LEDs RGB : RGBx,RRR,VVV,BBB<CR>
ex: RGB1,128,35,12 soit Reglage LED1 R=128 V=35 B=12
LIST_TABLE : Liste contenu TABLE de reglage RGB des 8 leds
LOAD_TABLE : Charge PIC EEPROM -> TABLE 8 leds
SAVE_TABLE : Sauve TABLE 8 leds RGB -> PIC EEPROM
TOUT_R : Couleur ROUGE pour toutes les leds
TOUT_V : Couleur VERTE pour toutes les leds
TOUT_B : Couleur BLEUE pour toutes les leds
IDEM_LED0: couleur de LED0 -> copiee pour toutes les leds


Le PIC est cadencé à 32MHz ( Q=8Mhz x 4 (PLL)
J'ai exploité la fonction strtok pour extirper les valeurs RGB de la commande envoyé via le clavier (=RX UART)
cela permet , via un delimiter remarquable, ici la virgule, de separer des champs de donnees de LONGUER VARIABLE ,et de les recuperer facilement
sinon il faut formatter chaque entree de donnée ( voir
ancienne fonction saisie RGB)
La valeur de reglage led RGB est donc envoyée avec une entete immuable "RGB", suivi du numero de led 0 à 7, separateur virgule, puis
les 3 valeurs de couleur separées via une virgule., terminateur =<CR> ex: RGB1,12,100,200 pour du violet sur la Led RGB #1

Nota:
L'intensité lumineuse des leds n'est pas terrible ,vu le rapport ON/OFF ~5% maxi
Il faudrait diminuer notablement les resistances de protection en serie avec les leds, mais R CMS déja sur le circuit.
La photo ne montre pas bien les couleurs ! L'appareil photo n'a pas la meme persistence retiniene que vous et moi.

Ce n'est pas, bien sur, la solution optimale pour commander 8 leds RGB.
c'est plus un projet didactique .
Il existe des version PIC pouvant gerer 3 PWM independants pour piloter les 3 signaux RGB
ou Mieux des circuits specialisés gerant jusqu'à 16 PWM simultanés ( voir module PCA9685)

Le projet MikroC , complet et zippé:
Ready_For_Pic_18F45K22_8leds_RGB

l
e code en html



Resultat d'echange dialogue avec HTerm port virtuel COM23






Comment extirper des valeurs d'une trame texte

3 methodes decrites dans ce source mikroC
Pour les tests, la trame à tesetr est introduite au clavier du termianl (UART1)
La 1ere methode,
recommandée pour sa souplesse, est l'usage de la fonction strok

cette fonction de la librairie "String" sert à isoler une donnees par rapport à un string separateur de donnees
Le plus usité est le format CSV, bien connu avec Excel.. on utilisera de preference le ";" au lieu de la ","
pour eviter de deboires avec le nombres decimaux (francais).
Un premier appel de strok est necessaire pour se positionner sur la premier occurence du 1er caracteredu string de recherche
avec comme parametre le pointeur du buffer, et le caractere separateur (1er car du string).
la fonction retourn un pointeur NULL si non trouvé .
ex: p1=strok(buffer,";");
les appels suivant se font avec un pointeur NULL comme parametre
ex: p1=strok(0,";");
On utilise alors cette fonction recursivement pour parcourir toute la chaine
et ainsi,isoler les valeurs comprises entre les separateurs
Nota: la fonction attent pour le séparaeur un pointeur de string (uniquement)
Testé ok avec
p1=strtok(buffer1,";");
et avec l' usage d'une variable string pour stocker le caractere separateur
char Separateur[2];
Separateur=strcpy(Separateur,";");
p1=strok(buffer1,Separateur);

voir ausi les remarques ici : MikroE link
Also, strtok is useless for parsing protocols (e.g. GPS NMEA sentences) because it discards empty tokens.
For example:
[code]
char txt[] = ";;1;22;333;;4444";
char result[10];
char * p;

p = strtok(txt, ";");
while (p != 0) {
   strcpy(result, p);
   p = strtok(0, ";");
}

The results will be :
l"1"
"22"
"333"
"4444"
[/code]


La 2em Methode
Methode hyper classique d'exploration du buffer , caractere par caratere

On evalue la longueur de texte à parcourir k=strlen(buffer)
Au depart on initialise un index "i" pour parcourir le buffer, de 0 à k
un indexe "Index" à zero ,pour ranger les valeurs isolees
et un pointerur "p1" pointant sur le debut du buffer.
Boucle:
for (i=0;i<k;i++) {
if(buffer[i]==';')
{
Des qu'on rencontre le caractere ( ce n'est plus un string !) separateur (';')
on y met un zero en lieu et place,( string terminateur à la place).. donc buffer1 est clos
buffer[i]=0;
on a donc le buffer (et pointer p1 ) qui pointe sur la premiere valeur isolée
On range cette valeur dans une table Time[Index]
ici, on traite des valeurs numeriques, donc on converti ascii-> numerique au passage, atoi( p1,Time[i]);
On incremente p1 de la valeur I (nb de car parcourus) + 1 , pour passer derriere le zero qu'on vient de mettre
on increment aussi Index, futur emplacement de stockage valeur
et on boucle avec
} next i
En sortie de boucle on a nos valeurs numériques rangées dans Time[]

La 3em Methode
La plus simple mais la plus contraignante et non portable, car le format doit etre IMMUABLE
ex: ";"1;45;23"
On connait par avance où sont positionnés les separateurs ';'
Il suffit alors d'utiliser les indice de stockage
la 1ere valeur sur 1 digit (donc limitée à 0..9 est en buffer[1];
on peut la transformer en numerique simplement en retranchant 48 (ou '0')
Time[0]=buffer[1]-48
La 2em valeur '45' sur 2 digits , donc indice 3 et 4
buffer[3] represente les dizaines
buffer[4] represente les unitees
Time[1]= ((buffer[3]-48)*10 + buffer[4]-48
ou autre façon : Time[1]= Buffer[3]*10 + Buffer[4]-528;
La 3em valeur '23' sur 2 digits , donc indice 6 et 7
buffer[6] represente les dizaines
buffer[7] represente les unitees
Time[2]= ((buffer[6]-48)*10 + buffer[7]-48
ou autre façon : Time[1]= Buffer[6]*10 + Buffer[7]-528;

le source MikroC : 18F45K22_UART1_Test_StrOK.c
le cvhargeur :
18F45K22_UART1_Test_strok.hex





paulfjujo@free.fr


common/GIF/LTC1286p.jpg



Retour à l'index general