probleme avec fonction de saut d'etape PIC C
Répondre à la discussion
Affichage des résultats 1 à 6 sur 6

probleme avec fonction de saut d'etape PIC C



  1. #1
    invite19952594

    probleme avec fonction de saut d'etape PIC C


    ------

    Bonjour j'ai un projet dont j'utilise la foncyion "go to;" pour generer un tel sorte de menue
    le probleme ce que la reponse du procedure et lente ; en effet si je teste sur un boutton ca marche parfois et
    parfois nn voici une partie de mon programme sur PIC C:

    Code:
    #include <18F4550.h>  
    #fuses HSPLL,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOPBADEN   
    #use delay(clock=MHZ)
    #include <usb_cdc.h>
    #include <usb_desc_cdc.h>  
    #include <pic18_usb.h> // Microchip PIC18Fxx5x Hardware layer for CCS's PIC USB driver
    #include <usb.c> // handles usb setup tokens and get descriptor reportsp
    #include <stdlib.h> 
    #include "kbd.c"
    #include "LCD.c" 
    #include <24256.c>
    #define EEPROM_SCL  PIN_E1
    #define EEPROM_SDA  PIN_E2
    char LETRA[]; 
    Void main()
    {          
    char ptr,k,c[8],d[8],Pswrd[5];
    int E,i,j,l;
    float n;
    i=0;
    j=0;
    l=0;
    E=0;
    C=0;
    d="21861653"; 
     lcd_init();
     kbd_init(); 
     usb_cdc_init();
     usb_init();  
     init_ext_eeprom();
    
    while (true)
    { 
    if(READ_EEPROM(0)!=0xFFFF) // EEPROM vierge ?
       {L=READ_EEPROM(0);} // valeur valide
     else{write_eeprom(0,0);}//valeur par defaut
       
    if(READ_EEPROM(1)!=0xFFFF) // EEPROM vierge ?
       {Pswrd=READ_EEPROM(1);} // valeur valide
     else{write_eeprom(1,"12345");} //valeur par defaut 
    Menu:
    while (true)
    { lcd_init(); kbd_init();
    k=kbd_getc();
    printf(lcd_putc,"\fMenue");
    delay_ms(100);
    if(k!=0)
               
          { 
    
    if (k=='1'){delay_ms(200); goto ADD_CODE;}
    if (k=='2'){delay_ms(200); goto scanner;}
    
    else printf(lcd_putc,"\fbad cmd"); 
          }
     
    }
    
    ADD_CODE:
    lcd_init();
    printf(lcd_putc,"\fCODE:");
    while (true)
    {
    k=kbd_getc();
    
          if(k!=0)
               
          {     
             if(k!='*'&&k!='#'&&i<8)
             {

    -----
    Dernière modification par gienas ; 10/05/2014 à 09h26. Motif: Ajouté les balises code, obligatoires pour les programmes

  2. #2
    inviteb3c806f8

    Re : probleme avec fonction de saut d'etape PIC C

    Quel est ton problème exactement?

  3. #3
    abracadabra75

    Re : probleme avec fonction de saut d'etape PIC C

    Bonjour.

    Un bon programme(ur) n'utilise jamais le goto.

    C'est la meilleure instruction pour se planter, ce qui est ton cas.

    Quant à débroussailler ton code, il faudrait déjà qu'il ne soit pas tronqué, et c'est à toi de l'analyser (correctement).

    Un programme qui ne marche pas... c'est TOUJOURS qu'il est mal conçu et/ou mal écrit: ton µp ne fait que ce que tu lui as dit de faire (et rien d'autre car il est c...n et n'a aucune imagination,lui!).

    Et un if ne se termine-t-il pas par un endif?
    Et un while n'est-il pas borné par quelque chose comme 'wend' ?
    (Ce ne sont peut-être pas les termes exacts, ça fait x années que j'ai oublié le C)

    A+
    Dernière modification par abracadabra75 ; 12/05/2014 à 10h15.
    Il n'y a que dans le dictionnaire où 'réussite' vient avant 'travail'.

  4. #4
    invitefa96bd8f

    Re : probleme avec fonction de saut d'etape PIC C

    Citation Envoyé par abracadabra75 Voir le message
    Et un if ne se termine-t-il pas par un endif?
    Et un while n'est-il pas borné par quelque chose comme 'wend' ?
    (Ce ne sont peut-être pas les termes exacts, ça fait x années que j'ai oublié le C)
    En Basic, peut etre ( je ne suis pas sur), mais en C, non, on a les accolades pour ca.

    On peut utiliser du goto dans certains cas très particuliers, je ne pense pas que ce soit le cas ici, donc code à revoir.

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

    Re : probleme avec fonction de saut d'etape PIC C

    Hello !

    kbd_init() et lcd_init : à appeler une seule fois dans l'initialisation, et pas dans la boucle principale.

    Attention aussi à la commande d'effacement du LCD (\f) qui demande bcp de temps (préférer un lcd_gotoxy et écraser le texte... au pire par des espaces pour effecer une zone).

    Pourquoi tous ces délais ??? Si c'est pour éviter les rebonds, c'est déjà intégré dans kbd_getc ... il faut juste paramétrer correctement le KBD_DEBOUNCE_FACTOR dans kbd.c (en fonction de la fréquence d'appel de kbd_getc).

    Pour gérer des menus, le goto c'est vraiment pas top ... utiliser l'instruction switch par exemple ou une série de if

    Voila un exemple qui utilise un clavier matricé avec la routine kbd_getc ... les touches ici n'activent pas des sous-menus mais bien des actions directes (mais le principe reste le même) :

    Code:
       while (TRUE)
       {
        //Gestion USB
        usb_task();
        enable_interrupts(GLOBAL);
        if (usb_cdc_kbhit()) 
          {
             USBComm();
             delay_ms(2);
          }
    	if (usb_cdc_connected())
    	  {
           PC = 1;
    	   Select=0;
    	   LCD_E = LCD_M;
           lcd_putc('\d');
    	  }
        else PC = 0;
        
        //Gestion Clavier
        k=kbd_getc();
        if ((k!='\0') & (!PC))
        {
          if (k=='A') {if (Select==1) Select=0; else Select=1;}
    	  if (k=='B') {if (Select==2) Select=0; else Select=2;}
    	  if (k=='C') {if (Select==3) Select=0; else Select=3;}
    	  if (k=='D') {if (Select==4) Select=0; else Select=4;}
    
    	  if (k=='1') { Mode[0]=Mode[0]^1; SetMode(0,Mode[0]);}
    	  if (k=='2') { Mode[1]=Mode[1]^1; SetMode(1,Mode[1]);}
    	  if (k=='3') { Mode[2]=Mode[2]^1; SetMode(2,Mode[2]);}
    	  if (k=='4') { Mode[3]=Mode[3]^1; SetMode(3,Mode[3]);}
    
    	  LCD_E = LCD_M;
          if (Select) {lcd_putc('\c'); lcd_gotoxy(2, Select);}
    	  else 		   lcd_putc('\d');
    
    	  if (Select)
    	  {
    	   n=Select-1;	
    	   if (k=='P') {SP[n]=SP[n]+0.1*Scale[n]; if (SP[n]>Scale[n]) SP[n]=Scale[n];}
    	   if (k=='M') {SP[n]=SP[n]-0.1*Scale[n]; if (SP[n]<0.0) SP[n]=0.0;}
    	   if (k=='p') {SP[n]=SP[n]+0.01*Scale[n]; if (SP[n]>Scale[n]) SP[n]=Scale[n];}
    	   if (k=='m') {SP[n]=SP[n]-0.01*Scale[n]; if (SP[n]<0.0) SP[n]=0.0;}
    	   if (k=='X') {SP[n]=0.0;}
    	   if (k=='Y') {SP[n]=0.5*Scale[n];}
    	   if (k=='Z') {SP[n]=Scale[n];}
    	   if (k=='R') {Total[n]=0.0; Sec[n]=0;}
    
           DAControl (n, (5.0*SP[n]/Scale[n]));
    	  }
        }
    A+
    Laurent

  7. #6
    invite19952594

    Re : probleme avec fonction de saut d'etape PIC C

    Meci Laurent pour les conseil le programme et maintenant fonctionel le probleme etait dans les interruption et l'attente en faite je suis un électricien en installation et je suis un amateur en programation

Discussions similaires

  1. Excel tirer une formule avec saut de ligne
    Par invitebfb0bb71 dans le forum Logiciel - Software - Open Source
    Réponses: 1
    Dernier message: 06/04/2014, 15h45
  2. Dosage pH-métrique avec double saut de pH
    Par invitee17d42ae dans le forum Chimie
    Réponses: 18
    Dernier message: 02/01/2011, 17h29
  3. Virus ? Problème étape> RSIT application win32 pas valide
    Par invitef3356915 dans le forum Sécurité et malwares : désinfectez votre machine
    Réponses: 11
    Dernier message: 25/05/2010, 15h02
  4. saut de programme avec PIC !!
    Par invite5396f733 dans le forum Électronique
    Réponses: 21
    Dernier message: 18/06/2008, 08h53
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...