fl { Programmable Peripheral interface 8255 PropForth5.5 2013/04/18 15:10:42 There is level-shifter between 8255 and propeller. ------------------ | PA0(4)|----- 5V -------|Vcc PA1(3)|----- P0 ---------------------------------|RESET(35) PA2(2)|----- P1 ---------------------------------|CS(6) PA3(1)|----- P2 ---------------------------------|RD(5) PA4(40)|----- P3 ---------------------------------|WR(36) PA5(39)|----- P4 ---------------------------------|A0(9) PA6(38)|----- P5 ---------------------------------|A1(8) PA7(37)|----- --------- | PB0(18)|----- 3.3V ---|Vcca Vccb|---- 5V | PB1(19)|----- P6 -----------|A0 B0|-----------|D0(34) PB2(20)|----- P7 -----------|A1 B1|-----------|D1(33) PB3(21)|----- P8 -----------|A2 B2|-----------|D2(32) PB4(22)|----- P9 -----------|A3 B3|-----------|D3(31) PB5(23)|----- P10 -----------|A4 B4|-----------|D4(30) PB6(24)|----- P11 -----------|A5 B5|-----------|D5(29) PB7(25)|----- P12 -----------|A6 B6|-----------|D6(28) PC0(14)|----- P13 -----------|A7 B7|-----------|D7(27) PC1(15)|----- GND ----|GND OE|----GND | PC2(16)|----- --------- | PC3(17)|----- FXMA108 | PC4(13)|----- (Bideirectional level-shifter) | PC5(12)|----- | PC6(11)|----- | GND(7) PC7(10)|----- ------------------ | 8255 | GMD } 0 wconstant RESET 1 wconstant CS 2 wconstant RD 3 wconstant WR 4 wconstant addr 6 wconstant data h3FF wconstant mask 0 wconstant portA 1 wconstant portB 2 wconstant portC 3 wconstant ctl_reg : _cs_l CS pinlo ; : _cs_h CS pinhi ; : _rd_l RD pinlo ; : _rd_h RD pinhi ; : _wr_l WR pinlo ; : _wr_h WR pinhi ; \ Initialize 8255 \ ( -- ) : init_8255 \ Set output RESET d14 0 do dup pinout 1+ loop drop CS 3 0 do dup pinhi 1+ loop drop \ Reset 8255 RESET dup pinhi 1 delms pinlo ; \ Set mode0 \ ( n1 n2 n3 n4 -- ) n1:PortA(In:1 Out:0) n2:PortB(In:1 Out:0) n3:PortC7-4(In:1 Out:0) n3:PortC3-0(In:1 Out:0) : mode0 init_8255 _cs_l 0 \ PC3-PC0 swap if 1 or then \ PC7-PC4 swap if 8 or then \ PortB swap if 2 or then \ portA swap if h10 or then \ Set mode set flag h80 or data lshift \ Set address ctl_reg addr lshift or \ Set outa outa COG@ or outa COG! \ outpur wr_pulse _wr_l _wr_h _cs_h mask addr lshift invert outa COG@ and outa COG! ; \ Read data from portA/B/C \ ( n1 -- n2 ) n1:portA/B/C n2:data : data_In _cs_l addr lshift \ Set outa outa COG@ or outa COG! \ outpur rd_pulse _rd_l 1 delms ina COG@ 1 delms _rd_h \ Get reading data data rshift hFF and _cs_h mask addr lshift invert outa COG@ and outa COG! ; \ Write data to portA/B/C \ ( n1 n2 -- ) n1:data n2:portA/B/C : data_Out _cs_l addr lshift swap data lshift or \ Set outa outa COG@ or outa COG! \ outpur wr_pulse _wr_l _wr_h _cs_h mask addr lshift invert outa COG@ and outa COG! ; \ Bit output-test from PA(bit7-bit0) to PC(bit7-bit0) : demo_OUT 0 0 0 0 mode0 \ PortA h80 9 0 do dup portA data_Out 1 rshift d1000 delms loop drop \ PortB h80 9 0 do dup portB data_Out 1 rshift d1000 delms loop drop \ PortC h80 9 0 do dup portC data_Out 1 rshift d1000 delms loop drop ; \ Bit input-test from PA(bit7-bit0) to PC(bit7-bit0) : demo_IN hex 1 1 1 1 mode0 begin portA data_In ." portA:" . portB data_In ." portB:" . portC data_In ." portC:" . cr fkey? swap drop until decimal ; : test 1 1 1 1 mode0 begin 0 data_In . cr fkey? swap drop until ; : test1 0 0 0 0 mode0 1000 delms 1 addr lshift outa COG@ or outa COG! 1000 delms 2 addr lshift outa COG@ or outa COG! 1000 delms 1 data lshift outa COG@ or outa COG! d1000 delms 2 data lshift outa COG@ or outa COG! d1000 delms 4 data lshift outa COG@ or outa COG! d1000 delms 8 data lshift outa COG@ or outa COG! d1000 delms h10 data lshift outa COG@ or outa COG! d1000 delms h20 data lshift outa COG@ or outa COG! d1000 delms h40 data lshift outa COG@ or outa COG! d1000 delms h80 data lshift outa COG@ or outa COG! d1000 delms ;