( Pilote des moteurs pas a pas. Version 0.10 du 8 Juillet 2012. Ecrit par jpb.forth . ) TELECHARGEMENT DECIMAL ( Moteur pas a pas: ----------------- 1 tour = 120 pas (3 degres/pas) Bits[7]: 1 a l'angle 0, 0 pour les autres angles Bits[6..4]: Moteur_I Moteur_G Moteur (lecture/ecriture) Bits[3..0]: Phase_4 Phase_3 Phase_2 Phase_1 (lecture/ecriture) ) HERE BIN 0001 , 0011 , 0010 , 0110 , 0100 , 1100 , 1000 , 1001 , DECIMAL CONSTANT TABLE_PAS 0 VARIABLE PAS 0 VARIABLE PAS_G 0 VARIABLE PAS_I -1 VARIABLE POSITION ( 0 --> 119, si negatif alors recherche de 0 ) -1 VARIABLE POSITION_G -1 VARIABLE POSITION_I 0 VARIABLE CONSIGNE ( 0 --> 119 ) 0 VARIABLE CONSIGNE_G 0 VARIABLE CONSIGNE_I 0 VARIABLE MOTEUR_PRET TACHE: T_MOTEUR 16 128+ 7 I2C_PCF8574A_C! CONSIGNE @ POSITION @ DUP 0< IF 7 I2C_PCF8574A_C@ 0< IF DUP XOR DUP DUP DUP POSITION ! PAS ! ELSE PAS DUP >R @ 2+ 14 AND DUP R> ! TABLE_PAS + @ THEN ELSE DUP 0= 7 I2C_PCF8574A_C@ 0< XOR IF -1 OR DUP POSITION ! PAS DUP >R @ 2+ 14 AND DUP R> ! TABLE_PAS + @ ELSE OVER >R DUP R> - DUP IF DUP 60 > IF 120- ELSE DUP -59 < IF 120+ THEN THEN 0< IF 1+ 2 ELSE 1- -2 THEN >R DUP 0< IF 120+ ELSE DUP 119 > IF 120- THEN THEN DUP POSITION ! R> PAS DUP >R @ + 14 AND DUP R> ! TABLE_PAS + @ THEN THEN THEN DUP 128 OR 7 I2C_PCF8574A_C! DUP 0= NOT 16 AND 128+ OR 7 I2C_PCF8574A_C! - IF 5 T_MOTEUR T_ACTIVE THEN ; TACHE: T_MOTEUR_G 32 128+ 7 I2C_PCF8574A_C! CONSIGNE_G @ POSITION_G @ DUP 0< IF 7 I2C_PCF8574A_C@ 0< IF DUP XOR DUP DUP DUP POSITION_G ! PAS_G ! ELSE PAS_G DUP >R @ 2+ 14 AND DUP R> ! TABLE_PAS + @ THEN ELSE DUP 0= 7 I2C_PCF8574A_C@ 0< XOR IF -1 OR DUP POSITION_G ! PAS_G DUP >R @ 2+ 14 AND DUP R> ! TABLE_PAS + @ ELSE OVER >R DUP R> - DUP IF DUP 60 > IF 120- ELSE DUP -59 < IF 120+ THEN THEN 0< IF 1+ 2 ELSE 1- -2 THEN >R DUP 0< IF 120+ ELSE DUP 119 > IF 120- THEN THEN DUP POSITION_G ! R> PAS_G DUP >R @ + 14 AND DUP R> ! TABLE_PAS + @ THEN THEN THEN DUP 128 OR 7 I2C_PCF8574A_C! DUP 0= NOT 32 AND 128+ OR 7 I2C_PCF8574A_C! - IF 5 T_MOTEUR_G T_ACTIVE THEN ; TACHE: T_MOTEUR_I 64 128+ 7 I2C_PCF8574A_C! CONSIGNE_I @ POSITION_I @ DUP 0< IF 7 I2C_PCF8574A_C@ 0< IF DUP XOR DUP DUP DUP POSITION_I ! PAS_I ! ELSE PAS_I DUP >R @ 2+ 14 AND DUP R> ! TABLE_PAS + @ THEN ELSE DUP 0= 7 I2C_PCF8574A_C@ 0< XOR IF -1 OR DUP POSITION_I ! PAS_I DUP >R @ 2+ 14 AND DUP R> ! TABLE_PAS + @ ELSE OVER >R DUP R> - DUP IF DUP 60 > IF 120- ELSE DUP -59 < IF 120+ THEN THEN 0< IF 1+ 2 ELSE 1- -2 THEN >R DUP 0< IF 120+ ELSE DUP 119 > IF 120- THEN THEN DUP POSITION_I ! R> PAS_I DUP >R @ + 14 AND DUP R> ! TABLE_PAS + @ THEN THEN THEN DUP 128 OR 7 I2C_PCF8574A_C! DUP 0= NOT 64 AND 128+ OR 7 I2C_PCF8574A_C! - IF 5 T_MOTEUR_I T_ACTIVE THEN ; : MOTEUR_INIT MOTEUR_PRET @ NOT IF 49152 T_MOTEUR T_AJOUTE 49152 T_MOTEUR_G T_AJOUTE 49152 T_MOTEUR_I T_AJOUTE -1 MOTEUR_PRET ! THEN ; : MOTEUR_RETIRE MOTEUR_PRET @ IF T_MOTEUR T_RETIRE T_MOTEUR_G T_RETIRE T_MOTEUR_I T_RETIRE 0 DUP PAS ! DUP PAS_G ! DUP PAS_I ! DUP CONSIGNE ! DUP CONSIGNE_G ! DUP CONSIGNE_I ! DUP MOTEUR_PRET ! COM DUP POSITION ! DUP POSITION_G ! POSITION_I ! THEN ; : MOTEUR ( consigne --> - ) DUP 0< IF DROP MOTEUR_RETIRE ELSE 120 MOD DUP POSITION - IF MOTEUR_INIT CONSIGNE ! 15 T_MOTEUR T_ACTIVE ELSE DROP THEN THEN ; : MOTEUR_G ( consigne --> - ) DUP 0< IF DROP MOTEUR_RETIRE ELSE 120 MOD DUP POSITION_G - IF MOTEUR_INIT CONSIGNE_G ! 15 T_MOTEUR_G T_ACTIVE ELSE DROP THEN THEN ; : MOTEUR_I ( consigne --> - ) DUP 0< IF DROP MOTEUR_RETIRE ELSE 120 MOD DUP POSITION_I - IF MOTEUR_INIT CONSIGNE_I ! 15 T_MOTEUR_I T_ACTIVE ELSE DROP THEN THEN ; ' MOTEUR 4- DUP ' TABLE_PAS 4- DUP 2@ - - SWAP 2! DICO_INIT ( FIN )