( Pilote des ports A et B. Version 0.10 du 22 Avril 2012. Ecrit par jpb.forth . ) TELECHARGEMENT DECIMAL ( Entrees sorties discretes A et B: --------------------------------- Ecriture: valeur[15..0] Lecture: (valeur&entree)[15..0] Voyant allume si valeur&entree = 1 ) 0 VARIABLE MSQ_PORT_A 0 VARIABLE MEM_PORT_A 0 VARIABLE PRG_PORT_A 0 VARIABLE MSQ_PORT_B 0 VARIABLE MEM_PORT_B 0 VARIABLE PRG_PORT_B : PORT_A_@ ( - --> n ) 49152 PRIORITE DUP >R DUP @ >R ! 0 I2C_PCF8574_C@ 8 LSH 1 I2C_PCF8574_C@ 255 AND + R> R> ! ; : PORT_B_@ ( - --> n ) 49152 PRIORITE DUP >R DUP @ >R ! 0 I2C_PCF8574A_C@ 8 LSH 1 I2C_PCF8574A_C@ 255 AND + R> R> ! ; : PORT_A_! ( n --> - ) 49152 PRIORITE DUP >R DUP @ >R ! DUP 1 I2C_PCF8574_C! -8 LSH 0 I2C_PCF8574_C! R> R> ! ; : PORT_B_! ( n --> - ) 49152 PRIORITE DUP >R DUP @ >R ! DUP 1 I2C_PCF8574A_C! -8 LSH 0 I2C_PCF8574A_C! R> R> ! ; TACHE: T_PORT_A PORT_A_@ DUP MEM_PORT_A @ XOR MSQ_PORT_A @ AND IF DUP MEM_PORT_A ! PRG_PORT_A 2@ EXECUTE ELSE DROP THEN ; TACHE: T_PORT_B PORT_B_@ DUP MEM_PORT_B @ XOR MSQ_PORT_B @ AND IF DUP MEM_PORT_B ! PRG_PORT_B 2@ EXECUTE ELSE DROP THEN ; : SYNC_PORT_A ( adr_prg,msq --> - ) OVER 0= OVER 0= OR IF DROP DROP MSQ_PORT_A @ IF T_PORT_A T_RETIRE 0 MSQ_PORT_A ! THEN ELSE DUP PORT_A_@ OR PORT_A_! PORT_A_@ OVER AND MEM_PORT_A ! MSQ_PORT_A ! PRG_PORT_A 2! 20 T_PORT_A 49152 OVER T_AJOUTE T_PERIODE THEN ; : SYNC_PORT_B ( adr_prg,msq --> - ) OVER 0= OVER 0= OR IF DROP DROP MSQ_PORT_B @ IF T_PORT_B T_RETIRE 0 MSQ_PORT_B ! THEN ELSE DUP PORT_B_@ OR PORT_B_! PORT_B_@ OVER AND MEM_PORT_B ! MSQ_PORT_B ! PRG_PORT_B 2! 20 T_PORT_B 49152 OVER T_AJOUTE T_PERIODE THEN ; : SORT_PORT_A ( n --> - ) MSQ_PORT_A @ OR PORT_A_! ; : SORT_PORT_B ( n --> - ) MSQ_PORT_B @ OR PORT_B_! ; ( Masquage des instructions inutilisees ) ' SYNC_PORT_A 4- DUP ' MSQ_PORT_A 4- DUP 2@ - - SWAP 2! DICO_INIT ( FIN )