changing individual bits in a byte?
Brian Carpenter
Posts: 728
I have a challenge that i cant get past at the moment.
here is a snippet of code....
There is the setup...
What i am expecting to have happen in this code is the following-
For example if bit_0 and bit_1 on MotionScan were high, i get $0001_0001 as the output when i display variable ZoneMotionFlag.
I then went on to add the IF statements for bit_2 and bit_3 of the test against MotionScan. They dont write to ZoneMotionFlag correctly either.
ANY IDEAS as to why this is not working the way i had hoped?
here is a snippet of code....
CON 'BIT MASKS ZoneMask_0 = $0000_0001 ZoneMask_1 = $0000_0010 ZoneMask_2 = $0000_0100 ZoneMask_3 = $0000_1000 ZoneMask_4 = $0001_0000 ZoneMask_5 = $0010_0000 ZoneMask_6 = $0100_0000 ZoneMask_7 = $1000_0000 ADDRRLY = 56 'PCF8574A I2C Address (A0, A1, A2 all pulled low) ADDROPTO =63 CLS = 0 PresetOnTime = 30 VAR long longHIGH,longLOW,MM_DD_YYYY,DW_HH_MM_SS 'Expected 4-contigous variables byte Buffer[BUFFER_SIZE] LONG currentTime Long ontime Long offtime byte Today byte ZoneTimerFlag ' if the bit is high, it means that the timezone states that it should be on byte ZoneMotionFlag 'if the bit is high, it means that the motion was triggered in this zone. requesting it to turn on. long ZoneMotionTimer[6] ' this is to store the times for the motions long MotionScan byte RelayState PUB MotionStatus | RunTil, currentH, currentM ' Read inputs MotionScan:= IO.IN(ADDROPTO) currentH := (RTC.gethour) * 100 currentM := (RTC.getminutes) PlxST.str(string(" OPTO READING = ")) PlxST.bin(MotionScan,8) PlxST.char(13) IF (MotionScan & |< 0) 'RunTil := currentMinute + 30 IF currentm > PresetOnTime currentm -= PresetOnTime currenth += 100 PlxST.dec(currentm) RunTil := currentm + PresetOnTime RunTil += currentH IF RunTil > 2400 RunTil -= 2400 ZoneMotionTimer[0] := RunTil ZoneMotionFlag |= ZoneMask_0 currentH := (RTC.gethour) * 100 currentM := (RTC.getminutes) IF (MotionScan & |< 1) 'RunTil := currentMinute + 30 IF currentm > PresetOnTime currentm := currentm - PresetOnTime currenth := currenth + 100 PlxST.dec(currentm) RunTil := currentm + PresetOnTime RunTil := RunTil + currentH IF RunTil > 2400 RunTil := RunTil - 2400 ZoneMotionTimer[1] := RunTil ZoneMotionFlag |= ZoneMask_1 currentH := (RTC.gethour) * 100 currentM := (RTC.getminutes) IF (MotionScan & |< 2) 'RunTil := currentMinute + 30 IF currentm > PresetOnTime currentm := currentm - PresetOnTime currenth := currenth + 100 PlxST.dec(currentm) RunTil := currentm + PresetOnTime RunTil := RunTil + currentH IF RunTil > 2400 RunTil := RunTil - 2400 ZoneMotionTimer[2] := RunTil ZoneMotionFlag |= ZoneMask_2 currentH := (RTC.gethour) * 100 currentM := (RTC.getminutes) IF (MotionScan & |< 3) 'RunTil := currentMinute + 30 IF currentm > PresetOnTime currentm := currentm - PresetOnTime currenth := currenth + 100 PlxST.dec(currentm) RunTil := currentm + PresetOnTime RunTil := RunTil + currentH IF RunTil > 2400 RunTil := RunTil - 2400 ZoneMotionTimer[3] := RunTil ZoneMotionFlag |= ZoneMask_3 PlxST.str(string(" ZoneMotionFlag = ")) PlxST.bin(ZoneMotionFlag,8) PlxST.char(13)
There is the setup...
What i am expecting to have happen in this code is the following-
-
First the Input board is sampled and it populates variable MotionScan (this works correctly)
-
Then it starts with the first IF statement where we do a test on the state of the LSB, Bit 0 of the byte MotionScan. If it is a 1, we capture the time, add a preset amount to it (30) and then set bit 0 high on the byte ZoneMotionFlag.
-
Then the next IF where it is checking the next bit, bit_1 in the MotionScan and then proceeds like above. This is where we start to have problems. When This scenario is true and it goes to create bit_1 high on variable ZoneMotionFLag.
For example if bit_0 and bit_1 on MotionScan were high, i get $0001_0001 as the output when i display variable ZoneMotionFlag.
I then went on to add the IF statements for bit_2 and bit_3 of the test against MotionScan. They dont write to ZoneMotionFlag correctly either.
ANY IDEAS as to why this is not working the way i had hoped?
Comments