From 60a7b1309eb4dd5625e5ab6c84eaa5bba7605581 Mon Sep 17 00:00:00 2001 From: Derisis13 Date: Wed, 2 Mar 2022 23:47:26 +0100 Subject: [PATCH] * optimisation: `-C3` compiler flag for optimised size * bugfix: correct order of setting `DDRn` and `PORTn` * optimisation: `enum` and `static const` instead of macros * optimisation: `PT6302_startup` is now `inline` * optimisation: functions are now static * bugfix: `data` is now rotated and stored instead of just rotating * special thanks to @kissadamfkut for pointing all of this out to me --- CMakeLists.txt | 5 ++--- PT6302.c | 39 -------------------------------- PT6302.h | 11 --------- main.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++-- 4 files changed, 60 insertions(+), 55 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e8d84ea..763268b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,11 +8,10 @@ set(TARGET_CPU ATmega88) add_compile_definitions("__AVR_${TARGET_CPU}__") include_directories(/usr/lib/avr/include) +set(CMAKE_C_FLAGS "-O3 -Wall") add_link_options(-Wl,--print-memory-usage) -add_executable(${PROJECT_NAME} main.c - PT6302.c PT6302.h - ) +add_executable(${PROJECT_NAME} main.c) add_custom_target( FLASH diff --git a/PT6302.c b/PT6302.c index ff879f8..b1e0554 100644 --- a/PT6302.c +++ b/PT6302.c @@ -5,42 +5,3 @@ #include #include "PT6302.h" -void PT6302_startup (void) -{ - PORTB |= (CSBpin | CLKBpin); - PORTB &= ~DINpin; - PORTC |= RSTpin; - DDRB |= (CSBpin | CLKBpin | DINpin); - DDRC |= RSTpin; - _delay_us (TPRZ); - PORTC &= ~RSTpin; - _delay_us (TWRSTB); -}; - -void transmit_bytes (const uint8_t *payload, const uint8_t size) -{ - PORTB &= ~CSBpin; - for (int i = 0; i < size; ++i) - { - uint8_t data = payload[i]; - for (int j = 0; j < 8; ++j) - { - PORTB &= ~CLKBpin; - if ((data & 0x01) == 0) - { - PORTB |= DINpin; - } - else - { - PORTB &= ~DINpin; - } - _delay_us (TCW); - PORTB |= CLKBpin; - _delay_us (TCW); - data >> 1; - } - _delay_us (TDOFF); - } - _delay_us (DTCSH); - PORTB |= CSBpin; -} diff --git a/PT6302.h b/PT6302.h index ac1cbbd..25891b6 100644 --- a/PT6302.h +++ b/PT6302.h @@ -5,17 +5,6 @@ #ifndef _PT6302_H_ #define _PT6302_H_ -/* PT6302 timing constants, all in usec */ -#define TCW 1 //CLKB pulse width -#define TDOFF 8 //Data processing time -#define DTCSH 16 //time difference between tDOFF and tCSH -#define TPRZ 100 //VDD rise time -#define TWRSTB 1 //RSTB pulse width - -#define RSTpin (uint8_t) (1 << PC2) -#define CSBpin (uint8_t) (1 << PB0) -#define CLKBpin (uint8_t) (1 << PB6) -#define DINpin (uint8_t) (1 << PB7) /* ------------------------------------------------------------- diff --git a/main.c b/main.c index 814ac37..8520a1d 100644 --- a/main.c +++ b/main.c @@ -1,13 +1,69 @@ #define F_CPU 8000000UL #include #include -#include "PT6302.h" +/* PT6302 timing constants, all in usec */ +static const uint8_t TCW = 1; //CLKB pulse width +static const uint8_t TDOFF = 8; //Data processing time +static const uint8_t DTCSH = 16; //time difference between tDOFF and tCSH +static const uint8_t TPRZ = 100; //VDD rise time +static const uint8_t TWRSTB = 1; //RSTB pulse width + +enum pins { + RSTpin = (1 << PC2), + CSBpin = (1 << PB0), + CLKBpin = (1 << PB6), + DINpin = (1 << PB7), +}; + +static inline void PT6302_startup (void) +{ + DDRB |= (CSBpin | CLKBpin | DINpin); + DDRC |= RSTpin; + PORTB |= (CSBpin | CLKBpin); + PORTB &= ~DINpin; + PORTC |= RSTpin; + _delay_us (TPRZ); + PORTC &= ~RSTpin; + _delay_us (TWRSTB); +} + +static void transmit_bytes (const uint8_t *payload, const uint8_t size) +{ + PORTB &= ~CSBpin; + for (int i = 0; i < size; ++i) + { + uint8_t data = payload[i]; + for (int j = 0; j < 8; ++j, data >>= 1) + { + PORTB &= ~CLKBpin; + if ((data & 0x01) == 0) + { + PORTB |= DINpin; + } + else + { + PORTB &= ~DINpin; + } + _delay_us (TCW); + PORTB |= CLKBpin; + _delay_us (TCW); + } + _delay_us (TDOFF); + } + _delay_us (DTCSH); + PORTB |= CSBpin; +} int main () { - PT6302_startup(); + PT6302_startup (); + DDRC |= (1 << PC4); while (1) { + PORTC |= (1 << PC4); + _delay_ms (1000); + PORTC &= ~(1 << PC4); + _delay_ms (1000); } }