View previous topic :: View next topic |
Author |
Message |
Guest
|
Timer1 external clock problem |
Posted: Mon Jan 11, 2010 2:26 pm |
|
|
I couldn't use timer1 external clock. I want to use 32.768Khz crystal for my counter. I have read a sample code for this operation:
Code: |
#include <16F877.h>
#FUSES NOWDT //No Watch Dog Timer
#FUSES XT //High speed Osc (> 4mhz)
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#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 NODEBUG //No Debug mode for ICD
#use delay(clock=4000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
int a;
void main()
{
setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1|T1_CLK_OUT); //32768Hz external Timer1 oscillator
while(1)
{
set_timer1(0);
delay_ms(1000);
a=get_timer1();
printf("%d",a);
delay_ms(1000);
}
} |
|
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Mon Jan 11, 2010 2:52 pm |
|
|
Quote: | int a;
a=get_timer1();
printf("%d",a); |
Timer1 is 16 bits wide. You should declare 'a' as 'int16'.
To display a 16-bit unsigned value, you should use "%lu" in the
printf statement. Also, you should add "\n\r", so it goes to a newline
after displaying the timer value.
Example program:
http://www.ccsinfo.com/forum/viewtopic.php?t=29957&start=4
If that doesn't help, then post a description of the crystal circuit
that is connected to the Timer1 oscillator pins. These are different
pins than the normal main oscillator pins.
Also post your compiler version. |
|
|
theasus
Joined: 31 May 2009 Posts: 79
|
|
Posted: Tue Jan 12, 2010 8:57 am |
|
|
I have changed my code but i couldn't succeed and my schematic is;
My code is;
Code: | #include <16F877.h>
#FUSES NOWDT //No Watch Dog Timer
#FUSES XT //High speed Osc (> 4mhz)
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#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 NODEBUG //No Debug mode for ICD
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
unsigned int16 a;
void main()
{
setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1|T1_CLK_OUT); //32768Hz external Timer1 oscillator
while(1)
{
set_timer1(0);
delay_ms(500);
a=get_timer1();
printf("%lu",a);
delay_ms(2000);
}
}
|
I think the problem can be related with my simulation program,Proteus.Or is there any different reason? |
|
|
mkuang
Joined: 14 Dec 2007 Posts: 257
|
|
Posted: Tue Jan 12, 2010 9:09 am |
|
|
Instead of this:
Code: |
setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1|T1_CLK_OUT);
|
Try this:
Code: |
setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1| 0x8);
|
This manually enables bit 7 (T1OSCEN) of the T1CON register instead of using the T1_CLK_OUT (which I am not sure whether it actually enables the oscillator). |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Tue Jan 12, 2010 12:01 pm |
|
|
Quote: | I have changed my code but I couldn't succeed. |
Post your compiler version. |
|
|
theasus
Joined: 31 May 2009 Posts: 79
|
|
Posted: Tue Jan 12, 2010 1:05 pm |
|
|
My compiler verison is 4.068. |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Tue Jan 12, 2010 1:15 pm |
|
|
I installed vs. 4.068 and compiled the program shown in your post
with the schematic. I programmed it into a 16F877 on my PicDem2-Plus
board. It works. I did add a "\n\r" in the printf statement, so it would
go to a new line after each value is displayed in the TeraTerm window
on my PC.
Here's the output. It's correct. You have a delay of 500 ms after you
clear the timer. During that time, it will count up to about 16384.
Then you read the timer every 2 seconds. During that time, it will do
65536 counts, which puts it right back at about 16384 again. That's
what we see below, so it's working.
Code: |
16385
16384
16384
16385
16384
16384
16385
16384
16385
16385
|
|
|
|
theasus
Joined: 31 May 2009 Posts: 79
|
|
Posted: Tue Jan 12, 2010 1:51 pm |
|
|
Ok thanks for your help I will try this code in real hardware.
Thanks for considering... |
|
|
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Tue Jan 12, 2010 5:03 pm |
|
|
Just a thought.... Is this your first program in Proteus?
What I remember from playing with Proteus is that it doesn't look at the connected crystal, this part of the PIC processor is not simulated. What you have to do is right-click on the PIC processor and enter the desired clock frequency in one of the property fields. |
|
|
theasus
Joined: 31 May 2009 Posts: 79
|
|
Posted: Wed Jan 13, 2010 12:45 am |
|
|
By clicking right on the PIC processor you can change only the processor clock frequency. You can't change the external clock which is connected to RC0- RC1 oscillator frequency. I have already connected 4Mhz crystal to OSC1-OSC2 pins and this determines the processor clock frequency. The main problem in Proteus adding second external oscillator for Timer1. |
|
|
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Wed Jan 13, 2010 2:07 pm |
|
|
I just checked, for the main oscillator you have to configure the clock using the properties dialog (press ctrl-E when mouse is over the processor), at least in my ISIS version 6.9.
I'm no Proteus expert, so I don't know about the second oscillator support. |
|
|
princez
Joined: 01 Aug 2011 Posts: 3
|
external oscillator problem |
Posted: Mon Aug 01, 2011 1:31 pm |
|
|
hay, I am having an external oscillator problem on Proteus. I am using Isis version 7, but I am unable to simulate my code on Proteus with an external oscillator. The hex file I generated was on CCS.
Here's my code,
Code: |
#include<18f4550.h>
#fuses HS,NOWDT
#use delay (oscillator=20M)
#use rs232 (baud=9600,parity=N,xmit=pin_c6,rcv=pin_c7,stream=com1,bits=8)
void main(void)
{
int i;
while(true)
{
fprintf(com1,"hello");
putc(13);
i=getenv("CLOCK");
fprintf(com1,"%d",i);
delay_ms(1000);
}
} |
Can anyone please tell me if I have written a right code ?? Or there's anything missing in it. Also on actual hardware, is there any way to determine what's the baud rate of my controller or its clock speed? |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9229 Location: Greensville,Ontario
|
|
Posted: Mon Aug 01, 2011 2:31 pm |
|
|
Last question first..you should be able to read the SFR associated with baud rate and figure out the 'speed'.....
First question last... Get RID of Proteus ! As you've just found out it's full of bugs, quirks and bad DRCs....in no way will it ever 'simulate' the real world ! |
|
|
princez
Joined: 01 Aug 2011 Posts: 3
|
|
Posted: Wed Aug 03, 2011 9:30 am |
|
|
temtronic wrote: | ..you should be able to read the SFR associated with baud rate and figure out the 'speed'.....
|
how to do this ?? will it tell the circuit baud rate ? |
|
|
asmboy
Joined: 20 Nov 2007 Posts: 2128 Location: albany ny
|
|
Posted: Fri Aug 05, 2011 9:53 am |
|
|
the best thing you can do is try with real circuits not this shaky simulator.
LOSE proteus - it is a great way to waste time |
|
|
|