Problême de Rebouclage??? Intrigant!!!!!
Répondre à la discussion
Affichage des résultats 1 à 17 sur 17

Problême de Rebouclage??? Intrigant!!!!!



  1. #1
    invite55fe29e6

    Problême de Rebouclage??? Intrigant!!!!!


    ------

    Bonjour à tous,

    Voila me revoila pour de nouvelle questions !!!!!!

    Je viens de faire un programme pour un atmega8535,
    Le principe de ce programme est de compter le nombre de Porte ouverte
    (c'est un programme d'essaie)

    Hors quand je le fais tourné, un problême bizard vien à se produire,
    Ci vous voulai une ne fais rien si toute les porte sont fermé et que je lance le programme il ne detecte rien et pendant l'instruction du programme si je bouge les niveau des porte pour dire qu'elles sont ouverte il ne fait toujour rien

    Maisssss, VOila par contre si par exemple j'ouvre deux portes et que je fais un Reset alors il va bien me compté le nombre de porte

    On dirai que le programme ne boucle pas

    Code:
    		do
    		{
    			unsigned char Masque, p ;
    			p=0;
    			Masque=(PINB & 0x0F);
    		
    				if ( (Masque & 0x01) == 0x01)
    					{++ p;}
    				else if ( (Masque & 0x01) == 0x00)
    					{p=p;}
    					
    				if ( (Masque & 0x02) == 0x02)
    					{++ p;}
    				else if ( (Masque & 0x02) == 0x00)
    					{p=p;}
    					
    				if ( (Masque & 0x04) == 0x04)
    					{++ p;}	
    				else if ( (Masque & 0x04) == 0x00)
    					{p=p;}
    					
    				if ( (Masque & 0x08) == 0x08)
    					{++ p;}
    				else if ( (Masque & 0x08) == 0x00)
    					{p=p;}
    		
    		switch (p)
    			{
    			
    			case 1 :
    				{
    				aff_ligne0(" 1              ");
    				aff_ligne1("        1       ");
    				}
    			break;
    			
    			case 2 :
    				{
    				aff_ligne0(" 2              ");
    				aff_ligne1("       2        ");
    				}
    			break;
    			
    			case 3 :
    				{
    				aff_ligne0(" 3              ");
    				aff_ligne1("       3        ");
    				}
    			break;
    			
    			case 4 :
    				{
    				aff_ligne0(" 4             ");
    				aff_ligne1("       4       ");
    				}
    			break;
    
    			default :
    				{
    				aff_ligne0(" 0             ");
    				aff_ligne1("       0       ");
    				}
    			}
    		}
    		while(1);
    	}
    Voici le programme test

    PS: je les même fais avec une boucle for(; et sa ne fonctionne toujours pas on dirai que soit mon programme ne reboucle pas soit il ne sais pas ou rebouclé

    Je trouve sa assé intrigant surtout que je n'ai jamais eu se problême sur la boucle do while pour que le programme reboucle

    Merci d'avance pour votre aide
    Cordialement Paulochon

    J'ai changé ta balise quote pour une balise code. Comme ça on garde l'indentation

    Jack

    -----
    Dernière modification par Jack ; 24/06/2007 à 13h35.

  2. #2
    invite22c0acb2

    Re : Problême de Rebouclage??? Intrigant!!!!!

    Je ne suis pas sure, mais je crois qu'il y'a "}" en plus a la fin, apres le "while(1)"
    Si mes souvenirs sont bon, la syntaxe d'un do/while est:
    Code HTML:
    do
    {
    ... ;
    ... ;
    ... ;
    }
    while(condition);

  3. #3
    invite55fe29e6

    Re : Problême de Rebouclage??? Intrigant!!!!!

    Merci pour ta suggestion mais mon compilateur ne voi pas d'erreurs de syntaxe sur le programme entier alors je ne sais pas d'ou sa peut venir se problême

    Merci quand même
    Paulochon

  4. #4
    invite55fe29e6

    Re : Problême de Rebouclage??? Intrigant!!!!!

    Je vien de tout essaié, mais je suis sur qu'a mon avie le programme ne sais pas ou rebouclé je trouve sa bizard pourtant

    Avez vous une idée

    Cordialement Paulochon

  5. A voir en vidéo sur Futura
  6. #5
    inviteaf3a73b7

    Re : Problême de Rebouclage??? Intrigant!!!!!

    Bonjour,

    Le C est un langage OBJET, il est donc anormal que tu ne puisse pas localiser facilement et rapidement l'erreur.

    Tu devrai pour réaliser cette fonction do{ .....}while(1); (note le while est collé à l'accolade c'est préférable), avoir donc 3 objets (fonctions séparées) :

    1 fonction scrutage_portes()
    2 fonction lecture_portes()
    3 fonction affichage_portes()

    Avec scrutage_port() de la forme:

    Code:
    void scrutage_portes(unsigned char Port_Portes)
    {
    unsigned char p; //valeur retour fonction lecture_portes() transmise en                     
                           //paramètre de l'affichage Affichage_portes()
         do
         {
          p=lecture_portes(Port_Portes);
          Affichage_portes(p);
         }while(1);
    }
    Lecture_portes() de la forme :

    Code:
    int fonction lecture_portes(unsigned char Port_Portes)
    {
         unsigned char Masque, p ; //variables de travail temporaires
         p=0;
         Masque=(Port_Portes & 0x0F); //Choix du masque appliqué
    		
         if ( (Masque & 0x01) == 0x01)
         {++ p;}
         else if ( (Masque & 0x01) == 0x00)
         {p=p;}
    					
         if ( (Masque & 0x02) == 0x02)
         {++ p;}
         else if ( (Masque & 0x02) == 0x00)
         {p=p;}
    					
         if ( (Masque & 0x04) == 0x04)
         {++ p;}	
         else if ( (Masque & 0x04) == 0x00)
         {p=p;}
    					
         if ( (Masque & 0x08) == 0x08)
         {++ p;}
         else if ( (Masque & 0x08) == 0x00)
         {p=p;}
    
         return(p); //retourne le résultat de la lecture
    }
    Remarque : si un bit est à 1 { faire1 } sinon { faire0 } (il aura du mal à être autre chose que 0 s'il n'est pas 1) et si t'as rien n'as faire d'autre que {p=p} ben fait pas de sinon, tu fait rien tu passe à la suite (t'économise des instructions et cycles processeur).....Je te laisse voir si y'a pas plus simple que tes if else if ..if else et autres else if .....

    Affichage_portes() de la forme :

    Code:
    void affichage_portes(unsigned char p)
    {
         switch (p)
         {
          case 1 :
                      {
                      aff_ligne0(" 1              ");
                      aff_ligne1("        1       ");
                      }
    		  break;
           case 2 :
                      {
                      aff_ligne0(" 2              ");
                      aff_ligne1("       2        ");
                      }
                      break;
           case 3 :
                      {
                      aff_ligne0(" 3              ");
                      aff_ligne1("       3        ");
                      }
                      break;
           case 4 :
                      {
                      aff_ligne0(" 4             ");
                      aff_ligne1("       4       ");
                      }
                      break;
           default :
                      {
                      aff_ligne0(" 0             ");
                      aff_ligne1("       0       ");
                      }
         }
    }
    Reste à placer dans les déclarations :

    Code:
    //variables
    unsigned char Port_Portes; //Port utilisé pour les portes
    //fonctions
    void scrutage_portes(unsigned char Port_Portes);
    unsigned char lecture_portes(unsigned char Port_Portes);
    void affichage_portes(unsigned char p);
    ET dans les initialisation ceci :
    Code:
    unsigned char Port_Portes = PINB; //attribution du portB aux portes
    Tu peux aussi passer p en pointeur à lecture_portes(..) afin de consacrer les valeur de retour de tes fonctions à la remonté de code d'erreurs détectes...
    utilisant les fonction aff_ligne0(...) et aff_ligne1(...) pour les visualiser ....
    p sera alors déclaré plus haut dans la hierarchie des fonctions et l'adresse de p (&p) passé en paramètre de

    unsigned char lecture_portes(unsigned char Port_Portes,unsigned char *p)

    exemple rapide :

    unsigned char erreur;
    erreur=lecture_portes(....);
    if (erreur == 1) {
    aff_ligne0("ERREUR");
    aff_ligne1("Lecture");
    }

    J'ai tapé le code ici et donc pas débuggé soumis à d'eventuelles fautes de frappes et/ou oublis quelconques.

    D'autre par ne sachant pas ce qu'il y a dans ton programme avant DO..WHILE ni après il est possible d'avoir des modifications des paramètres des fonctions à faire.

    Pour les codes importants l'utilisation des codes erreurs en valeur de retour n'est pas du temps perdu, d'autre par avoir des sources documentées et hiérarchisé et conçu OBJET ne signifie pas des tailles de fichiers compilés volumineux pour autant. Les tailles compilés des sources propres et des sources "à la va comme je te pousse" sont proches.

    Par contre le temps à la conception, au codage, ainsi qu'aux tests unitaires et ensuite d'intégrations sont incomparablement avantageux. Le débogage réalisable et des fonctions très facilement évolutives sans tout recommencer.

    Cordialement.

  7. #6
    m'enfin

    Re : Problême de Rebouclage??? Intrigant!!!!!

    Salut
    Les break placés comme ils le sont peuvent être la cause de la sortie de la boucle.
    Dans un "switch" la syntaxe est la suivante:
    Code:
         switch (p)
         {
    	case 1 :
    		aff_ligne0(" 1              ");
    		ff_ligne1("        1       ");
    		break;
    			
    	case 2 :
    		aff_ligne0(" 2              ");
    		aff_ligne1("       2        ");
    		break;
    
    etc...
    
         }
    A+

  8. #7
    invite55fe29e6

    Re : Problême de Rebouclage??? Intrigant!!!!!

    Merci Alex82 et m'enfin,

    Pour la syntaxe du switch je vien d'essaié de placé le break mais cela ne donne rien, je vais donc essayé de me pencher sur la solution de Alex82

    Je poste le résultat des que j'ai fini et surtout des que sa fonctionne,
    Si j'ai des problême je vous en ferai part,

    Merci beaucoup¨
    Cordialement
    Paulochon

  9. #8
    invite55fe29e6

    Re : Problême de Rebouclage??? Intrigant!!!!!

    Voila je vien de modifier le programme comme Alex82 ma la supposé,

    Et alors j'ai toujours le même Problême,
    Commant faire ??? Une question que je me pose
    D'ou peut venir le problême?? Hummmm je cherche je cherche

    Je continue a travaillé dessus ci quelqu'un a une idée ou si il peut me dire d'ou vien le problême je post ci-dessous le programme entier
    avec la modification apporté.

    En vous remerciant d'avance
    Cordialment Paulochon

    /*

    Gestion Voiture ( Programme Test)
    Version:1
    REV:B
    Auteur: Leblanc Paul
    Frèquence Microcontrôleur: 8Mhz


    */

    #include <avr/io.h>
    #include <avr/interupt.h>
    #include <avr/signal.h>
    #include <stdlib.h>
    #include <avr/delay.h>

    #define PORT_AFFICHEUR PORTC
    #define DIRECTION_PORT_AFFICHEUR DDRC
    #define PORT_COMMANDE PORTA
    #define DIRECTION_PORT_COMMANDE DDRA

    #define val_bit(bit) (1<<bit)
    #define set_bit(port,bit) port|=(1<<bit)
    #define clear_bit(port,bit) port&=(~(val_bit(bit)))

    #define BIT_ENABLE 1
    #define BIT_RS 0


    // Routine de gestion de l'afficheur LCD
    unsigned char lcd_x=0, lcd_y=0;

    void lcd_delay (unsigned int t)
    {
    unsigned int i;

    for (i=0; i<t; i++);
    }

    void lcd_ready (void)
    {
    clear_bit (PORT_COMMANDE, BIT_RS);

    lcd_delay(1000);
    }

    void lcd_write_nibble (unsigned char data)
    {
    PORT_AFFICHEUR=data;

    set_bit (PORT_COMMANDE, BIT_ENABLE);
    lcd_delay(5);
    clear_bit ( PORT_COMMANDE, BIT_ENABLE);
    lcd_delay(5);
    }

    void lcd_write_data (unsigned char data)
    {
    unsigned char d;

    lcd_write_nibble(data);
    }

    void lcd_gotoXY (unsigned char x, unsigned char y)
    {
    unsigned char base_y[2] = { 0x80, 0xc0 };

    lcd_ready ();
    lcd_write_data (x + base_y[y]);
    lcd_x = x;
    lcd_y = y;
    }

    void lcd_clear (void)
    {

    lcd_ready ();
    lcd_write_data (0x0C);
    lcd_ready ();
    lcd_write_data (1);
    lcd_ready ();
    lcd_x =0;
    lcd_y = 0;

    }

    void lcd_putchar (unsigned char c)
    {
    if (c == 10)
    goto newline;
    ++lcd_x;

    if (lcd_x > 16)

    {
    newline:
    ++lcd_y;
    lcd_gotoXY (0, lcd_y);
    if (c == 10)
    return;
    }

    lcd_ready ();
    set_bit (PORT_COMMANDE, BIT_RS);
    lcd_write_data(c);
    }

    void lcd_puts (unsigned char * str)
    {
    while(* str)
    {
    lcd_putchar (* str);
    str++;
    }
    }

    void lcd_init (void)
    {
    lcd_ready();
    lcd_write_data (0x38);
    lcd_ready();
    lcd_write_data (0x38);
    lcd_write_data (6);
    lcd_clear();
    lcd_ready();
    }

    void delay_ms (unsigned int ms)
    {
    unsigned int i, j, k;

    for (i=0; i < ms; i++)
    {
    for (j=0; j < 28; j++)
    {
    for (k=0; k < 2500; k++)
    ;
    }
    }
    }

    void aff_ligne0 (char * m)
    {
    lcd_gotoXY (0, 0);
    lcd_puts (m);
    }

    void aff_ligne1 (char * m)
    {
    lcd_gotoXY (0, 1);
    lcd_puts (m);
    }


    // Gestion de scrutage des portières
    int lecture_portes ( unsigned char port_portes)
    {

    unsigned char Masque, p ;
    p=0;
    Masque=(port_portes & 0x0F);

    if ( (Masque & 0x01) == 0x01)
    {++ p;}
    else if ( (Masque & 0x01) == 0x00)
    {p=p;}

    if ( (Masque & 0x02) == 0x02)
    {++ p;}
    else if ( (Masque & 0x02) == 0x00)
    {p=p;}

    if ( (Masque & 0x04) == 0x04)
    {++ p;}
    else if ( (Masque & 0x04) == 0x00)
    {p=p;}

    if ( (Masque & 0x08) == 0x08)
    {++ p;}
    else if ( (Masque & 0x08) == 0x00)
    {p=p;}

    return(p);
    }

    void Affichage_portes(unsigned char p)

    {

    switch (p)
    {

    case 1 :
    {
    aff_ligne0(" 1 ");
    aff_ligne1(" 1 ");
    break;
    }

    case 2 :
    {
    aff_ligne0(" 2 ");
    aff_ligne1(" 2 ");
    break;
    }


    case 3 :
    {
    aff_ligne0(" 3 ");
    aff_ligne1(" 3 ");
    break;
    }


    case 4 :
    {
    aff_ligne0(" 4 ");
    aff_ligne1(" 4 ");
    break;
    }



    }
    }

    void scrutages_portes ( unsigned char port_portes)
    {

    unsigned char p;

    do
    {
    p= lecture_portes(port_portes);
    Affichage_portes(p);

    }while(1);

    }
    // Initialisation du PORTB en entrée, les autres PORTs étant définie au début du prgramme pour le LCD
    void ioInit (void)
    {
    DDRB=0x00;
    PINB=0x00;
    }

    // Programme Principal
    int main (void)
    {
    DIRECTION_PORT_AFFICHEUR=0xFF;
    DIRECTION_PORT_COMMANDE=0xFF;

    lcd_init ();
    lcd_clear();
    ioInit();

    unsigned char port_portes = PINB;
    scrutages_portes(PINB);



    }

    PS:

    En orange le programme principal
    En rouge la routine d'affichage LCD ( elle est opérationelle )
    En bleu le scrutage des portes

    Merci de l'aide que vous pourriez m'apporter

  10. #9
    m'enfin

    Re : Problême de Rebouclage??? Intrigant!!!!!

    Salut,
    Je note que tu as conservé les accolades des "case", essaie d'enlever celles notées en rouge (je ne te garantie pas que c'est ça, je n'ai pas le matériel sous la main pour faire un essai):

    switch (p)
    {

    case 1 :
    {
    aff_ligne0(" 1 ");
    aff_ligne1(" 1 ");
    break;
    }

    case 2 :
    {
    aff_ligne0(" 2 ");
    aff_ligne1(" 2 ");
    break;
    }

    etc...
    }

    A+

  11. #10
    invite55fe29e6

    Re : Problême de Rebouclage??? Intrigant!!!!!

    Je viens de supprimé les accolade comme tu m'as indiqué, il me note pas d'erreurs à la compilation sauf que le problême reste toujours le même

    Je rappelle le problême pour les personnes prenant le post en cour,

    Je veux compté le nombre de porte ouverte, avec le programme actuelle quand je lance l'application les états de mes portes peuvent chnagé il ne se pase rien MAIS si je change certain états et que je fais un Reset sur le micro alors il me compte bien les portes ouverte,

    En gros il ne me fais pas l'application en temps réelle j'ai l'impression qu'il ne sait pas ou rebouclé

    Cordialement Paulochon

  12. #11
    inviteaf3a73b7

    Re : Problême de Rebouclage??? Intrigant!!!!!

    Bonjour,

    Citation Envoyé par Paulochon Voir le message
    Je viens de supprimé les accolade comme tu m'as indiqué, il me note pas d'erreurs à la compilation sauf que le problême reste toujours le même

    Je rappelle le problême pour les personnes prenant le post en cour,

    Je veux compté le nombre de porte ouverte, avec le programme actuelle quand je lance l'application les états de mes portes peuvent chnagé il ne se pase rien MAIS si je change certain états et que je fais un Reset sur le micro alors il me compte bien les portes ouverte,

    En gros il ne me fais pas l'application en temps réelle j'ai l'impression qu'il ne sait pas ou rebouclé

    Cordialement Paulochon
    Si tes affichages fonctionnent trace tn programme alors avec.

    Tu places au endroits ou tu veux verifier que le programme passe des instructions comme ceci par exemple:

    aff_ligne0("debug1"); //trace le passage par ce point
    lcd_delay(1000); // delai suffisant pour que j'ai le temps de lire les passages

    Tu place ce genre de "débugeur" dans ton programme et ton lcd va t'indiquer par où passe ton programme ou pas et combien de fois ....

    Quand tout fonctionne tu mets soit // devant soit tu les supprimes

    Cordialement.

  13. #12
    invite55fe29e6

    Re : Problême de Rebouclage??? Intrigant!!!!!

    Merci je vais faire comme sa pour débugger le programme,
    Merci encore une fois et je tiens le post à jour pour

    Cordialement Paulochon

  14. #13
    m'enfin

    Re : Problême de Rebouclage??? Intrigant!!!!!

    Salut,
    je crois que je viens de voir le truc: tu fais l'acquisition de l'état des portes lorsque tu accèdes à PINB, c'est à dire dans le programme principal. Dans la boucle, tu ne travailles qu'avec port_portes, or la valeur de port_portes ne change plus puisque tu n'accèdes plus à PINB.
    Je te proposes donc d'écrire:

    void scrutages_portes (void)
    {

    unsigned char p;

    do
    {
    p= lecture_portes(PINB);
    Affichage_portes(p);

    }while(1);


    Bien sûr, il faudra changer l'appel à scrutages_portes() qui ne réclame plus de paramètre

  15. #14
    inviteaf3a73b7

    Re : Problême de Rebouclage??? Intrigant!!!!!

    Bonjour,

    Citation Envoyé par m'enfin Voir le message
    Salut,
    je crois que je viens de voir le truc: tu fais l'acquisition de l'état des portes lorsque tu accèdes à PINB, c'est à dire dans le programme principal. Dans la boucle, tu ne travailles qu'avec port_portes, or la valeur de port_portes ne change plus puisque tu n'accèdes plus à PINB.
    Je te proposes donc d'écrire:

    void scrutages_portes (void)
    {

    unsigned char p;

    do
    {
    p= lecture_portes(PINB);
    Affichage_portes(p);

    }while(1);


    Bien sûr, il faudra changer l'appel à scrutages_portes() qui ne réclame plus de paramètre
    Tout à fait m'enfin, erreur grosière de ma part :

    scrutage_portes() ne doit pas contenir la boucle mais simplement faire appel a lecture_porte et passer le résultat a affichage_portes().

    C'est le Main() qui, en effet, doit :
    Debut
    1 lire le port
    2 en déduire l'état des portes ( lecture_portes() )
    3 afficher le résultat ( affichage_portes() )
    Retour début

    On peux garder srutage avec le port en parametre (afin de pouvoir changer de port de lecture facilement ) mais le Do ... while doit effectivement comporter la lecture par le biais de PINB, et les appels aux fonctions précitées et être dans le Main().

    Désolé pour la boulette

    Cordialement.

  16. #15
    invite55fe29e6

    Re : Problême de Rebouclage??? Intrigant!!!!!

    Merci m'enfin Merci Alex82 je travaille dessus aujourd'hui et je rend compte de mes avancement
    Merci encore une fois

    Cordialement Paulochon

  17. #16
    polo974

    Re : Problême de Rebouclage??? Intrigant!!!!!

    voici (après la bataille...) trois façons de "compter" les bits dans un quartet.
    J'aime bien le tableau...
    J'ai directement "calculé" le char à afficher plutôt que le nombre, mais ça ne change pas grand chose...

    Code:
    /**** directement le char à afficher en résultat *****/
    
    	// comptage des bits par boucle
    for(n = '0', bits = port & 0xF; bits; bits/=2)
    	if(bits & 1) n++;
    aff(n);
    
    /***************/
    
    	// sans comptage des bits avec tableau
    
    unsigned char tabchar[]={
    	'0', '1', '1', '2', 
    	'1', '2', '2', '3', 
    	'1', '2', '2', '3', 
    	'2', '3', '3', '4'};
    
    aff(tabchar[port & 0xF]); break;
    
    
    /***************/
    
    	// sans comptage des bits avec switch
    bits = port & 0xF;
    switch(bits)
    {
    case 0x0:
    	aff('0'); break;
    case 0x1:
    case 0x2:
    case 0x4:
    case 0x8:
    	aff('1'); break;
    case 0x3:
    case 0x6:
    case 0xC:
    case 0x5:
    case 0xA:
    case 0x9:
    	aff('2'); break;
    case 0x7:
    case 0xB:
    case 0xD:
    case 0xE:
    	aff('3'); break;
    case 0xF:
    	aff('4'); break;
    }
    par ailleurs l'écriture (assez lourde...):
    Code:
     if ( (Masque & 0x08) == 0x08)
    {++ p;}
    else if ( (Masque & 0x08) == 0x00)
    {p=p;}
    peut être remplacée avantageusement par
    Code:
    if (Masque & 0x08) ++p;
    car le else refait tout un test pour finalement ne rien faire, autant le virer.

    petites précisions:
    les accolages permettent de regrouper un paquet d'instructions dans un bloc pour par ex les "if()" ou "for(;"... On peut en ajouter là ou on veut, sans que cela ne trouble le fonctionnement. Il n'y en a pas besoin entre 2 "case :", mais là il ne faut pas oublier les "break;" quand ils sont nécessaires (pas toujours...).

    Le C n'est pas un langage OBJET, c'est le C++, mais ça n'empêche pas le debug, même en assembleur c'est possible, si, si...

    Et le mot de la fin, juste pour faire hérisser quelques têtes:
    l'instruction goto existe et parfois permet de se tirer d'affaires scabreuses (gestion d'erreur principalement, c'est mieux emballé en C++, mais ça existe toujours...). Ne pas en abuser, car les plats de spaghettis sont à réserver au domaine culinaire...

  18. #17
    invite55fe29e6

    Re : Problême de Rebouclage??? Intrigant!!!!!

    Merci Pour c'est précisionn , en ce moment je travaille dessus et je peut vous dire que les problême reste le même et que je m'accroche pourtant lol,

    En vous remerciant de votre aide
    Des que j'ai un problême que je n'arrive pas à résoudre je fait signe,

    Cordialemnt Paulochon

Discussions similaires

  1. Réponses: 11
    Dernier message: 26/05/2011, 12h27
  2. Un petit problème qui me pause problème lol
    Par invitef2853e5d dans le forum Mathématiques du supérieur
    Réponses: 13
    Dernier message: 31/03/2009, 15h28
  3. problème avec un lecteur mp4(le problème vient de l'ordinateur)
    Par mat_the_bad_boy dans le forum Matériel - Hardware
    Réponses: 3
    Dernier message: 29/10/2007, 16h53
  4. stupide mais intrigant
    Par Tritium dans le forum Physique
    Réponses: 11
    Dernier message: 18/08/2007, 18h52
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...