reprise en programmation
Répondre à la discussion
Affichage des résultats 1 à 27 sur 27

reprise en programmation



  1. #1
    nanard

    reprise en programmation


    ------

    Bonjour,

    Cela fait quelques années que je n'ai pas programmé un microcontrôleur et je bute sur quelque chose de simple, voilà mon programme.

    void main() {
    TrisB.F1=0;
    TrisB.F2=1;
    PORTB.F1=1;
    delay_ms (1000);
    while(PORTB.F2=0);
    {
    }
    PortB.F1=0;
    }

    le but est que la led sur la sortie 1 du port b s'allume et reste allumée tant que je n'appuie pas sur le poussoir de l'entré 2 du port b.
    Je travaille avec mikroc et la platine easy pic 6
    Mon problème est que la led s'allume bien mais elle s'éteint au bout 1 second, j'ai essayé de mettre PORTB.F2=0 et PORTB.F2=1 mais c'est la même chose.

    Pouvez vous me dire où est mon erreur?
    merci

    -----

  2. #2
    tayak

    Re : reprise en programmation

    Bonjour,

    A mon avis il te faut initialiser PORTB.F2 à 0 sinon tu ne sais pas quelle valeur il prend à la mise sous tension.

  3. #3
    Bernibernouille

    Re : reprise en programmation

    Ton programme ne travaille pas en boucle.
    Pour que ton programme tourne constament, tu doit metre une boucle infini comme ca:
    Code:
    void main() {
    TRISB.F1=0;
    TRISB.F2=1;
    for(;;)
    {
    PORTB.F1=1;
    delay_ms (1000);
    while(PORTB.F2=0);
    {
    }
    PORTB.F1=0;
    }
    }
    et pour définir entrée ou sortie c'est:
    1 pour les entrée
    et 0 pour les sortie
    Dernière modification par Bernibernouille ; 11/09/2010 à 12h31.

  4. #4
    Bernibernouille

    Re : reprise en programmation

    et si tu veut te rappeler certaine chose tu a ce tuto qui est pas mal:
    http://herve.hollard.perso.sfr.fr/prog_pic_c.htm

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

    Re : reprise en programmation

    Merci

    tayak si je met la broche à 0 je vais l'utiliser en sortie et je veux l'utiliser en entrée.
    Bernibernouille ton source boucle bien mais il ne veux plus en sortir la broche RB1 rest allumée.

  7. #6
    nanard

    Re : reprise en programmation

    Il y a un truc que je ne comprend pas, le while çà veut bien dire "tant que", donc si je met while(PORTB.F2=0) cela veut dire tant que la broche du port B et à 0 je boucle?
    non?
    merci

  8. #7
    tayak

    Re : reprise en programmation

    Citation Envoyé par nanard Voir le message
    Merci

    tayak si je met la broche à 0 je vais l'utiliser en sortie et je veux l'utiliser en entrée.
    Bernibernouille ton source boucle bien mais il ne veux plus en sortir la broche RB1 rest allumée.
    C'est par l'instruction TRISB que tu définit ton port en entrée ou en sortie. Tu as donc bien défini par TRISB.F2=1 que tu voulais utiliser ce port en entrée.
    PORTB représente l'état haut ou bas de ton port. Si tu ne l'initialise pas, tu ne peux savoir quelle valeur il va prendre au reset (cf datasheet de ton PIC).

  9. #8
    freepicbasic

    Re : reprise en programmation

    En C la comparaison égalité c'est ==
    le = seul c'est une assignation !

    while(PORTB.F2=0);
    avec F2 en entrée !
    Le résultat est surement bizarre ...
    A+, pat

  10. #9
    nanard

    Re : reprise en programmation

    Désolé j'ai été long à comprendre

    voilà ce que j'ai fait:

    void main() {
    TrisB.F1=0;
    TrisB.F2=1;
    PORTB.F1=1;
    PORTB.F2=0;
    delay_ms (1000);
    while(PORTB.F2=0);
    {
    }
    PortB.F1=0;
    }

    et çà ne fonctionne toujours pas

  11. #10
    nanard

    Re : reprise en programmation

    Citation Envoyé par freepicbasic Voir le message
    En C la comparaison égalité c'est ==
    le = seul c'est une assignation !

    while(PORTB.F2=0);
    avec F2 en entrée !
    Le résultat est surement bizarre ...
    Merci c'est bon çà fonctionne je vais pouvoir continuer.

  12. #11
    nanard

    Re : reprise en programmation

    Bonjour,

    Autre soucis,

    Je souhaite afficher un nombre, par exemple 5, et le faire incrémenter ou décrémenter en appuyant sur un bouton, le problème est que je n'arrive pas à l'afficher.

    // LCD module connections
    sbit LCD_RS at RB4_bit;
    sbit LCD_EN at RB5_bit;
    sbit LCD_D4 at RB0_bit;
    sbit LCD_D5 at RB1_bit;
    sbit LCD_D6 at RB2_bit;
    sbit LCD_D7 at RB3_bit;

    sbit LCD_RS_Direction at TRISB4_bit;
    sbit LCD_EN_Direction at TRISB5_bit;
    sbit LCD_D4_Direction at TRISB0_bit;
    sbit LCD_D5_Direction at TRISB1_bit;
    sbit LCD_D6_Direction at TRISB2_bit;
    sbit LCD_D7_Direction at TRISB3_bit;
    // End LCD module connections
    char txt1;

    void main() {
    txt1 = 5 ;
    LCD_INIT();
    LCD_OUT(1,1,"essais");
    Lcd_Cmd(_LCD_CURSOR_OFF);
    LCD_chr(2,1,txt1);

    }

    Je pense que c'est la déclaration de txt1 mais je ne vois pas quoi mettre.

    merci

  13. #12
    Seb.26

    Re : reprise en programmation

    txt1 est un char, donc un nombre de 0..255 ... pas une chaine de char, ni un char affichable ...

    Essaye avec ceci :
    Code:
    // LCD module connections
    sbit LCD_RS at RB4_bit;
    sbit LCD_EN at RB5_bit;
    sbit LCD_D4 at RB0_bit;
    sbit LCD_D5 at RB1_bit;
    sbit LCD_D6 at RB2_bit;
    sbit LCD_D7 at RB3_bit;
    
    sbit LCD_RS_Direction at TRISB4_bit;
    sbit LCD_EN_Direction at TRISB5_bit;
    sbit LCD_D4_Direction at TRISB0_bit;
    sbit LCD_D5_Direction at TRISB1_bit;
    sbit LCD_D6_Direction at TRISB2_bit;
    sbit LCD_D7_Direction at TRISB3_bit;
    // End LCD module connections
    char txt1;
    char txt1_str[5];
    
    void main()
    {
      txt1 = 5 ;
      LCD_INIT();
      LCD_OUT(1,1,"essais");
      Lcd_Cmd(_LCD_CURSOR_OFF);
      //
      sprintf(txt1_str, "%d", txt1 );
      LCD_OUT(2,1,txt1_str);
    }
    PS: mets ton code dans les balises [C0DE] !!! ( c'est le bouton '#' dans la barre en haut )
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  14. #13
    Rodrigue

    Re : reprise en programmation

    Tu dois utiliser la fonction printf (http://www.cplusplus.com/reference/c...tdio/printf/):

    Code:
    main() { 
       float chiffre;
       int entier;
       
       f=12.345f;
       entier = 7;
       
       printf(LCD,"%6.3f",chiffre);
       printf(LCD,"%d",entier);
    }
    Quel compilateur utilises-tu?

  15. #14
    Hearty

    Re : reprise en programmation

    Bonjour,

    Il semble que tu sois sous MikroC,
    Tu dois convertir ton entier en caractère pour être affichable,
    avec la fonction "IntToStr"

    vois ici un exemple
    le compilateur était MikroC standard, avec la version pro,
    quelques changements de syntaxes sont de mises,
    comme l'initialisation du LCD, tel que tu l'utilises.


  16. #15
    nanard

    Re : reprise en programmation

    Seb.26 ta solution à fonctionnée mais maintenant je n'ai plus 5 mais 773 je ne comprend rien.
    Rodrigue j'utilise mikroC 3.8 avec sa suite, ce qui est fournir avec la platine de dévellopement.
    Hearty c'est la version pro que j'ai car j'ai acheté une licence. J'ai essayé avec IntToStr mais ça me décale mon chiffre de 5 caractère sur la droite.

  17. #16
    Hearty

    Re : reprise en programmation

    Effectivement,

    Sur une minuterie que j'ai réalisé,
    j'ai utilisé la fonction suivante:

    Code:
    // Fonction d'affichage sur 2 digits
    //********************
    
    void aff_int(int mon_int) {
        char affich[2];
        affich[1] = ((mon_int%100)/10)+48;
        affich[0] = (mon_int%10)+48;
        LCD_Chr_CP(affich[1]);
        LCD_Chr_CP(affich[0]);
    }
    //******************
    Que tu utilises de la manière suivante:

    Code:
    //*****************************
    // Affichage du compteur
         Lcd_constOut(1, 2, "T =") ;
         aff_int(minute);                         // Afficher les minutes
         LCD_Chr_CP(':') ;                        // Afficher le séparateur
         aff_int(seconde);                      // Afficher les secondes
    Minute et seconde dans mon exemple,
    étant les variables d'entiers que tu comptes afficher.

    la fonction "aff_int" permet d'avoir un affichage
    sur deux digits, 00 à 99 ( si ton comptage monte à 99).


  18. #17
    Seb.26

    Re : reprise en programmation

    Citation Envoyé par Rodrigue Voir le message
    Tu dois utiliser la fonction printf
    à condition d'avoir le stdout bien réglé ...

    mais maintenant je n'ai plus 5 mais 773 je ne comprend rien.
    773 dans un char ?! ... change d'EDI ! ...
    ( c'est quoi et où que tu as 773 ??? )
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  19. #18
    umfred

    Re : reprise en programmation

    Citation Envoyé par nanard Voir le message
    ...
    char txt1;
    ...
    txt1 = 5 ;
    ...
    hum ... et si on essayait de mettre simplement:

    txt1="5";


  20. #19
    Seb.26

    Re : reprise en programmation

    Citation Envoyé par umfred Voir le message
    hum ... et si on essayait de mettre simplement:

    txt1="5";

    ça compile pas ... à la limite tu peux écrire :
    Code:
    txt = '5';
    Mais il faut ensuite afficher non plus un char* ( ce qui de toute façon donne toujours 'Y' ), mais un char ...

    NB: la programmation n'est pas de l'alchimie, on n''essaye pas des trucs au pif !!!
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  21. #20
    nanard

    Re : reprise en programmation

    Bonjour,

    J'ai tout repris de zéro,
    J'utilise un 16F887 mon programme est (désolé je n'est pas trouver comment le mettre dans code):

    // LCD module connections
    sbit LCD_RS at RB4_bit;
    sbit LCD_EN at RB5_bit;
    sbit LCD_D4 at RB0_bit;
    sbit LCD_D5 at RB1_bit;
    sbit LCD_D6 at RB2_bit;
    sbit LCD_D7 at RB3_bit;

    sbit LCD_RS_Direction at TRISB4_bit;
    sbit LCD_EN_Direction at TRISB5_bit;
    sbit LCD_D4_Direction at TRISB0_bit;
    sbit LCD_D5_Direction at TRISB1_bit;
    sbit LCD_D6_Direction at TRISB2_bit;
    sbit LCD_D7_Direction at TRISB3_bit;
    // End LCD module connections
    char txt1;
    char txt1_str[5];

    void main()
    {
    txt1 = 5 ;
    LCD_INIT();
    LCD_OUT(1,1,"essais");
    Lcd_Cmd(_LCD_CURSOR_OFF);
    //
    sprintf(txt1_str, "%d", txt1 );
    LCD_OUT(2,1,txt1_str);
    }

    Et maintenant en compilant j'ai:
    Undeclared identifier 'sprintf' in expression essai.c

    Je comprend rien quand j'avais un 18f252 çà fonctionnais et maintenant plus!

  22. #21
    nanard

    Re : reprise en programmation

    J'ai trouvé pourquoi je n'arrivais pas à afficher quelque chose en regardant les exemple mais je n'ai pas trouvé à quoi sa sert. J'ai rajouter ceci:
    ANSELH = 0;
    Il me semble que çà concerne les entrées analogiques pour les passer en entrés/sorties mais je ne suis pas sur.

  23. #22
    nanard

    Re : reprise en programmation

    Je me suis débrouillé.

    autre soucis et je suis sur que c'est encore un truc à la c..
    J'utilise un clavier 16 touches, pas de pb de se côté, pour afficher heures, minutes, et seconds, jusque là pas de problème, je veux éviter de mettre 30 heures j'ai un bout de code mais il ne fonctionne pas:

    // LCD module connections
    sbit LCD_RS at RB4_bit;
    sbit LCD_EN at RB5_bit;
    sbit LCD_D4 at RB0_bit;
    sbit LCD_D5 at RB1_bit;
    sbit LCD_D6 at RB2_bit;
    sbit LCD_D7 at RB3_bit;

    sbit LCD_RS_Direction at TRISB4_bit;
    sbit LCD_EN_Direction at TRISB5_bit;
    sbit LCD_D4_Direction at TRISB0_bit;
    sbit LCD_D5_Direction at TRISB1_bit;
    sbit LCD_D6_Direction at TRISB2_bit;
    sbit LCD_D7_Direction at TRISB3_bit;
    // End LCD module connections

    // Keypad module connections
    char keypadPort at PORTD;
    // End Keypad module connections

    unsigned short kp ;
    char dixheure, heure, dixminute, minute, dixsecond, second;

    void main(){

    Keypad_Init(); // initialisation du clavier
    ANSEL = 0; // Configure les broche A/N en I/O
    ANSELH = 0;
    Lcd_Init(); // Initialisation de l'afficheur LCD
    Lcd_Cmd(_LCD_CLEAR); // effacement de l'afficheur
    Lcd_Out(1,1,"compte a rebours"); // ecrire compte a rebours
    delay_ms (1000);
    Lcd_Out(2,5,"0");
    Lcd_Out(2,6,"0");
    Lcd_Out(2,7,":");
    Lcd_Out(2,8,"0");
    Lcd_Out(2,9,"0");
    Lcd_Out(2,10,":");
    Lcd_Out(2,11,"0");
    Lcd_Out(2,12,"0");
    Lcd_Out(2,4," ");

    //choix des dixaines heure

    do {
    kp = 0; // Reset key code variable

    // Wait for key to be pressed and released
    do
    kp = Keypad_Key_Click(); // Store key code in kp variable

    while (!kp);

    // Prepare value for output, transform key to it's ASCII value
    switch (kp) {

    case 1: kp = 49; break; // 1 // Uncomment this block for keypad4x4
    case 2: kp = 50; break; // 2
    case 3: kp = 51; break; // 3
    case 4: kp = 65; break; // A
    case 5: kp = 52; break; // 4
    case 6: kp = 53; break; // 5
    case 7: kp = 54; break; // 6
    case 8: kp = 66; break; // B
    case 9: kp = 55; break; // 7
    case 10: kp = 56; break; // 8
    case 11: kp = 57; break; // 9
    case 12: kp = 67; break; // C
    case 13: kp = 42; break; // *
    case 14: kp = 48; break; // 0
    case 15: kp = 35; break; // #
    case 16: kp = 68; break; // D
    }

    if (kp >> 50 )
    {
    kp = 0 ;
    }
    else
    {
    Lcd_Chr(2, 5, kp);
    dixheure = kp;
    }

    } while (kp=0);

    //choix des heures
    .
    .
    .
    .

    La partie qui ne va pas est celle ci
    if (kp >> 50 )
    {
    kp = 0 ;
    }
    else
    {
    Lcd_Chr(2, 5, kp);
    dixheure = kp;
    }

    qu'est qui cloche? Si j'ai bien compris le "do...while" tant que kp reste à 0 çà tourne en boucle, je n'ai pas l'habitude de l'utiliser.

    merci

  24. #23
    Seb.26

    Re : reprise en programmation

    Citation Envoyé par nanard Voir le message
    Undeclared identifier 'sprintf' in expression essai.c
    il te manque un :
    Code:
    #include "string.h"
    J'ai pas tout lu, mais ceci me saute aux yeux :

    Code:
    kp >> 50
    tu es sûr que c'est ce que tu veux écrire ???

    L'opérateur '>>' est un décalage de bit (50 décalages vers la droite dans ton cas ?!!!), pour faire un test "supérieur ou égal", il faut écrire ">="
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  25. #24
    Seb.26

    Re : reprise en programmation

    re ...

    Code:
    kp=0
    ... ceci est une affectation ... pas un test ...

    Et en C, c'est équivalent à 'faux' tout le temps ... donc tu boucle pas ...

    Un peu de lecture te fera gagner pas mal de temps je crois :
    http://c.developpez.com/cours/
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  26. #25
    Seb.26

    Re : reprise en programmation

    Et pour mettre du CODE, c'est le l'icône # en haut de ton message ...

    Code:
    // Wait for key to be pressed and released
    do
    kp = Keypad_Key_Click(); // Store key code in kp variable
    
    while (!kp);
    Une bonne habitude à prendre est de mettre SYSTEMATIQUEMENT des accolades ... surtout quand on débute ...
    Dernière modification par Seb.26 ; 15/09/2010 à 15h13.
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  27. #26
    nanard

    Re : reprise en programmation

    Citation Envoyé par Seb.26 Voir le message
    Et pour mettre du CODE, c'est le l'icône # en haut de ton message ...
    Je n'ai pas le # en haut, à vrai dire je n'ai rien du tout

    Pour le kp >> 50 j'ai fait une faute de frappe, j'ai mis kp>50 et j'ai trouvé mon erreur le while (kp=0); j'ai oublié de mettre le deuxième =.

    merci
    Images attachées Images attachées  

  28. #27
    Seb.26

    Re : reprise en programmation

    Citation Envoyé par nanard Voir le message
    Je n'ai pas le # en haut, à vrai dire je n'ai rien du tout
    Ah OK ... Tu dois probablement être en éditeur "basique" ... vas dans ton "tableau de bord" (en haut à gauche dans la barre grise ), puis dans tes option, et vers le bas tu peux choisir quel éditeur utiliser ...

    Le "basique" est vraiment ... ... basique !!!

    Citation Envoyé par nanard Voir le message
    Pour le kp >> 50 j'ai fait une faute de frappe, j'ai mis kp>50 et j'ai trouvé mon erreur le while (kp=0); j'ai oublié de mettre le deuxième =.
    vi ...
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

Discussions similaires

  1. Reprise d'étude?
    Par inviteacbb7354 dans le forum Orientation après le BAC
    Réponses: 1
    Dernier message: 10/05/2010, 17h53
  2. reprise de fac
    Par invitef5b0623c dans le forum Psychologies (archives)
    Réponses: 2
    Dernier message: 19/06/2009, 16h05
  3. Reprise d'études
    Par invite2329c2ed dans le forum Orientation après le BAC
    Réponses: 8
    Dernier message: 05/12/2006, 22h38
  4. C'est la reprise !
    Par invite4e552635 dans le forum Mathématiques du supérieur
    Réponses: 5
    Dernier message: 07/09/2005, 19h57
Découvrez nos comparatifs produits sur l'informatique et les technologies.