Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général sur le langage C !

Modérateur : Jérémy

Mplab X et mode debug sur pic 16f876A- en C
francknvs
Débutant
Débutant
Messages : 82
Enregistré en : septembre 2017
Localisation : Paca-toulon

#1 Message par francknvs » sam. 14 oct. 2017 15:46

Bonjour à tous ,
je reviens aupres de vous pour un problème de config dont je me prends la tete depuis qqs jours
je travaille sous:
-Windows 10
-Mplab X v4.01 et ICD3
-Compilateur Hi TECH (-> langage C)
-Pic 16f876A

Le but de mon programme est de faire du pas à pas en mode debug
Pour cela , j'ai réalisé un petit programme séquentiel au rythme d'un quartz de 20 Mhz fort simple commandant 4 led: (code source ci-dessous)
Configuration Materiel
Pic alimenté via platine sous 5volts
icd3 power activé en 5volt
MCLR sur ICD3
VSS & VDD sur ICD3
Pin RB6 et RB7 sur ICD3

A/programmation
1/la compilation se passe bien
2/la programmation aussi
3/le pic fonctionne de façon normal

B/en mode debug: ça se complique
* toujours dans la meme configuration d'alimentation
-ça compile
-ça programme
-ça se lance (Running) automatiquement
Mais:
au moment de la pause, le programme se fige
Target Halted
The target device is not ready for debugging. Please check your configuration bit settings and program the device before proceeding. The most common causes for this failure are oscillator and/or PGC/PGD settings.
Failed getting PC

je comprends que la cause est peut etre due

1/aux Pin RB6/RB7
INIT_DIRPORTB;//TRISB=0b11000000
//[rB7-rB4]=Entree--->(rb7 rb6) mode ICSP

je suis pourtant bien configuré en mode ICSP

2/Aux Bits de config:
__CONFIG (FOSC_HS & WDTE_OFF & PWRTE_ON & BOREN_ON & LVP_ON & CPD_OFF & WRT_OFF & CP_OFF );


HYPOTHÈSE 1:est-ce un probleme de conf?

->j'ai bien pensé à configurer de façon manuelle avec DEBUG_ON (datasheet 16f876a) meme si la fenetre de
configuration Bits
de MplaX ne me le propose pas .
__CONFIG (FOSC_HS & WDTE_OFF & PWRTE_ON & BOREN_ON & LVP_ON & CPD_OFF & WRT_OFF & DEBUG_ON & CP_OFF );

-> Cela ne résoud rien , je n'arrive toujours pas à communiquer avec mon pic

HYPOTHÈSE2:est ce un problème de configuration des options de MplabX?


HYPOTHÈSE3:est ce un probleme de version de pic?
on ne peut faire de debug in real time avec la version A du 16f876?
--> pourtant la doc ne me dit pas le contraire puisqu'il y a une config dédicacé au debug

Par avance je vous remercie à tous pour vos lumieres à ce sujet, car pour le moment je ne peux avancer dans mon projet

Code : Tout sélectionner




//----------------------------------------------------------------
//*******************inclusion des fichiers***********************
//----------------------------------------------------------------
#include <htc.h> //chargement des en-tete issu du compilateur lors de la compilation
//#include <pic.h> //chargement des en-tete issu du compilateur lors de la compilation
#include <pic16f876a.h> //chargement des en-tete issu du compilateur lors de la compilation

//------------definition des registres Systemes---------------------------
#include "definition_registre_16f876.c"//chargement du fichier issu du dossier local lors de la compilation

//------------definition des fichiers temporels---------------------------
// on defini la valeur du Quartz en Hz utilisé sur le pic
 #define _XTAL_FREQ 20000000
// on peut utilser les fonctions declarées dans <pic.h> pointé par <htc.h>
// __delay_us(1)-> valeur imprecise verifiée à l'oscillo (tjrs +4µs mesuré)
// __delay_ms(1)-> valeur precise verifiée à l'oscillo
// __delay_s(1) -> valeur precise verifiée à l'oscillo


//-----------definition des fusibles de configuration
//

__CONFIG (FOSC_HS & WDTE_OFF & PWRTE_ON & BOREN_ON & LVP_ON & CPD_OFF & WRT_OFF & CP_OFF );

//definition des varibles Generales
//----------------------------------------------------------------
//---------------------------------E/S----------------------------------------------- 
//#define inter RA0  // pour donner un nom aux pattes de sorie ou entrée
#define led1 RA1     // pour donner un nom aux pattes de sorie ou entrée
#define led2 RA2
#define led3 RA3
#define led4 RB0
#define led5 RB1
#define led6 RB2
#define led7 RB3
#define led8 RB4
#define led9 RB5





//---------Declaration des variables------------------------------


//----------------------------------------------------------------
//***********************Prepo************************************
//----------------------------------------------------------------


//----------------------------------------------------------------
//***********************Debut Prog Main()************************
//----------------------------------------------------------------

void main(void) 
{
   
   
    
//---------initialisation-------------------------
//initialisation des registres
    INIT_OPTION; //= 0b00000000 
    INIT_ADCON1; //=0b00000110//I/O en mode Numerique
    INIT_INTCON; //=0b00100000//interruption generale desactivée
//phase de direction des ports
    INIT_DIRPORTA;//TRISA=0b00000001
    INIT_DIRPORTB;//TRISB=0b11000000
                   //[rB7-rB4]=Entree--->(rb7 rb6) mode ICSP  
                   //[rB5-rB0]=Sortie
    INIT_DIRPORTC;// =0xff// portc en entree {capteurs}   

//phase d'initialisation
    PORTA = 0; //Initialisation des pattes du microcontroleur 
               //car les entrées du port A sont à l'alimentation du pic mise à 1
    PORTB = 0; //Initialisation des pattes du microcontroleur 
               //car les entrées du port B sont à l'alimentation du pic mise à 1//

//Vérification des sorties----------------------------------------------

    
while(1)    //Faire ce qu il y a entre accolade tant que vrai (1)
    {
        led1=1;
        led1=0;
        led2=1;
        led2=0;        
        led3
=1;
        led3=0;
        led4=1;
        led4=0;        
        
        
    
}
}
 

