summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore5
-rw-r--r--.vscode/extensions.json10
-rw-r--r--platformio.ini16
-rw-r--r--src/main.cpp186
-rw-r--r--src/pin.cpp37
-rw-r--r--src/pin.h51
6 files changed, 305 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..89cc49c
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,5 @@
+.pio
+.vscode/.browse.c_cpp.db*
+.vscode/c_cpp_properties.json
+.vscode/launch.json
+.vscode/ipch
diff --git a/.vscode/extensions.json b/.vscode/extensions.json
new file mode 100644
index 0000000..080e70d
--- /dev/null
+++ b/.vscode/extensions.json
@@ -0,0 +1,10 @@
+{
+ // See http://go.microsoft.com/fwlink/?LinkId=827846
+ // for the documentation about the extensions.json format
+ "recommendations": [
+ "platformio.platformio-ide"
+ ],
+ "unwantedRecommendations": [
+ "ms-vscode.cpptools-extension-pack"
+ ]
+}
diff --git a/platformio.ini b/platformio.ini
new file mode 100644
index 0000000..faf6e65
--- /dev/null
+++ b/platformio.ini
@@ -0,0 +1,16 @@
+; PlatformIO Project Configuration File
+;
+; Build options: build flags, source filter
+; Upload options: custom upload port, speed and extra flags
+; Library options: dependencies, extra library storages
+; Advanced options: extra scripting
+;
+; Please visit documentation for the other options and examples
+; https://docs.platformio.org/page/projectconf.html
+
+[env:attiny2313]
+platform = atmelavr
+board = attiny2313
+framework = arduino
+
+upload_protocol = usbasp \ No newline at end of file
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
diff --git a/src/pin.cpp b/src/pin.cpp
new file mode 100644
index 0000000..5c12a4c
--- /dev/null
+++ b/src/pin.cpp
@@ -0,0 +1,37 @@
+#include <avr/io.h>
+#include "pin.h"
+
+//===============================================================
+// Инициализация всех ПИНов:
+void init_pin()
+{
+ DDR_A |= (1 << SEG_A);
+ PORT_A |= (1 << SEG_A);
+ DDR_B |= (1 << SEG_B);
+ PORT_B |= (1 << SEG_B);
+ DDR_C |= (1 << SEG_C);
+ PORT_C |= (1 << SEG_C);
+ DDR_D |= (1 << SEG_D);
+ PORT_D |= (1 << SEG_D);
+ DDR_E |= (1 << SEG_E);
+ PORT_E |= (1 << SEG_E);
+ DDR_F |= (1 << SEG_F);
+ PORT_F |= (1 << SEG_F);
+ DDR_G |= (1 << SEG_G);
+ PORT_G |= (1 << SEG_G);
+ DDR_H |= (1 << SEG_H);
+ PORT_H |= (1 << SEG_H);
+
+ DDR_RAZ1 |= (1 << RAZ_1);
+ PORT_RAZ1 |= (1 << RAZ_1);
+ DDR_RAZ2 |= (1 << RAZ_2);
+ PORT_RAZ2 |= (1 << RAZ_2);
+ DDR_RAZ3 |= (1 << RAZ_3);
+ PORT_RAZ3 |= (1 << RAZ_3);
+ DDR_RAZ4 |= (1 << RAZ_4);
+ PORT_RAZ4 |= (1 << RAZ_4);
+ DDR_RAZ5 |= (1 << RAZ_5);
+ PORT_RAZ5 |= (1 << RAZ_5);
+}
+
+//===============================================================
diff --git a/src/pin.h b/src/pin.h
new file mode 100644
index 0000000..d8a17ee
--- /dev/null
+++ b/src/pin.h
@@ -0,0 +1,51 @@
+#ifndef PIN_H_
+#define PIN_H_
+
+// ЗАДАЕМ ИСПОЛЬЗУЕМЫЕ ПИНы:
+// СЕГМЕНТЫ:
+#define SEG_A PB7
+#define DDR_A DDRB
+#define PORT_A PORTB
+#define SEG_B PB6
+#define DDR_B DDRB
+#define PORT_B PORTB
+#define SEG_C PB5
+#define DDR_C DDRB
+#define PORT_C PORTB
+#define SEG_D PB4
+#define DDR_D DDRB
+#define PORT_D PORTB
+#define SEG_E PB3
+#define DDR_E DDRB
+#define PORT_E PORTB
+#define SEG_F PB2
+#define DDR_F DDRB
+#define PORT_F PORTB
+#define SEG_G PB1
+#define DDR_G DDRB
+#define PORT_G PORTB
+#define SEG_H PB0
+#define DDR_H DDRB
+#define PORT_H PORTB
+// РАЗРЯДЫ:
+#define RAZ_1 PD2
+#define DDR_RAZ1 DDRD
+#define PORT_RAZ1 PORTD
+#define RAZ_2 PD3
+#define DDR_RAZ2 DDRD
+#define PORT_RAZ2 PORTD
+#define RAZ_3 PD4
+#define DDR_RAZ3 DDRD
+#define PORT_RAZ3 PORTD
+#define RAZ_4 PD5
+#define DDR_RAZ4 DDRD
+#define PORT_RAZ4 PORTD
+#define RAZ_5 PD6
+#define DDR_RAZ5 DDRD
+#define PORT_RAZ5 PORTD
+
+//-----------------------------------
+// Инициализация PIN:
+void init_pin(void);
+
+#endif \ No newline at end of file