Code post test
Robert Graham
Posts: 55
Ahhhh, much better indeed!
'' I/O 26 is the clock signal '' I/O 27 is the data signal '' This is a final version of the Demux prototype software. '' The output code switches all the previous preset's relays off before turning '' the current preset's relays on '' There is code here to ensure the two devices sync up. '' This is version 3. It is designed to drive a 16 bit multiplexer. Accordingly, the output method '' is written to generate addresses to drive the CD4067 chip. Version 4 will add outputs for however '' many more I/O pins are needed to drive the additional relays and LED's. CON _clkmode = xtal1 + pll16x ' Feedback and PLL multiplier _xinfreq = 5_000_000 ' External oscillator = 5 MHz VAR byte address[16] byte input[11] byte on[11] byte off[11] long stack[60] 'Makes memory available for the two cogs that will be running. PUB LaunchCogs cognew(Demux, @stack[0]) 'Launches Demux method in first available cog cognew(Output, @stack[20]) Pub Demux | munch 'create variable dira[26..27] := %00 'Sets I/O pins to input dira[0..4] := %11111 'Sets I/O pins to output repeat waitpeq(|< 26, |< 26, 0) 'wait for I/O 26 to transition to high waitcnt(clkfreq / 35000 + cnt) repeat munch from 0 to 7 'repeat the following block for input variable via 'munch 0 thru 7 if ina[27] == 1 'data inputs is high input[munch] := 1 'set input varable high else input[munch] := 0 'or set input variable low waitcnt(clkfreq / 50000 + cnt) ' Wait 1/50000 second -> 100000 Hz waitpne(|< 26, |< 26, 0) 'wait for I/O 26 to not match previous state Pub Output | pin, pintwo, poop dira[26..27] := %00 'Sets I/O pins to input dira[0..4] := %11111 'Sets I/O pins to output address[0] := %0000 address[1] := %1000 address[2] := %0100 address[3] := %1100 address[4] := %0010 address[5] := %1010 address[6] := %0110 address[7] := %1110 address[8] := %0001 address[9] := %1001 address[10] := %0101 address[11] := %1101 address[12] := %0011 address[13] := %1011 address[14] := %0111 address[15] := %1111 pin := 1 repeat 8 'Brief output to all relays to flip them to base state. outa[0..3] := address[pin] outa[4] := 1 waitcnt(clkfreq / 400 + cnt) outa[0..3] := address[pin] outa[4] := 0 pin += 2 repeat poop := 0 'Set values for the variables used in this method pin := 1 repeat 8 'Check input from the demux, and turn 'any relays from the previous preset off if input[poop] == 0 and on[poop] == 1 outa[0..3] := address[pin] outa[4] := 1 waitcnt(clkfreq / 400 + cnt) outa[4] := 0 on[poop] := 0 pin += 2 poop += 1 poop := 0 pin := 0 'Check input from the demux, and turn repeat 8 'any relays from the current preset on if input[poop] == 1 and on[poop] == 0 outa[0..3] := address[pin] outa[4] := 1 waitcnt(clkfreq / 400 + cnt) outa[4] := 0 on[poop] := 1 pin += 2 poop += 1