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

Problème de programmation du 16F877 en language C



  1. #1
    srasra

    Problème de programmation du 16F877 en language C


    ------

    bon soire a tt ,bon je viens de calculé un déphasage entre deux signaux U1 et U2 ont des amplitudes sont respectivement les suivantes 5 ET 2 V volts ayant une fréquence de 50 HZ bon aprés une simulation sur isis et j'ai utiliser un compilater pic c COMPILER je ne trouve pas mes valeurs souhaité de déphasage pour une fréquence de 50HZ bien que mon programme donne des bonne valeurs de déphasage pour des fréquence de 0.05 HZ qui ma fait étonné !!!! j'arrive pas a trouvé mon bonheur s'il vous plais aider moi pour connaitre les erreurs dans le programme ou dans la simulation
    mon code source et le schéma sur isis sont les suivantes

    ################# Image effacée.
    Merci de suivre ces quelques conseils pour poster une image dans le forum.

    Pour la modération,

    yoda1234.



    Code:
    #include <16f877.h>
    #device ADC=10
    #fuses xt,nowdt,NOPROTECT,noput
    #use delay(clock=20000000)
    #use rs232(baud=9600, xmit=PIN_C6,rcv=PIN_C7)
    #include <lcd.c>
    #include <math.h>
    
    
    int32 n=0;
    
    
    #int_timer0
    void timer0_isr()
    {
    n++;
    }
    
    
    void main () 
    {
    int1 test_1, test_2;
    //***********programme de dephasage******************//
    //float a,b,c,e,f,g,R,X;
    //float tens_max,courant_max,dephasage,Veff,Ieff ;
    
    float temps, dephasage;
    float tens_anal_10,tens_anal_1,tens_num_1,tens_num_2,tens_anal_2,tens_anal_20;
    int8 Iter;
    float Freq=0.05;
    
    tens_anal_10 = 0.1;
    tens_anal_20 = 0.1;
    
    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
    enable_interrupts(int_timer0);
    enable_interrupts(GLOBAL);
    
    
    disable_interrupts(int_timer0);
    clear_interrupt(int_timer0);
    
    setup_port_A(all_analog);
    setup_adc(adc_clock_internal);
    
    
    while(true)
    {
      while(!input(pin_C0))
      {
       test_1=1;
       test_2=1;
       set_adc_channel(0);
       delay_us(10);
       
       while(test_1==1)
       {
         tens_num_1 =read_adc();
         tens_anal_1 = (tens_num_1 *(0.0048876)*2)-5;
         
         
         lcd_init();
         printf(lcd_putc,"Tens1=%2.5f\r",tens_anal_1);
         //printf("T1=%2.3f\r",tens_anal_1);
         
         if ((tens_anal_1>=0) && (tens_anal_10<0))
           {       
             set_timer0(0);
             n=0;
             clear_interrupt(int_timer0);
             enable_interrupts(int_timer0);
             test_1=0;
             tens_anal_10=tens_anal_1;
             //lcd_init();
             //printf(lcd_putc,"Tens1=%2.5f\r",tens_anal_1);         
             printf("Detected Tens1=%2.5f\r",tens_anal_1);
           }
          else
           {
             tens_anal_10 = tens_anal_1;
           }
        }
        
        set_adc_channel(1);
        delay_us (10);
        
        while (test_2==1)
        {
          tens_num_2=read_adc();
          tens_anal_2 = (tens_num_2 *(0.0048876))-2;
          
          lcd_init();
          printf(lcd_putc,"Tens2=%2.5f\r",tens_anal_2);     
          //printf("T2=%2.3f\r",tens_anal_2);
          
          if ((tens_anal_2>=0) && (tens_anal_20<0))
          { 
            Iter=get_timer0();
            disable_interrupts(int_timer0);
            clear_interrupt(int_timer0);
            temps = 0.0000512*n+Iter*0.0000002;
            dephasage =2*PI-((2*PI*Freq)*temps);
            test_2=0;
            tens_anal_20=tens_anal_2;
            
            //lcd_init();
            //printf(lcd_putc,"Tens2=%2.5f\r",tens_anal_2);
            printf("Detected Tens2=%2.5f\r",tens_anal_2);
            printf("temps=%3.5f\r",temps);
          }
          else
          {
            tens_anal_20=tens_anal_2;
          }
        }
        lcd_init();
        printf(lcd_putc,"Deph=%3.5f deg\r",dephasage*57.295779513);
        printf("Deph=%3.5f deg\r",dephasage*57.295779513);
       }
      }
    }

    -----
    Dernière modification par yoda1234 ; 27/04/2011 à 07h47. Motif: Effacement image externe et mise en place balise code

  2. #2
    pernorge

    Re : :sos: problème de programmation du 16F877 en language C

    n'est pas facile...
    Dernière modification par yoda1234 ; 27/04/2011 à 07h48. Motif: Effacement image externe

  3. #3
    boulbidor

    Re : :sos: problème de programmation du 16F877 en language C

    Tu veux connaitre le déphasage entre deux signaux ? OK !
    Explique un peu la technique que tu comptes utiliser pour le faire (t'as utilisé le timer_0 et l'adc mais comment tu comptes t'en servir en fonction des variables que tu utilises).
    Déjà ça permettra de bien comprendre ton code.
    Enfin bref si ton code marche pour 0.05 hz et non pour 50 hz, tu devrais prendre en considération la fréquence interne de ton pic avec la demarche que tu utilises pour detecter le déphasage et voir à quelle fréquence maximale ton code peut être valable.
    NB : Si tu veux avoir beaucoup plus de réponde, poses ton problème sur le forum électronique (les pic c'est plutôt ce domaine)

Sur le même thème :

Discussions similaires

  1. Problème Programmation 16F877
    Par flowind dans le forum Électronique
    Réponses: 22
    Dernier message: 10/07/2010, 21h27
  2. Pic 16f877 problème de programmation
    Par Arpazak dans le forum Électronique
    Réponses: 11
    Dernier message: 06/08/2009, 09h21
  3. Réponses: 6
    Dernier message: 18/05/2009, 10h33
  4. programmation en language C???
    Par benjamin pagé dans le forum Électronique
    Réponses: 2
    Dernier message: 03/06/2008, 10h37
  5. Language de programmation
    Par Charlus93 dans le forum Logiciel - Software - Open Source
    Réponses: 3
    Dernier message: 12/01/2008, 15h44
Découvrez nos comparatifs produits sur l'informatique et les technologies.