View previous topic :: View next topic |
Author |
Message |
HTAluvBeBeo
Joined: 23 Feb 2008 Posts: 35
|
My project with 16F876A and ds1307. Really need help |
Posted: Fri Mar 14, 2008 10:28 am |
|
|
First of all, thank you so much for visiting my topic
I am very new with C language and programming.
I've just coded. but my works did not work.
I use six 7segment leds anode common controlled by 6 npn transistor which are connected to PortA. And PortB is to transfer data to 7seg leds
T
The original driver of ds1307 is from http://www.ccsinfo.com/forum/viewtopic.php?t=23255&highlight=ds1307
I was modified the driver to set 1Hz SQW output and connect swq/out to RB0 ext_interrupts to get date and time every second
But when complie, i was recieve this message
"interrupts disabled during call to prevent re-entrancy (@I2C_WRITE_1)"
interrupts disabled during call to prevent re-entrancy (@I2C_READ_1)"
interrupts disabled during call to prevent re-entrancy (bcd2bin)"
"Funtion not void and doe not return a value EXT_isr"
I am very happy to get your help
Thank you so much
Last edited by HTAluvBeBeo on Sun Mar 16, 2008 12:54 am; edited 1 time in total |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Fri Mar 14, 2008 11:03 am |
|
|
Quote: | #int_EXT
EXT_isr()
{
sec++;
if(sec==60) sec=0;
ds1307_get_time(hr,min,sec);
ds1307_get_date(day,mth,year,dow);
} |
Quote: | void main(){
enable_interrupts(INT_EXT);
ext_int_edge(L_TO_H);
enable_interrupts(GLOBAL);
while(1){
key=0;
ds1307_get_time(hr,min,sec);
ds1307_get_date(day,mth,year,dow);
keyscan();
}
} |
This is very bad program design. In your main loop, you are constantly
reading the date and time from the ds1307. Then you have an interrupt
which also does i2c operations on the same ds1307 chip. What if
an interrupt occurs while an i2c operation is in progress in the main loop ?
You can't do that. It won't work. My advice is to use the #int_ext to
set a global variable (a flag). Check the flag in the main loop and if
it's set, then read the date and time and then clear the flag. |
|
|
HTAluvBeBeo
Joined: 23 Feb 2008 Posts: 35
|
|
Posted: Fri Mar 14, 2008 6:58 pm |
|
|
thank you so much. I am very new with programming, i will fix my stupid program
is there any problem else:-?
Last edited by HTAluvBeBeo on Sun Mar 16, 2008 12:54 am; edited 1 time in total |
|
|
HTAluvBeBeo
Joined: 23 Feb 2008 Posts: 35
|
|
Posted: Sat Mar 15, 2008 1:36 am |
|
|
I've changed my hardware and used RC0 RC1 RC2 to catch the buttons instead of using together with 7seg leds
everything seems better
But instead of using only one more I/O to catch buttons, Now I have to use RC 0 RC1 RC2 to do that
I still want to use one I/O to catch upto 6 buttons
Thank you so much
Last edited by HTAluvBeBeo on Sun Mar 16, 2008 12:55 am; edited 1 time in total |
|
|
HTAluvBeBeo
Joined: 23 Feb 2008 Posts: 35
|
|
Posted: Sat Mar 15, 2008 9:26 am |
|
|
with the code above, my program runs untill 20:20:22
And there is some bugs when i set time to 22:22:22 or something like that
I don't know why
Please help me |
|
|
HTAluvBeBeo
Joined: 23 Feb 2008 Posts: 35
|
|
Posted: Sat Mar 15, 2008 10:18 am |
|
|
with the following code
The program wont work when it runs to (or I set to) value which do not have number 1 or 4
for example
06:37:58
or
20:23:57
etc
The time and date must have number 1 or 4 in it for program to work
for example
04:37:58
or
21:23:57
What a crazy bug
I don't know why
Could you show me the solution:-?
Thank PCM Programmer and other friends for reading my topic
Sorry for my bad English[
Last edited by HTAluvBeBeo on Sun Mar 16, 2008 12:55 am; edited 1 time in total |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Sat Mar 15, 2008 2:00 pm |
|
|
1. You are posting too much code. People are ignoring your posts
because no one wants to look at hundreds of lines of code.
2. I assume that you got the ds1307 driver from the CCS code library.
So it probably works. Don't post that code. Just provide a link to
the post in the CCS code library. We can go there to look at it.
3. You need to change the design of your program so that it is easier
to understand and easier to test. You should create a function that
is used only to display a number on your LEDs. That's the only thing
it should do. Then you can test it separately and prove that it works. |
|
|
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Sat Mar 15, 2008 3:20 pm |
|
|
One thing I noticed was that you are mixing two different configurations.
ds1307_init() has: Code: |
i2c_write(0x90); // squarewave output pin 1Hz
| while ds1307_set_date_time() has: Code: |
i2c_write(0x10); // REG 7 - 1Hz squarewave output pin | The OUT-bit is don't care in your setup so this shouldn't affect performance, but it got me confused. It's best to set the configuration equal in both functions. |
|
|
Guest
|
|
Posted: Sat Mar 15, 2008 6:51 pm |
|
|
thank for your care, I found the problem
I use ext_in on RB0 and this I/O is also to transfer the data to a segment of 7seg leds
So what should I do to use ext_int on RB0 to upadate time and date every second while using Port B to transfer the data to 7seg leds
Thank you so so much, I haven't had enough experiece with PIC andC language.
Thank PCM Programmer for your helpful advices
Thank for friend who replied my post |
|
|
HTAluvBeBeo
Joined: 23 Feb 2008 Posts: 35
|
|
Posted: Sat Mar 15, 2008 7:31 pm |
|
|
Anonymous wrote: | thank for your care, I found the problem
I use ext_in on RB0 and this I/O is also to transfer the data to a segment of 7seg leds
So what should I do to use ext_int on RB0 to upadate time and date every second while using Port B to transfer the data to 7seg leds
Thank you so so much, I haven't had enough experiece with PIC andC language.
Thank PCM Programmer for your helpful advices
Thank for friend who replied my post |
One more question:
How to control the brightness of leds in my case
Using PWM, do I need one more I/O to do that:-?
PS:ckielstra, you have a code that will probably useful for me
http://www.ccsinfo.com/forum/viewtopic.php?t=26177
I will try to use this code and int_timer1 to update time and date evey second instead of using int_ext RB0
Is it ok:-?
Or maybe give up the ds1307 to use your code to do my own clock:D |
|
|
HTAluvBeBeo
Joined: 23 Feb 2008 Posts: 35
|
|
Posted: Sun Mar 16, 2008 12:48 am |
|
|
Thank you all
I did 2 clock. they work fine
one with ds1307 and use int_timer1 and code lib of ckielstra to update time and date every 1s
the other do not use ds1307. just use code lib of ckielstra that i mentioned above
Thank for your help, PCM Programmer and ckielstra
I still want to know how to control brightness of my leds
could you show me some links or advices
Sory for my bad English |
|
|
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Sun Mar 16, 2008 7:27 am |
|
|
You can make the dimming as difficult as you want to. An easy solution is to use the PWM module of your PIC in combination with a single transistor in the power (or ground) line to your LEDs. Choose a frequency of 100Hz or higher to avoid seeing the LED flicker. |
|
|
HTAluvBeBeo
Joined: 23 Feb 2008 Posts: 35
|
|
Posted: Sun Mar 16, 2008 11:36 am |
|
|
Could you give me an example or schematic how to control six 7seg leds and dim by using PWM
I am very new to electronics, MCU and programming
Thank for replying
sorry for my bad English |
|
|
|