tweekzilla Posted October 5, 2012 Posted October 5, 2012 I'm running a toy model to try and switch Gate3[1].Chan[0].AtanEna in a background C program. (the AtanEna is bit 18 of inCtrl). I can read the bit without any problems and it recognizes when I flip the bit using the terminal, however, when I try and set the bit in a background C program it does not work. Am I able to do this? Code below int main(void) { volatile GateArray3 *tga; int inCtrl; InitLibrary(); tga = GetGate3MemPtr(1); inCtrl = tga->Chan[0].InCtrl; printf("before %i\n",inCtrl); //AtanEna = 1 tga->Chan[0].InCtrl &= ~(1<<18); //AtanEna should = 0 inCtrl = tga->Chan[0].InCtrl; printf("flipped %i\n",inCtrl); //Still shows 1 CloseLibrary(); return 0; } There is no change in the value of inCtrl upon setting the bit to zero.
Omron Forums Support Posted October 6, 2012 Posted October 6, 2012 I could be wrong, but I think you may need to change the line where you are actually writing the bit low to the following: tga->Chan[0].InCtrl &= (tga->Chan[0].InCtrl)^(1<<18); //AtanEna should = 0 Does that work?
tweekzilla Posted October 6, 2012 Author Posted October 6, 2012 Hi Charles Unfortunately that doesn't work. I know from doing the following the the bit-operation works: inCtrl = tga->Chan[0].InCtrl inCtrl &= ~(1<<18) // When printed this sets bit 18 to zero
JeffLowe Posted October 8, 2012 Posted October 8, 2012 I could be wrong, but I think you may need to change the line where you are actually writing the bit low to the following: tga->Chan[0].InCtrl &= (tga->Chan[0].InCtrl)^(1<<18); //AtanEna should = 0 Does that work? Does Gate3.WpKey have to be $AAAAAAAA for this?
Omron Forums Support Posted October 8, 2012 Posted October 8, 2012 I tested this and you're right, it doesn't set the 18th bit low. Also, setting Sys.WpKey=$AAAAAAAA has no effect. My PPMAC is malfunctioning right now; otherwise, I would test further. For now, can you just use SetPmacVar()? For example, SetPmacVar("Gate3[1].Chan[0].AtanEna",0.0) This will set AtanEna to 0. Using SetPmacVar is slower than writing the bit directly but it will work in a pinch.
tweekzilla Posted October 8, 2012 Author Posted October 8, 2012 Yes the SetPmacVar does work so long as you make sure that WpKey is set. It's strange though that I can't set it by simply addressing the pointer in C. It might be a write protect issue but I though that there was no write protect when accessing variables from C?
shansen Posted October 8, 2012 Posted October 8, 2012 Are you sure that the printf isn't misleading you? The reason I ask is that I ran into a similar problem where I would set a register, and then immediately printf the register to read its value. The problem is that whenever you modify a register in C you are probably doing a read-modify-write operation. If your program hasn't completed the "write" operation before your printf, you'll get the wrong value printed to the terminal. Try inserting a usleep between the write and the printf, see if that changes anything. This would also explain why SetPmacVar works, but the direct write appears not to work.
tweekzilla Posted October 8, 2012 Author Posted October 8, 2012 I put a sleep in (1 second) and I still see the same effect. I also check using the terminal to see if the bit has been set to zero. Another think I tried was just writing the value to the register i.e. tga->Chan[0].InCtrl = 4194375; And that did not work either.
shansen Posted October 8, 2012 Posted October 8, 2012 Are you sure you are setting tga->WpKey=$AAAAAAAA before the write?
tweekzilla Posted October 9, 2012 Author Posted October 9, 2012 tga->WpKey=0xAAAAAAAA Did the trick! Thanks everyone and as always it was in the software reference manual although I was being distracted by: "Furthermore, in the Script environment, many elements are write-protected so user code cannot change their values, but these elements can be read at any time. In the C environment, any element for which you are provided access (that is, whose name is provided in the RtGpShm.h header file) can be written to. " Which I wrongly assumed meant that the registers were not write-protected.
Recommended Posts