PIC16F19176 rtc help

53 views
Skip to first unread message

flyway38

unread,
Jan 10, 2023, 1:04:25 PM1/10/23
to jallib
Hello all,

Need help on coding for an rtc for the 16F19176.
Have tried many samples with no luck. They get alot of failures, like not defined terms...
Need to implement a simple RTC code to keep track of time even if PIC is handling "closed loop" routines, like reading Comm Port or resetting the gsm modem, etc...
Need these routines to get interrupted, and finished after RTC updates time.
It would be a very fast code, only to increment a variable.
Need some sample code adapted for this PIC, please.
Thank you 

Kind regards,
Filipe Santos

Rob CJ

unread,
Jan 10, 2023, 1:35:45 PM1/10/23
to jallib
Hi Filipe,

I took the sample program 16f1825_rtc_ds3231.jal and changed it for the 16f19176.

No compiler issues.

See attachment.

Kind regards,

Rob


Van: jal...@googlegroups.com <jal...@googlegroups.com> namens flyway38 <fsfo...@gmail.com>
Verzonden: dinsdag 10 januari 2023 19:04
Aan: jallib <jal...@googlegroups.com>
Onderwerp: [jallib] PIC16F19176 rtc help
 
--
You received this message because you are subscribed to the Google Groups "jallib" group.
To unsubscribe from this group and stop receiving emails from it, send an email to jallib+un...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/jallib/4b03768d-331b-4a4c-aa10-afbf73fc952cn%40googlegroups.com.
16f19176_rtc_ds3231.jal

flyway38

unread,
Jan 10, 2023, 1:45:27 PM1/10/23
to jallib
Hi Rob,

Wow.
Thank you very much for the fast reply.
Will check and back here with results.

Cheers,
FS

flyway38

unread,
Jan 10, 2023, 2:25:35 PM1/10/23
to jallib
Hi Rob,

It seems something not working...
Not sure why, but using your sample (part of it, check below what have integrated in my code from your sample), it doesn't even reach the FOREVER LOOP...
Maybe because am using serial_hw_int_cts instead of serial_hardware, or even because am using timer0_isr_interval... don't know...
Here's what am using from your sample:

-- Settings for the RTC and intialization.
alias rtc_sck is pin_C0 -- Pin 10 for 14 pin DIP
alias rtc_sck_direction is pin_C0_direction
alias rtc_sdo is pin_C1 -- Pin 9 for 14 pin DIP.
alias rtc_sdo_direction is pin_C1_direction
-- If you want to use software IIC, define the following constant.
-- const RTC_SOFTWARE_IIC = TRUE
include rtc_ds3231

-- Setting to check the alarm on a poll basis or interrupt bases. When
-- defined the alarms are checked using the external interrupt of the PIC.
-- Using the interrupt has its limitations for this rtc as explained in the
-- sample interrupt routine below.
-- const ALARM_ON_INTERRUPT = TRUE

-- Print the current time of the rtc.
procedure print_time() is

   var byte hours, minutes, seconds

   rtc_get_time_bin(hours, minutes, seconds)
   print_string(serial_hw_data, "H:")
   print_byte_dec(serial_hw_data, hours)
   print_string(serial_hw_data, " M:")
   print_byte_dec(serial_hw_data, minutes)
   print_string(serial_hw_data, " S:")
   print_byte_dec(serial_hw_data, seconds)
   print_crlf(serial_hw_data)

end procedure

-- Example of handling the alarm on an interrupt basis. Note that we cannot
-- call any of the RTC procedures because it will interfere with the IIC
-- transmission. We can only set a flag that can be checked later. Note that
-- the interrupt is edge triggered. The rtc interrupt stays low as long as
-- the alarm flag of the RTC is set.
if defined(ALARM_ON_INTERRUPT) then
   procedure alarm_interrupt is pragma interrupt
      if INTCON_INTF then
         INTCON_INTF = FALSE
         alarm_was_given = TRUE
      end if
   end procedure
end if

rtc_init()

-- Enable interrupts if setting is defined.
if defined(ALARM_ON_INTERRUPT) then
   INTCON_INTE = TRUE
   -- Interrupt on falling edge.
   OPTION_REG_INTEDG = FALSE
   INTCON_GIE = TRUE
   rtc_enable_alarm_1_interrupt()
   rtc_enable_alarm_2_interrupt()
end if

Don't need to use any Alarms...
But need to use Timer Interval to do some checks regularly.

Anyways, have put just before FOREVER LOOP:
-- Set some intial time hh:mm:ss in binary format and print it.
rtc_set_time_bin(18, 51, 30)
print_time()
This code doesn't run...

Any ideas?
Thank you very much.

FS

vsurducan

unread,
Jan 10, 2023, 10:50:33 PM1/10/23
to jal...@googlegroups.com
Hi Fellipe,
You will not like my ideea but any rtc can be implemented in any pic, much better than using an external RTC, by using Bresenham zero error algorithm.

It's in the sample and works perfect with all timers. 

It's set to seconds but works down to 1ms for fast pics.
You have just to set a flag in the isr when time passed and reset it in the main after you have read it.

The only thing to care is the total lenght of your isr, including your own application which must be shorter than time genetated (aka 1 second or shorter).


flyway38

unread,
Jan 11, 2023, 8:53:01 AM1/11/23
to jallib
Hello Vasile,

I think that have already tried that sample, but as said before, think i fall into some LIB errors...
Will check again, but maybe get stuck while adapting it to my PIC...
Will back here with results.
Thank you very much.

