Thank you. I would appreciate that, but I think that will work only if
there is no complete cycle between two reads, so it is potentially a
possibility to get wrong position.

I will try experiment more with timer counter interrupts to see if 0 ->
0xFFFF and 0xFFFF -> 0 situations.

I will appreciate if you can share your code so I can take it as a
reference.

Best regards,
Petro

On Thu, Jan 13, 2022, 4:26 PM Nathan Hartman <hartman.nat...@gmail.com>
wrote:

> On Thu, Jan 13, 2022 at 8:19 AM Petro Karashchenko <
> petro.karashche...@gmail.com> wrote:
>
> > Hi,
> >
> > I've been working to add SAMv7 Qencoder interface and see that Qencoder
> > driver expects QEIOC_POSITION to be int32_t value. The issue is that
> SAMv7
> > has 16 bit timer counter interface and the SW extension to 32 bits (by
> > adding adding or subtracting UINT16_MAX+1 when counter matches 0xffff)
> does
> > not seems to work reliably because sometimes pulses are incremented /
> > decremented not by 1 by the HW.
> >
> > The question that I have is whether the Qencder position is expected to
> > count to negative values "INT16_MIN, ..., -2, -1, 0, 1, 2, .. INT16_MAX"
> or
> > position can be in range "0 ... UINT16_MAX" or there are not strict
> > requirements?
> >
> > Best regards,
> > Petro
>
>
>
> Correct; you can't rely on that.
>
> >
> I don't know at the moment whether the position is expected to be signed or
> unsigned, but I have code somewhere to extend precision from 16 bit to 32
> bit. If I remember correctly it always saves the previous reading. Each
> time it samples the encoder it subtracts the old from the new. If > 0x7fff
> it subtracts the complement, otherwise it adds the value, to a 32-bit
> variable, which is used as the counter. Let me know if you need me to find
> the code.
>
> Hope this helps,
> Nathan
>

Reply via email to