RTC - code not working - Mel's example


Closed Thread
Results 1 to 19 of 19
  1. #1
    malc-c's Avatar
    malc-c Guest

    Default RTC - code not working - Mel's example

    Ok so now I've sussed out why the RTC module wasn't working, I've used Mel's code to test the RTC and have stumbled into a problem which for the life of me can't get working.

    When powered up it displays the time on the 1st line and date on the second (incidentally it seems to skip the pre-sets in the code and use the date set in a previous bit of code used to test the module). The code responds to RA5 going low and jumps to set mode. However the LCD just sits there at Set Mode with the 12HR / 24HR overwriting itself every half a second. Pressing any of the buttons on PORT A has no affect, and the code doesn't jump back to normal clock mode if left for several seconds with out input.

    Your help would be appreciated... Code attached
    Attached Files Attached Files

  2. #2
    malc-c's Avatar
    malc-c Guest


    Did you find this post helpful? Yes | No

    Default

    Sorted...

    I'm gonna give up tonight....

    I had the LEDs set to confirm the switches were working, and it must of been taking the port low enough to register as an input.... turning these off and it is now stable !

  3. #3
    malc-c's Avatar
    malc-c Guest


    Did you find this post helpful? Yes | No

    Default

    Maybe I spoke too soon...

    I can now run through the set up, however setting it up for 10:45PM on 22nd March 2010, however pressing RA5 the display states "Memorised" but then displays the current time and date as : 4:46 AM Sat 28 Apr 2018

  4. #4
    malc-c's Avatar
    malc-c Guest


    Did you find this post helpful? Yes | No

    Default

    Anyone have any ideas ?

  5. #5
    Join Date
    Jul 2003
    Posts
    2,358


    Did you find this post helpful? Yes | No

    Default

    If I have time in the next day or two I'll revisit this... but I'd have thought if there was a problem someone would have mentioned it in the eight years it's been around.

    Despite the fact it's incorrect - is the Time incrementing?

    Looks to me like the Data to/from the RTC is corrupt.

    You got correct pull-up's on the CLK and Data lines to the RTC?

    Download a fresh source copy and recompile... you may have changed something accidentally without noticing.

  6. #6
    malc-c's Avatar
    malc-c Guest


    Did you find this post helpful? Yes | No

    Default

    Mel, thank for replying.

    Yes the clock runs fine. The module has the pull ups fitted


    I'll try your suggestion when I get home from work in a couple of hours. Maybe I did edit something I shouldn't have, but AFAIK the only changes were to portB for the LCD and port A for the switches

  7. #7
    malc-c's Avatar
    malc-c Guest


    Did you find this post helpful? Yes | No

    Default

    Quote Originally Posted by Melanie View Post

    Download a fresh source copy and recompile... you may have changed something accidentally without noticing.
    Mel,

    I've downloaded a fresh copy of the code from http://www.melabs.com/resources/samp...ted/MN1307.txt

    The only things I've changed are making PORTA all input, PORTB output, the LCD to work on PORTB and the config setting s so it compiles on an 16F877A. - all the code that handles the setup of the clock is unchanged. I have all LEDS turned off so there is nothing else connected to either the RTC lines or switch inputs. RA4,5 and 6 are tied high via pull-up resistors, with switch's to gnd when pressed.

    Code compiles and loads into PIC. time is shown on line 1 Hrs:min:sec, a date is shown on line two (which was the date set using a very basic example found on the web that simply writes values in a "string" to the device eg I2CWRITE SDA,SCL,$D0,$00,[$00,$00,$19,$7,$14,$2,$10,$90] )

    All seems as it should, however pressing RA5 the display changes to "SET MODE :" with the 12 / 24 HR constantly over-writing itself. Pressing RA4, 5 or 6 has no effect, and if left doesn't auto switch back to display the clock.

    Code attached

    Any ideas ?
    Attached Files Attached Files

  8. #8
    malc-c's Avatar
    malc-c Guest


    Did you find this post helpful? Yes | No

    Default

    Well I compiled and loaded this example

    Code:
    @   __config _HS_OSC & _WDT_ON & _LVP_OFF & _CP_OFF
    
    DEFINE  OSC 20
    CLEAR
    
    ;----[LCD definitions]------------------------------------------------------
    DEFINE LCD_DREG  PORTB          ' LCD Data port
    DEFINE LCD_DBIT  0              ' starting Data bit (0 or 4)
    DEFINE LCD_EREG  PORTB          ' LCD Enable port
    DEFINE LCD_EBIT  5              '     Enable bit  (on EasyPIC 5 LCD)
    DEFINE LCD_RSREG PORTB          ' LCD Register Select port
    DEFINE LCD_RSBIT 4              '     Register Select bit   (on EasyPIC 5 LCD)
    DEFINE LCD_BITS  4              ' LCD bus size (4 or 8 bits)
    DEFINE LCD_LINES 4              ' number of lines on LCD
    DEFINE LCD_COMMANDUS 2000       ' Command delay time in us 
    DEFINE LCD_DATAUS 50            ' Data delay time in us 
    
    'RTC pins on 877a
    SDA	Var	PORTC.4
    SCL	Var	PORTC.3
    
    ' Allocate variables
    RTCYear	Var	Byte
    RTCMonth Var Byte
    RTCDate	Var	Byte
    RTCDay	Var	Byte
    RTCHour	Var	Byte
    RTCMin	Var	Byte
    RTCSec	Var	Byte
    RTCCtrl Var	Byte
    
    TRISC= %11111111
    ;DB0 var byte[8]
    CMCON = %00000111                   ' Comparators = off
    
    ' Initialize LCD
    LCDOUT $FE,1:FLAGS=0:PAUSE 250:LCDOUT $FE,1:PAUSE 250 
    
    ' Set initial time 
    	RTCYear = $10
    	RTCMonth = $03
    	RTCDate = $23
    	RTCDay = $02
    	RTCHour = $19
    	RTCMin = $35
    	RTCSec = 0
    	RTCCtrl = 0
    	
    Gosub set		' Set the time
    
    Goto mainloop		' Skip over subroutines
    
    
    ' Subroutine to write time to RTC
    set:
    	I2CWrite SDA,SCL,$D0,$00,[RTCSec,RTCMin,RTCHour,RTCDay,RTCDate,RTCMonth,RTCYear,RTCCtrl]
    	Return
    
    ' Subroutine to read time from RTC
    gettime:
    	I2CRead SDA,SCL,$D0,$00,[RTCSec,RTCMin,RTCHour,RTCDay,RTCDate,RTCMonth,RTCYear,RTCCtrl]
    	Return
    
    mainloop:
    	Gosub gettime		' Read the time from the RTC
    
            ' Display time on LCD
    	Lcdout $fe, 1,hex2 RTCDate, "/",hex2 RTCMonth, "/" , hex2 RTCYear,_
    		"  ", hex2 RTCHour, ":", hex2 RTCMin, ":", hex2 RTCSec
    
    	Pause 500		
    
    	Goto mainloop
    The correct date and time as per code was shown on the LCD. I then recompiled the melrtc.pbp code and this time I was able to run through the set up menu, and kept the date (today's date) and after the "memorise" was displayed the following was displayed:

    2:59:01 AM
    Wed 25 sep 2013

    I have no idea what's screwing the code up, and as you said, given the age of the file, would of though that this would of been discussed years ago !

  9. #9
    Join Date
    Nov 2005
    Posts
    51


    Did you find this post helpful? Yes | No

    Default

    Malc I brought one of those for my easy-pic spent hours and over severals day's thinking it was my code. Which I knew it did work in another project, At the time I was unsure about the code but when I loaded the hex file into my running project everything worked ok. so this led me to the RTC moudle (the one shown in the picture), So I built the curcuit on vero board and that worked percfet, There was one connection I never used, So in the end atfer waisting days hunting I just threw it in the bin and could not be botherd to send it back. I did look at but not found nothing

    Have you tried your own simple circuit ?
    Last edited by chuck; - 23rd March 2010 at 21:35.

  10. #10
    malc-c's Avatar
    malc-c Guest


    Did you find this post helpful? Yes | No

    Default

    Thanks for the reply Chuck,

    To be honest I've not tried breadboarding the chip like you suggest. I'll try that tomorrow and see if it makes any difference. Are you suggesting that there is a flaw with the EasyPIC5 board or just the RTC2 board... If the latter, why does it seem to work with other examples that write once to the module and then read the time back from that point... IMO it seems as if the code is doing strange things. I noticed that if I press the increment button it doesn't decrease by one unit, it seems to jump. Maybe the value on the LCD isn't the actual value that the counter is. EG, the hour displayed on the LCD hasn't refreshed to show the value the code has been set to by the button..

  11. #11
    Join Date
    Jul 2003
    Location
    Colorado Springs
    Posts
    4,959


    Did you find this post helpful? Yes | No

    Default

    Malc,

    In the modified version of Melanie's code, you have ...

    Code:
    IncButton var PORTA.6	' Press to Increment Button
    The 16F877A doesn't have a PORTA.6, and to the program it probably looks like the button is always pressed.
    <br>
    DT

  12. #12
    malc-c's Avatar
    malc-c Guest


    Did you find this post helpful? Yes | No

    Default

    How did I miss that ! (embarrassed smile goes here !)

    I'll re-compile tonight after work and see what happens

  13. #13
    malc-c's Avatar
    malc-c Guest


    Did you find this post helpful? Yes | No

    Default

    Well must be something with the configuration of port A.

    Code:
    	DecButton var PORTD.0	' Press to Decrement Button
    	SetButton var PORTD.1  'Press to Set/memorise Button
    	IncButton var PORTD.2	' Press to Increment Button
    The above works ! as does

    Code:
    	DecButton var PORTE.0	' Press to Decrement Button
    	SetButton var PORTE.1  'Press to Set/memorise Button
    	IncButton var PORTE.2	' Press to Increment Button
    Thanks to all those who posted... at least I've proved my hardware is ok, just need to learn how to set up these devices correctly !

  14. #14
    Join Date
    Jul 2003
    Location
    Colorado Springs
    Posts
    4,959


    Did you find this post helpful? Yes | No

    Default

    Quote Originally Posted by malc-c View Post
    Well must be something with the configuration of port A.
    PORTA ... well, you have ...

    ADCON1 = $0F

    For a 16F877A it should be ...

    ADCON1 = 7

    Unless you want some analog channels.
    <br>
    DT

  15. #15
    malc-c's Avatar
    malc-c Guest


    Did you find this post helpful? Yes | No

    Default

    I'm looking at using the code to set a photo period, ie at a set time, say 11:00 pm lights go off, then at 06:00 am lights come on.

    Is it a simple case of : (not actual code, more logic)

    Code:
    set off time
    set on time
    
    I2CRead SDApin,SCLpin,$D0,$00,[RTCSec,RTCMin,RTCHour,RTCWDay,RTCDay,RTCMonth,RTCYear,RTCCtrl]
    
    If RTCHour=>off time or <=on time then lights off
    Else lights on

  16. #16
    malc-c's Avatar
    malc-c Guest


    Did you find this post helpful? Yes | No

    Default

    Quote Originally Posted by Darrel Taylor View Post
    PORTA ... well, you have ...

    ADCON1 = $0F

    For a 16F877A it should be ...

    ADCON1 = 7

    Unless you want some analog channels.
    <br>
    I tried that well, ADCON1 = $0F but that didn't work... but then I'm currently using an 16f877a

  17. #17
    malc-c's Avatar
    malc-c Guest


    Did you find this post helpful? Yes | No

    Default

    Quote Originally Posted by Darrel Taylor View Post

    For a 16F877A it should be ...

    ADCON1 = 7

    Unless you want some analog channels.
    <br>
    Uhmmm.. tried that and then changed the code to

    Code:
    	DecButton var PORTA.0	' Press to Decrement Button
    	SetButton var PORTA.1  'Press to Set/memorise Button
    	IncButton var PORTA.2	' Press to Increment Button
    but that still left the 12/24 hr set mode over-writing each other again !

  18. #18
    Join Date
    Mar 2009
    Location
    Colorado
    Posts
    378


    Did you find this post helpful? Yes | No

    Default Try using DT's "AllDigital.inc"

    Quote Originally Posted by Darrel Taylor View Post

    Unless you want some analog channels.
    <br>
    Malc-C, since it doesn't appear you are using any analog channels in your application I recommend you use DT's "AllDigital.inc" routine as an INCLUDE in your program. It works great and takes care of all the register settings you are trying to figure out so that you don't have a conflict of your digital processing with ports that are set for analog input.

  19. #19
    malc-c's Avatar
    malc-c Guest


    Did you find this post helpful? Yes | No

    Default

    Many thanks for the suggestion. At the moment I'm just verifying that the hardware works, and will (hopefully) be combining this code with some existing code for other functions, one of which has 4 pots on AN1, AN2, AN3 and AN4, so I'm really looking at setting up PORTA for a 50/50 split of analogue / digital when I come to migrating this all to a new PIC (18F4580) when my samples arrive

Members who have read this thread : 0

You do not have permission to view the list of names.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts