Besoin petit coup de pouce programmation en C
Répondre à la discussion
Affichage des résultats 1 à 11 sur 11

Besoin petit coup de pouce programmation en C



  1. #1
    invite831b139b

    Besoin petit coup de pouce programmation en C


    ------

    Bonjour,

    voila je réalise un projet avec un PIC18F4685, et je rencontre un petit problème :

    j'envois en RS232 depuis l'hyperterminal de l'ordi des nombres compris entre 0 et 999 (ces valeurs n'ont pas d'importance car mon problème a lieu plus loin).

    J'utilise un écran 2 lignes 16 caractères pour visualiser ce que je reçois, sur la première ligne les 3 caractères, et sur la deuxième une variable qui est le résultat de l'addition de ces 3 caractères. jusqu'à 255 je reçois bien ce que j'envois sur les deux lignes, mais si par exemple je passe à 300 ou plus les caractères sont toujours OK, mais la variable est fausse. voilà ce que j'ai comme code :

    Code:
    long value1;                                                                     // variable 16 bits
    long value2;                                                                     // variable 16 bits
    long value3;                                                                     // variable 16 bits
    long value;                                                                      // variable 16 bits
    
    value1 = (100 * (buffer_RS232 [0]-'0');                                          // centaines
    value2 = (10 * (buffer_RS232 [1]-'0');                                           // dizaines
    value3 = (buffer_RS232 [2]-'0');                                                 // unités
    value =  (value1 + value2 + value3);                                             // valeur à afficher
    
    lcd_gotoxy (1, 1);                                                               // ligne 1 char. 1 LCD
    printf(lcd_putc, "%c%c%c", buffer_RS232 [0], buffer_RS232 [1], buffer_RS232 [2]);// affichage indépendant des caractères
    
    lcd_gotoxy (1, 2);                                                               // ligne 2 char. 1 LCD
    printf(lcd_putc, "%Lu", value);                                                  // affichage de la variable
    Je ne vois pas d'où vient le problème puisque ma variable est en 16 bits, et en fixant value1 à 500, value2 à 40 et value3 à 8 j'obtiens bien 548 donc pas de problème de dépassement, et j'ai bien fait la conversion caractère/décimal en enlevant 30 aux caractères (caractère '0') pour avoir des valeurs décimales correspondant : '6' => 6...

    Si quelqu'un pouvait m'aider ce serait sympa

    merci!

    -----

  2. #2
    invite860936ec

    Re : Besoin petit coup de pouce programmation en C

    Bonjour ,
    Essayes de déclarer tes variables en unsigned long .
    @+

  3. #3
    invite0e5af214

    Re : Besoin petit coup de pouce programmation en C

    Salut,

    Code:
    printf(lcd_putc, "%Lu", value);
    Apparement le "L" majuscule est pour afficher un long double (un nombre à virgule flottante quoi)
    Essaye de le remplacer mar un "l" minuscule, pour long int

  4. #4
    invite831b139b

    Re : Besoin petit coup de pouce programmation en C

    merci pour votre rapidité, mais dans mon compilateur CCS PCW "long" est reconnu comme "unsigned long" et je n'ai jamais rencontré de problème avec %Lu mais je vais quand même essayer voir si ça peut m'éviter d'autres soucis , sinon je viens d'essayer une autre formule qui a l'air de marcher, ça ne diminue pas le nombre de lignes mais j'espère que ça va fonctionner dans toutes les situations et que je vais pouvoir résoudre un autre problème moins important

    voici le code modifié :
    Code:
    value_1 = (buffer_RS232 [0]-'0');
    value_2 = (buffer_RS232 [1]-'0');
    value_3 = (buffer_RS232 [2]-'0');
    value = 100*value_1 + 10*value_2 + value_3;
    je me suis aperçu du problème en affichant les variables "value_1" à "value_3" à la place des caractères, les résultats ne correspondaient pas (j'avais par exemple pour value_1 244 au lieu de 300 alors que sans la multiplication par 100 il affichait bien 3... soit un problème d'incompatibilité entre caractère et entier, soit trop de multiplication sur une seule ligne... Du coup j'ai fait en sorte que les 3 variables servent seulement de "convertisseur" pour pouvoir travailler sans encombres qu'avec des entiers.

    je ne mets pas "résolu" tout de suite au cas ou j'ai encore des soucis, et merci à vous!

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

    Re : Besoin petit coup de pouce programmation en C

    Bon ça tombe bien que je n'ai pas fermé, j'ai 2 nouvelles questions :

    j'aimerais récupérer sur 2 broches du PIC les données émises/reçues sur les broches dédiées à la RS-232, le but étant de mettre des LEDs pour visualiser Rx et Tx sans perturber le signal.
    J'ai donc eu l'idée de lier les broches C6 et C7 (Tx et Rx) en interne avec par exemple B0 et B1.

    En ce qui concerne RX pas de soucis :

    Code:
    output_bit (PIN_B0, !input (PIN_C7));
    mais pour TX je ne sais pas comment procéder, car j'ai essayer ces deux codes mais aucun d'eux n'est concluant :

    Code:
    output_bit (PIN_B1, output (PIN_C6));
    
    et
    
    output_bit (PIN_B1, PIN_C6);
    Sinon la deuxième question c'est comment faire du multi tâches "simple"? En fait je voudrais faire clignoter une led à 1Hz tout en faisant d'autres trucs dans mon programme principal (émission/réception SPI, lecture du CAN, éclairer d'autres leds en fonction des valeurs mesurées...) tout en sachant que pour la RS-232 j'ai déja une interruption donc elle ne gênera pas (j'ai fait le test en faisant clignoter la led dans mon programme principal tout en envoyant des données séries)

    merci!

  7. #6
    invite831b139b

    Re : Besoin petit coup de pouce programmation en C

    Up!

    j'ai 2 nouvelles questions :

    j'aimerais récupérer sur 2 broches du PIC les données émises/reçues sur les broches dédiées à la RS-232, le but étant de mettre des LEDs pour visualiser Rx et Tx sans perturber le signal.
    J'ai donc eu l'idée de lier les broches C6 et C7 (Tx et Rx) en interne avec par exemple B0 et B1.

    En ce qui concerne RX pas de soucis :

    Code:
    output_bit (PIN_B0, !input (PIN_C7));
    mais pour TX je ne sais pas comment procéder, car j'ai essayer ces deux codes mais aucun d'eux n'est concluant :

    Code:
    output_bit (PIN_B1, output (PIN_C6));
    
    et
    
    output_bit (PIN_B1, PIN_C6);
    Sinon la deuxième question c'est comment faire du multi tâches "simple"? En fait je voudrais faire clignoter une led à 1Hz tout en faisant d'autres trucs dans mon programme principal (émission/réception SPI, lecture du CAN, éclairer d'autres leds en fonction des valeurs mesurées...) tout en sachant que pour la RS-232 j'ai déja une interruption donc elle ne gênera pas (j'ai fait le test en faisant clignoter la led dans mon programme principal tout en envoyant des données séries)
    Merci!

  8. #7
    invitef86a6203

    Re : Besoin petit coup de pouce programmation en C

    value1 = (100L * (unsigned long) (buffer_RS232 [0]-'0'); // centaines
    value2 = (10L * (unsigned long) (buffer_RS232 [1]-'0'); // dizaines

    Il est péférable de lui dire clairement ce que le compilo doit faire , sinon qui sait quelle cuisine il fera...

  9. #8
    invite831b139b

    Re : Besoin petit coup de pouce programmation en C

    Merci pour l'indication! je ne connaissais pas cette syntaxe, la mienne a l'air de fonctionner mais je vais la changer par celle-là au cas où!

  10. #9
    Poseidon88

    Re : Besoin petit coup de pouce programmation en C

    Salut, si tu veux visualiser ton signal RX et TX avec des LED, il te suffit de mettre des transistors ou des FETs sur les lignes et de commander des LED avec.

  11. #10
    invite831b139b

    Re : Besoin petit coup de pouce programmation en C

    J'y ai pensé, mais c'est un circuit que je vais réaliser plus tard en cms, le but étant de faire le plus réduit possible, donc je pensais utiliser ces LEDs pour indiquer aussi si l'instruction reçue est OK (LED RX allumée pendant 1s) ou si le message est incorrect la (LED Tx clignote deux fois) si c'est trop compliqué je relie les LEDs via transistor aux lignes RX et TX et je réserve d'autres broches pour d'autres LEDs.

  12. #11
    invite831b139b

    Re : Besoin petit coup de pouce programmation en C

    Code:
    output_bit (TX_LED, !input_state (PIN_C6));
    output_bit (RX_LED, !input_state (PIN_C7));
    De sur ça fonctionne quand je fixe "output_low / output_high (PIN_C6)" mais je doute que ça fonctionne avec la RS-232 vu que ce ne sera pas exécuter en même temps... Du coup j'ai trouver une autre solution qui me permet de n'utiliser que ces deux LEDs, mais j'utilise 4 sorties et 4 transistors, comme ça j'en mets deux sur Rx et Tx qui montrent les données, et les deux autres pour Erreur et OK. Chaque LED est reliée à l’émetteur de deux transistors, comme ça chaque signal commande indépendamment la LED correspondant.

    Donc on va dire que le problème de LED est réglé, par contre là où je galère c'est en gestion du temps...

    - J'arrive bien à faire fonctionner l'interruption pour la RS-232 et faire autre chose dans mon programme principal (sauf sur ma maquette car c'est un design que j'avais fait autour d'un 18F4550 pour autre chose et les signaux RS-232 ne sont pas sur C6 et C7 donc pas compatible avec les interuptions de l'UART).

    - J'arrive bien à utiliser le RTOS et les tâches pour faire clignoter 3 LEDs à des fréquences différentes, aussi bien sur ISIS qu'en réel.

    - Mais je n'arrive pas à rendre compatible le RTOS et les interruptions, j'ai l'impression que le RTOS les court-circuite...

Discussions similaires

  1. Besoin d'un petit coup de pouce
    Par invite6f402f21 dans le forum Environnement, développement durable et écologie
    Réponses: 15
    Dernier message: 06/11/2011, 21h30
  2. Besoin d'un petit coup de pouce :)
    Par invite405656a4 dans le forum Mathématiques du collège et du lycée
    Réponses: 1
    Dernier message: 11/04/2010, 11h17
  3. Besoin d'un petit coup de pouce ^^
    Par invite758b11ee dans le forum Physique
    Réponses: 0
    Dernier message: 10/10/2009, 18h37
  4. Besoin d'un petit coup de pouce...
    Par inviteef6f95b9 dans le forum Santé et médecine générale
    Réponses: 2
    Dernier message: 02/11/2007, 18h39
  5. besoin d'un petit coup de pouce!!!
    Par invitebe1531d1 dans le forum Mathématiques du supérieur
    Réponses: 2
    Dernier message: 10/03/2006, 22h45
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...