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

images/Pickit2_MCP2150_demo_board.jpg images/MCP2150_demo_board_Test_Shanga.JPG
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..

images/IRDA_board_16F877_a_schem.jpg images/IRDA_board_16F877_LCD_schem.jpg images/IRDA_Board_16F877_implantation.jpg
schema 1 Attention Mettre RD5=1 pour usage du LCD  



../common/GIF/lgreen_cligno.gif
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

images/IRDA_ADC0.jpg images/IRDABoard.jpg
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

images/IRDABoard_Test_140607.jpg images/IRDA_board_16F877_sch.jpg
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 !

../common/GIF/DS1307_24C32_I2C_RTC_module.jpg ../common/GIF/DS1307_24C32_schema_RTC_Module.jpg
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

mages/t_16F73_ac-voltage-VO_schema.gif


Schema Modifié

images/t_230V_AC_Measuregif

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


images/t_PWM_180Khz_5bits_16F877_test_2020_10.gif

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 :

images/t_IRDABoard_16F877_PWM_10b_5Khz_Duty_64_2020_09.gif images/t_IRDABoard_16F877_PWM_10b_5Khz_Duty_512_2020_09.gif images/t_IRDABoard_16F877_PWM_10b_5Khz_Duty_990_2020_09.gif
Duty Cycle =f(EA0) =64 Duty cycle f(EA0) = 512 Duty Cycle f(EA0) =990



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 !

images/t_IRDA_Board_avec_16F887_2020_1005.gif

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


images/t_PWM_tests_16F887_8MHz_2020_1004.gif  
IKALOGIC SQA ANALYSER terminal avec set de commandes


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..


images/t_Terminal_PWM_Yat.gif

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)




paulfjujo@free.fr