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

Silly question blinking a led (delay_ms)
Goto page 1, 2  Next
 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
Surfer83



Joined: 25 Nov 2011
Posts: 7

View user's profile Send private message Send e-mail

Silly question blinking a led (delay_ms)
PostPosted: Fri Nov 25, 2011 4:19 am     Reply with quote

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. Embarassed

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. Smile

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: 19513

View user's profile Send private message

PostPosted: Fri Nov 25, 2011 4:34 am     Reply with quote

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

View user's profile Send private message Send e-mail

PostPosted: Fri Nov 25, 2011 6:18 am     Reply with quote

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.Smile
asmboy



Joined: 20 Nov 2007
Posts: 2128
Location: albany ny

View user's profile Send private message AIM Address

PostPosted: Fri Nov 25, 2011 11:42 am     Reply with quote

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

View user's profile Send private message Send e-mail

PostPosted: Wed Nov 30, 2011 7:59 am     Reply with quote

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

View user's profile Send private message Send e-mail

PostPosted: Wed Nov 30, 2011 8:14 am     Reply with quote

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. Embarassed

Anyway thanks in advance to the people who give the time to help and currently helping me.

Appreciate it very much. Smile
Ttelmah



Joined: 11 Mar 2010
Posts: 19513

View user's profile Send private message

PostPosted: Wed Nov 30, 2011 10:43 am     Reply with quote

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

View user's profile Send private message AIM Address

PostPosted: Wed Nov 30, 2011 8:13 pm     Reply with quote

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 Very Happy
PICman



Joined: 02 Nov 2007
Posts: 26

View user's profile Send private message

PostPosted: Wed Nov 30, 2011 8:58 pm     Reply with quote

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

View user's profile Send private message AIM Address

PostPosted: Wed Nov 30, 2011 9:34 pm     Reply with quote

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.

Very Happy
ckielstra



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

View user's profile Send private message

PostPosted: Thu Dec 01, 2011 10:10 am     Reply with quote

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: 262

View user's profile Send private message AIM Address

Me too with a 16F722
PostPosted: Sat Dec 03, 2011 8:23 pm     Reply with quote

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: 262

View user's profile Send private message AIM Address

PostPosted: Sun Dec 04, 2011 9:55 am     Reply with quote

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: 262

View user's profile Send private message AIM Address

delay_ms is not working
PostPosted: Sun Dec 04, 2011 11:22 am     Reply with quote

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

View user's profile Send private message

PostPosted: Sun Dec 04, 2011 2:34 pm     Reply with quote

There were problems noted with delay_us() with compiler versions near
4.114. See this thread:
http://www.ccsinfo.com/forum/viewtopic.php?t=43333
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Goto page 1, 2  Next
Page 1 of 2

 
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