#include #include #include #include #include "lcd.h" #define FALSE 0 #define TRUE 1 #define USART_BAUD 1953 #define MY_UBRR (F_CPU/16/USART_BAUD)-1 static FILE lcd_stream = FDEV_SETUP_STREAM(lcd_putc, NULL, _FDEV_SETUP_WRITE); volatile int i = 0, c_req = 0, c_rep = 0, c_tx, c_rx; volatile unsigned char ecu_response = '\0'; volatile unsigned char ecu_current_cmd = '\0'; volatile uint8_t ecu_status = 0; /* 0 = Ready, 1 = Waiting for reply, 2 = Own Response Received, 3 = Reply Received */ unsigned int timer1_last = 0; void adc_setup() { ADCSRA |= /* PS=128 */_BV(ADPS2) | _BV(ADPS1) | _BV(ADPS0) | _BV(ADIE) | _BV(ADEN); ADMUX |= _BV(REFS0); /* AVCC reference */ // ADMUX |= _BV(ADLAR); /* Left-adjust values for easy 8-bit values */ } void uart_setup() { UBRRH = ((MY_UBRR) >> 8); UBRRL = MY_UBRR; UCSRC |= _BV(URSEL) | _BV(UCSZ0) | _BV(UCSZ1); UCSRB |= _BV(RXEN) | _BV(TXEN) | _BV(RXCIE); } uint8_t ecu_req(unsigned char req) { if ((UCSRA & _BV(UDRE)) && (ecu_status == 0)) { ecu_current_cmd = req; UDR = req; ecu_status = 1; c_tx++; return TRUE; } else { return FALSE; } } uint8_t ecu_reply() { if (ecu_status == 4) { ecu_status = 0; return TRUE; } else { return FALSE; } } void timer1_setup() { TCCR1B |= _BV(CS10) | _BV(CS12); } int main(void) { adc_setup(); uart_setup(); timer1_setup(); sei(); /* Enable interrupts */ lcd_init(LCD_DISP_ON); lcd_command(LCD_ON_CURSOR); stdout = &lcd_stream; printf("Penny."); for(;;) { unsigned int timer_check = 0; if (ecu_status == 4) { c_rep++; ecu_reply(); } if (ecu_status == 0) { c_req++; ecu_req(0x21); } timer_check = TCNT1; if (timer_check > 1800) { lcd_gotoxy(7, 1); fprintf(stdout, "E:%#x U:%3u", ecu_response, i); lcd_gotoxy(7, 2); fprintf(stdout, "T:%3u R:%3u", c_tx, c_rx); lcd_gotoxy(3, 3); fprintf(stdout, "S:%1u Q:%3u P:%3u",ecu_status, c_req, c_rep); TCNT1 = 0; i++; } } return 0; /* never reached */ } ISR(SIG_UART_RECV) { char x; c_rx++; x = UDR; if (ecu_status == 1) { ecu_status = 2; } else if (ecu_status == 2) { ecu_response = x; ecu_status = 3; } else if (ecu_status == 3) { if (x == 0xe0) { ecu_status = 4; } } }