Cheers,
FS

Rob CJ

unread,
Jan 11, 2023, 12:46:15 PM1/11/23
to jal...@googlegroups.com
Hi Filipe,

It helps if you send your program otherwise we are comparing apples with pears.

There is another possibility. Your PIC has a secondary oscillator, meant for connecting a 32 kHz crystal. If you use that, you can make your own RTC and the only thing you need is a 32 kHz crystal and a small piece of software.

Kind regards,

Rob


Verzonden: woensdag 11 januari 2023 14:53
Aan: jallib <jal...@googlegroups.com>
Onderwerp: Re: [jallib] PIC16F19176 rtc help
 

vsurducan

unread,
Jan 12, 2023, 12:09:14 AM1/12/23
to jal...@googlegroups.com
Yep. If a secondary oscillator available, definitely yes for the RTC, except maybe for running at -20C where a good TCXO is expensive, using only one could be an option.
Apples with pears are still fruits, not very bad comparison. :)

flyway38

unread,
Jan 12, 2023, 4:16:42 AM1/12/23
to jallib
Hi Rob and Vasile,

Thank you for your input.
My code is very big (and confuse) by now.
Anyways, only need an effective RTC to increment a variable, no matter what PIC is doing...
Problem is I have no experience using interrupts (software ones) with PICs.

Good point about that second oscillator. Remember now, my eyes crossing that info in the datasheet...
But, I think that will not need that. I don't need a precise RTC. My code will use a time base of 10seconds.
Problem is when PIC is doing some actions like reading SMSs, deleting SMSs, resetting modem, etc.... those actions take almost a minute, so I need interrupts to keep track of elapsed time.
Thank you very much.

Cheers,
FS

Rob CJ

unread,
Jan 12, 2023, 4:59:11 AM1/12/23
to jal...@googlegroups.com
Hi Filipe,

In that case you could use a timer. Did you have a look at a timer library?

Met vriendelijke groet,
Rob Jansen

From: jal...@googlegroups.com <jal...@googlegroups.com> on behalf of flyway38 <fsfo...@gmail.com>
Sent: Thursday, January 12, 2023 10:16:41 AM
To: jallib <jal...@googlegroups.com>
Subject: Re: [jallib] PIC16F19176 rtc help
 

flyway38

unread,
Jan 12, 2023, 6:02:02 AM1/12/23
to jallib
Hello Rob,

Yes, am using this code:
-- This program uses the internal oscillator at 32 MHz.
pragma target clock    32_000_000  -- oscillator frequency
pragma target OSC      OFF         -- internal oscillator
pragma target RSTOSC   HFINT32     -- select 32 MHz
pragma target CLKOUTEN DISABLED    -- no clock output
pragma target WDT      DISABLED    -- watchdog
pragma target BROWNOUT DISABLED    -- no brownout reset
pragma target FCMEN    DISABLED    -- no clock monitoring
pragma target CSWEN    ENABLED     -- allow writing OSCCON1 NOSC and NDIV
pragma target LVP      ENABLED     -- low voltage programming
pragma target MCLR     INTERNAL    -- internal reset
--
OSCFRQ_HFFRQ = 0b110               -- Fosc 32 -> 32 MHz
--OSCCON2 = 0x00                   -- 32 MHz and no division
--
-- Enable weak pull up for all inputs.
--WPUA = 0b1111_1111
WPUB = 0b1111_1111
WPUC = 0b1111_1111
WPUD = 0b1111_1111
WPUE = 0b0000_1111

...

-- Timer0_isr_interval Lib
const DELAY_SLOTS = 1              -- support 2 delays at the same time
const word TIMER0_ISR_RATE = 1000  -- 1 kHz isr rate
include timer0_isr_interval
timer0_isr_init()                  -- init timer0 isr
--
set_delay(0, 2_000)                -- Init timer0 pointer
var word wTimeSync = 0             -- Init Time Sync clock

And inside FOREVER LOOP:
   -- Checking TIMER0 - Time Sync
   if (check_delay(0)) then
      wTimeSync = wTimeSync + 1
      --
      -- ticks (of 2s) on delay-slot 0
      set_delay(0, 2_000)
      --
     if (!LedAM & wTimeSync%10 == 0) then
         Krnl_CheckModem()
      end if
   end if

Problem is this code don't use interrupts.
So my var "wTimerSync" don't get updated when PIC is doing longer time consuming tasks...
Can you help?
Thank you.

Cheers,
FS

Rob CJ

unread,
Jan 12, 2023, 12:55:18 PM1/12/23
to jal...@googlegroups.com
Hi Filipe,

That timer library is using interrupts but if the code in your forever loop has a delay you will not benefit from it.

So what should be done is that the action you want to execute when the timer has an interrupt should be part of that timer0 interrupt routine and not in your forever loop. Some libraries - but not this one - have an option to call a user defined procedure when it is defined.

A quick - and dirty - fix is to make a local copy of this timer library and add your specific code to the procedure ISR() in timer0_isr_interval. Note that when you do that, your code must be fast since interrupt routine should be a short as possible.

An option would be to extend this library and call a user defined procedure from the timer interrupt if it was defined by the user.

Kind regards,

Rob


Verzonden: donderdag 12 januari 2023 12:02

flyway38

unread,
Jan 12, 2023, 1:09:25 PM1/12/23
to jallib
Hi Rob,

Thank you for your information.
Will test and back here with results.

Cheers,
FS
Reply all
Reply to author
Forward
0 new messages