Mplab X et mode debug sur pic 16f876A- en C
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2595
Enregistré en : juillet 2016
Localisation : Terre

#2 Message par Temps-x » sam. 14 oct. 2017 18:06

Bonjour

N'étant pas un spécialiste du C

Un petit rappelle :

Code : Tout sélectionner

_BODEN_ON                       Reset tension en service
                                Valide PWRTE_ON automatiquement
_BODEN_OFF                      Reset tension hors service     

_LVP_ON                         RB3 permet la programmation série de la PIC
_LVP_OFF                        RB3 en utilisation normale


Tu les mets sur OFF, et tu essais comme cela.

D'autre par, tu active les résistance sur OPTION_REG, donc tous les ports de RB0 à RB7 va être au +5.

Tu as mis si je me trompe RB7, et RB6 en entrée, avec du + 5 volts dessus

Code : Tout sélectionner

 INIT_ADCON1; //=0b 00000110//I/O en mode Numérique         

C'est peut être plus logique : :sifflotte:

Code : Tout sélectionner

 B'00000110' ; PORTA en mode digital



A vérifier :
Regarde si tes comparateur son sur OFF.

Juste pour t'aider un peu, on sait jamais :wink:

A+
Modifié en dernier par Temps-x le sam. 14 oct. 2017 21:55, modifié 1 fois.
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:

Mplab X et mode debug sur pic 16f876A- en C
francknvs
Débutant
Débutant
Messages : 82
Enregistré en : septembre 2017
Localisation : Paca-toulon

#3 Message par francknvs » sam. 14 oct. 2017 19:44

merci temps-x

Effectivement, nouvelle config:

Code : Tout sélectionner

__CONFIG(FOSC_HS & WDTE_OFF & PWRTE_OFF & BOREN_OFF & LVP_OFF & CPD_OFF & WRT_OFF & CP_OFF); 


mais j'avais déjà essayé cette config avant de poster...

en revanche, le coup du
Regarde si tes comparateur sont sur OFF.


Ca m a alerté!!!!
En effet, à la base ce programme est un copié d'un autre pour lequel j avais configuré le convertiseur AD.
...et comme j'utilise un programme modulaire avec l'inclusion d'un fichier qui gère les registres ( je le mets ici pour ceux que ça intéresse), afin d’éviter de surcharger la lecture du fichier source, j'avais oublié de désactiver le registre concerné ADCON1 et enlever les résistances de tirage vers le Haut dans OPTION par /
RBPU/= Pull up Enable bit on Port B.
1 = Pull up désactivé sur le Port B.
0 = Pull up activé.


En conclusion:
de mon programme ci-dessus (au 1er post)
j'ai modifié l'initialisation des Options en configurant par

Code : Tout sélectionner

B10000000

j'ai enlever l'initialisation ADCON1

Un tres grand merci à temps-x Merci ! :bravo: :+1:

A présent je vais regarder de pres ces histoires de CONFIG

mon fichier en C permettant d'initier les registres de configuration du Pic 16F876A à inclure dans le fichier Source du programme(j'en ai egalement fait un pour le 16f690 pour ceux qui le souhaite)
#include "definition_registre_16f876.c"
:

Code : Tout sélectionner

//******************************************************************************


/* NOM DU FICHIER: definition_registre_16f876.c



* ce fichier,traduit du datasheet 16f876A, permet de configurer chaque registre
* utilisé pour programmer un Pic 16F876A

* WARNING: J'utilise le compilateur HiTech
*  
* Pour rendre actif le registre concerné, 
* effacer les "//" de commentaire devant "# define" 
* copier/coller les registres dans le programme Source 
* pour que ces derniers soient compilés
 * 
 * par francknvs
*/
//------------------------------------------------------------------------------
/*
OPTION REGISTER Ce registre en lecture/écriture permet de configurer les prédiviseurs du Timer0
                et du Watchdog, la source du Timer, le front des interruptions et le choix du
                Pull up sur le Port B.. 

RBPU-INTEDG-TOCS-TOSE-PSA-PS2-PS1-PS0 (Au reset: OPTION = 11111111)

RBPU/= Pull up Enable bit on Port B.
      1 = Pull up désactivé sur le Port B.   
      0 = Pull up activé.                    

INTEDG= Interrupt Edge select bit.
        1 = Interruption si front montant sur la broche RB0
        0 = Interruption si front descendant sur RB0

TOCS= Timer TMR0 Clock Source select bit.
      1 = L'horloge du Timer est l'entrée RA4/Clk (pin 3).
      0 = Le Timer utilise l'horloge interne du PIC.

TOSE= Timer TMR0 Source Edge select bit.
      1 = Le Timer s'incrémente à chaque front montant de la broche RA4/Clk.
      0 = Le Timer s'incrémente à chaque front descendant de la broche RA4/Clk.

PSA= Prescaler Assignement bit.
     1 = Le prédiviseur est affecté au watchdog..
     0 = Le prédiviseur est affecté au Timer TMR0.

PS2 PS1 PS0= Prescaler Rate Select bits.  PS2 PS1 PS0 Prédiv Timer Prédiv Watchdog
                                           0   0   0       2             1
                                           0   0   1       4             2
                                           0   1   0       8             4
                                           0   1   1       16            8
                                           1   0   0       32            16
                                           1   0   1       64            32
                                           1   1   0       128           64
                                           1   1   1       256           128 
 */
                                          
