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 CCS Technical Support

My program didn't work

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



Joined: 29 Apr 2010
Posts: 11

View user's profile Send private message

My program didn't work
PostPosted: Thu Apr 29, 2010 12:58 am     Reply with quote

Hello,

This is my program and it is not working. The main idea for my program is that:
When any input of A0,A1,A2 changes, the PIC 16F877A must make pulses at the outputs B0,B1,B2 if the input B3=0.

The pulses is like this: On (300ms) Off (300ms) as appear in the program
Code:

#include "D:\cc\d\main.h"

int check_change();
void menu();
void end();
void cursor();
int which_MSG();

int8 sen1,sen2,sen3,i;

void main()
{
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_wdt(WDT_18MS);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);

output_low(PIN_B0);
output_low(PIN_B1);
output_low(PIN_B2);

sen1=input(PIN_A0);
sen2=input(PIN_A1);
sen3=input(PIN_A2);

start:
if (check_change()==1) //&& input(PIN_B3)==0 )
goto messaging;
else
goto start;

messaging:
sen1=input(PIN_A0);
sen2=input(PIN_A1);
sen3=input(PIN_A2);

end();
menu();
menu();
menu();
cursor();
cursor();
cursor();
cursor();
menu();

for(i=0; i<which_MSG(); i++)
    cursor();

menu();
menu();
cursor();

menu();
menu();
cursor();

menu();
menu();
end();

goto start;
}

int check_change()
{
if( (sen1==input(PIN_A0)) && (sen2==input(PIN_A1)) && (sen3==input(PIN_A2)) )
  return 0;
else
  return 1;
}

void menu()
{
output_high(PIN_B0);
delay_ms(900);
output_low(PIN_B0);
delay_ms(900);
}

void end()
{
output_high(PIN_B1);
delay_ms(900);
output_low(PIN_B1);
delay_ms(900);
}

void cursor()
{
output_high(PIN_B2);
delay_ms(900);
output_low(PIN_B2);
delay_ms(900);
}

int which_MSG()
{
int8 s1,s2,s3;

s1=input(PIN_A0);
s2=input(PIN_A1);
s3=input(PIN_A2);

if(s1==0 && s2==0 && s3==0)
return 0;
else if(s1==0 && s2==0 && s3==1)
return 1;
else if(s1==0 && s2==1 && s3==0)
return 2;
else if(s1==0 && s2==1 && s3==1)
return 3;
else if(s1==1 && s2==0 && s3==0)
return 4;
else if(s1==1 && s2==0 && s3==1)
return 5;
else if(s1==1 && s2==1 && s3==0)
return 6;
else if(s1==1 && s2==1 && s3==1)
return 7;

}

what is the wrong???
Wayne_



Joined: 10 Oct 2007
Posts: 681

View user's profile Send private message

PostPosted: Thu Apr 29, 2010 2:05 am     Reply with quote

OK, several issues:-

1. You don't show main.h which I presume has all your fuse settings in it.

2. You don't say what it does do.

3. Try a simple led on off routine to see if it works.

4. You use to program in assembler didn't you. There is no need for those goto's in your code.
Code:

start:
if (check_change()==1) //&& input(PIN_B3)==0 )
goto messaging;
else
goto start;

messaging:
sen1=input(PIN_A0);
sen2=input(PIN_A1);
sen3=input(PIN_A2);

I prefer
Code:

while (true)
{
  while (!check_change())
  {
  }
 
  sen1=input(PIN_A0);
  sen2=input(PIN_A1);
  sen3=input(PIN_A2);
  ...
}


5. Because you are using A0, A1 and A2 I would code it differently:0
Code:

sen = input_a() & 0x07;  // Gets A0, A1 and A2

// in check_change
return(sen != (input_a() & 0x7F)); // returns true if changed or false


6.Do you realy need to re-check the input in your for loop or should you be working on the last read value ?

7. Again because you are using A0, A1 and A2
Code:

int which_MSG()
{
  return(input_a & 0x07);// will return 0, 1, 2, 3, 4, 5, 6 or 7
}


That is about it for now, I expect your pic is not actually running because I would expect the code to actually work, unless it is a hardware issue, No pullups on the pins A0, A1 or A2 ?
rami_shama



Joined: 29 Apr 2010
Posts: 11

View user's profile Send private message

PostPosted: Thu Apr 29, 2010 3:24 pm     Reply with quote

Hello,
I will try to use your suggestions, and I will tell you about the results.
about main.h
Code:
#include <16F877A.h>
#device adc=8

#FUSES WDT                      //Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected

#use delay(clock=4000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

rami_shama



Joined: 29 Apr 2010
Posts: 11

View user's profile Send private message

PostPosted: Sat May 01, 2010 3:37 am     Reply with quote

Hello,
I'm edit my program and now it is :


Code:
#include "main.h"

int sen,i;
void menu();
void cursor();
void end();
void main()
{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_CLOCK_DIV_2);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);

output_low(PIN_B0);
output_low(PIN_B1);
output_low(PIN_B2);

sen= input_a() & 0x07;


while (true)
{
  while ((sen != (input_a() & 0x7F)) && input(PIN_B3)==0 )
  {
 
 
sen= input_a() & 0x07;

end();
menu();
menu();
menu();
cursor();
cursor();
cursor();
cursor();
menu();

for(i=0; i<(input_a() & 0x07); i++)
    cursor();

menu();
menu();
cursor();
menu();
menu();
cursor();
menu();
menu();
end();

}
}


}



