Page 1 of 1
FRO AND RRO USING HEXADECIMAL SWITCH
Posted: Fri Sep 11, 2020 7:28 am
by AmitKumar171
Hi Tom,
I am using KFLOP+KONNECT+KANALOG for connecting FRO i.e. the Hexadecimal switch which has 5 input pins and 16 position based on the 5 input pins.
I have connected the all 5 input pins for Hexadecimal switch to konnect pin number 1040,1041,1042,1043,1044. I want to set each position out of 16 position to use FRO 0 to 1.6.
How to proceed with the programs for checking 5 pins at each FRO change. ? how can i check the 5 pins for one input of FRO.
Waiting for your kind reply.
Re: FRO AND RRO USING HEXADECIMAL SWITCH
Posted: Fri Sep 11, 2020 6:51 pm
by TomKerekes
Hi Amit,
A hexadecimal switch should normally require 4 bits not 5.
Does the switch return gray code or binary?
If gray code you might do something like:
Code: Select all
#include "KMotionDef.h"
int grayToBinary(int num)
{
unsigned int temp = num ^ (num>>4);
temp ^= (temp>>2);
temp ^= (temp>>1);
return temp;
}
void main()
{
float FRO=0.1f*grayToBinary(ReadBit(1040)*8+ReadBit(1041)*4+ReadBit(1042)*2+ReadBit(1043));
}
Re: FRO AND RRO USING HEXADECIMAL SWITCH
Posted: Mon Sep 14, 2020 6:20 am
by AmitKumar171
Hi tom ,
Thanks for your reply.
A hexadecimal switch should normally require 4 bits
Yes it requires 4 bits.
Does the switch return gray code or binary?
The switch returns binary codes.
Help me with Binary code program.
Waiting for your kind reply.
Re: FRO AND RRO USING HEXADECIMAL SWITCH
Posted: Mon Sep 14, 2020 4:56 pm
by TomKerekes
Hi Amit,
The problem with binary is sampling bits while they are changing can give indeterminate values. For example changing from 7 to 8 might temporarily read 0 or 15. I think the same debounce function can be used to identify when things have changed and are stable. See below:
Code: Select all
#include "KMotionDef.h"
int hlast=0,hlastsolid=-1,hcount=0;
int Debounce(int n, int *cnt, int *last, int *lastsolid);
void main()
{
int hex;
float FRO;
for(;;)
{
WaitNextTimeSlice();
// read hex value with potential glitches
hex = ReadBit(1040)*8+ReadBit(1041)*4+ReadBit(1042)*2+ReadBit(1043);
// "debounce" hex value
if (Debounce(hex,&hcount,&hlast,&hlastsolid)!=-1) // changed and stable?
{
FRO = hlast * 0.1f;
printf("FRO changed to %f\n",FRO);
}
}
}
// Debounce a bit
//
// return 1 one time when first debounced high
// return 0 one time when first debounced low
// return -1 otherwise
#define DBTIME 300
int Debounce(int n, int *cnt, int *last, int *lastsolid)
{
int v = -1;
if (n == *last) // same as last time?
{
if (*cnt == DBTIME-1)
{
if (n != *lastsolid)
{
v = *lastsolid = n; // return debounced value
}
}
if (*cnt < DBTIME) (*cnt)++;
}
else
{
*cnt = 0; // reset count
}
*last = n;
return v;
}
Re: FRO AND RRO USING HEXADECIMAL SWITCH
Posted: Tue Sep 15, 2020 12:49 pm
by AmitKumar171
Hi tom,
THanks for your reply, will check that and update.