# define INIT_OPTION OPTION_REG = 0b10000000                                  
//------------------------------------------------------------------------------
/*
INTCON REGISTER: Ce registre en lecture écriture permet de configurer les différentes sources
                 d'interruption. 
                 
GIE-PEIE-TOIE-INTE-RBIE-TOIF-INTF-RBIF(Au reset: INTCON = 0000000X )

GIE= Interrup Generale Enable bit
     1 = Autorise toutes les interruptions non masquées.
     0 = Désactive toutes les interruptions.

PEIE= Interrupt Peripherique Enable bit.
      1 = Autorise les interruptions causées par les périphériques.
      0 = Désactive les interruptions causées par le périphériques.

TOIE= Interrup sur debordement TMR0 Enable bit.
      1 = Autorise les interruptions du Timer TMR0.
      0 = Désactive les interruptions du Timer TMR0.

INTE= Interrup sur Pin RB0/Int Enable bit.
      1 = Autorise les interruptions sur la broche : PB0/IRQ (pin6).
      0 = Désactive les interruptions sur la broche : PB0/IRQ (pin6).

RBIE= Interrup sur changement d'etat de l'ensemble du PORTB Enable bit.
      1 = Autorise les interruptions par changement d'état du PortB (RB4 à RB7).
      0 = Désactive les interruptions par changement d'état du PortB (RB4 à RB7).

TOIF= Flag Interrup TMR0 bit.
      1 = Le Timer à débordé. Ce flag doit être remis à zéro par programme.
      0 = Le Timer n'a pas débordé.

INTF= Flag Interrup RB0/Int
      1 = Une interruption sur la broche PB0/IRQ ( pin 6) est survenue.
      0 = Pas d' interruption sur la broche PB0/IRQ ( pin 6).

RBIF= Flag Interrup Change d etat du PORTB.
      Ce flag doit être remis à zéro par programme.
      1 = Quand au moins une entrée du portB (de PB4 à PB7) a changé d'état.
      0 = Aucune entrée de PB4 à PB7 n'a changé d'état. 
*/
# define INIT_INTCON INTCON=0b00100000//interruption generale desactivée
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//                       LES INTERRUPTION PERIPHERIQUES 1 & 2
//------------------------------------------------------------------------------
/*              ---------------
                PERIPHERIQUE 1:
             
PIE1 REGISTER:(Au reset: PIE1 = 00000000)
              Ce registre contient les bits individuels d'autorisation pour les Interruptions
              des périphériques 1. 
              Le bit 6 de INTCON(PEIE) doit être mis à "1" pour autoriser une quelconque IT de 
              périphérique. 

PSPIE-ADIE-RCIE-TXIE-CCP1IE-TMR2IE-SSPIE-TMR1IE

PSPIE= Parallel Slave Port Interrup Enable bit .
       Ce bit n'existe pas pour un PIC 16F876( 28 pins). Toujours garder ce bit à "0".
       1 = Autorise les interruptions R/W du port SSP .
       0 = Désactive toutes ces interruptions.

ADIE= A/D converter Interrup Enable bit .
      1 = Autorise les interruptions du convertisseur analogique/digital .
      0 = Désactive cette interruption.

RCIE= USART Receive Interrup Enable bit .
      1 = Autorise les interruptions en réception de l'USART .
      0 = Désactive cette interruption.

TXIE= USART Transmit Interrup Enable bit .
      1 = Autorise les interruptions en émission de l'USART .
      0 = Désactive cette interruption.

SSPIE= Synchronous Serial port Interrup Enable bit .
       1 = Autorise les interruptions du module Synchrone (I2C) .
       0 = Désactive cette interruption.

CCP1IE= CCP1 Interrup Enable bit .
        1 = Autorise les interruptions du CCP1 .
        0 = Désactive cette interruption.

TMR2IE= TMR2 Interrup Enable bit .
        1 = Autorise les interruptions du Timer 2 TMR2 .
        0 = Désactive cette interruption.

TMR1IE= TMR1 overflow Interrup Enable bit .
        1 = Autorise les interruptions de débordement du Timer 1 TMR1 .
        0 = Désactive cette interruption. 
*/
//# define INIT_PIE1 PIE1=
//-----------------FLAG PERIPHERIQUE 1------------------------------------------
/*
PIR1 REGISTER:(Au reset PIR1 = 00000000) 
              Ce registre contient les FLAG associés aux interruptions des périphériques.
              Ces Flag passent à "1" quand une IT correspondante survient et que le bit
              d'autorisation est bien positionné. Ces Flag doivent être remis à "0" par Soft. 
              
PSPIF-ADIF-RCIF-TXIF-CCP1IF-TMR2IF-SSPIF-TMR1IF 


PSPIE= Parallel Slave Port Interrup Flag bit .
       1 = Une opération de R/W vient d'avoir lieu sur le port SSP .
       0 = Il n'y a pas eu de R/W sur le port SSP.

ADIF= A/D converter Interrup Flag bit .
      1 = Une conversion A/D est terminée .
      0 = la conversion A/D n'est pas terminée.

RCIF= USART Receive Interrup Flag bit .
      1 = Le buffer de réception de l'USART est plein (donnée reçue).
      0 = Le buffer de réception de l'USART est vide ( rien de reçu).

TXIF= USART Transmit Interrup Flag bit .
      1 = Le buffer de transmission de l'USART est vide ( on peut le remplir).
      0 = Le buffer de réception de l'USART est plein ( on ne peut pas le charger).

SSPIF= Synchronous Serial Port Interrup Flag bit .
       1 = Une condition d'IT dumodule SSP est apparue .
       0 = Aucune condition d'IT n'est apparue .

CCP1IF= CCP1 Interrup Flag bit .
        1 = Une condition de Capture ou de Compare du Timer1 a fait une IT.
        0 = Pas d'IT de capture ou de Compare du TIMER 1.

TMR2IF= TMR2 Interrup Flag bit .
        1 = Le Timer2 a fait une IT.
        0 = Pas d'IT du TIMER 2.

TMR1IF= TMR1 Overflow Interrup Flag bit .
        1 = Le débordement Timer 1 a fait une IT.
        0 = Pas de débordement du TIMER 2.  
*/
//# define INIT_PIR1 PIR1=
/*              ---------------
                PERIPHERIQUE 2:
             
PIE2 Register
             Ce registre contient les validations individuelles pour: 
                       -the CCP2 peripheral interrupt, 
                       -the SSP bus collision interrupt, 
                       -EEPROM write operation interrupt and 
                       -the comparator interrupt.

nc-CMIE-nc-EEIE-BCLIE-nc-nc-CCP2IE

nc:   Non Implanté: Lire comme ‘0’

CMIE: Validation des Interrupt du Comparateur 
      1 = Enables the comparator interrupt
      0 = Disable the comparator interrupt

EEIE: EEPROM Write Operation Interrupt Enable bit
      1 = Enable EEPROM write interrupt
      0 = Disable EEPROM write interrupt

BCLIE: Bus Collision Interrupt Enable bit
      1 = Enable bus collision interrupt
      0 = Disable bus collision interrupt

CCP2IE: CCP2 Interrupt Enable bit
      1 = Enables the CCP2 interrupt
      0 = Disables the CCP2 interrupt
*/
//# define INIT_PIE2 PIE2=
//------------------------------------------------------------------------------
//
//-----------------FLAG PERIPHERIQUE 1------------------------------------------
/*
PIR2 Register
             Ce registre contient les flag d'interrup pour: 
                        -le module CCP2 (CAPTURE COMPARE et PWM)
                        -collision du bus en mode SSP
                        -sur les operation d'ecriture en EEPROM
                        -sur le mode comparateur 2


nc-CMIF-nc-EEIF BCLIF-nc-nc-CCP2IF

nc:   Non Implanté: Lire comme ‘0’

CMIF: Flag d'interruption sur  Mode Comparateur
      1 = l 'entrée du comparateur a changé (doit etre remis à "o" par logiciel)
      0 = l 'entrée du comparateur n a pas changé 

EEIF: Flag d'interuption sur les operation d'ecriture en EEPROM
      1 = operation d'ecriture terminée (doit etre remis à "o" par logiciel)
      0 = operation d'ecriture non terminée ou non debutée
BCLIF: Flag d'interruption sur une collision du bus 
       1 = une collision de bus a été identifiée dans le SSP quand celui ci a été configuré en mode MAITRE I2C 
       0 = Pas de collision indentifée

CCP2IF: Flag d'interruption sur le module CCP2
Capture mode:
        1 = A TMR1 register capture occurred (must be cleared in software)
        0 = No TMR1 register capture occurred
Compare mode:
        1 = A TMR1 register compare match occurred (must be cleared in software)
        0 = No TMR1 register compare match occurred
PWM mode:
    Non utilisé.
*/

