summaryrefslogtreecommitdiff
path: root/src/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.cpp')
-rw-r--r--src/main.cpp186
1 files changed, 186 insertions, 0 deletions
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 <avr/interrupt.h>
+#include <util/delay.h>
+#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