| View previous topic :: View next topic | 
	
	
		| Author | Message | 
	
		| rami_shama 
 
 
 Joined: 29 Apr 2010
 Posts: 11
 
 
 
			    
 
 | 
			
				| My program didn't work |  
				|  Posted: Thu Apr 29, 2010 12:58 am |   |  
				| 
 |  
				| 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
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Thu Apr 29, 2010 2:05 am |   |  
				| 
 |  
				| 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
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Thu Apr 29, 2010 3:24 pm |   |  
				| 
 |  
				| 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
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Sat May 01, 2010 3:37 am |   |  
				| 
 |  
				| 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
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Sat May 01, 2010 3:49 am |   |  
				| 
 |  
				|  |  | 
	
		|  | 
	
		| dyeatman 
 
 
 Joined: 06 Sep 2003
 Posts: 1968
 Location: Norman, OK
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Sat May 01, 2010 6:17 am |   |  
				| 
 |  
				| Compare: 
 
 
 
 
  	  | 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
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Sat May 01, 2010 2:44 pm |   |  
				| 
 |  
				|  	  | dyeatman wrote: |  	  | Compare: 
 
 
 
 
  	  | Quote: |  	  | for(i=0; i<(input_a & 0x07) | 
 
 What's missing?
 | 
 
 ohhh!!!
 It is bad!!
 Thank you very much
   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
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Sun May 02, 2010 2:01 pm |   |  
				| 
 |  
				| it is still didn't work! |  | 
	
		|  | 
	
		| ckielstra 
 
 
 Joined: 18 Mar 2004
 Posts: 3680
 Location: The Netherlands
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Sun May 02, 2010 4:26 pm |   |  
				| 
 |  
				| Compare: 
  	  | Code: |  	  | sen= input_a() & 0x07; | 
 and
 Why the difference? 	  | Code: |  	  | while ((sen != (input_a() & 0x7F)) | 
 And this most likely is the cause of the test never being TRUE.
 
 
 A (small) error in the CCS wizard generates an invalid configuration:
 should be: 	  | Code: |  	  | setup_spi(SPI_SS_DISABLED); | 
 |  | 
	
		|  | 
	
		| rami_shama 
 
 
 Joined: 29 Apr 2010
 Posts: 11
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Tue May 04, 2010 7:45 am |   |  
				| 
 |  
				| 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();
 
 }
 
 | 
 |  | 
	
		|  | 
	
		|  |