//# define INIT_PIR2 PIR2=


//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//                        LES PORTS ENTREE / SORTIE et REGISTRE DE DIRECTION
//------------------------------------------------------------------------------
/*PORTA

          - Au RESET:(TRISA = 1)
ATTENTION:- après un reset le Port A est configuré en CAN. Il faut 
            impérativement le configurer en I/O digitale pour l'utiliser comme tel. 
            Il faut pour cela accéder au registre ADCON1 
            et positionner les 4 bits PCFG à 0110 pour placer les 5 bit du PORTA en I/O DIGITAL
          - La Pin RA4 qui est partagée avec l'entrée horloge du Timer 0 est un Drain ouvert. 
            Il faut donc le tirer au +Vcc par une résistance de 10K pour l'utiliser en tant que sortie.
*/
# define INIT_DIRPORTA TRISA=0b00000001// [ra5-ra3]=sortie [ra2]=entree pour choix du mode  [ra1-ra0]=sortie nc
# define PORTA_DATA    PORTA
//-------------
/*PORTB             

          - Au RESET:(TRISB = 1 et PORTB : Tirage désactivé)
          - Chaque Pin du PORTB est munie d'un tirage au +VDD que l'on peut
            mettre ou non en service en mode entrée uniquement. 
            On active cette fonction par la mise à "0" du bit7 dans le registre OPTION.
          - Au reset, le tirage est désactivé.Il est inactif quand le port est configuré en sortie.
          
          - Les 4 Pin RB7 RB6 RB5 et RB4 provoquent une interruption sur un changement d'état 
            si configurées en ENTREE.
              On doit remettre à zéro le Flag de cette interruption (bit 0 du registre INTCON) 
              dans le programme d'interruption.
              Cette possibilité d'interruption sur un changement d'état associé à la fonction 
              de tirage configurable sur ces 4 Pin, permet l'interfaçage facile avec un clavier. 
              Cela rend possible le réveil du PIC en mode SLEEP par un appui sur une touche du clavier.
          - RB0 peut également être utilisé comme entrée d'interruption externe. 
            et Le choix du front de déclenchement se fait en configurant le bit 6 du registre OPTION.
*/
# define INIT_DIRPORTB TRISB=0b11000000// [rB7-rB4]=Entree--->(rb7 rb6) mode ICSP  (rb5 rb4)entree capteur D10-D9
                                       // [rB5-rB0]=Sortie
