| View previous topic :: View next topic | 
	
	
		| Author | Message | 
	
		| Surfer83 
 
 
 Joined: 25 Nov 2011
 Posts: 7
 
 
 
			      
 
 | 
			
				| Silly question blinking a led (delay_ms) |  
				|  Posted: Fri Nov 25, 2011 4:19 am |   |  
				| 
 |  
				| I just started using C for programming by running some simple code. I have some experience using assembly but seems like everyone telling me I should go to C. SO here I'm stuck with the simplest code haha.   
 I'm trying to blink a LED on port A1. I had run a simple code to just turn on the LED and it was ok and this show that my hardware should be ok. Hope that someone could give me some help here.
   
 I did try Googling and searching the forum but can't find solution for my problem.
 
 
  	  | Code: |  	  | #include <16F628.h>
 #fuses INTRC_IO,NOWDT,NOPUT,NOPROTECT,NOCPD
 #use delay(internal=4000000)
 
 void main()
 {
 
 while(true)
 {
 output_high(PIN_A1);
 delay_ms(500);
 output_low(PIN_A1)
 delay_ms(500);
 
 }
 
 }
 
 | 
 |  | 
	
		|  | 
	
		| Ttelmah 
 
 
 Joined: 11 Mar 2010
 Posts: 19967
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Fri Nov 25, 2011 4:34 am |   |  
				| 
 |  
				| How is the LED wired?. One 'classic', is not having a current limiting resistor, so when the LED turns on, it hangs the chip. This wouldn't be obvious with code that just turned the LED 'on'.
 I'd add:
 
 setup_adc_ports(NO_ANALOGS);
 
 at the start of the main, and the fuse 'NOLVP'. Otherwise the chip may get hung thinking you want to program it!....
 
 What is actually happening?.
 
 Best Wishes
 |  | 
	
		|  | 
	
		| Surfer83 
 
 
 Joined: 25 Nov 2011
 Posts: 7
 
 
 
			      
 
 | 
			
				|  |  
				|  Posted: Fri Nov 25, 2011 6:18 am |   |  
				| 
 |  
				| I have 1K ohm current limiter, positive side of the LED connected from 1K ohm end and the negative side of the LED to the ground. I have 10k pull up to Vdd on the MCLR PIN. Supply is 5 volt from a 5volt regulator. Sorry cant bring a proper sch atm. 
 After I turn on the power the LED just won't turn on. As I said earlier I did try a simple code to just turn a LED on and it did work. I have a feeling there probably something wrong when I used the "delay_ms".
 
 Anyway I will try you suggestions latter thank you.
  |  | 
	
		|  | 
	
		| asmboy 
 
 
 Joined: 20 Nov 2007
 Posts: 2128
 Location: albany ny
 
 
			      
 
 | 
			
				|  |  
				|  Posted: Fri Nov 25, 2011 11:42 am |   |  
				| 
 |  
				| 1- have U tested led GOOD with measured Vf of 1.6V or more ? 
 
 2- is led POLARITY correct ??
 |  | 
	
		|  | 
	
		| Surfer83 
 
 
 Joined: 25 Nov 2011
 Posts: 7
 
 
 
			      
 
 | 
			
				|  |  
				|  Posted: Wed Nov 30, 2011 7:59 am |   |  
				| 
 |  
				|  	  | Code: |  	  | #include <16F628.h>
 #use delay(internal=4M)
 #fuses INTRC_IO, NOWDT, BROWNOUT, NOPUT, NOLVP, ,NOCPD
 
 
 void main()
 {
 
 while(1)
 {
 output_high(PIN_B5);
 delay_ms(10);
 output_low(PIN_B5);
 delay_ms(10);
 
 }
 
 }
 
 
 | 
 
 My new code which I lowered the timing and change pin to B5 which is purely a digital I/0 pin.
 
 
 
  	  | Quote: |  	  | 1- have U tested led GOOD with measured Vf of 1.6V or more ? 
 
 2- is led POLARITY correct ??
 | 
 
 Yeah LED good and my first attempt to just turn on a LED was fine and still using the same LED
 |  | 
	
		|  | 
	
		| Surfer83 
 
 
 Joined: 25 Nov 2011
 Posts: 7
 
 
 
			      
 
 | 
			
				|  |  
				|  Posted: Wed Nov 30, 2011 8:14 am |   |  
				| 
 |  
				| BTW I'm using a ICD2,version 4. CCS I'm using and a solderless protoboard. 
 Man this really sucks, just to blink this LED and I had a bad feeling there must be some silly thing that I missed.
   
 Anyway thanks in advance to the people who give the time to help and currently helping me.
 
 Appreciate it very much.
  |  | 
	
		|  | 
	
		| Ttelmah 
 
 
 Joined: 11 Mar 2010
 Posts: 19967
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Wed Nov 30, 2011 10:43 am |   |  
				| 
 |  
				| You talk about the ICD2. Does this mean you have the 18 to 28pin adapter AC162053?. If not, you are aware the ICD, is _not_ available on the 18pin device?. Hopefully you are just using the ICD2 as a programmer.
 You don't show the NOMCLR fuse. Do you have the MCLR pin pulled up?.
 
 Best Wishes
 |  | 
	
		|  | 
	
		| asmboy 
 
 
 Joined: 20 Nov 2007
 Posts: 2128
 Location: albany ny
 
 
			      
 
 | 
			
				|  |  
				|  Posted: Wed Nov 30, 2011 8:13 pm |   |  
				| 
 |  
				| you said : 
  	  | Quote: |  	  | just to blink this led
 
 | 
 
 why did you write so such code ? LOL
 
 try this:
 
  	  | Code: |  	  | void main(){ while(1)  { output_toggle(PIN_B5);   delay_ms(100);}}
 
 | 
 
 now THATS the easy way
  |  | 
	
		|  | 
	
		| PICman 
 
 
 Joined: 02 Nov 2007
 Posts: 26
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Wed Nov 30, 2011 8:58 pm |   |  
				| 
 |  
				| Doesn't the code need oscillator setup ? 
 setup_oscillator(OSC_4MHZ|OSC_INTRC|OSC_PLL_OFF,0);
 _________________
 The ideal electronic world: A place where the words VERSION and REVISION do NOT exist !
 |  | 
	
		|  | 
	
		| asmboy 
 
 
 Joined: 20 Nov 2007
 Posts: 2128
 Location: albany ny
 
 
			      
 
 | 
			
				|  |  
				|  Posted: Wed Nov 30, 2011 9:34 pm |   |  
				| 
 |  
				| Hard to improve on that code i fear. Code should be as simple and  transportable as possible , no?
 
 But specifying the master clock matters to simulation
 and the real world alike.
 
 I agree that a device definitions setup would be required beyond
 that omission in order for this  circuit to  make its way out of simulation.
 
 
  |  | 
	
		|  | 
	
		| ckielstra 
 
 
 Joined: 18 Mar 2004
 Posts: 3680
 Location: The Netherlands
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Thu Dec 01, 2011 10:10 am |   |  
				| 
 |  
				| What is your compiler version number? It looks something like 4.xxx, i.e. 3 digits after the dot. 
 NOMCLR fuse is used by default for this chip when you specify nothing, but best to specific about your choice and add it to the list of fuses.
 
 A delay of 10ms is way too short for debugging as your eye is to slow to see it. Even 100ms is tricky. Be safe and use something like 500ms.
 
 I tried it in the MPLab simulator with CCS v4.077 and got a delay as expected.
 |  | 
	
		|  | 
	
		| rovtech 
 
 
 Joined: 24 Sep 2006
 Posts: 288
 
 
 
			      
 
 | 
			
				| Me too with a 16F722 |  
				|  Posted: Sat Dec 03, 2011 8:23 pm |   |  
				| 
 |  
				| I have similar problems and resorted to the simplest code (not the most elegant, that just makes more problems). Note the delays in the comments as seen on a 'scope. 
  	  | Code: |  	  | #include <16F722.H>
 #fuses XT, NOWDT, PUT, NOPROTECT, MCLR
 #use delay (clock = 4000000)      // using 4 MHz XTAL
 
 void main(void)
 {
 set_tris_c (0x00);      //all outputs
 
 while (true)
 {
 output_low (pin_C4);      // low for about 190 uS
 delay_ms (1);
 output_high (pin_C4);      // high for about 200 uS
 delay_ms (10);
 }
 }
 
 | 
 My programming for the 16F722 was working OK, suddenly it has problems.
 Selecting #fuses INTRC and #use delay (clock = 8MHZ) gives an osc of 500 kHz and I had to resort to an XTAL and the above to get the correct freq. – 4 MHz on pin 10. Other options did not work.
 The timers seem to be haywire and the delay does not work. A second delay after line 17 of 20 ms just doubles the delay to about 380 us. This is not even close. Changing from 1 to 20 ms in the delays has no effect!
 MPLAB IDE v8.60 and CCS C v 4.114, Lenovo T61 running latest updates of XP pro.
 The only thing that has changed (I think) is a switch to ICD-3 from Picstart Plus, and XP updates.
 
 Relevant part of .lst is below. I can read most of it but do not understand the 20.4 etc after BCF, I guess it clears bit 4 of register 20? and call 004 is the delay routine? but is it correct?
 
  	  | Code: |  	  | ....................    while (true)
 ....................    {
 ....................    output_low (pin_C4);
 002D:  BCF    20.4
 002E:  MOVF   20,W
 002F:  BSF    03.5
 0030:  MOVWF  07
 0031:  BCF    03.5
 0032:  BCF    07.4
 ....................    delay_ms (1);
 0033:  MOVLW  01
 0034:  MOVWF  21
 0035:  CALL   004
 ....................    output_high (pin_C4);
 0036:  BCF    20.4
 0037:  MOVF   20,W
 0038:  BSF    03.5
 0039:  MOVWF  07
 003A:  BCF    03.5
 003B:  BSF    07.4
 ....................    delay_ms (10);
 003C:  MOVLW  0A
 003D:  MOVWF  21
 003E:  CALL   004
 ....................    }
 003F:  GOTO   02D
 | 
 |  | 
	
		|  | 
	
		| rovtech 
 
 
 Joined: 24 Sep 2006
 Posts: 288
 
 
 
			      
 
 | 
			
				|  |  
				|  Posted: Sun Dec 04, 2011 9:55 am |   |  
				| 
 |  
				| This works and gives a square wave of 20 milliseconds period: 
  	  | Code: |  	  | #include <16F722.H>
 #fuses XT, NOWDT, PUT, NOPROTECT, MCLR
 #use delay (clock = 4000000)   // using 4 MHz XTAL
 
 void main()
 {
 while(1)
 {
 output_toggle(PIN_C4);
 delay_ms(10);
 }
 }
 | 
 
 This does NOT work and gives a square wave of about 400 microseconds period. Note that it should NOT be a square wave.
 
  	  | Code: |  	  | #include <16F722.H>
 #fuses XT, NOWDT, PUT, NOPROTECT, MCLR
 #use delay (clock = 4000000)   // using 4 MHz XTAL
 
 void main()
 {
 while(1)
 {
 output_low (pin_C4);      // low for about 190 uS
 delay_ms (1);
 output_high (pin_C4);      // high for about 200 uS
 delay_ms (10);
 }
 }
 | 
 
 The only difference I can see is the use of upper case and a space before the brackets. I will experiment with these.
 |  | 
	
		|  | 
	
		| rovtech 
 
 
 Joined: 24 Sep 2006
 Posts: 288
 
 
 
			      
 
 | 
			
				| delay_ms is not working |  
				|  Posted: Sun Dec 04, 2011 11:22 am |   |  
				| 
 |  
				| I connected a freq counter to measure the time periods of the negative pulse and changed only the first delay in us or ms 10 us = 16 us out
 50 us = 56 us out
 100 us = 106 us out
 500 us = 506 us out
 1000 us = 192 us out
 1 ms = 192 us out and any value in ms from 1 to 100 gives 192 us out
 500 ms = 36.9 ms out
 So microsecond delays are close unless a value over 1000 (1ms) is used. Even then the constant 6 us error is suspicious. I think I have a version of CCS C (4.114) that has a bug in it and will have to upgrade.
 
 Typical code showing last change:
 
  	  | Code: |  	  | while(1)
 {
 output_low (PIN_C4);      // low for about 190 uS
 delay_ms(500);
 output_high (PIN_C4);      // high for about 200 uS
 delay_ms(1);
 }
 | 
 |  | 
	
		|  | 
	
		| PCM programmer 
 
 
 Joined: 06 Sep 2003
 Posts: 21708
 
 
 
			    
 
 |  | 
	
		|  | 
	
		|  |