* 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
This commit is contained in:
2022-03-02 23:47:26 +01:00
parent 69c4eb43e0
commit 60a7b1309e
4 changed files with 60 additions and 55 deletions

60
main.c
View File

@@ -1,13 +1,69 @@
#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
#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);
}
}