Hantera roll-over i räknare?

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Joe
Inlägg: 1646
Blev medlem: 3 mars 2006, 17:00:50
Ort: Södermanland

Hantera roll-over i räknare?

Inlägg av Joe »

Jag har ett roterande axel som det sitter en pulsgivare med 360ppr på.
AB kopplad till en räknare som använder DINT -2147483648 to +2147483647
Axeln kan snurra både fram och back.
Inget av ovanstående går att ändra på.

Vad jag vill är att räknaren ska löpa på då axel roterar hela tiden, att gå in och nolla räknaren ger ett följdfel över tid då antalet pulser imellan interrupten och nollning inte är känd.
Sen så lägger jag in interrupt på ärvärdet + 360 för att få fram antalet varv den har snurrat.

Något bra tips på hur jag detekterar rollovern? att bara kolla tecknet funkar inte då den också kan passera 0.
Gärna i strukturerad text.
H.O
Inlägg: 5684
Blev medlem: 19 mars 2007, 10:11:27
Ort: Ronneby

Re: Hantera roll-over i räknare?

Inlägg av H.O »

Kan du inte ta absolutvärdet på skillnaden mellan nuvarande och föregående värde, om det är orimligt stort (alltså betydligt mer än vad axeln rimligitvis kan förflytta sig på den tiden) så har räknaren snurrat runt?
Joe
Inlägg: 1646
Blev medlem: 3 mars 2006, 17:00:50
Ort: Södermanland

Re: Hantera roll-over i räknare?

Inlägg av Joe »

Jo jag tänkte det med känns inte som en optimal lösning, det borde finnas något klurigare sätt.

Å andra sidan kanske jag gör det för krånglig, det jag vill är att sätta interrupten på föregående värde +360
Om värdet är +2147483600 så blir interrupten på -2147483335 och då jag egentligen är bara intresserad av nästa högre varv så borde detta räcka.
Senast redigerad av Joe 5 juni 2017, 10:35:44, redigerad totalt 1 gång.
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Hantera roll-over i räknare?

Inlägg av lillahuset »

lillahuset skrev:Då kommer jag dragande med min gamla trotjänare igen. :D

Kod: Markera allt

/**
  * @brief  check if *timer has timed out
  * @brief  initialise *timer by a call with ticks = 0
  * @param  timer: pointer to timer variable
  * @param  ticks: number of ticks to wait
  * @retval return 0 if not timeout, !0 if timeout
  * @date   2012-12-14
  */
int timeout(uint32_t *timer, uint32_t ticks)
{
  uint32_t t, diff;
  int tout;

  tout = 0;
  t = getTicks();
  diff = t - *timer;

  if (0 == ticks || diff >= ticks) {
    *timer = t;
    tout = 1;
  }

  return tout;
} /* timeout */
Joe
Inlägg: 1646
Blev medlem: 3 mars 2006, 17:00:50
Ort: Södermanland

Re: Hantera roll-over i räknare?

Inlägg av Joe »

unsigned int är enklare att hantera.. Särskilt när den bara räknar upp.
Användarvisningsbild
hawkan
Inlägg: 2585
Blev medlem: 14 augusti 2011, 10:27:40

Re: Hantera roll-over i räknare?

Inlägg av hawkan »

Skämmigt rak kopia från webben

It will not matter so long as the difference between the start and end count is less than (2^32)/2, and assuming 2's complement 32bit arithmetic is performed (almost universally true), even if the count value spans the wrap-point. For example:

Start count: 0xfffffff
End Count: 0x00000002 (incremented through 0,1,2 - i.e. three counts)

End - Start == 0x00000002 - 0xfffffff == 0x00000003

So the right answer is achieved so long as the counter is the bit width of a built-in integer type, and that type is used. Where perhaps a counter register is not the width of a built-in integer type, you can achieve the same effect by masking the higher order "overflow" bits.

If you need the larger count for other reasons or if the difference between successive timestamps is too large, then you can simply use another integer that is incremented when the lower-order counter wraps. This integer will form the high order bits of a larger integer, so the LSB of the second integer is the 33rd bit of this larger integer.
https://stackoverflow.com/questions/309 ... embedded-c

Om det stämmer i detta fallet överlåter jag åt andra
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Hantera roll-over i räknare?

Inlägg av lillahuset »

Jodå, det är exakt så man gör. Enkelt och elegant. :)
Skriv svar