From 9414322a192e4c39d99c482dbb901bdf16a18310 Mon Sep 17 00:00:00 2001 From: Tristan Krause Date: Tue, 2 Apr 2019 15:32:51 +0200 Subject: [PATCH] endlich geht mal wieder was --- firmware/B15F.elf | Bin 15308 -> 16060 bytes firmware/B15F.hex | 546 +++++++++++++++++++++------------------- firmware/Makefile | 4 +- firmware/global_vars.h | 6 - firmware/interrupts.cpp | 12 + firmware/main.cpp | 70 +----- firmware/requests.cpp | 103 ++++---- firmware/requests.h | 16 ++ firmware/tlc5615.cpp | 2 +- firmware/usart.cpp | 76 ++++-- firmware/usart.h | 58 +++-- 11 files changed, 481 insertions(+), 412 deletions(-) create mode 100644 firmware/interrupts.cpp diff --git a/firmware/B15F.elf b/firmware/B15F.elf index b34092436c3271b202b728aea4347c2659d3908b..baaa71ed62a9b086bf2421a6daa22aa5debae1fa 100755 GIT binary patch literal 16060 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 +#include "global_vars.h" + +ISR(USART0_RX_vect) +{ + usart.handleRX(); +} + +ISR(USART0_TX_vect) +{ + usart.handleTX(); +} diff --git a/firmware/main.cpp b/firmware/main.cpp index 2a86cde..ae7dfca 100644 --- a/firmware/main.cpp +++ b/firmware/main.cpp @@ -9,46 +9,8 @@ #define WDT_TIMEOUT WDTO_1S -uint8_t const rq_len[] = { - /* RQ_DISC */ 1, - /* RQ_TEST */ 2, - /* RQ_INFO */ 1, - /* RQ_INT */ 3, - /* [ reserved ] */ 0, - /* RQ_BA0 */ 2, - /* RQ_BA1 */ 2, - /* RQ_BE0 */ 1, - /* RQ_BE1 */ 1, - /* RQ_AA0 */ 3, - /* RQ_AA1 */ 3, - /* RQ_ADC */ 2, - /* RQ_ADC_DAC_STROKE */ 9 -}; - - - - - void handleRequest(void); -ISR(USART0_RX_vect) -{ - receive_buffer[receive_pos] = UDR0; - receive_pos++; - - if(receive_pos == rq_len[receive_buffer[0]]) // last byte - { - receive_pos = 0; - handleRequest(); - } -} - -ISR(USART0_TX_vect) -{ - if(send_pos < send_len) - UDR0 = send_buffer[send_pos++]; -} - void initAll() { ((SPI*) &spi)->init(); @@ -60,7 +22,8 @@ void initAll() ((MCP23S17*) &sw)->setDirB(0xFF); // alle Eingang ((ADU*) &adu)->init(); - ((USART*) &usart)->init(); + usart.init(&handleRequest); + usart.initRX(); // aktiviere Interrupts sei(); @@ -72,17 +35,14 @@ void initAll() } void handleRequest() -{ - wdt_disable(); - - const uint8_t req = ((USART*) &usart)->readByte(); - send_pos = 0; - +{ // starte WDT wdt_enable(WDT_TIMEOUT); wdt_reset(); - //((MCP23S17*) &beba0)->writePortA(receive_buffer[0]); + const uint8_t req = usart.readByte(); + ((MCP23S17*) &beba1)->writePortA(req); + switch(req) { case RQ_DISC: @@ -135,34 +95,24 @@ void handleRequest() default: break; } - //((MCP23S17*) &beba1)->writePortA(0x00); - receive_pos = 0; - + usart.initRX(); + + wdt_disable(); } int main() { - initAll(); - // Reset anzeigen ((MCP23S17*) &beba0)->writePortA(0xFF); _delay_ms(100); ((MCP23S17*) &beba0)->writePortA(0x00); - uint8_t n = 0; - uint8_t block[16]; while(1) { - //testAll(); - _delay_ms(1); - } - - while(1) - { - handleRequest(); + _delay_ms(10); } return 0; diff --git a/firmware/requests.cpp b/firmware/requests.cpp index 968a18d..53c1bf9 100644 --- a/firmware/requests.cpp +++ b/firmware/requests.cpp @@ -2,106 +2,107 @@ void rqTestConnection() { - uint8_t dummy = ((USART*) &usart)->readByte(); - ((USART*) &usart)->writeByte(USART::MSG_OK); - ((USART*) &usart)->writeByte(dummy); - ((USART*) &usart)->write(); + usart.initTX(); + uint8_t dummy = usart.readByte(); + usart.writeByte(USART::MSG_OK); + usart.writeByte(dummy); + usart.flush(); } void rqBoardInfo() { - ((USART*) &usart)->writeByte(3); // Anzahl an Strings - ((USART*) &usart)->write(); - - send_pos = 0; - ((USART*) &usart)->writeStr(DATE, sizeof(DATE)); - ((USART*) &usart)->write(); - - send_pos = 0; - ((USART*) &usart)->writeStr(TIME, sizeof(TIME)); - ((USART*) &usart)->write(); - - send_pos = 0; - ((USART*) &usart)->writeStr(FSRC, sizeof(FSRC)); - ((USART*) &usart)->writeByte(USART::MSG_OK); - ((USART*) &usart)->write(); + usart.initTX(); + usart.writeByte(3); // Anzahl an Strings + usart.writeStr(DATE, sizeof(DATE)); + usart.writeStr(TIME, sizeof(TIME)); + usart.writeStr(FSRC, sizeof(FSRC)); + usart.writeByte(USART::MSG_OK); + usart.flush(); } void rqTestIntConv() { - uint16_t d = ((USART*) &usart)->readInt(); - ((USART*) &usart)->writeInt(d * 3); - ((USART*) &usart)->write(); + usart.initTX(); + uint16_t d = usart.readInt(); + usart.writeInt(d * 3); + usart.flush(); } void rqDigitalWrite0() { - uint8_t port = ((USART*) &usart)->readByte(); + usart.initTX(); + uint8_t port = usart.readByte(); ((MCP23S17*) &beba0)->writePortA(port); - ((USART*) &usart)->writeByte(USART::MSG_OK); - ((USART*) &usart)->write(); + usart.writeByte(USART::MSG_OK); + usart.flush(); } void rqDigitalWrite1() { - uint8_t port = ((USART*) &usart)->readByte(); + usart.initTX(); + uint8_t port = usart.readByte(); ((MCP23S17*) &beba1)->writePortA(port); - ((USART*) &usart)->writeByte(USART::MSG_OK); - ((USART*) &usart)->write(); + usart.writeByte(USART::MSG_OK); + usart.flush(); } void rqDigitalRead0() { + usart.initTX(); uint8_t port = ((MCP23S17*) &beba0)->readPortB(); - ((USART*) &usart)->writeByte(port); - ((USART*) &usart)->write(); + usart.writeByte(port); + usart.flush(); } void rqDigitalRead1() { + usart.initTX(); uint8_t port = ((MCP23S17*) &beba1)->readPortB(); - ((USART*) &usart)->writeByte(port); - ((USART*) &usart)->write(); + usart.writeByte(port); + usart.flush(); } void rqAnalogWrite0() { - uint16_t value = ((USART*) &usart)->readInt(); + usart.initTX(); + uint16_t value = usart.readInt(); ((TLC5615*) &dac0)->setValue(value); - ((USART*) &usart)->writeByte(USART::MSG_OK); - ((USART*) &usart)->write(); + usart.writeByte(USART::MSG_OK); + usart.flush(); } void rqAnalogWrite1() { - uint16_t value = ((USART*) &usart)->readInt(); + usart.initTX(); + uint16_t value = usart.readInt(); ((TLC5615*) &dac1)->setValue(value); - ((USART*) &usart)->writeByte(USART::MSG_OK); - ((USART*) &usart)->write(); + usart.writeByte(USART::MSG_OK); + usart.flush(); } void rqAnalogRead() { - uint8_t channel = ((USART*) &usart)->readByte(); + usart.initTX(); + uint8_t channel = usart.readByte(); uint16_t value = ((ADU*) &adu)->getValue(channel); - ((USART*) &usart)->writeInt(value); - ((USART*) &usart)->write(); + usart.writeInt(value); + usart.flush(); } void rqAdcDacStroke() { - uint8_t channel_a = ((USART*) &usart)->readByte(); - uint8_t channel_b = ((USART*) &usart)->readByte(); + uint8_t channel_a = usart.readByte(); + uint8_t channel_b = usart.readByte(); - int16_t start = static_cast(((USART*) &usart)->readInt()); - int16_t delta = static_cast(((USART*) &usart)->readInt()); - int16_t count = static_cast(((USART*) &usart)->readInt()); + int16_t start = static_cast(usart.readInt()); + int16_t delta = static_cast(usart.readInt()); + int16_t count = static_cast(usart.readInt()); - //((USART*) &usart)->writeByte(USART::MSG_OK); + //usart.writeByte(USART::MSG_OK); count *= delta; ((MCP23S17*) &beba1)->writePortA(0xFF); @@ -113,8 +114,8 @@ void rqAdcDacStroke() uint16_t val_a = ((ADU*) &adu)->getValue(channel_a); uint16_t val_b = ((ADU*) &adu)->getValue(channel_b); - ((USART*) &usart)->writeInt(val_a); - ((USART*) &usart)->writeInt(val_b); + usart.writeInt(val_a); + usart.writeInt(val_b); /*union doubleword { @@ -130,12 +131,12 @@ void rqAdcDacStroke() do { wdt_reset(); - ret = ((USART*) &usart)->writeBlock(&(dw.byte[0]), 4); + ret = usart.writeBlock(&(dw.byte[0]), 4); if(ret == 0) return; } while(ret != USART::MSG_OK);*/ } - ((USART*) &usart)->writeByte(USART::MSG_OK); + usart.writeByte(USART::MSG_OK); } diff --git a/firmware/requests.h b/firmware/requests.h index 13d036e..2644a82 100644 --- a/firmware/requests.h +++ b/firmware/requests.h @@ -18,6 +18,22 @@ constexpr static uint8_t RQ_AA1 = 10; constexpr static uint8_t RQ_ADC = 11; constexpr static uint8_t RQ_ADC_DAC_STROKE = 12; +uint8_t const rq_len[] = { + /* RQ_DISC */ 1, + /* RQ_TEST */ 2, + /* RQ_INFO */ 1, + /* RQ_INT */ 3, + /* [ reserved ] */ 0, + /* RQ_BA0 */ 2, + /* RQ_BA1 */ 2, + /* RQ_BE0 */ 1, + /* RQ_BE1 */ 1, + /* RQ_AA0 */ 3, + /* RQ_AA1 */ 3, + /* RQ_ADC */ 2, + /* RQ_ADC_DAC_STROKE */ 9 +}; + void rqTestConnection(void); void rqBoardInfo(void); void rqTestIntConv(void); diff --git a/firmware/tlc5615.cpp b/firmware/tlc5615.cpp index 89c0681..521bef0 100644 --- a/firmware/tlc5615.cpp +++ b/firmware/tlc5615.cpp @@ -1,4 +1,4 @@ -#include "TLC5615.h" +#include "tlc5615.h" TLC5615::TLC5615(SPI& spi, uint8_t adr) : spi(spi), adr(adr) { diff --git a/firmware/usart.cpp b/firmware/usart.cpp index 5e78bcc..2bf4765 100644 --- a/firmware/usart.cpp +++ b/firmware/usart.cpp @@ -1,6 +1,8 @@ #include "usart.h" -void USART::init() +handler_t USART::receive_handler = nullptr; + +void USART::init(handler_t handler) volatile { UCSR0A = _BV(U2X0); @@ -13,9 +15,11 @@ void USART::init() UBRR0H = (((F_CPU / (8UL * BAUDRATE))-1) >> 8) & 0xFF; UBRR0L = ((F_CPU / (8UL * BAUDRATE))-1) & 0xFF; + receive_handler = handler; + send_active = false; } -void USART::clearInputBuffer() +void USART::clearInputBuffer() volatile { uint8_t dummy; do @@ -29,35 +33,77 @@ void USART::clearInputBuffer() return; } -void USART::write(void) +void USART::handleRX(void) volatile { - send_len = send_pos; - send_pos = 0; - while (!(UCSR0A & (1<= rq_len[receive_buffer[0]]) // last byte + { + receive_pos = 0; + receive_handler(); + } } -void USART::writeByte(uint8_t b) +void USART::handleTX(void) volatile +{ + ((MCP23S17*) &beba0)->writePortA(send_pos); + if(send_pos < send_len) + { + while (!(UCSR0A & (1<>= 8; writeByte(v & 0xFF); } -void USART::writeStr(const char* str, uint8_t len) +void USART::writeStr(const char* str, uint8_t len) volatile { writeByte(len); while(len--) writeByte(*str++); } -uint8_t USART::writeBlock(uint8_t* ptr, uint8_t len) +uint8_t USART::writeBlock(uint8_t* ptr, uint8_t len) volatile { writeByte(len); @@ -79,19 +125,19 @@ uint8_t USART::writeBlock(uint8_t* ptr, uint8_t len) return readByte(); } -uint8_t USART::readByte() +uint8_t USART::readByte() volatile { return receive_buffer[receive_pos++]; } -uint16_t USART::readInt() +uint16_t USART::readInt() volatile { uint16_t v = readByte(); v |= readByte() << 8; return v; } -void USART::nextByte(uint8_t byte) +void USART::nextByte(uint8_t byte) volatile { switch(seq) { @@ -164,7 +210,7 @@ void USART::nextByte(uint8_t byte) block_pos++; } -void USART::readBlock(uint8_t* ptr, uint8_t offset) +void USART::readBlock(uint8_t* ptr, uint8_t offset) volatile { ptr += offset; uint8_t crc = 0x7F; diff --git a/firmware/usart.h b/firmware/usart.h index 52bccc0..f3f970f 100644 --- a/firmware/usart.h +++ b/firmware/usart.h @@ -4,13 +4,14 @@ #include #include #include +#include + +class USART; +#include "global_vars.h" +#include "requests.h" -extern volatile uint8_t receive_buffer[32]; -extern volatile uint8_t receive_pos; -extern volatile uint8_t send_buffer[32]; -extern volatile uint8_t send_pos; -extern volatile uint8_t send_len; +typedef void (*handler_t)(void); enum BlockSequence { @@ -23,38 +24,57 @@ enum BlockSequence class USART { -public: - void init(void); - void clearInputBuffer(void); +public: + + void init(handler_t handler) volatile; + void clearInputBuffer(void) volatile; - void writeByte(uint8_t); - void writeInt(uint16_t); - void writeLong(uint32_t); - void writeStr(const char*, uint8_t); + void writeByte(uint8_t) volatile; + void writeInt(uint16_t) volatile; + void writeStr(const char*, uint8_t) volatile; - uint8_t writeBlock(uint8_t*, uint8_t); - uint8_t readByte(void); - uint16_t readInt(void); - uint32_t readLong(void); - void write(void); + uint8_t readByte(void) volatile; + uint16_t readInt(void) volatile; + + // NEU + void handleRX(void) volatile; + void handleTX(void) volatile; + + void initRX(void) volatile; + void initTX(void) volatile; + void flush(void) volatile; - void nextByte(uint8_t byte); - void readBlock(uint8_t*, uint8_t); + // Blockgedöns + void nextByte(uint8_t byte) volatile; + uint8_t writeBlock(uint8_t*, uint8_t) volatile; + void readBlock(uint8_t*, uint8_t) volatile; constexpr static uint8_t MSG_OK = 0xFF; constexpr static uint8_t MSG_FAIL = 0xFE; uint8_t block_pos = 0; + + // constants constexpr static uint32_t BAUDRATE = 115200; // 38400 constexpr static uint8_t CRC7_POLY = 0x91; constexpr static uint8_t MAX_BLOCK_SIZE = 64; constexpr static uint8_t BLOCK_END = 0x80; + + volatile uint8_t send_buffer[128]; private: + static handler_t receive_handler; uint8_t block_buffer[MAX_BLOCK_SIZE + 3]; // don't store BLOCK_END byte uint8_t crc; + BlockSequence seq = BlockSequence::IDLE; + + volatile uint8_t receive_buffer[32]; + volatile uint8_t receive_pos; + volatile uint8_t send_pos; + volatile uint8_t send_len; + volatile bool send_active; }; #endif // USART_H