# define PORTB_DATA    PORTB
//--------------
/*PORTC
          - Il s'agit d'un PORT 8 bits bidirectionnel.
          - Il peut etre partagé avec le module de transmission synchrone I2C et l'USART 
               Pour USART:
                    Elle utilise le pins 6 et 7 du PORT C:      RC6 = TxDATA et RC7 = RxDATA
                    Les 5 registres utilisés sont :
                        voir Registre Emission :             TXREG
                        voir Registre Réception:             RCREG
                        voir Registre d'état Emission :      TXSTA
                        voir Registre d'état Réception :     RCSTA
                        voir Registre du choix de la vitesse:SPBRG
               Pour I2C:Le module MSSP (Master Synchronous Serial Port) 
                        permet de faire des transmissions au format I2C (Inter Integrated Circuits) 
                        en tant que Maître ou Esclave.
                        Il utilise les pins 3 et 4 du PORT C:   RC3 = SCL    et RC4 = SDA.
                    Les 5 registres utilisés sont :
                        voir Registre Buffer:                SSPBUF
                        voir Registre d'adresse:             SSPADD
                        voir Registre d'état:                SSPSTAT
                        voir Registre de contrôle:           SSPCON
                        voirRegistre de contrôle n°2:        SSPCON2
*/
# define INIT_DIRPORTC TRISC=0xff// portc en entree {capteurs}    
# define PORTC_DATA PORTC
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//                                         LES TIMERS
//------------------------------------------------------------------------------
/*MODULE TIMER 0:
               Ce module est le même que dans le PIC 16F84.
               Le compteur/Timer TMR0 a les caractéristiques suivantes :
                  - Compteur sur 8 bits.
                  - Lecture / écriture de TMR0.
                  - Prédiviseur 8 bits programmable.
                  - Choix de l'horloge : interne en Timer et externe en compteur.
                  - Interruption au débordement ( passage de FF à 00).
                  - Choix du front de l'horloge en mode horloge externe.
               
               Pour la configuration de TMR0:
                    voir registre OPTION 

MODULE TIMER 1:
               Le Timer 1 est un compteur sur 16 bits constitué de 2 registres de 8 bits 
               TMR1H et TMR1L que l'on peut lire ou écrire.
               TMR1 ( constitué de TMR1H et TMR1L) 
                    s'incrémente de h'0000'jusqu'à h'FFFF' et repasse ensuite à h'0000' pour continuer le comptage.
                    Quand il y a débordement, une interruption peut être générée si on la autorisée par TMR1IE =1 ( bit 0 de PIE1) 
                    le Flag TMR1IF (bit 0 de PIR1)passe alors à "1".
               Ce module peut fonctionner 
                         en mode TIMER, quand il s'incrémente à chaque cycle instruction ( Fosc/4 avec le pré diviseur considéré à "1") 
                         en mode compteur, quand il s'incrémente à chaque front montant de l'horloge externe appliquée sur la Pin RC0.
                         L'horloge externe peut également être l'oscillateur interne, dont la fréquence est fixée par un quartz externe
                         branché entre la Pin RC0 et la Pin RC1.
               
               Pour le contrôle du TIMER 1 
                    voir registre T1CON 
T1CON: TIMER1 CONTROL REGISTER
nc-nc-T1CKPS1-T1CKPS0-T1OSCEN-T1SYNC-TMR1CS-TMR1ON
nc:   Non Implanté: Lire comme ‘0’
T1CKPS1 à T1CKPS0:Selection d Entree de la valeur du prediviseur du Timer1
                          11 = 1:8 de la valeur du prediviseur
                          10 = 1:4 de la valeur du prediviseur
                          01 = 1:2 de la valeur du prediviseur
                          00 = 1:1 de la valeur du prediviseur
T1OSCEN: Validation de l oscillateur Timer1 
1 = Oscillator en fonction
0 = Oscillator is shut-off (the oscillator inverter is turned off to eliminate power drain)
T1SYNC: Entree de l'horloge externe de synchronisation du Timer1 quand le bit TMR1CS = 1:
1 = Pas de synchronisation sur l'entree de l'horloge externe
0 = synchronisation sur l'entree de l'horloge externe si TMR1CS = 0:ce bit est ignoré et le Timer1 l'horloge interne.
TMR1CS: Selection de la source d'horloge du Timer1 
1 = horloge externe prise sur la pin RC0/T1OSO/T1CKI (sur front montant)
0 = sur horloge interne (FOSC/4)
TMR1ON: validation du Timer1
1 = Timer1 en fonction
0 = Timer1 stoppé
*/
//# define INIT_T2CON T1CON=
//                 -----------------------------

/*
MODULE TIMER 2:
               Le Timer 2 est un compteur 8 bits avec prédiviseur et postdiviseur .
               Ce compteur TMR2 est un registre en lecture ou écriture. 
               Il possède un registre 8 bits pour la période : PR2 . 
                  Le compteur s'incrémente de h'00' jusqu'à la valeur contenue par PR2 
                  et repasse ensuite à "0" pour continuer le comptage. 
                  Au reset PR2 est initialisé à "FF".
                  L'entrée du compteur est l'horloge cycle interne : F
osc/4 qui passe à travers un pré diviseur programmable par 1, 4 ou 16.
La sortie du compteur passe dans un post diviseur programmable sur 4 bits entre 1 et 16.
Quand la sortie du compteur passe par la valeur programmée dans PR2, il y a
génération d'une interruption (si elle a été autorisée par TMR2IE=1) 
le flag TMR2IF est alors positionné à "1". 
Ceci bien entendu en considérant le postdiviseur programmé à "1".
              
              Pour le contrôle du Timer 2 
                   voir registre T2CON

T2CON: TIMER2 CONTROL REGISTER

nc-TOUTPS3-TOUTPS2-TOUTPS1-TOUTPS0-TMR2ON-T2CKPS1-T2CKPS0

nc:   Non Implanté: Lire comme ‘0’           
        
TOUTPS3 à TOUTPS0: Selection de la sortie du postdiviseur du Timer2 
          0000 = 1:1 du postdiviseur
          0001 = 1:2 du postdiviseur
          0010 = 1:3 du postdiviseur
          •
          •
          •
          1111 = 1:16 du postdiviseur
TMR2ON: Timer2 On bit
          1 = Timer2 is on
          0 = Timer2 is off
T2CKPS1 à T2CKPS0: Selection du prediviseur Timer2 
         00 = predivideur à 1
         01 = predivideur à 4
         1x = predivideur à 16  
*/
         
//# define INIT_T2CON T2CON=                 
//# define INIT_VALPR2 PR2=                 

