From f9367668a761010752cf9aeb4a87e21bcb47df5b Mon Sep 17 00:00:00 2001 From: vlapa Date: Sat, 13 Jun 2026 18:04:36 +0300 Subject: First --- src/main.cpp | 186 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 186 insertions(+) create mode 100644 src/main.cpp (limited to 'src/main.cpp') diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..fc9738b --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,186 @@ +/* =============================================== + Табло 8сег 5раз - мои изыскания + 20250622 ... 20250625 + v.3.10 + + AtTiny2313, 8MHz, Общий Анод - ОА + + A-PB7, B-PB6, C-PB5, D-PB4, E-PB3, F-PB2, G-P1, dp-PB0 + 0-PD2, 1-PD3, 2-PD4, 3-PD5, 4-PD6 + + = FUSES = Low - 0xFD; High - 0xDF; Ext - 0xFE + +================================================== */ + +#include +#include +#include "pin.h" + +// ======================================= +// ОПРЕДЕЛЯЕМ КОНСТАНТЫ: +#define F_QUARTZ 8000000UL // частота кварца +#define DIVIDER 64 // делитель таймера T2, задается в инициализации Т1 +#define BAUD 9600UL // скорость UART + +// 8ми сегментный 5х разрядный индикатор: +#define LEVEL 1 // (1) - ОА, (0) - ОК +#define RAZR 5 // количество разрядов индикатора +#define BRIGHT 0xFE // яркость свечения сегментов (больше значение - ярче) + +// ======================================= +// Рабочие переменные: +// Отображаемые на индикаторе символы: +uint8_t seg[16] = { + 0b11111100, // 0 + 0b01100000, // 1 + 0b11011010, // 2 + 0b11110010, // 3 + 0b01100110, // 4 + 0b10110110, // 5 + 0b10111110, // 6 + 0b11100000, // 7 + 0b11111110, // 8 + 0b11110110, // 9 + 0b00000000, // E - пусто + 0b00000010, // F - минус + 0b11000110, // G - градус + 0b11001110, // H - P + 0b00101110, // I - h + 0b00111000 // J - v +}; +uint8_t dataIndic[RAZR] = {10, 10, 10, 10, 10}; // ячейки данных разрядов индикатора + +// ################################################################ +// Инициализация прерываний: +void init_interrupt() +{ + // Инициализация USART: + uint16_t ubrr = F_QUARTZ / 16 / BAUD - 1; + UBRRH = (uint8_t)(ubrr >> 8); // старшие биты UBRR + UBRRL = (uint8_t)ubrr; // младшие биты UBRR + UCSRA |= (1 << RXC); // | (1 << TXC); + UCSRB |= (1 << RXCIE) | (1 << RXEN); // | (1 << TXCIE) | (1 << TXEN); + UCSRC |= (1 << UCSZ1) | (1 << UCSZ0); // асинхронный режим, + // размер посылки 8 бит, проверка чётности отключена, 1 стоп-бит + + // Инициализация T0: + TCCR0A = 0; //(1 << WGM11); // (1 << WGM10) | (1 << COM1A1) | (1 << COM1A0); // OC1A Отключен + TCCR0B |= (1 << CS00) | (1 << CS01); // (1 << WGM12) | + OCR0A = BRIGHT; + TIMSK |= (1 << TOIE0) | (1 << OCIE0A); +} + +//================================================================ +// Включение сегментов: +void segWork(uint8_t sTem) +{ + uint8_t segments = seg[sTem]; + (LEVEL) ? segments = segments : segments = ~segments; + (segments & (1 << 7)) ? PORT_A |= (1 << SEG_A) : PORT_A &= ~(1 << SEG_A); + (segments & (1 << 6)) ? PORT_B |= (1 << SEG_B) : PORT_B &= ~(1 << SEG_B); + (segments & (1 << 5)) ? PORT_C |= (1 << SEG_C) : PORT_C &= ~(1 << SEG_C); + (segments & (1 << 4)) ? PORT_D |= (1 << SEG_D) : PORT_D &= ~(1 << SEG_D); + (segments & (1 << 3)) ? PORT_E |= (1 << SEG_E) : PORT_E &= ~(1 << SEG_E); + (segments & (1 << 2)) ? PORT_F |= (1 << SEG_F) : PORT_F &= ~(1 << SEG_F); + (segments & (1 << 1)) ? PORT_G |= (1 << SEG_G) : PORT_G &= ~(1 << SEG_G); + (segments & (1 << 0)) ? PORT_H |= (1 << SEG_H) : PORT_H &= ~(1 << SEG_H); +} + +//================================================================ +// Гашение всех разрядов перед установкой сегментов: +ISR(TIMER0_COMPA_vect) +{ + (LEVEL) ? PORT_RAZ1 &= ~(1 << RAZ_1) : PORT_RAZ1 |= (1 << RAZ_1); + (LEVEL) ? PORT_RAZ2 &= ~(1 << RAZ_2) : PORT_RAZ2 |= (1 << RAZ_2); + (LEVEL) ? PORT_RAZ3 &= ~(1 << RAZ_3) : PORT_RAZ3 |= (1 << RAZ_3); + (LEVEL) ? PORT_RAZ4 &= ~(1 << RAZ_4) : PORT_RAZ4 |= (1 << RAZ_4); + (LEVEL) ? PORT_RAZ5 &= ~(1 << RAZ_5) : PORT_RAZ5 |= (1 << RAZ_5); +} + +//================================================================ +// Основная индикация: +ISR(TIMER0_OVF_vect) +{ + static uint8_t s = 0; + + switch (s) + { + case 0: + (LEVEL) ? PORT_RAZ1 |= (1 << RAZ_1) : PORT_RAZ1 &= ~(1 << RAZ_1); + segWork(dataIndic[0]); + break; + + case 1: + (LEVEL) ? PORT_RAZ2 |= (1 << RAZ_2) : PORT_RAZ2 &= ~(1 << RAZ_2); + segWork(dataIndic[1]); + break; + + case 2: + (LEVEL) ? PORT_RAZ3 |= (1 << RAZ_3) : PORT_RAZ3 &= ~(1 << RAZ_3); + segWork(dataIndic[2]); + break; + + case 3: + (LEVEL) ? PORT_RAZ4 |= (1 << RAZ_4) : PORT_RAZ4 &= ~(1 << RAZ_4); + segWork(dataIndic[3]); + break; + + case 4: + (LEVEL) ? PORT_RAZ5 |= (1 << RAZ_5) : PORT_RAZ5 &= ~(1 << RAZ_5); + segWork(dataIndic[4]); + break; + } + (s == (RAZR - 1)) ? s = 0 : s++; // крутим активный разряд +} + +//========================== +ISR(USART_RX_vect) +{ + static uint8_t count = 0; + uint8_t b = UDR; + + if (b == 0x0D || b == 0x0A) + { + count = 0; + } + else + { + if (b >= '0' && b <= '9') + { + dataIndic[count] = b - '0'; + } + else if (b >= 'A' && b <= 'K') + { + dataIndic[count] = b - 59; + } + + (count < RAZR) ? count++ : count = 0; + } +} + + //================================================================ + // Запись данных в массив для отображения: + // void visible(uint32_t vis) + // { + // dataIndic[4] = vis % 10; + // dataIndic[3] = vis / 10 % 10; + // dataIndic[2] = vis / 100 % 10; + // dataIndic[1] = vis / 1000 % 10; + // dataIndic[0] = vis / 10000; + // } + + //=============================================================== + int main(void) + { + // Инициализация: + init_pin(); + init_interrupt(); + + // Разрешаем прерывания: + sei(); + + //--------------------------------------------------------- + while (1) + { + } + } \ No newline at end of file -- cgit v1.2.3