Répondre à la discussion
Affichage des résultats 1 à 13 sur 13

Besoin d'un petit coup de main en programmation C



  1. #1
    Do you understand

    Smile Besoin d'un petit coup de main en programmation C

    Bonjour,
    à l'issu d'un projet de stage j'aurais besoin d'un petit peu d'aide pour de la programmation en C.
    Il s'agit d'un compteur, enfin de 18 compteurs. J'ai déja fait toute la partie interfaçage des 18 boutons poussoirs avec un PIC16F877 qui sort un signal sur 5 bits en fonction du B-P appuyé avec anti rebond, ainsi qu une petite option qui consiste à limité le comptage avec un "bip" de dépassement en fonction de 5 B-P annexes (100, 200, 300, 400 ou 500).

    L'appareil est fait en 3 parties distinctes:
    -L'affichage, peut etre sur un LCD, ou 7 segments + leds diverses
    -L'interfaçage qui "convertit" les appui des 23 B-P sur 5 bits comptage + 3 bits limitation.
    -Le comptage effectué par un 18F4685 (18 compteurs propre à chaque B-P et un compteur qui incrémente quel que soit le B-P appuyé) ainsi que la sortie des résultats sur LCD/7 segments.

    Bien évidemment je ne vous demande pas de le faire, j'ai juste besoin d'un exemple de code le plus simple possible pour un seul compteur et surtout en C, j'en ai trouvé en basic et en Pascal mais je ne suis pas habitué et n'ai pas le temps de m y mettre pour le moment sachant que mon stage finit dans 4 semaines.

    Je vous remercie par avance et espere arriver au bout de ce projet tres intéressant

    -----


  2. Publicité
  3. #2
    Do you understand

    Re : Besoin d'un petit coup de main en programmation C

    PS: je l'ai indiqué vaguement mais je préfere le préciser, le comptage peut aller jusqu à 500

  4. #3
    RISC

    Re : Besoin d'un petit coup de main en programmation C

    Salut,

    Cherche sur G..gle tu trouveras des centaines de programmes en C pour le PIC16F877 avec le compilateur gratuit HiTech.

    a+
    Ma marotte ? les microcontrôleurs ;=)

  5. #4
    Do you understand

    Smile Re : Besoin d'un petit coup de main en programmation C

    Ok merci beaucoup, je vais jeter un oeil ce soir quand je pourrai l installer sans avoir a passer en administrateur, en attendant je viens de tomber par hasard sur un site qui donne une partie de cours je vais essayer de me débrouiller avec tout ça par contre juste une petite question qui me semble importante pour pouvoir assigner les broches du PIC, est ce que je peux utiliser le PIC seul ou est ce que le résultat des calculs doit etre stockée dans une EEPROM (I2C ou SPI) parce que l'appareil doit fonctionner comme ceci:

    2 pavés de chacun 9 touches (A1 - A9 et B1 - B9), chaque touche est assignée à un compteur qui lui est propre, et un 19 ème compteur qui incrémente quelle que soit la touche appuyée (TOTAL). Il y a 5 autres boutons qui permettent de fixer une limite de comptage (tous les 100 jusqu'à 500) avec un "bip" lorsque l on atteint cette valeur.

    Il y a un mode écriture (comptage) et un mode lecture (qui affiche le résultat du compteur correspondant à la touche appuyée)

    TOTAL est affichée en permanence et est comparé aux boutons auxilliaires de limitation (100 à 500), alors que le résultat de [A1 - B9] n'est affiché que lorsque LECTURE est actif et que [A1 - B9] est appuyé. Il y a aussi un calcul de pourcentage mais ça je devrais pouvoir m en sortir à peu près

    Encore merci pour votre rapidité

  6. #5
    Do you understand

    Exclamation [URGENT] Besoin d'un petit coup de main en programmation C

    bon donc j'ai regarder dans les exemples mais mon probleme est le suivant: tous les compteurs que j ai trouvé utilise des timers, et je crains qu il en faille un pour chaque compteur. Or j'ai seulement 4 timers de dispo avec le 18F4685 et j ai 19 compteurs à incrémenter.

    Autres questions que j ai oublié, est ce que je peux incrémenter avec un code 5 bits sur un des ports plutot que 1 touche => 1 entrée (en gros j ai une partie interfaçage qui génère un code binaire 5 bits correspondant à chaque touche, l'anti-rebond étant intégré dans cette partie) pour A1 => 00001 et pour B9 =>10010 (00000 étant l'état de repos).

    De meme une question par rapport à l'envoie des résultats, est il possible (voire plus simple) de les stocker dans le PIC (comment?) ou dans une mémoire externe en I2C ou SPI genre 24C?

    Je vous remercie pour votre aide.
    cordialement, Loïc

  7. A voir en vidéo sur Futura
  8. #6
    Do you understand

    Exclamation Re : Besoin d'un petit coup de main en programmation C

    bon une bonne nouvelle, à force de tourner en rond j'ai réussi à faire un pseudo compteur avec deux variables (bouton 1 => incrémente variable A, bouton 2 => incrémente variable B) le tout sur un afficheur LCD (je laisse tomber les 7segments vu que je m en sors pas mal avec le LCD)

    Petit probleme, sa compte un peu trop, des que l un des BP est à un le compteur s'emballe et j'arrive à des résultats positifs, négatifs, énormes...

    voila le code:

    #include <main.h>
    #include <variable.c>
    #include <lcd.c>


    void main()
    {

    lcd_init ();
    setup_psp (PSP_DISABLED);
    setup_wdt (WDT_OFF);
    setup_timer_0 (RTCC_INTERNAL);
    setup_timer_1 (T1_DISABLED);
    setup_timer_2 (T2_DISABLED, 0, 1) ;
    setup_comparator (NC_NC_NC_NC);
    setup_vref (FALSE);
    setup_psp(PSP_DISABLED);

    A=0; // initialisation des compteurs
    B=0;

    while(true)
    {
    lcd_gotoxy (1, 1);
    printf (lcd_putc, "A= %d",A);
    lcd_gotoxy (1, 2);
    printf (lcd_putc, "B= %d",B);


    if(!input(inter1))
    {
    A=A+1;
    lcd_gotoxy (1, 1);
    printf (lcd_putc, "A= %d",A);
    lcd_gotoxy (1, 2);
    printf (lcd_putc, "B= %d",B);
    }
    if(!input(inter2))
    {
    B=B+1;
    lcd_gotoxy (1, 1);
    printf (lcd_putc, "A= %d",A);
    lcd_gotoxy (1, 2);
    printf (lcd_putc, "B= %d",B);
    }
    }
    }

    donc ce que j'aimerais c'est que dès que le bouton est appuyé, le compteur correspondant ne s'incrémente que de 1, même si on reste appuyé indéfiniment.

    Pour tout le reste je devrais pouvoir m en sortir assez vite si le micropross arrive à suivre niveau mémoire et RAM.

    merci

  9. Publicité
  10. #7
    lhse

    Re : Besoin d'un petit coup de main en programmation C

    Salut, voici le programme que je te proposerai:
    #include <main.h>
    #include <variable.c>
    #include <lcd.c>


    void main()
    {

    lcd_init ();
    setup_psp (PSP_DISABLED);
    setup_wdt (WDT_OFF);
    setup_timer_0 (RTCC_INTERNAL);
    setup_timer_1 (T1_DISABLED);
    setup_timer_2 (T2_DISABLED, 0, 1) ;
    setup_comparator (NC_NC_NC_NC);
    setup_vref (FALSE);
    setup_psp(PSP_DISABLED);

    A=0; // initialisation des compteurs
    B=0;

    while(true)
    {
    lcd_gotoxy (1, 1);
    printf (lcd_putc, "A= %d",A);
    lcd_gotoxy (1, 2);
    printf (lcd_putc, "B= %d",B);


    if(!input(inter1))
    {
    // Attente pour ne pas qu'il y aient des rebonds je ne suis pas sûr que cela fonctionne avec ton compilateur
    // ce n'est pas nécessaire si tes boutons ont déjà anti-rebond intégré
    delay_ms(50);
    // Attente que l'interrupteur se relève
    while(!input(inter1)){
    }
    A=A+1;
    lcd_gotoxy (1, 1);
    printf (lcd_putc, "A= %d",A);
    lcd_gotoxy (1, 2);
    printf (lcd_putc, "B= %d",B);
    }
    if(!input(inter2))
    {
    // Attente pour ne pas qu'il y aient des rebonds je ne suis pas sûr que cela fonctionne avec ton compilateur
    // ce n'est pas nécessaire si tes boutons ont déjà anti-rebond intégré
    delay_ms(50);
    // Attente que l'interrupteur se relève
    while(!input(inter2)){
    }
    B=B+1;
    lcd_gotoxy (1, 1);
    printf (lcd_putc, "A= %d",A);
    lcd_gotoxy (1, 2);
    printf (lcd_putc, "B= %d",B);
    }
    }
    }

  11. #8
    Do you understand

    Smile Re : Besoin d'un petit coup de main en programmation C

    oui du coup j ai réussi à m en sortir à peu près, en fait la ou sa clochait c'était "A=A++", qui veut pas dire grand chose, et le while(!input(inter1)); qui me manquait

    De meme pour ce qui est de la mémoire j ai réussi à gérer presque toutes les variables comme je voulais,

    SAUF, que je n'arrive pas à diviser une variable par une autre:
    J'ai une variable Pourcent (A1 - B9), une variable Totale, et mes variables A1 à B9. Pour donner le pourcentage de chaque variable A1 - B9, je voulais faire quelque chose du genre:

    PourcentA1=A1/B9;
    (je sais pas si je dois faire un #define, je sais que si je mets int16 PourcentA1=A1/Total j'ai un renvoi d'erreur "doit etre égal à une constante)
    donc je sais pas trop comment m y prendre...

    sinon un probleme un peu plus accessoire:

    j'aimerais pouvoir créer des variables pour remplacer les noms "inter1" par BP-A1, BP-A2... car "inter1" est défini comme l'entrée RA0 du PIC, seulement dans le montage réel les touches vont générer un code 5 bits et pas seulement une entrée du PIC, donc je voudrais pouvoir faire

    int1 BPA1 (RA0=1 && RA1=0 && ... RA4=0);
    int1 BPA2 (RA0=0 && Ra1=1 && ... RA4=0);
    ...
    int1 BPB9 (RA0-RA4= 10010);

    seulement pour simplifier mon code principal, j ai créer des sous programmes:

    - variables.c qui regroupe toutes les variables sauf peut etre celles ci-dessus.

    - clavier.c dans lequel je voulais définir BPA1, BPA2...

    - compteurA1.c à compteurB9.c qui contiennent le code:

    if (!input(inter1))
    {
    ++A1;
    lcd_gotoxy (1, 1);
    printf (lcd_putc, "Total:%Lu",Total);
    lcd_gotoxy (1, 2);
    printf (lcd_putc, " \n\r");
    lcd_gotoxy (1, 2);
    printf (lcd_putc, "A1:%Lu",A1);
    lcd_gotoxy (11, 1);
    printf (lcd_putc, "Nb:%Lu",Nb);
    lcd_gotoxy (11, 2);
    printf (lcd_putc, "%g\%%",Pourcent);
    while (!input(inter1));
    }

    et j'aurais aimer pouvoir remplacer inter1 par ma variable BPA1, mais sa me semble un peu complexe vu que je maitrise pas encore énormément tout ce qui est pointeur, variable locale...

    en tout cas merci pour ton aide, avec un peu de chance en rajoutant les delays dans mon code je pourrai gérer mes BP et tout le reste avec un seul PIC

  12. #9
    Do you understand

    Exclamation Re : Besoin d'un petit coup de main en programmation C

    autre question, je viens de découvrir par erreur une fonction en faisant compiler sans faire exprès, et étonné aucune erreur, mais je ne sais pas ce que c'est, j'ai écrit quelque chose du style:

    int16 A;
    float B;
    B=A

    lcd_gotoxy (1, 2);
    printf (lcd_putc, "%Lu %g",A,B/"%");

    j'ai essayer de remplacer % par 1 et par 10 mais je ne vois pas à quoi ça peut correspondre

    Donc sur mon LCD j'ai bien la valeur de A, mais B varie bizarrement en fonction de A:

    exemples:

    A=0, B=0
    A=1, B=0
    A=5, B=0.01
    A=10, B=0.03
    A=20, B=0.07
    A=50, B=0.18
    etc...
    donc au début je pensais que ça allait faire un pourcentage mais...

  13. #10
    Do you understand

    Exclamation URGENT: Besoin d'un petit coup de main en programmation C

    Bon mon programme est pas loin d'etre fini, mais j ai un petit soucis,
    voici mon code:

    Code PHP:
    switch (Total)
    {
    case (
    100): {output_high(buzzer); delay_ms(200);output_low(buzzer);}
       
    break;

    case (
    200): {output_high(buzzer); delay_ms(200);output_low(buzzer);}
       
    break;

    case (
    300): {output_high(buzzer); delay_ms(200);output_low(buzzer);}
       
    break;

    case (
    400): {output_high(buzzer); delay_ms(200);output_low(buzzer);}
       
    break;

    case (
    500): {output_high(buzzer); delay_ms(200);output_low(buzzer);}
       
    break;

    Donc lorsque Total passe à 100, 200... il "bip" bien et s'arrete bien, mais si par exemple Total=100 et que je fais passer Nb de 100 à 200 (n'influe pas sur Total) le buzzer se remet a sonner sans s'arreter jusqu à ce que Total change.

    donc je voudrais savoir, comment faire s'executer une fonction une seule fois et s'arreter meme si la condition (ici Total=100, 200... 500.) est encore vraie?

  14. #11
    MiGaNuTs

    Re : URGENT: Besoin d'un petit coup de main en programmation C

    Tu mets une variable dans chacun de tes case.
    tu ne bip que si elle est a 0, puis tu la mets a 1.

    Tu la remets a 0 si aucun de tes case n'est vrai.

  15. #12
    Do you understand

    Lightbulb Re : Besoin d'un petit coup de main en programmation C

    j'ai essayer avec des variables mais j'ai un peu de mal.
    en gros j'ai 5 boutons qui permettent de faire varier ma variable Nb (100, 200, 300, 400 et 500)

    à l'allumage, Total=0 et Nb=100

    si Total arrive à 100, le buzzer bip pendant 100ms et s'arrete, mais si j appuie sur Nb=200...500, le buzzer se remet a sonner jusqu à ce que Total passe à 101...

    donc avec variable je sais pas trop comment définir sa, je voudrais faire un truc du genre "si Nb précédant=100 et Nb=200...500, désactiver buzzer, sinon buzzer actif pendant 100ms"

    car l autre probleme que j'ai eu est que le buzzer s'arretait bien, mais que si Total arrivait à 200...500, le buzzer ne fonctionnait plus alors qu il devrait biper chaque fois que Total augmente de 100...

    encore merci pour votre aide, je ne suis plus tres loin de la fin, j'ai plus que ce petit probleme à regler

  16. Publicité
  17. #13
    Do you understand

    Re : Besoin d'un petit coup de main en programmation C

    Résolu!

Sur le même thème :

Discussions similaires

  1. Histoire de pendule.... Mais surtout d'une fille qui a besoin d'un petit coup de main
    Par sasi4634 dans le forum TPE / TIPE et autres travaux
    Réponses: 8
    Dernier message: 13/08/2013, 11h10
  2. Besoin d'un petit coup de main...
    Par prp0_0 dans le forum Électronique
    Réponses: 2
    Dernier message: 09/12/2007, 11h03
  3. Besoin d' un petit coup de main!
    Par Julien3400 dans le forum Biologie
    Réponses: 2
    Dernier message: 09/04/2007, 13h45
  4. Besoin d'un coup de main
    Par jerem8 dans le forum Électronique
    Réponses: 3
    Dernier message: 19/08/2006, 19h26
  5. besoin d'un ptit coup de main pour commentaire d'un petit texte de Kant
    Par unefilledu33 dans le forum [ARCHIVE] Philosophie
    Réponses: 4
    Dernier message: 30/10/2004, 11h40