//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//                                 CONVERTISSEUR CAN (4 registres) 
//                  (s appuyer sur le datasheet pour les tps d'acquisition etc)
//------------------------------------------------------------------------------
/*REMARQUES:   constitué d'un module convertisseur à 5 entrées(16F876)et à 8 entrées(16F877).
             Les 5 entrées sont sur le PortA en RA0 RA1 RA2 RA3 et RA5
             Le résultat de la conversion est codé sur 10 bits dans les registre ADRESH (8 bits) et ADRESL(8 bits)
             C'est une valeur comprise entre h'000' et h'3FF'.
             Les tensions de référence haute(REF+) et basse(REF-) 
             peuvent être choisies par programmation parmi: VDD
                                      ou la broche RA3 pour VREF+ et VSS
                                      ou la broche RA2 pour VREF-

                   Les 4 registres utilisés par le module convertisseur A/D sont :
                       voir ADRESH :MSB des 10 bits du résultat.
                       voir ADRESL :LSB des 10 bits du résultat.
                       voir ADCON0 :registre de contrôle n°0 du convertisseur.
                       voir ADCON1 :registre de contrôle n°1 du convertisseur. 

       
ADCON0 :ADCS1-ADCS0-CHS2-CHS1-CHS0-GO/DONE-nc-ADON

nc:   Non Implanté: Lire comme ‘0’ 
ADCS1 à ADCS0: horloge de conversion A/D Conversion 
quand ADCS2 d'adcon1=0
      00 FOSC/2
      01 FOSC/8
      10 FOSC/32
      11 FRC (clock derived from the internal A/D RC oscillator)
quand ADCS2 d'adcon1=1      
      00 FOSC/4
      01 FOSC/16
      10 FOSC/64
      11 FRC (clock derived from the internal A/D RC oscillator)      
CHS2 à CHS0: Analog Channel Select bits
     000 = Channel 0 (AN0)
     001 = Channel 1 (AN1)
     010 = Channel 2 (AN2)
     011 = Channel 3 (AN3)
     100 = Channel 4 (AN4)
     101 = Channel 5 (AN5)
     110 = Channel 6 (AN6)
     111 = Channel 7 (AN7)
Note: seul le PIC16F873A/876A utilise 4 canals de conversion 
GO/DONE: etat de conversion A/D
Quand ADON = 1: lancement de la conversion
1 = lancement ou conversion en cours
0 = mis automatiquement en fin de conversion

ADON: mise en fonction du module de conversion A/D 
1 = mise en fonction A/D 
0 = arret du module conversion
*/
//# define INIT_ADCON0 ADCON0=
//     ----------------------------
/*
ADCON1 : ADFM-ADCS2-nc-nc-PCFG3-PCFG2-PCFG1-PCFG0    
       
ADFM: selection du format du resultat A/D
1 = Justification à droite. les 6 bits plus significatif  d'ADRESH sont lus comme‘0’.
0 = Justification à gauche. les 6 bits moins significatif  d'ADRESL sont lus comme‘0’.
ADCS2: Selection du format d'horloge de converstion A/D
quand ADCS2 d'adcon1=0  
       00 FOSC/2
      01 FOSC/8
      10 FOSC/32
      11 FRC (clock derived from the internal A/D RC oscillator)
quand ADCS2 d'adcon1=1   
      00 FOSC/4
      01 FOSC/16
      10 FOSC/64
      11 FRC (clock derived from the internal A/D RC oscillator)  

PCFG3:PCFG0: configuration de selection des pin du pic voir datasheet
*/
# define INIT_ADCON1 ADCON1=0b00000110//I/O en mode Numerique
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//                                LA MEMOIRE EEPROM
//------------------------------------------------------------------------------
/*
REMARQUES: Divisée en 2 zones mémoire EEPROM accessible par l'utilisateur. 
           La zone DATA et la mémoire Flash de Programme.
           - La zone DATA est organisée en mot de 8 bits. 
             Les 256 octets se programment et se lisent comme avec un PIC 16F84. 
             Elle est positionnée dans le PIC entre les adresses h'2100' et h'21FF'.
                  On l'adressera (de h'00'à h'FF')par le registre spécifique: EEADR 
                  Les données transiteront par le registre:                   EEDATA .

           - La zone EEPROM de programme qui est organisée en mots de 14 bits,
             est également accessible par l'utilisateur.
             Pour adresser les 8 K mots il faut 13 bits d'adresse. 
             Un registre supplémentaire est disponible: EEADRH 
                Les 8 bits LSB de l'adresse seront passés par EEADR 
                les 5 bits MSB par EEADRH.
             Les données sur 14 bits seront échangées à travers:
                le registre EEDATA pour les 8 bits LSB 
                le registre EEDATH pour les 6 bits MSB. 

                 Les 6 registres utilisés par LA MEMOIRE EEPROM sont :
                     EEDATA :
                     EEADR :
                     EEDATH :
                     EEADRH :
                     EECON1 :
                     EECON2 :
                            
ATTENTION:     Pour pouvoir écrire en EEPROM programme, 
               il faut configurer correctement certains bits du REGISTRE de CONFIG en h'2007'.
                  Le bit WRT doit être forcé à "1". 
                  Les bits CP0 et CP1 doivent être tous les deux à "1" ( Code Protect OFF), 
                  ou bien ne protéger qu'une zone particulière dans laquelle on ne voudra pas écrire.

               Les procédures de lecture et d'écriture 
               -en zone DATA sont identiques à celles décrites pour le PIC 16F84.
               -Pour la zone flash du programme, elles sont particulières pour les PIC 16F876 et 16F877. 

               LECTURE EN ZONE EEPROM PROGRAMME:
                        - 1 - Mettre le MSB de l'adresse dans EEADRH.
                        - 2 - Mettre le LSB de l'adresse dans EEADR
                        - 3 - Mettre le bit EEPGD à "1"
                       pour pointer la zone programme.
                        - 4 - Mettre le bit RD à "1" pour lancer le cycle de lecture.
                        - 5 - Attendre 2 cycles par deux NOP.
                        - 6 - Lire le MSB dans EEDATH et le LSB dans EEDATA.
               ECRITURE EN ZONE EEPROM PROGRAMME:
                        - 1 - Mettre le MSB de l'adresse dans EEADRH.
                        - 2 - Mettre le LSB de l'adresse dans EEADR.
                        - 3 - Mettre le MSB de la DATA dans EEDATH.
                        - 4 - Mettre le LSB de la DATA dans EEDATA.
                        - 5 - Mettre le bit EEPGD à "1"
                        pour pointer la zone programme.
                        - 6 - Mettre le bit WREN à "1" pour autoriser l'écriture.
                        - 7 - Inhiber les interruptions par mise à "0" du bit GIE de INTCON.
                        - 8 - Lancer la séquence spécifique suivante :
                                     - Ecrire h'55' dans EECON2.
                                     - Ecrire h'AA' dans EECON2.
                                     - Lancer le cycle d'écriture par WR=1.
                                     - On attend 2 cycles par deux NOP.
                                     - Le PIC ignore maintenant toutes les instructions.
                                     - A la fin de l'écriture , le PIC exécute l'instruction suivante.
                        - 9 - On autorise les interruptions par GIE=1.
                        - 10 - On interdit l'écriture en EEPROM par WREN = 0. 
*/

