View previous topic :: View next topic |
Author |
Message |
anthory
Joined: 24 Jun 2013 Posts: 6
|
Delay_ms not stopping my code |
Posted: Wed Oct 23, 2013 10:18 am |
|
|
Hello,
First off sorry for not posting my version of compiler but I can't seem to find where it tell me what version I have. Where is it located at?
I'm programming a pic18f46k80, I also don't have internet on the computer I am programming on so I going to type it out. If I take out the delay I can see it change on my oscope but once I put one in it never makes it to the second set_pwm.
main.h
Code: |
#include <18F46K80.h>
#FUSES NOWDT
#FUSES WDT128
#FUSES NOXINST
#FUSES WDT_NOSLEEP
#use delay(clock=16000000)
|
main.c
Code: |
#include<main.h>
void main()
{
setup_ccp5(CCP_PWM);
setup_timer_2(T2_DIV_BY_16, 255,1);
long duty;
while(1)
{
duty=100;
set_pwm5_duty(duty);
delay_ms(1000);
duty=200;
set_pwm5_duty(duty);
delay_ms(1000);
} |
|
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Wed Oct 23, 2013 11:31 am |
|
|
Quote: | I can't seem to find where it tell me what version I have. Where is it located at? |
Look at the top of the .LST file for your project. It will be in the project
directory after a successful compilation. Example of version numbers:
http://www.ccsinfo.com/devices.php?page=versioninfo
Quote: |
#include <18F46K80.h>
#FUSES NOWDT
#FUSES WDT128
#FUSES NOXINST
#FUSES WDT_NOSLEEP
#use delay(clock=16000000)
I also don't have internet on the computer I am programming on so I going to type it out.
|
You're missing the oscillator fuse. |
|
|
anthory
Joined: 24 Jun 2013 Posts: 6
|
|
Posted: Wed Oct 23, 2013 11:59 am |
|
|
I added in the #FUSES LP and tried #FUSES HS neither it didnt work. It is still getting hung up on the delay_ms statements.
Also the link you posted brings me to what the software versions fixed not how to find out what version I have. |
|
|
gpsmikey
Joined: 16 Nov 2010 Posts: 588 Location: Kirkland, WA
|
|
Posted: Wed Oct 23, 2013 12:11 pm |
|
|
The link he posted was an EXAMPLE of version numbers (what to look for). As he indicated, at the top of the list file it will list the compiler version number.
mikey _________________ mikey
-- you can't have too many gadgets or too much disk space !
old engineering saying: 1+1 = 3 for sufficiently large values of 1 or small values of 3 |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Wed Oct 23, 2013 12:25 pm |
|
|
Post the manufacturer and name of your PIC development board. Post a
link to it.
If you built the board yourself, describe the crystal or external oscillator
circuit (if any), that is connected to the 18F46K80's oscillator pins. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19504
|
|
Posted: Thu Oct 24, 2013 1:03 am |
|
|
Let's take things very slowly:
1) As PCM programmer has explained, the compiler version number is in the very first line of the .lst file generated when you compile. Find it, and post it. There are several numbers in this line, so he has also posted a link showing you what the version number looks like.
2) We need to know something about your hardware. What oscillator have you got attached to the chip?. LP won't work except with a low power (perhaps 100KHz or slower crystal) attached, while HS won't work without a crystal between perhaps 5MHz, and 25MHz attached. What have you got?. Key thing in programming and electronics design in general is _precision_. The clock statement says you are meant to be using a 16MHz oscillator, and won't work right, till you _are_ using such an oscillator.
3) How fast is the PWM you see without the delay?. |
|
|
anthory
Joined: 24 Jun 2013 Posts: 6
|
|
Posted: Thu Oct 24, 2013 7:57 am |
|
|
Let's take things very slowly:
1) As PCM programmer has explained, the compiler version number is in the very first line of the .lst file generated when you compile. Find it, and post it. There are several numbers in this line, so he has also posted a link showing you what the version number looks like.
2) We need to know something about your hardware. What oscillator have you got attached to the chip?. LP won't work except with a low power (perhaps 100KHz or slower crystal) attached, while HS won't work without a crystal between perhaps 5MHz, and 25MHz attached. What have you got?. Key thing in programming and electronics design in general is _precision_. The clock statement says you are meant to be using a 16MHz oscillator, and won't work right, till you _are_ using such an oscillator.
3) How fast is the PWM you see without the delay?.
1) Sorry about that. I am quite new to programming. verision 4.135
2) The pic data sheet states it has three Internal Oscillators: LF-INTOSC (31 KHz),
MF-INTOSC (500 kHz) and HF-INTOSC (16 MHz).
http://ww1.microchip.com/downloads/en/DeviceDoc/39977f.pdf
3) #use delay(clock=16Mhz)
PWM=1.9kHz
#FUSES LP
PWM= 95-105Hz |
|
|
oxo
Joined: 13 Nov 2012 Posts: 219 Location: France
|
|
Posted: Thu Oct 24, 2013 8:17 am |
|
|
#fuses LP is not an alternative to #use delay(clock= 16M)
You have to specify both the type of oscillator as TTelmah has shown, and also the frequency with #use delay. |
|
|
anthory
Joined: 24 Jun 2013 Posts: 6
|
reply |
Posted: Thu Oct 24, 2013 8:55 am |
|
|
#fuses LP is not an alternative to #use delay(clock= 16M)
You have to specify both the type of oscillator as TTelmah has shown, and also the frequency with #use delay.
So if i specify #fuses LP i need to specify my clock to be #use (delay=31000) correct?
What do I use if I want the clock to be 16M? I dont see and #FUSES for it on this website http://www.ccsinfo.com/forum/viewtopic.php?t=31698 |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19504
|
|
Posted: Thu Oct 24, 2013 9:33 am |
|
|
Get your brain round a simple thing. Your _hardware_ has to match what you want to run.
If you want to run a crystal at 16MHz, you need to start with the crystal. Then HS, and clock=16MHz. LP, is saying to use a low power crystal, so again the crystal (typically a 32768Hz watch one), and clock=32768.
With your reference to 31KHz, I suspect you actually want to use the internal oscillator. In which case you need:
Code: |
#FUSES INTRC_LP
#use delay(CLOCK=31000)
//For 31KHz
//or.....
#FUSES INTRC_HP
#use delay(CLOCK=16MHz)
//for 16MHz
|
You always need to start with the data sheet. Work out what oscillator you want, and what the configuration has to be for that oscillator (both hardware and software). Then refer to the list 'fuses.txt' in the compiler directory to work out what CCS fuse name corresponds to the fuses you need. |
|
|
gpsmikey
Joined: 16 Nov 2010 Posts: 588 Location: Kirkland, WA
|
|
Posted: Thu Oct 24, 2013 2:17 pm |
|
|
One of the simplest (and best) pieces of test equipment is the simple LED on the board. put a routine to flash it at a 1 hz rate. If it isn't flashing at 1 HZ, then you don't have the oscillator configured correctly and everything else is going to be screwed up that uses timing. If you don't have an LED on the board, just a spare pin configured to change state at 1hz is good too. Without the clock right, you are just wasting your time on the rest of the stuff.
mikey _________________ mikey
-- you can't have too many gadgets or too much disk space !
old engineering saying: 1+1 = 3 for sufficiently large values of 1 or small values of 3 |
|
|
anthory
Joined: 24 Jun 2013 Posts: 6
|
reply |
Posted: Thu Oct 24, 2013 2:46 pm |
|
|
Quote: | Get your brain round a simple thing. Your _hardware_ has to match what you want to run.
If you want to run a crystal at 16MHz, you need to start with the crystal. Then HS, and clock=16MHz. LP, is saying to use a low power crystal, so again the crystal (typically a 32768Hz watch one), and clock=32768.
With your reference to 31KHz, I suspect you actually want to use the internal oscillator. In which case you need:
Code:
#FUSES INTRC_LP
#use delay(CLOCK=31000)
//For 31KHz
//or.....
#FUSES INTRC_HP
#use delay(CLOCK=16MHz)
//for 16MHz
You always need to start with the data sheet. Work out what oscillator you want, and what the configuration has to be for that oscillator (both hardware and software). Then refer to the list 'fuses.txt' in the compiler directory to work out what CCS fuse name corresponds to the fuses you need. |
Ok thanks. I didnt realize I needed the INTRC in front of the HP or LP.
So I have tried them both out and both will work. Now my problems how to calculate the delays with each.
Also does the frequency of the pulse need to be synced up with the 110V 60hz light I'm trying to control?
Quote: | One of the simplest (and best) pieces of test equipment is the simple LED on the board. put a routine to flash it at a 1 hz rate. If it isn't flashing at 1 HZ, then you don't have the oscillator configured correctly and everything else is going to be screwed up that uses timing. If you don't have an LED on the board, just a spare pin configured to change state at 1hz is good too. Without the clock right, you are just wasting your time on the rest of the stuff. |
I will try this as well. Thanks!
Also Im having trouble submiting my reply's....I have to hit submit a bunch of times before it will actually submit. |
|
|
gpsmikey
Joined: 16 Nov 2010 Posts: 588 Location: Kirkland, WA
|
|
Posted: Thu Oct 24, 2013 3:58 pm |
|
|
This is the first mention of trying to control a light - if you are trying to do phase control of the light (dimmer) then you need to work the problem of using a zero crossing detector to sync up. If you are simply flashing a light or something like that, that is different. Phase control is a different critter and needs to by sync'd to the AC line frequency unless you want really strange effects (although Halloween is coming up shortly ... )
If you are trying to implement a dimmer, do a search here or globally for "phase control" or "dimmer" for more info.
mikey _________________ mikey
-- you can't have too many gadgets or too much disk space !
old engineering saying: 1+1 = 3 for sufficiently large values of 1 or small values of 3 |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19504
|
|
Posted: Fri Oct 25, 2013 1:29 am |
|
|
Also, you are not going to get very far with a CPU clock of 31000Hz, for anything involving phase control.
31000Hz = 7750 instruction/second.
Remember these are machine instruction, not C instructions. A simple C line line a=b*c, using int16, will take 236 machine instructions. 3 hundredths of a second. If trying to work with mains at 50 Hz, then you get a zero crossing every hundredth of a second, while at 60Hz, every 120th second. So just this one multiplication would take over three half cycles of the mains.....
The low speed clock, is designed for ultra low power operation, for things where being 'slow' doesn't matter. Not for anything that needs to work quickly.
Best Wishes |
|
|
anthory
Joined: 24 Jun 2013 Posts: 6
|
reply |
Posted: Fri Oct 25, 2013 9:35 am |
|
|
Quote: | Posted: Thu Oct 24, 2013 3:58 pm Post subject:
--------------------------------------------------------------------------------
This is the first mention of trying to control a light - if you are trying to do phase control of the light (dimmer) then you need to work the problem of using a zero crossing detector to sync up. If you are simply flashing a light or something like that, that is different. Phase control is a different critter and needs to by sync'd to the AC line frequency unless you want really strange effects (although Halloween is coming up shortly ... )
If you are trying to implement a dimmer, do a search here or globally for "phase control" or "dimmer" for more info.
mikey
|
I know this is the first I have mentioned lighting control but was just trying to get a simple delay working first. I will do more research on phase control or dimmer.
Quote: | Posted: Fri Oct 25, 2013 1:29 am Post subject:
--------------------------------------------------------------------------------
Also, you are not going to get very far with a CPU clock of 31000Hz, for anything involving phase control.
31000Hz = 7750 instruction/second.
Remember these are machine instruction, not C instructions. A simple C line line a=b*c, using int16, will take 236 machine instructions. 3 hundredths of a second. If trying to work with mains at 50 Hz, then you get a zero crossing every hundredth of a second, while at 60Hz, every 120th second. So just this one multiplication would take over three half cycles of the mains.....
The low speed clock, is designed for ultra low power operation, for things where being 'slow' doesn't matter. Not for anything that needs to work quickly.
Best Wishes
|
I plan on using the fastest clock speed of 16Mhz. Thanks for the info. |
|
|
|