From 35268c53ae39d9e15013d19c2d051a0b86179fa9 Mon Sep 17 00:00:00 2001 From: Markus Koch Date: Sun, 10 Nov 2019 18:11:09 +0100 Subject: [PATCH] printer: avr: Update to new hardware * Update I/O constraints * Remove SPI code (some left for future reference) * Launch test code instead of printer program --- printer/avr/Makefile | 6 +- printer/avr/main.c | 367 ++++++++++++++++++++++--------------------- 2 files changed, 194 insertions(+), 179 deletions(-) diff --git a/printer/avr/Makefile b/printer/avr/Makefile index 4b5f434..29fbf89 100644 --- a/printer/avr/Makefile +++ b/printer/avr/Makefile @@ -1,5 +1,6 @@ MCU=atmega8 -CFLAGS=-g -Wall -mcall-prologues -mmcu=$(MCU) -O2 -DF_CPU=8000000 +PDEV=/dev/ttyUSB0 +CFLAGS=-g -Wall -mcall-prologues -mmcu=$(MCU) -O2 -DF_CPU=16000000 LDFLAGS=-Wl,-gc-sections -Wl,-relax CC=avr-gcc TARGET=main @@ -18,8 +19,7 @@ clean: avr-size -C --mcu=atmega8 main.obj program: $(TARGET).obj - avrdude -p $(MCU) -c usbasp -U flash:w:$(TARGET).hex - #avrdude -p $(MCU) -P /dev/ttyUSB1 -c arduino -b 57600 -U flash:w:$(TARGET).hex + avrdude -p $(MCU) -P $(PDEV) -c arduino -b 19200 -U flash:w:$(TARGET).hex fuse: avrdude -p m8 -c usbasp -U lfuse:w:0xe4:m -U hfuse:w:0xd9:m diff --git a/printer/avr/main.c b/printer/avr/main.c index de12264..4d8b0f1 100644 --- a/printer/avr/main.c +++ b/printer/avr/main.c @@ -5,7 +5,6 @@ #include #define BAUDRATE 9600 -#define UBRR 51 // (F_CPU / BAUDRATE) / 32 inline void spi_process_data(); @@ -17,7 +16,7 @@ enum TIMERS{TIM_CARRIAGE, TIMS}; #define TIMESCALE 4 -#define sleep_ms(channel, time_ms) sleep(channel, time_ms / TIMESCALE) +#define sleep_ms(channel, time_ms) sleep(channel, time_ms * TIMESCALE) volatile uint16_t timer[TIMS]; #define set_timer(channel, time_systicks) {timer[channel] = time_systicks;} @@ -30,8 +29,6 @@ uint8_t block_for(uint8_t channel, uint16_t time_systicks) return 0; } -uint8_t system_status; // CAUTION: Must not be updated from interrupts! - ISR (TIMER1_COMPA_vect) { uint8_t i; @@ -40,8 +37,6 @@ ISR (TIMER1_COMPA_vect) timer[i]--; } } - if (SPSR & (1< align daisy wheel assembly */ - for (i = 0; i < (96 + 1) * 2; ) { + for (i = 0; i < (96 + 1 + 6) * 2; ) { if (block_for(TIM_WHEEL, STEPPER_CFG_WHEEL.delay)) { STEPPER_NEXT(WHEEL, -1); i++; @@ -618,7 +624,7 @@ void align_daisy_wheel() STEPPER_STOP(WHEEL); _delay_ms(STEPPER_CFG_WHEEL.delay * REVERSAL_MULTIPLIER); - for (i = 0; i < 4;) { + for (i = 0; i < 3;) { if (block_for(TIM_WHEEL, STEPPER_CFG_WHEEL.delay)) { STEPPER_NEXT(WHEEL, 1); i++; @@ -628,7 +634,7 @@ void align_daisy_wheel() stepper_status_WHEEL.ldir = 1; stepper_status_WHEEL.target_pos = 0; - stepper_status_WHEEL.pos = 4; + stepper_status_WHEEL.pos = 0; debug_write("[whl] Alignment completed.\r\n"); } @@ -666,90 +672,6 @@ void initialize_paperfeed() debug_write("[lfd] Initialization completed.\r\n"); } -//int system_test_auto() -//{ -// char c; -// int do_it = 0; -// int print_stat = 0; - -// debug_write("[sys] Entering system test mode\r\n"); -// debug_write(">"); - -// while(1) { -// if (UCSRA & (1 << RXC)) { -// print_stat = 1; -// c = UDR; - -// if (c >= '0' && c <= '9') { -// stepper_status_CARRIAGE.target_pos = 100 * (c - '0'); -// } else { -// switch (c) { -// case ' ': -// stepper_status_CARRIAGE.target_pos += 10; -// break; -// case 'z': -// if (stepper_status_CARRIAGE.target_pos >= 10) -// stepper_status_CARRIAGE.target_pos -= 10; -// break; -// case 'r': -// move_carriage_to_far_left(0); -// break; -// case 'h': -// DCMOTOR_EN; -// arm_hammer(); -// _delay_ms(100); /* Note, this also locks the carriage movement -> important! */ -// DCMOTOR_STOP; -// break; -// default: -// break; -// } - -// switch (c) { -// case '\'': -// //if (stepper_status_WHEEL.target_pos >= 2) -// SET_TARGET_DELTA(WHEEL, -2); -// debug_printf("[whl] New wheel: %d\r\n", stepper_status_WHEEL.target_pos); -// break; -// case ',': -// SET_TARGET_DELTA(WHEEL, 2); -// debug_printf("[whl] New wheel: %d\r\n", stepper_status_WHEEL.target_pos); -// break; -// case 'w': -// align_daisy_wheel(); -// break; -// case 't': -// stepper_status_WHEEL.target_pos += 2; -// stepper_status_CARRIAGE.target_pos += 10; -// do_it = 1; -// break; -// default: -// break; -// } -// } -// } - -// stepper_perform_movement(&stepper_status_CARRIAGE, &STEPPER_CFG_CARRIAGE); -// stepper_perform_movement(&stepper_status_WHEEL, &STEPPER_CFG_WHEEL); - -// if (POSITION_REACHED(WHEEL) && POSITION_REACHED(CARRIAGE) && print_stat) { -// print_stat = 0; -// debug_printf("[pos] CAR: %u\r\n[pos] WHL: %u\r\n", -// stepper_status_CARRIAGE.pos, -// stepper_status_WHEEL.pos); -// } - -// if (do_it) { -// if (stepper_status_CARRIAGE.pos == stepper_status_CARRIAGE.target_pos) { -// do_it = 0; -// DCMOTOR_EN; -// arm_hammer(); -// _delay_ms(100); -// DCMOTOR_STOP; -// } -// } -// } -//} - //void printer_test() //{ // uint8_t buf[80] = {0}; @@ -835,8 +757,8 @@ void initialize_paperfeed() //{ // debug_write("[tmr] System timer test\r\n"); // while (1) { -// if (block_for(0, 1000*4)) { -// debug_write("hello"); +// if (block_for(0, 1000 * TIMESCALE)) { +// debug_write("hello\n"); // } // } //} @@ -871,62 +793,20 @@ volatile uint8_t print_buffer_rd = 0; #define SPI_COMMAND_SYSTEM_BACKLIGHT 0x40 -#define UART_CMD_ACK_KEYPRESS 'A' - -#define SPI_GET_CS (!(PINB & (1 << 2))) #define UART_BYTE_READY (UCSRA & (1 << RXC)) -volatile uint8_t spi_command = SPI_COMMAND_NONE; -volatile uint8_t keys_to_be_acked = 0; -/* This function needs to be fast AF! */ inline void spi_process_data() { - switch (spi_command) { - case SPI_COMMAND_KEYBOARD_GETKEY: /* Needs to be first, quick reply expected. */ - if (UART_BYTE_READY) { - SPDR = UDR; - keys_to_be_acked++; - } else { - SPDR = 0x00; - } - break; - - /* !!! Only no-reply commands below !!! */ - case SPI_COMMAND_NONE: /* This is the start of the transaction */ - spi_command = SPDR; - break; - - case SPI_COMMAND_PRINTER_WRITE: - print_buffer[print_buffer_wr++] = SPDR; // WARNING: No overflow protection - // Will auto wrap at 256; print_buffer_wr = print_buffer_wr % PRINT_BUFFER_SIZE; - break; - - default: - //SPDR = 0x0; - break; - - } + //print_buffer[print_buffer_wr++] = SPDR; // WARNING: No overflow protection + // Will auto wrap at 256; print_buffer_wr = print_buffer_wr % PRINT_BUFFER_SIZE; } -ISR(SPI_STC_vect) +/*ISR(SPI_STC_vect) { - spi_process_data(); -} -void ioc_process() -{ - if (!SPI_GET_CS) { - /* Cancel the current command */ - spi_command = SPI_COMMAND_NONE; - SPDR = system_status; // TODO: status 1 - } - if (keys_to_be_acked && (UCSRA & (1 << UDRE))) { - UDR = UART_CMD_ACK_KEYPRESS; - keys_to_be_acked--; - } +}*/ -} #define PRINT_CHARACTER_WIDTH 10 #define PRINT_LINE_HEIGHT 34 @@ -1167,16 +1047,155 @@ void printer_process() stepper_perform_movement(&stepper_status_WHEEL, &STEPPER_CFG_WHEEL); } +int system_test_auto() +{ + char c; + int do_it = 0; + int print_stat = 0; + static int goto_wheel = 0; + + debug_write("[sys] Entering system test mode\r\n"); + debug_write(">"); + + while(1) { + if (UCSRA & (1 << RXC)) { + print_stat = 1; + c = UDR; + + if (goto_wheel) { + goto_wheel = 0; + SET_TARGET(WHEEL, (GET_PRINT_CODE(c)) * 2); + } else if (c >= '0' && c <= '9') { + stepper_status_CARRIAGE.target_pos = 100 * (c - '0'); + } else { + /* Linefeed control */ + switch (c) { + case '=': + stepper_status_LINEFEED.target_pos += 10; + break; + case '\\': + if (stepper_status_LINEFEED.target_pos >= 10) + stepper_status_LINEFEED.target_pos -= 10; + break; + default: + break; + } + + /* Carriage control */ + // Note: Characters 0 - 9 for carriage handled in if above + switch (c) { + case ' ': + stepper_status_CARRIAGE.target_pos += 10; + break; + case 'z': + if (stepper_status_CARRIAGE.target_pos >= 10) + stepper_status_CARRIAGE.target_pos -= 10; + break; + case 'r': + move_carriage_to_far_left(0); + break; + default: + break; + } + + /* DC component control (Hammer / correction / motor) */ + switch (c) { + case 'h': + DCMOTOR_EN; + arm_hammer(); + _delay_ms(100); /* Note, this also locks the carriage movement -> important! */ + DCMOTOR_STOP; + break; + case 'H': + arm_hammer(); + break; + case 'c': + arm_correction(); + break; + case 'm': + DCMOTOR_STOP; + break; + case 'M': + DCMOTOR_EN; + break; + default: + break; + } + + /* Wheel control */ + switch (c) { + case 'g': + goto_wheel = 1; + break; + case '\'': + //if (stepper_status_WHEEL.target_pos >= 2) + SET_TARGET_DELTA(WHEEL, -2); + debug_printf("[whl] New wheel: %d\r\n", stepper_status_WHEEL.target_pos); + break; + case ',': + SET_TARGET_DELTA(WHEEL, 2); + debug_printf("[whl] New wheel: %d\r\n", stepper_status_WHEEL.target_pos); + break; + case '"': + //if (stepper_status_WHEEL.target_pos >= 2) + SET_TARGET_DELTA(WHEEL, -60); + debug_printf("[whl] New wheel: %d\r\n", stepper_status_WHEEL.target_pos); + break; + case '<': + SET_TARGET_DELTA(WHEEL, 60); + debug_printf("[whl] New wheel: %d\r\n", stepper_status_WHEEL.target_pos); + break; + case 'w': + align_daisy_wheel(); + break; + case 't': + stepper_status_WHEEL.target_pos += 2; + stepper_status_CARRIAGE.target_pos += 10; + do_it = 1; + break; + default: + break; + } + } + } + + stepper_perform_movement(&stepper_status_CARRIAGE, &STEPPER_CFG_CARRIAGE); + stepper_perform_movement(&stepper_status_WHEEL, &STEPPER_CFG_WHEEL); + stepper_perform_movement(&stepper_status_LINEFEED, &STEPPER_CFG_LINEFEED); + + if (POSITION_REACHED(WHEEL) && POSITION_REACHED(CARRIAGE) && POSITION_REACHED(LINEFEED) && print_stat) { + print_stat = 0; + debug_printf("[pos] %uL %uC%c %uW\r\n", + stepper_status_LINEFEED.pos, + stepper_status_CARRIAGE.pos, + (LIMITSWITCH ? '*' : '+'), + stepper_status_WHEEL.pos); + } + + if (do_it) { + if (stepper_status_CARRIAGE.pos == stepper_status_CARRIAGE.target_pos) { + do_it = 0; + DCMOTOR_EN; + arm_hammer(); + _delay_ms(100); + DCMOTOR_STOP; + } + } + } +} + void mainloop() { while (1) { printer_process(); - ioc_process(); } } int main() { + /* Disable interrupts */ + cli(); + /* Pre-init I/O */ DDRB = 0; DDRC = 0; @@ -1187,12 +1206,8 @@ int main() /* Set up UART */ UCSRB = (1 << TXEN) | (1 << RXEN); - UBRRH = (UBRR >> 8) & 0xFF; - UBRRL = UBRR & 0xFF; - - /* Set up SPI */ - DDRB |= (1 << PB4); - SPCR = (1 << SPE) | (1 << CPOL) | (1 << CPHA) | (1 << SPIE); + UBRRH = ((((F_CPU / BAUDRATE) / 16) - 1) >> 8); + UBRRL = (((F_CPU / BAUDRATE) / 16) - 1); /* Set up DC components */ MOTLIM(DDR) |= PIN_DCMOTOR; @@ -1208,25 +1223,25 @@ int main() /* Set up SysTick Timer */ TCCR1B = (1 << WGM12) | (1 << CS11); // f_tim = 8 MHz / 8 - OCR1A = 1000 / TIMESCALE; + OCR1A = 2000 / TIMESCALE; TIMSK = (1 << OCIE1A); /* Init system */ - system_status = 0; debug_write("\n\n\r[sys] STARTING IO CONTROLLER...\r\n"); debug_write("[sys] Enabling interrupts.\r\n"); sei(); /* Align printer */ initialize_paperfeed(); - move_carriage_to_far_left(1); - align_daisy_wheel(); - reset_printhead(); + //move_carriage_to_far_left(1); + //align_daisy_wheel(); + //reset_printhead(); debug_write("[sys] Startup completed.\r\n"); /* Run system */ - mainloop(); + system_test_auto(); + // mainloop(); // printer_test(); // system_test_auto(); // systick_test();