//# define INIT_EEDATA EEDATA= 
//# define INIT_EEADR EEADR=
//# define INIT_EEDATH EEDATH=
//# define INIT_EEADRH EEADRH=
//# define INIT_EECON1 EECON1=
//# define INIT_EECON2 EECON2=
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//                                MODULE COMPARATEUR
//------------------------------------------------------------------------------
/*
REMARQUES:
          Ce module contient 2 comparateur Analogique.
          COMPARATEUR 1 
                       2 entrees RA0 et RA3  Sortie sur C1OUT
          COMPARATEUR 2 
                       2 entrees RA1 et RA2  Sortie sur C2OUT   
la tension de reference peut etre utilisée comme entree de comparateur (voir datasheet)
Elle est configurée par le registre CVRCON

CMCON REGISTER

C2OUT-nc-C1OUT-nc-C2INV-nc-C1INV-nc-CIS-nc-CM2-nc-CM1-nc-CM0

C2OUT: Sortie du COMPARATEUR 2
       quand C2INV = 0:
       1 = C2 VIN+ > C2 VIN-
       0 = C2 VIN+ < C2 VIN
       quand C2INV = 1:
       1 = C2 VIN+ < C2 VIN-
       0 = C2 VIN+ > C2 VIN

C1OUT: Sortie du COMPARATEUR 1
       quand C1INV = 0:
       1 = C1 VIN+ > C1 VIN-
       0 = C1 VIN+ < C1 VIN
       quand C1INV = 1:
       1 = C1 VIN+ < C1 VIN-
       0 = C1 VIN+ > C1 VIN
       
C2INV: Comparator 2 Output Inversion bit
      1 = C2 output inverted
      0 = C2 output not inverted
C1INV: Comparator 1 Output Inversion bit
       1 = C1 output inverted
       0 = C1 output not inverted
CIS: Comparator Input Switch bit
     quand CM2 à CM0 = 110:
           1 = C1 VIN- connects to RA3/AN3
               C2 VIN- connects to RA2/AN2
           0 = C1 VIN- connects to RA0/AN0
               C2 VIN- connects to RA1/AN1
CM2:CM0: Comparator Mode bits
Figure 12-1 shows the Comparator modes and CM2:CM0 bit settings.
*/
//# define INIT_CMCON CMCON=
/*
MODULE DE TENSION DE REF POUR LES COMPARATEUR
CVRCON

CVREN CVROE CVRR — CVR3 CVR2 CVR1 CVR0

CVREN: validation de la comparaison sur tension de reference
       1 = CVREF circuit powered on
       0 = CVREF circuit powered down
CVROE: Comparator VREF Output Enable bit
       1 = CVREF voltage level is output on RA2/AN2/VREF-/CVREF pin
       0 = CVREF voltage level is disconnected from RA2/AN2/VREF-/CVREF pin
CVRR: Comparator VREF Range Selection bit
      1 = 0 to 0.75 CVRSRC, with CVRSRC/24 step size
      0 = 0.25 CVRSRC to 0.75 CVRSRC, with CVRSRC/32 step size

CVR3 à CVR0: Comparator VREF Value Selection bits 0 . VR3:VR0 . 15
quand CVRR = 1:
      CVREF = (VR<3:0>/ 24) . (CVRSRC)
quand CVRR = 0:
      CVREF = 1/4 . (CVRSRC) + (VR3:VR0/ 32) . (CVRSRC)
*/
//# define INIT_VRCON VRCON=     

Mplab X et mode debug sur pic 16f876A- en C
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2595
Enregistré en : juillet 2016
Localisation : Terre

#4 Message par Temps-x » sam. 14 oct. 2017 20:17

Bonsoir francknvs, et tous le forums,

:+1: Très beau tutoriel du 16f876A, cela aideras pas mal de monde, car tous en français.

:bravo: et Merci !

A+
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:

Mplab X et mode debug sur pic 16f876A- en C
francknvs
Débutant
Débutant
Messages : 82
Enregistré en : septembre 2017
Localisation : Paca-toulon

#5 Message par francknvs » dim. 22 oct. 2017 18:26

Bonsoir à tous...
je reprends ce post apres l'aide de temps-x ( Merci ! ) concernant le debug et qqs modifications pour que mon code soit plus clair,
j'ai rajouté qqs led (9 au total) utilisant le porta et le portb de mon 16f876a
le but etant de comprendre les etapes du mode debug avec MPLAX et ICD3.
voici mon fichier source:

Code : Tout sélectionner

/*
 * File:   16f876A_led_clignotante.c
 * Author: franck-Acer
 *
 * Created on 23 septembre 2017, 17:38
 * 
 * compilateur: Hi-tech
 */

//----------------------------------------------------------------
//*******************inclusion des fichiers***********************
//----------------------------------------------------------------
#include <htc.h> //chargement des en-tête issu du compilateur lors de la compilation
//#include <pic.h> //chargement des en-tête issu du compilateur lors de la compilation
#include <pic16f876a.h> //chargement des en-tête issu du compilateur lors de la compilation

//------------définition des registres Systemes---------------------------
#include "définition_registre_16f876.c"//chargement du fichier issu du dossier local lors de la compilation (il est en ligne sur le precedent post)

//------------définition des fichiers temporels---------------------------
// on defini la valeur du Quartz en Hz utilisé sur le pic
 #define _XTAL_FREQ 20000000
// on peut utilser les fonctions declarées dans <pic.h> pointé par <htc.h>
// __delay_us(1)-> valeur imprecise verifiée à l'oscillo (tjrs +4µs mesuré)
// __delay_ms(1)-> valeur precise verifiée à l'oscillo
// __delay_s(1) -> valeur precise verifiée à l'oscillo


//-----------definition des fusibles de configuration
//


// PIC16F876A Configuration Bit Settings

// PIC16F876A Configuration Bit Settings
// 'C' source line config statements
#include <htc.h>

__CONFIG(FOSC_HS & WDTE_OFF & PWRTE_OFF & BOREN_OFF & LVP_OFF & CPD_OFF & WRT_OFF & CP_OFF);



//definition des varibles Generales
//----------------------------------------------------------------
//---------------------------------E/S----------------------------------------------- 

#define led1 RA0     // pour donner un nom aux pattes de sorie ou entrée
#define led2 RA1
#define led3 RA2
#define led4 RA3
#define led5 RA4
#define led6 RA5
#define led7 RB0
#define led8 RB1
#define led9 RB2





//---------Declaration des variables------------------------------


//----------------------------------------------------------------
//***********************Prepo************************************
//----------------------------------------------------------------


//----------------------------------------------------------------
//***********************Debut Prog Main()************************
//----------------------------------------------------------------

