mirror of
https://github.com/Derisis13/AT-VFD.git
synced 2025-12-07 03:42:49 +01:00
* 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:
@@ -8,11 +8,10 @@ set(TARGET_CPU ATmega88)
|
|||||||
|
|
||||||
add_compile_definitions("__AVR_${TARGET_CPU}__")
|
add_compile_definitions("__AVR_${TARGET_CPU}__")
|
||||||
include_directories(/usr/lib/avr/include)
|
include_directories(/usr/lib/avr/include)
|
||||||
|
set(CMAKE_C_FLAGS "-O3 -Wall")
|
||||||
|
|
||||||
add_link_options(-Wl,--print-memory-usage)
|
add_link_options(-Wl,--print-memory-usage)
|
||||||
add_executable(${PROJECT_NAME} main.c
|
add_executable(${PROJECT_NAME} main.c)
|
||||||
PT6302.c PT6302.h
|
|
||||||
)
|
|
||||||
|
|
||||||
add_custom_target(
|
add_custom_target(
|
||||||
FLASH
|
FLASH
|
||||||
|
|||||||
39
PT6302.c
39
PT6302.c
@@ -5,42 +5,3 @@
|
|||||||
#include <util/delay.h>
|
#include <util/delay.h>
|
||||||
#include "PT6302.h"
|
#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;
|
|
||||||
}
|
|
||||||
|
|||||||
11
PT6302.h
11
PT6302.h
@@ -5,17 +5,6 @@
|
|||||||
#ifndef _PT6302_H_
|
#ifndef _PT6302_H_
|
||||||
#define _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)
|
|
||||||
|
|
||||||
|
|
||||||
/* -------------------------------------------------------------
|
/* -------------------------------------------------------------
|
||||||
|
|||||||
58
main.c
58
main.c
@@ -1,13 +1,69 @@
|
|||||||
#define F_CPU 8000000UL
|
#define F_CPU 8000000UL
|
||||||
#include <avr/io.h>
|
#include <avr/io.h>
|
||||||
#include <util/delay.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 ()
|
int main ()
|
||||||
{
|
{
|
||||||
PT6302_startup ();
|
PT6302_startup ();
|
||||||
|
DDRC |= (1 << PC4);
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
|
PORTC |= (1 << PC4);
|
||||||
|
_delay_ms (1000);
|
||||||
|
PORTC &= ~(1 << PC4);
|
||||||
|
_delay_ms (1000);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user