/* Assumes MSB first. */ void shift_out(uint8_t data) { for(uint8_t i = 0; i < 8; i++) { /* Write bit to data port. */ if (0 == (data & _BV(7 - i))) { digital_write(SHIFT_OUT_DATA, LOW); } else { digital_write(SHIFT_OUT_DATA, HIGH); } /* Pulse clock to write next bit. */ digital_write(SHIFT_OUT_CLOCK, LOW); digital_write(SHIFT_OUT_CLOCK, HIGH); } }
/* Assumes MSB first. */ uint8_t shift_in(void) { uint8_t byte = 0; uint8_t pin_value; for(int i=0; i<8; i++) { pin_value = digital_read(SHIFT_IN_DATA); byte |= (pin_value << ((8 - 1) - i)); /* printf("%d = %d \n", ((8 - 1) - i), pin_value); */ /* Pulse clock to write next bit. */ digital_write(SHIFT_IN_CLOCK, LOW); digital_write(SHIFT_IN_CLOCK, HIGH); } return byte; }
int main(void) { init(); uart_init(); stdout = &uart_output; stdin = &uart_input; uint8_t i; uint8_t register_value; uint8_t pin_value; while (1) { /* Read in parallel input by setting SH/LD low. */ digital_write(&PORT_SHLD, SHLD, 0); //_delay_ms(5); /* Freeze data by setting SH/LD high. When SH/LD is high data enters */ /* to reqisters from SER input and shifts one place to the right */ /* (Q0 -> Q1 -> Q2, etc.) with each positive-going clock transition. */ digital_write(&PORT_SHLD, SHLD, 1); register_value = 0; for(i=0; i<8; i++) { pin_value = digital_read(PIN_QH, QH); register_value |= (pin_value << ((8 - 1) - i)); printf("%d = %d \n", ((8 - 1) - i), pin_value); /* Pulse clock input (CP) LOW-HIGH to read next bit. */ digital_write(&PORT_CLK, CLK, 0); //_delay_ms(5); digital_write(&PORT_CLK, CLK, 1); } printf("%d \n", register_value); _delay_ms(2000); } return 0; }
int main(void) { init(); for(uint16_t i = 0; i < 0xffff; i++) { /* Shift high byte first to shift register. */ shift_out(i >> 8); shift_out(i & 0xff); /* Pulse latch to transfer data from shift registers */ /* to storage registers. */ digital_write(LATCH, LOW); digital_write(LATCH, HIGH); _delay_ms(50); } return 0; }
void io_init(void) { /* Extruder 0 Heater pin */ pin_mode(EXTRUDER_0_HEATER_PORT, EXTRUDER_0_HEATER_PIN, OUTPUT); extruder_heater_off(); /* Heated Bed 0 Heater pin */ pin_mode(HEATED_BED_0_HEATER_PORT, HEATED_BED_0_HEATER_PIN, OUTPUT); heated_bed_off(); /* setup I/O pins */ pin_mode(STEPPERS_RESET_PORT, STEPPERS_RESET_PIN, OUTPUT); digital_write(STEPPERS_RESET_PORT, STEPPERS_RESET_PIN, 1); /* Disable reset for all stepper motors */ pin_mode(X_STEP_PORT, X_STEP_PIN, OUTPUT); pin_mode(X_DIR_PORT, X_DIR_PIN, OUTPUT); pin_mode(X_ENABLE_PORT, X_ENABLE_PIN, OUTPUT); x_enable(); pin_mode(X_MIN_PORT, X_MIN_PIN, INPUT); pin_mode(Y_STEP_PORT, Y_STEP_PIN, OUTPUT); pin_mode(Y_DIR_PORT, Y_DIR_PIN, OUTPUT); pin_mode(Y_ENABLE_PORT, Y_ENABLE_PIN, OUTPUT); y_enable(); pin_mode(Y_MIN_PORT, Y_MIN_PIN, INPUT); pin_mode(Z_STEP_PORT, Z_STEP_PIN, OUTPUT); pin_mode(Z_DIR_PORT, Z_DIR_PIN, OUTPUT); pin_mode(Z_ENABLE_PORT, Z_ENABLE_PIN, OUTPUT); z_enable(); pin_mode(Z_MIN_PORT, Z_MIN_PIN, INPUT); pin_mode(E_STEP_PORT, E_STEP_PIN, OUTPUT); pin_mode(E_DIR_PORT, E_DIR_PIN, OUTPUT); pin_mode(E_ENABLE_PORT, E_ENABLE_PIN, OUTPUT); e_enable(); pin_mode(EXTRUDER_0_FAN_PORT, EXTRUDER_0_FAN_PIN, OUTPUT); extruder_fan_off(); adc_init(); }
void shift_out_latch(void) { digital_write(SHIFT_OUT_LATCH, LOW); digital_write(SHIFT_OUT_LATCH, HIGH); }
void shift_in_latch(void) { digital_write(SHIFT_IN_LATCH, LOW); digital_write(SHIFT_IN_LATCH, HIGH); }
void digital_write(const unsigned char& mbed_pin, const bool& mode) { digital_write(get_port(mbed_pin), get_pin(mbed_pin), mode); return; }