I know that calling some procedures of the same library from the main an
fron an ISR may work. The NRF905 example is one which work this way if I
recall correctly. However, that approach is consuming more hw stacks which
is not very good (the libraries are supposed to keep their backward
compatibility with old 8 hw stack pics).
I think your decision is correct. Use your own I2C procedures within ISR
and not I2C libraries. Actually this is the way to build a fast and complex
ISR.

On Fri 2 Jun 2023, 8:30 PM Rob CJ, <rob...@hotmail.com> wrote:

> Hi Vasile,
>
> Before testing this I gave this some more thought and had a short look at
> the assembly file.
>
> The issue is that as soon at I do any IIC ibrary call from an interrupt
> routine, all these routines become 'interrupt routines' if you know what I
> mean. I think that means that these routines can no longer be called from a
> non-interrupt location like the main program.
>
> For example a non-interrupt routine to transmit something over the IIC
> looks like this:
>
> ;  102 function i2c_transmit_byte(byte in data) return bit is
> l_i2c_transmit_byte
>                                movlb    0
>                                movwf    v___data_80
> ;  104    PIR1_SSPIF = false  ; clear pending flag
>                                bcf      v_pir1, 3 ; pir1_ssp1if
> ;  105    sspbuf = data       ; write data
>                                movf     v___data_80,w
>                                movlb    4
>                                movwf    v_ssp1buf
> ;  108    while ! PIR1_SSPIF loop end loop
> l__l524
>                                movlb    0
>                                btfsc    v_pir1, 3 ; pir1_ssp1if
>                                goto     l__l525
>                                goto     l__l524
> l__l525
> ;  113    if SSPCON2_ACKSTAT == low  then
>                                movlb    4
>                                btfsc    v_ssp1con2, 6 ; ssp1con2_ackstat
>                                goto     l__l528
> ;  114       return true -- okay
>                                movlb    0
>                                bsf      v__pic_temp, 0 ; _pic_temp
>                                return
>
> But if you do a call to the same IIC procedure from an interrupt the code
> becomes this:
>
> ;  102 function i2c_transmit_byte(byte in data) return bit is
> l_i2c_transmit_byte
>                                incf     v__ri2c_transmit_byte,f
>                                decfsz   v__ri2c_transmit_byte,w
>                                goto     l__l712
>                                movlp    HIGH l__l713
>                                goto     l__l713
> l__l712
>                                movf     v__pic_stkptr+1,w
>                                movwf    v__fsr0h
>                                movf     v__pic_stkptr,w
>                                movwf    v__fsr0l
>                                decf     v__pic_stkptr,f
>                                decf     v__fsr0l,f
>                                movf     v__fi2c_transmit_byte,w
>                                movwf    v__ind
> l__l713
>                                movf     v__pic_temp,w
>                                movwf    v___data_80
> ;  104    PIR1_SSPIF = false  ; clear pending flag
>                                bcf      v_pir1, 3 ; pir1_ssp1if
> ;  105    sspbuf = data       ; write data
>                                movf     v___data_80,w
>                                movlb    4
>                                movwf    v_ssp1buf
> ;  108    while ! PIR1_SSPIF loop end loop
> l__l524
>                                movlp    HIGH l__l525
>                                movlb    0
>                                btfsc    v_pir1, 3 ; pir1_ssp1if
>                                goto     l__l525
>                                goto     l__l524
> l__l525
> ;  113    if SSPCON2_ACKSTAT == low  then
>                                movlb    4
>                                btfsc    v_ssp1con2, 6 ; ssp1con2_ackstat
>                                goto     l__l528
> ;  114       return true -- okay
>                                movlb    0
>                                bsf      v__pic_temp, 0 ; _pic_temp
>                                goto     l__l523
> ;  115    else
> l__l528
> ;  116       sspcon1_sspen = false;
>                                bcf      v_ssp1con1, 5 ; ssp1con1_sspen
> ;  117       sspcon1_sspen = true;
>                                bsf      v_ssp1con1, 5 ; ssp1con1_sspen
> ;  119       return false -- no response
>                                movlb    0
>                                bcf      v__pic_temp, 0 ; _pic_temp
> ;  120    end if
> ;  121 end function
> l__l523
>                                decfsz   v__ri2c_transmit_byte,f
>                                goto     l__l715
>                                return
> l__l715
>                                movf     v__pic_stkptr+1,w
>                                movwf    v__fsr0h
>                                movf     v__pic_stkptr,w
>                                movwf    v__fsr0l
>                                movf     v__ind,w
>                                movwf    v__fi2c_transmit_byte
>                                incf     v__fsr0l,w
>                                movwf    v__pic_stkptr
> l__l714
>                                return
>
> I think it cannot be mixed. The only solution I can think of is making
> separate routines that access the IIC hardware registers directly without a
> call to any other - common - routine.
>
> Kind regards,
>
> Rob
>
>
> ------------------------------
> *Van:* jallib@googlegroups.com <jallib@googlegroups.com> namens Rob CJ <
> rob...@hotmail.com>
> *Verzonden:* donderdag 1 juni 2023 21:01
> *Aan:* jallib@googlegroups.com <jallib@googlegroups.com>
> *Onderwerp:* Re: [jallib] Peripheral hardware and interrupts
>
> Hi Vasile,
>
> Good suggestion. I will give it a try.
>
> Thanks.
>
> Kind regards,
>
> Rob
>
> ------------------------------
> *Van:* jallib@googlegroups.com <jallib@googlegroups.com> namens vsurducan
> <vsurdu...@gmail.com>
> *Verzonden:* donderdag 1 juni 2023 20:58
> *Aan:* jallib@googlegroups.com <jallib@googlegroups.com>
> *Onderwerp:* Re: [jallib] Peripheral hardware and interrupts
>
> Hi Rob,
> Perhaps you should disable/enable interrupts within the I2c procedures and
> not for the entire main program.
> The way you did it, by writing a flag in the ISR and reading it in the
> main is correct. If you need less delay between the main execution and
> interrupt flag refresh, you should have just one interrupt routine and keep
> it as short as possible. Nowadays the JAL libraries are using multiple
> ISR's which are controlled entirely by the compiler. This feature does not
> give too many options to the user except writing his own procedures for
> sensitive interrupt applications instead of using libraries with their own
> ISR's.
>
> best wishes
>
> On Thu, Jun 1, 2023 at 9:34 PM rob...@hotmail.com <rob...@hotmail.com>
> wrote:
>
> Hi all,
>
> I have the following issue and I am interested in either your suggestions
> or if you encountered the same problem. The example is based on the sample
> program I made for the real time clock library DS3231.
>
> The DS3231 has two alarms and uses the IIC interface. The device has an
> interrupt line that can be activated when an alarm is triggered. I
> connected this line to the external interrupt of the PIC.
>
> The main program read the time and sends it to the serial port. Since the
> main program calls DA3231 functions, the IIC interface is used to access
> the DS3231. When an interrupt occurs, a register has to be read from the
> DS3231 to see which alarm was activated also using the IIC interface of
> course.
>
> In order to prevent that halfway an IIC transmission initiated by a
> library call from the main program, I disable the external interrupt of the
> PIC at the start of the main program an enable it again at the end of the
> main program. In that way I am sure that the interrupt does not interrupt
> an IIC transmission initiated by the main program. There is a delay at the
> end of the main program, sufficient for any pending interrupt to be handled.
>
> The problem is that it does not work. The PIC just hangs and does not
> start. The only solution I found is setting a flag in the interrupt routine
> and let the main program poll this flag and read the register from the
> DS3231 to check which alarm was activated. But in this way the whole idea
> of the interrupt is gone.
>
> Looking forward to your reactions and suggestions.
>
> Thanks.
>
> Kind regards,
>
> Rob
>
>
>
> --
> 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+unsubscr...@googlegroups.com.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/jallib/679a0f81-03fe-4310-b401-ac69f2d2aeadn%40googlegroups.com
> <https://groups.google.com/d/msgid/jallib/679a0f81-03fe-4310-b401-ac69f2d2aeadn%40googlegroups.com?utm_medium=email&utm_source=footer>
> .
>
> --
> You received this message because you are subscribed to a topic in the
> Google Groups "jallib" group.
> To unsubscribe from this topic, visit
> https://groups.google.com/d/topic/jallib/13BABaIMXzs/unsubscribe.
> To unsubscribe from this group and all its topics, send an email to
> jallib+unsubscr...@googlegroups.com.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/jallib/CAM%2Bj4qt%3DKi2pGVDwyLkzHmZJAsaX0qkoQPxM-p580W4BC%3DKNMw%40mail.gmail.com
> <https://groups.google.com/d/msgid/jallib/CAM%2Bj4qt%3DKi2pGVDwyLkzHmZJAsaX0qkoQPxM-p580W4BC%3DKNMw%40mail.gmail.com?utm_medium=email&utm_source=footer>
> .
>
> --
> 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+unsubscr...@googlegroups.com.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/jallib/GVXP195MB163770A10C791A2D2901350EE6499%40GVXP195MB1637.EURP195.PROD.OUTLOOK.COM
> <https://groups.google.com/d/msgid/jallib/GVXP195MB163770A10C791A2D2901350EE6499%40GVXP195MB1637.EURP195.PROD.OUTLOOK.COM?utm_medium=email&utm_source=footer>
> .
>
> --
> 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+unsubscr...@googlegroups.com.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/jallib/GVXP195MB1637572DBF263871A88FD431E64EA%40GVXP195MB1637.EURP195.PROD.OUTLOOK.COM
> <https://groups.google.com/d/msgid/jallib/GVXP195MB1637572DBF263871A88FD431E64EA%40GVXP195MB1637.EURP195.PROD.OUTLOOK.COM?utm_medium=email&utm_source=footer>
> .
>

-- 
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+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/jallib/CAM%2Bj4qu4WXuF249%3DLa5zCHz6J6o_A%3DWM0RDDbU1hGXEnO9XRfw%40mail.gmail.com.

Reply via email to