void main(void) 
{
   
   
    
//---------initialisation-------------------------
//initialisation des registres
    INIT_OPTION; //=0b10000000--> Résistances de tirage à +VCC du PORTB désactivées 
    INIT_ADCON1; //=0b00000110-->Facultatif car si tout le PORTA est configuré en SORTIE, 
                               //toutes les  Pins se trouvent en Sortie Numerique, sans Vref+ et sans Vref-
    INIT_INTCON; //=0b00100000-->interruption générale désactivée mais interrup sur débordement tmr0 configuré
//phase de direction des ports
    INIT_DIRPORTA;//TRISA=0b00000000--> Direction du PORTA configuré en Sortie,Mef cependant à RA4 (=collecteur ouvert)
    INIT_DIRPORTB;//TRISB=0b11000000--> Direction du PORTB configuré en Sortie, sauf RB7 & RB6 en Entrée pour le mode debug icsp
                   //[RB7-RB6]=Entree--->(rb7 rb6) mode ICSP  
                   //[rB5-rB0]=Sortie
    INIT_DIRPORTC;// =0xff// portc en entree   

//phase d'initialisation
    PORTA = 0; //Je Force toutes les pins du PORTA en sortie à "0" sauf RA2 qui est une sortie à collecteur ouvert impliquant une logique Inversée(RA2=1))
    
    PORTB 
= 0; //Je Force toutes les pins du PORTB en sortie à "0"


//Vérification des sorties----------------------------------------------

    
while(1)    //Faire ce qu il y a entre accolade tant que vrai (1)
{
        led1=1;
        led1=0;
        led2=1;
        led2=0;        
        led3
=1;
        led3=0;
        led4=1;
        led4=0; 
        led5
=1; //-->RA2 en logique inversée dû au collecteur ouvert 
        led5=0; //-->RA2 en logique inversée dû au collecteur ouvert
        led6=1;
        led6=0;
        led7=1;
        led7=0;
        led8=1;
        led8=0;
        led9=1;
        led9=0;
       
}      
   

}



Apres avoir placé mon pic sur platine avec toute la circuiterie ( led,mclr, rj11 de l'icd3, etc..),
j'alimente ma platine:
-je configure Mplabx avec ICD3 en mode debug et je valide le power sur ICD3
-je compile sans debug icd3 pour vérifier si pas d'erreur--->ok
-je compile et je charge le Pic au travers de l’appuie sur la commande 1 de mplabx (voir pht jointe)
Tout se bien, mon programme s’exécute et mes leds s'allument et s’éteignent de façon successive au rythme des cycles ( trop vite à l'oeil nu...normal).
-j'agis sur les commandes 2 de mplabx (voir pht jointe), afin de faire du pas à pas et voir de façon sequenciel l'extinction et l'allumage des 9 led
[img]
Image
[/img]
Ma question est:
A/Me confirmez vous bien qu'à la différence de mplab 8 et antérieur, on ne peut voir les variables evoluer en temps reel avec ICD3?
Seul le mode Simul permet le
runtime watch


B/En mode run, puis-je faire ralentir la vitesse d'execution de mon pointeur? afin de voir l'execution du programme.
le mode Simul permet d'agir sur la vitesse de l'execution du programme sans toutefois visualiser le défilement du pointeur
Chaque variable peut avoir une vitesse d'evolution differente via
run time update interval
: - no delay
- 100ms
- 250ms
- 500ms
- 750ms
- 1 s
je ne trouve pas cela tres utile et illogique quelque part

C/Quel est l'utilité de la commande "hold in reset" car aucune action visible apres changement?

Apres un crash PC sous Win7 où tout fonctionnait, je me suis doté d'un PC sous Win10 et là commencent les pbm
Mplab v8 fonctionnait normalement mais pas de driver pour ICD3 qui n'etait pas reconnu
j'ai donc installé MplabX avec le driver pour ICD3----> merci " l'usine à gaz"
----> Trop de fonctionnalités inutiles
----> trop d'option à cocher ou decocher....si bien qu'on ne sait plus ce qu'on a fait ou ce que l'on devrait faire
...et le doute des config des registres du pic s'installe: ai-je bien configuré mes options?,mes directions des port,etc...

c'est la raison pour laquelle je post cette source de programme simple ensuite je m'attaque à l'i²C.....c'est promis

Mplab X et mode debug sur pic 16f876A- en C
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#6 Message par satinas » dim. 22 oct. 2017 19:56

Bonsoir,
Est-ce que tu utilises le logiciel Driver Switcher qui permet de reconfigurer l'ICD3 pour passer de MPLAB à MPLABX ou l'inverse. N'ayant pas utilisé l'ICD3, je ne peux pas t'aider pour son utilisation.
Par contre j'ai eu aussi des surprises avec MPLAB, un vieux PC window7 Mplab 8.92 upgradé en Windows 10, marche très bien avec le PicKit2, tandis qu'un nouveau PC Windows 10 Mplab 8.92 ne propose plus le Pickit2 comme programmer/debugger.
bye

Mplab X et mode debug sur pic 16f876A- en C
francknvs
Débutant
Débutant
Messages : 82
Enregistré en : septembre 2017
Localisation : Paca-toulon

#7 Message par francknvs » dim. 22 oct. 2017 20:39

Bonsoir Satinas et à tous

Tout d'abord,
je te confirme qu'en win10, Mplab 8.88 propose le Pickit2 comme programmer/debugger.

Ensuite: un tres grand merci Merci ! Merci ! Merci !
Car pour confirmer ma reponse j'ai voulu refaire un essai de communication ICD3 <---> Mplab8
-Oui, j'ai bien Driver Switcher, mais il n a pas l'air d’être fonctionnel à moins que je ne sache pas le mettre en œuvre...: et c'est le cas du moins ce l'etait jusqu'à ton post....

En fait ....et cela peut etre utile pour tous:

il faut ouvrir Mplab driver Switcher en mode administrateur ( clique souris droit), pour pouvoir l'utiliser et modifier le "switch" entre Mplab X et Mplab 8!!!!

Maintenant ça marche----> ce qui repond à ma question:
Mplab v8 fonctionnait normalement mais pas de driver pour ICD3 qui n'etait pas reconnu
j'ai donc installé MplabX avec le driver pour ICD3


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 50 invités