void menu()
{
output_high(PIN_B0);
delay_ms(900);
output_low(PIN_B0);
delay_ms(900);
}

void end()
{
output_high(PIN_B1);
delay_ms(900);
output_low(PIN_B1);
delay_ms(900);
}

void cursor()
{
output_high(PIN_B2);
delay_ms(900);
output_low(PIN_B2);
delay_ms(900);
}


and here the main.h

Code:
#include <16F877A.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected
#FUSES RESERVED                 //Used to set the reserved FUSE bits

#use delay(clock=4000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)




Note: The Compiler is : PIC C Compiler V4.102


Last edited by rami_shama on Sat May 01, 2010 2:45 pm; edited 2 times in total
rami_shama



Joined: 29 Apr 2010
Posts: 11

View user's profile Send private message

PostPosted: Sat May 01, 2010 3:49 am     Reply with quote

dyeatman



Joined: 06 Sep 2003
Posts: 1933
Location: Norman, OK

View user's profile Send private message

PostPosted: Sat May 01, 2010 6:17 am     Reply with quote

Compare:

Quote:
input_a() & 0x07



Quote:
for(i=0; i<(input_a & 0x07)


What's missing?
_________________
Google and Forum Search are some of your best tools!!!!
rami_shama



Joined: 29 Apr 2010
Posts: 11

View user's profile Send private message

PostPosted: Sat May 01, 2010 2:44 pm     Reply with quote

dyeatman wrote:
Compare:

Quote:
input_a() & 0x07



Quote:
for(i=0; i<(input_a & 0x07)


What's missing?


ohhh!!!
It is bad!!
Thank you very much Smile
I will try to run it and I will tell you if it is ok at PIC.
rami_shama



Joined: 29 Apr 2010
Posts: 11

View user's profile Send private message

PostPosted: Sun May 02, 2010 2:01 pm     Reply with quote

it is still didn't work!
ckielstra



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

View user's profile Send private message

PostPosted: Sun May 02, 2010 4:26 pm     Reply with quote

Compare:
Code:
sen= input_a() & 0x07;

and
Code:
while ((sen != (input_a() & 0x7F))
Why the difference?
And this most likely is the cause of the test never being TRUE.


A (small) error in the CCS wizard generates an invalid configuration:
Code:
setup_spi(SPI_SS_DISABLED);
should be:
Code:
setup_spi(FALSE);
rami_shama



Joined: 29 Apr 2010
Posts: 11

View user's profile Send private message

PostPosted: Tue May 04, 2010 7:45 am     Reply with quote

Look at this Code, it is work
Code:
#include "F:\cc\main.h"
int check_change();
void menu();
void end();
void cursor();
int which_MSG();
int sen1,sen2,sen3,i;
void standby();


void main()
{


   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_CLOCK_DIV_2);
   setup_psp(PSP_DISABLED);
   setup_spi(FALSE);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);

set_tris_a(0x11);
set_tris_b(0xE8);
output_high(PIN_B5);


if(input(PIN_A0))
 sen1=1;
else sen1=0;
if(input(PIN_A1))
 sen2=1;
else sen2=0;
if(input(PIN_A2))
 sen3=1;
else sen3=0;

while (true)
{
   standby();
   if (check_change()==1)
   { 
 
 
end();
end();
menu();
menu();
menu();
cursor();
cursor();
cursor();
cursor();
menu();
for(i=0; i<which_MSG(); i++)
 cursor();
menu();
menu();
cursor();
menu();
menu();
cursor();
menu();
menu();
end();
delay_ms(1500);
 if(input(PIN_A0)) sen1=1;
   else sen1=0;
   if(input(PIN_A1)) sen2=1;
   else sen2=0;
   if(input(PIN_A2)) sen3=1;
   else sen3=0;
end();
   }
}
}
int check_change()
 {
  if(sen1!=input(PIN_A0) || sen2!=input(PIN_A1) || sen3!=input(PIN_A2))
      return 1;

  else
      return 0;
 }

void menu()
 {
  output_high(PIN_B0);
  delay_ms(500);
  output_low(PIN_B0);
  delay_ms(500);
 }
void end()
 {
  output_high(PIN_B1);
  delay_ms(500);
  output_low(PIN_B1);
  delay_ms(500);
 }
void cursor()
 {
  output_high(PIN_B2);
  delay_ms(500);
  output_low(PIN_B2);
  delay_ms(500);
 }

int which_MSG()
 {
 
 
  if(sen1==0 && sen2==0 && sen3==0)
     return 0;
  else if(sen1==0 && sen2==0 && sen3==1)
     return 1;
   else if(sen1==0 && sen2==1 && sen3==0)
     return 2;
  else if(sen1==0 && sen2==1 && sen3==1)
     return 3;
  else if(sen1==1 && sen2==0 && sen3==0)
     return 4;
  else if(sen1==1 && sen2==0 && sen3==1)
     return 5;
  else if(sen1==1 && sen2==1 && sen3==0)
     return 6;
  else if(sen1==1 && sen2==1 && sen3==1)
     return 7;

 }
 
 void standby()
 {
 output_low(PIN_B5);
delay_ms(100);
output_high(PIN_B5);
delay_ms(100);
end();

 }
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