CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to support@ccsinfo.com

where's the bug in this code?

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
nfs



Joined: 28 Apr 2004
Posts: 18

View user's profile Send private message

where's the bug in this code?
PostPosted: Fri May 21, 2004 9:23 am     Reply with quote

sorry, i've a great problem with my code, it simulate successfully with ISIS simulator but when i wrote it to the PIC never seems to be right.
so if sone find the problem plz tell me
Code:

#include <16F876.h>
/* Set configuration bits in the PIC processor */
#fuses XT, NOPROTECT, NOPUT, NOWDT, NOBROWNOUT, NOLVP, NOCPD, NOWRT
//crystal, no watchdog timer, no low programming, no powerup timer, noprotect=memory protection off
#device adc=10
#device *=16
#use delay (clock=4000000)      /* sets appropriate compiler constants 1µsecond instruction cycle */
#use standard_io ( a )
#use standard_io ( b )
#use standard_io ( c )
#define led1 PIN_A1   //led jaune commutateur '0'
#define led2 PIN_A2   //led verte commutateur '0'
#define led3 PIN_A3   //led rouge commutateur '0'
#define Vppfluct 1003   //seuil autorisé de fluctuation de la tension
#define Vppmin   973    //seuil pour lequel la tension est passée du niveau haut à un niveau plus bas*****
#define Vctq   921     //seuil de chute de la tension
#define tension_maxi_touche_0    34
#define tension_mini_touche_0    0
#byte INTCON = 0x0b //registre des interruptions
#byte PIE1 = 0x8c   //registre contenant les autorisations d'interruptions
#byte PIR1 = 0x0c
#byte ADCON0 = 0x1f  //registre du convertisseur
#byte ADCON1 = 0x9f  //rôle des pins+justification du resultat de la conversion
#bit GO_DONE = ADCON0.2
#bit ADON = ADCON0.0
#bit ADIE = PIE1.6
#bit ADIF = PIR1.6
#define TMR1IE = PIE1.0
#define TMR1IF = PIR1.0


int16 ADCvaleur;
int32 ADCvtot;
int32 Counter1;
int32 Counter2;
int8 counter4;
int32 counter3 =499;
int32 cnt;

#int_TIMER2
TIMER2_isr()
{
Counter1++;
Counter2--;
}

void InitialiseADC ()
{
setup_port_a( RA0_ANALOG );
setup_adc( ADC_CLOCK_DIV_8 );
set_adc_channel( 0 );
delay_us(10);
}

void main(void)
    {
    long ADCvaleur;
    int32 ADCvtot;


      OUTPUT_B(0x00);// clear all pins on port b
      ADCON0=0x81; // fosc/32, RA0, a/d off, a/d operating
      ADCON1=0x8E; // an0 is a/d input, rest port a digital, internal ref, right justified
      INTCON=0xc0; // enable global interrupts and peripherals

      InitialiseADC();
      if (ADIF=1)
      ADIF = 0;
      ADCvaleur = 0;
      ADCvtot = 0;
      Counter1 == 0;

            setup_timer_2(T2_DIV_BY_4,5,5);
            enable_interrupts(INT_TIMER2);
            enable_interrupts(GLOBAL);
            ADCvaleur=read_ADC();
            while (Counter1<19999)
               {
                        ADCvaleur=read_ADC();
                        if (ADCvaleur>Vppfluct)
                        {
                        output_high (led1);
                        }
                        else
                           if (ADCvaleur=Vppfluct)
                           {
                             output_low(led1);
                             disable_interrupts (INT_TIMER2);
                             delay_ms(10);
                             ADCvaleur=read_ADC();
                               if ((ADCvaleur<=tension_maxi_touche_0) && (ADCvaleur>=tension_mini_touche_0))
                                 {
                                 counter1==0;
                                 setup_timer_2(T2_DIV_BY_4,5,5);
                                 enable_interrupts(INT_TIMER2);
                                 enable_interrupts(GLOBAL);
                                 ADCvaleur=read_ADC();
                                 while ((counter1<=counter3) && (ADCvaleur<=tension_maxi_touche_0) && (ADCvaleur>=tension_mini_touche_0))/* increment count */
                                 {
                                 ADCvaleur = Read_ADC();           /* read the ADC */
                                 ADCvtot = ADCvtot + ADCvaleur;           /* add it to total, for later averaging */
                                 }
                                 disable_interrupts (INT_TIMER2);    /* don't allow interrupts */
                                 ADCvtot /= (long)500;    /* division par 500 échantillons pour calculer la moyenne des tensions relevée */
                                 if ((ADCvtot<=tension_maxi_touche_0) && (ADCvtot>=tension_mini_touche_0))
                                 {
                                 continue;
                                 }
                                 else
                                 {
                                 output_high(led3);
                                 }
                                 counter1==0;
                                 setup_timer_2(T2_DIV_BY_4,10,5);
                                 enable_interrupts(INT_TIMER2);
                                 enable_interrupts(GLOBAL);
                                 ADCvaleur=read_ADC();
                                    if ((ADCvaleur >= ADCvtot+ADCvtot*0.1))
                                    {
                                    disable_interrupts(INT_timer2);
                                    delay_ms(20);
                                    counter2==200;
                                    setup_timer_2(T2_DIV_BY_4,15,5);
                                    enable_interrupts(INT_TIMER2);
                                    enable_interrupts(GLOBAL);
                                    ADCvaleur=read_ADC();
                                    if ((ADCvaleur>=Vppfluct) && (counter2>=0))
                                    {
                                    output_high(led2);
                                    disable_interrupts(INT_timer2);
                                    disable_interrupts(GLOBAL);
                                    }
                                    else
                                    output_high(led3);
                                 }
                                else
                                    output_high(led3);
                                 }
                               else
                              output_high(led3);
                            }
               }

               if ((counter1++==19999)&&(ADCvaleur>=Vppfluct))
               {
               disable_interrupts (INT_TIMER2);
               output_high(led3);
               output_low(led1);
               disable_interrupts(GLOBAL);
               }
          }

i know that is so longer but i can't delete parts cause it can be significant
thanks for your time
_________________
nfs


Last edited by nfs on Mon May 24, 2004 5:08 am; edited 1 time in total
rnielsen



Joined: 23 Sep 2003
Posts: 852
Location: Utah

View user's profile Send private message

PostPosted: Fri May 21, 2004 10:41 am     Reply with quote

Just looking at your code, quickly, I can see that you are making a common mistake in swapping '=' and '=='. It looks like you are trying to assign '0' (zero) to Counter1 in several parts of your code but you are using '==' (equality) instead. Try looking through your code and make sure you have the correct '=' or '==' in each statement.

Ronald
ckielstra



Joined: 18 Mar 2004
Posts: 3680
Location: The Netherlands

View user's profile Send private message

PostPosted: Fri May 21, 2004 12:40 pm     Reply with quote

Ronald is right, your major error is mixing '=' and '==' (at least 5 times).

Another bug:
Code:

if ((ADCvaleur>=Vppfluct) && (counter2>=0))


counter2 is an unsigned int32, so Counter2 is doing nothing.
I suggest to change it to:
Code:

if ((ADCvaleur>=Vppfluct) && (counter2>0))

and then also
Code:

int8 Counter2;

#int_TIMER2
TIMER2_isr()
{
  Counter1++;
  if (Counter2)
    Counter2--;
}

Carlo
guest
Guest







re
PostPosted: Tue May 25, 2004 10:25 am     Reply with quote

i have the same idea than those who posted. you can verify if you have a infinished boucle.
bye
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group