/******* compass driver ***********/ #define porth 0x7C00 #define set_h bit_set(0x7e00,0b00000100) #define pc_low bit_clear(porth,0b00100000) #define pc_high bit_set(porth,0b00100000) #define sclk_low bit_clear(porth,0b01000000) #define sclk_high bit_set(porth,0b01000000) #define ss_low bit_clear(porth,0b00001000) #define ss_high bit_set(porth,0b00001000) #define reset_low bit_clear(porth,0b00010000) #define reset_high bit_set(porth,0b00010000) #define read_sdo input_j(1) #define check_eoc input_j(0) void reset_compass() {set_h; poke(porth,0); ss_high; pc_high; sclk_high; reset_high; reset_low; msleep(15L); reset_high; msleep(5L);} int read() {int i; int j; int heading; heading=0; sclk_high; ss_high; msleep(15L); pc_low; msleep(15L); pc_high; while(!check_eoc) {;} msleep(15L); ss_low; msleep(15L); for(i=1;i<8;i++) {sclk_low; msleep(5L); sclk_high; msleep(5L);} sclk_low; msleep(5L); sclk_high; msleep(5L); if(read_sdo==1) {heading=256;} msleep(15L); for(j=7;j>0;j--) {sclk_low; msleep(10L); sclk_high; msleep(10L); if(read_sdo != 0) {heading +=(int)((2.^(float)(j))+1.);}} sclk_low; msleep(5L); pc_high; sclk_high; return heading;} /*************************END*************************/