1
0
mirror of https://github.com/AlexGyver/GyverCore.git synced 2025-07-29 19:01:12 +03:00
This commit is contained in:
Alex
2019-09-11 14:33:26 +03:00
parent 1931dfcb7a
commit 0fcb9c135f
7 changed files with 92 additions and 29 deletions

View File

@ -1,6 +1,6 @@
/* Главный цикл программы */ /* Главный цикл программы */
#pragma message "Нас тут заперли, вызовите 911!" #pragma message "Нас тут заперли, вызовите 911!"
#pragma message "GyverCore v1.8.2 inside. Enjoy" #pragma message "GyverCore v1.8.3 inside. Enjoy"
#include <Arduino.h> #include <Arduino.h>

View File

@ -5,15 +5,21 @@ static volatile uint8_t _UART_RX_BUFFER_HEAD;
static volatile uint8_t _UART_RX_BUFFER_TAIL; static volatile uint8_t _UART_RX_BUFFER_TAIL;
uint32_t _UART_TIMEOUT = 100; uint32_t _UART_TIMEOUT = 100;
#define UART_TX_BUFFER_SIZE 32
static volatile char _UART_TX_BUFFER[UART_TX_BUFFER_SIZE];
static volatile uint8_t _UART_TX_BUFFER_HEAD;
static volatile uint8_t _UART_TX_BUFFER_TAIL;
// =========================== INIT ======================== // =========================== INIT ========================
void GyverUart::begin(uint32_t baudrate){ void GyverUart::begin(uint32_t baudrate){
uint16_t speed = (F_CPU / (8L * baudrate)) - 1; uint16_t speed = (F_CPU / (8L * baudrate)) - 1;
UBRR0H = highByte(speed); UBRR0H = highByte(speed);
UBRR0L = lowByte(speed); UBRR0L = lowByte(speed);
UCSR0A = (1 << U2X0); UCSR0A = (1 << U2X0);
UCSR0B = ((1<<TXEN0) | (1<<RXEN0) | (1<<RXCIE0)); UCSR0B = ((1<<TXEN0) | (1<<RXEN0) | (1<<RXCIE0) | (1<<TXCIE0));
UCSR0C = ((1<<UCSZ01) | (1<<UCSZ00)); UCSR0C = ((1<<UCSZ01) | (1<<UCSZ00));
_UART_RX_BUFFER_HEAD = _UART_RX_BUFFER_TAIL = 0; _UART_RX_BUFFER_HEAD = _UART_RX_BUFFER_TAIL = 0;
_UART_TX_BUFFER_HEAD = _UART_TX_BUFFER_TAIL = 0;
} }
void GyverUart::end(){ void GyverUart::end(){
@ -42,8 +48,11 @@ char GyverUart::read() {
} }
char GyverUart::peek() { char GyverUart::peek() {
//return _UART_RX_BUFFER[0]; return _UART_RX_BUFFER_HEAD != _UART_RX_BUFFER_TAIL ? _UART_RX_BUFFER[_UART_RX_BUFFER_TAIL]: -1;
return _UART_RX_BUFFER_HEAD != _UART_RX_BUFFER_TAIL? _UART_RX_BUFFER[_UART_RX_BUFFER_TAIL]: -1; }
void GyverUart::flush() {
while (_UART_RX_BUFFER_HEAD != _UART_RX_BUFFER_TAIL);
} }
uint8_t GyverUart::available() { uint8_t GyverUart::available() {
@ -183,19 +192,54 @@ String GyverUart::readStringUntil(char terminator) {
} }
// ====================== WRITE =========================== // ====================== WRITE ===========================
/*
// прямая запись без буфера
void GyverUart::write(byte data){ void GyverUart::write(byte data){
while (!(UCSR0A & (1<<UDRE0))); while (!(UCSR0A & (1<<UDRE0)));
UDR0 = data; UDR0 = data;
} }
*/
void GyverUart::write(byte data) {
uint8_t i = (unsigned int)(_UART_TX_BUFFER_HEAD + 1) % UART_TX_BUFFER_SIZE;
// ждать освобождения места в буфере
while ( (i + 1) == _UART_TX_BUFFER_TAIL);
// Не сохранять новые данные если нет места
if (i != _UART_TX_BUFFER_TAIL) {
_UART_TX_BUFFER[_UART_TX_BUFFER_HEAD] = data;
_UART_TX_BUFFER_HEAD = i;
}
}
void GyverUart::startTransmission() {
while (!(UCSR0A & (1<<UDRE0)));
if (_UART_TX_BUFFER_HEAD != _UART_TX_BUFFER_TAIL) {
unsigned char c = _UART_TX_BUFFER[_UART_TX_BUFFER_TAIL];
_UART_TX_BUFFER_TAIL = (_UART_TX_BUFFER_TAIL + 1) % UART_TX_BUFFER_SIZE;
UDR0 = c;
}
}
ISR(USART_TX_vect) {
if (_UART_TX_BUFFER_HEAD != _UART_TX_BUFFER_TAIL) {
unsigned char c = _UART_TX_BUFFER[_UART_TX_BUFFER_TAIL];
_UART_TX_BUFFER_TAIL = (_UART_TX_BUFFER_TAIL + 1) % UART_TX_BUFFER_SIZE;
UDR0 = c;
}
}
void GyverUart::println(void) { void GyverUart::println(void) {
write('\r'); write('\r');
startTransmission();
write('\n'); write('\n');
startTransmission();
} }
void GyverUart::print(char data) { void GyverUart::print(char data) {
write(data); write(data);
startTransmission();
} }
void GyverUart::println(char data) { void GyverUart::println(char data) {
print(data); print(data);
@ -283,7 +327,7 @@ void GyverUart::println(double data, byte decimals) {
void GyverUart::print(String data) { void GyverUart::print(String data) {
byte stringSize = data.length(); byte stringSize = data.length();
for (byte i = 0; i < stringSize; i++) { for (byte i = 0; i < stringSize; i++) {
write(data[i]); print(data[i]);
} }
} }
void GyverUart::println(String data) { void GyverUart::println(String data) {
@ -294,7 +338,7 @@ void GyverUart::println(String data) {
void GyverUart::print(char data[]) { void GyverUart::print(char data[]) {
byte i = 0; byte i = 0;
while (data[i] != '\0') { while (data[i] != '\0') {
write(data[i]); print(data[i]);
i++; i++;
} }
} }

View File

@ -2,6 +2,7 @@
// Версия 1.2 - добавлен циклический буфер // Версия 1.2 - добавлен циклический буфер
// версия 1.3 - пофикшен вывод float, добавлен вывод с базисом // версия 1.3 - пофикшен вывод float, добавлен вывод с базисом
// Версия 1.4 - либа собрана в класс // Версия 1.4 - либа собрана в класс
// Версия 1.5 - добавлен буфер на отправку и flush
#ifndef GyverUART_h #ifndef GyverUART_h
#define GyverUART_h #define GyverUART_h
@ -24,6 +25,7 @@ public:
char read(); char read();
char peek(); char peek();
void clear(); void clear();
void flush();
void setTimeout(int timeout); void setTimeout(int timeout);
int32_t parseInt(); int32_t parseInt();
@ -55,12 +57,13 @@ public:
void println(uint32_t data, byte base = DEC); void println(uint32_t data, byte base = DEC);
void println(double data, byte decimals = 2); void println(double data, byte decimals = 2);
void println(String data); void println(String data);
void println(char data[]); void println(char data[]);
private: private:
void printHelper(int32_t data, byte base); void printHelper(int32_t data, byte base);
void printHelper(uint32_t data, byte base); void printHelper(uint32_t data, byte base);
void printBytes(uint32_t data); void printBytes(uint32_t data);
void startTransmission();
}; };
extern GyverUart uart; extern GyverUart uart;

View File

@ -19,21 +19,21 @@ sbi KEYWORD2
analogStartConvert KEYWORD2 analogStartConvert KEYWORD2
analogGet KEYWORD2 analogGet KEYWORD2
uartBegin KEYWORD2 begin KEYWORD2
uartEnd KEYWORD2 end KEYWORD2
uartPeek KEYWORD2 peek KEYWORD2
uartClear KEYWORD2 flush KEYWORD2
uartRead KEYWORD2 clear KEYWORD2
uartWrite KEYWORD2 read KEYWORD2
uartPrint KEYWORD2 write KEYWORD2
uartPrintln KEYWORD2 print KEYWORD2
uartAvailable KEYWORD2 println KEYWORD2
uartSetTimeout KEYWORD2 available KEYWORD2
uartParseInt KEYWORD2 setTimeout KEYWORD2
uartReadString KEYWORD2 parseInt KEYWORD2
uartParseFloat KEYWORD2 readString KEYWORD2
uartParsePacket KEYWORD2 parseFloat KEYWORD2
lightInit KEYWORD2 parsePacket KEYWORD2
ISR KEYWORD2 ISR KEYWORD2

View File

@ -1,6 +1,6 @@
![CORE_PHOTO](https://github.com/AlexGyver/GyverCore/blob/master/gyverCoreLogo.jpg) ![CORE_PHOTO](https://github.com/AlexGyver/GyverCore/blob/master/gyverCoreLogo.jpg)
# GyverCore for ATmega328 # GyverCore for ATmega328
**Версия 1.8.2 от 11.09.2019** **Версия 1.8.3 от 11.09.2019**
Быстрое и лёгкое ядро для Arduino IDE с расширенной конфигурацией. Быстрое и лёгкое ядро для Arduino IDE с расширенной конфигурацией.
Основано на оригинальном ядре Arduino версии 1.8.9, большинство функций заменены на более быстрые и лёгкие аналоги, убрано всё лишнее и не относящееся к микроконтроллеру ATmega328p, убран почти весь Wiring-мусор, код упрощён и причёсан. Добавлено несколько функций и интересных вариантов компиляции. Основано на оригинальном ядре Arduino версии 1.8.9, большинство функций заменены на более быстрые и лёгкие аналоги, убрано всё лишнее и не относящееся к микроконтроллеру ATmega328p, убран почти весь Wiring-мусор, код упрощён и причёсан. Добавлено несколько функций и интересных вариантов компиляции.
Разработано by Александр **AlexGyver** и Egor 'Nich1con' Zaharov Разработано by Александр **AlexGyver** и Egor 'Nich1con' Zaharov
@ -20,10 +20,10 @@
- Закрой окно - Закрой окно
- Выбери плату в **Инструменты > Плата > GyverCore > ATmega328/168 based** - Выбери плату в **Инструменты > Плата > GyverCore > ATmega328/168 based**
- Готово! - Готово!
- *Примечание*: файлы ядра находятся по пути C:\Users\Username\AppData\Local\Arduino15\packages\GyverCore\hardware\avr\1.8.2\ - *Примечание*: файлы ядра находятся по пути C:\Users\Username\AppData\Local\Arduino15\packages\GyverCore\hardware\avr\1.8.3\
### Ручная ### Ручная
- Файлы из папки GyverCore в этом репозитории положить по пути C:\Users\Username\AppData\Local\Arduino15\packages\GyverCore\hardware\avr\1.8.2\ - Файлы из папки GyverCore в этом репозитории положить по пути C:\Users\Username\AppData\Local\Arduino15\packages\GyverCore\hardware\avr\1.8.3\
## Изменения ## Изменения
### Облегчено и ускорено ### Облегчено и ускорено
@ -235,4 +235,6 @@ parseFloat | 1070 | 246 | 824
- В uart добавлен вывод с базисом числа - В uart добавлен вывод с базисом числа
- 1.8.2 - 1.8.2
- uart обёрнут в класс - uart обёрнут в класс
- Добавлена возможность заменить вызовы Serial на uart (через меню выбора платы) - Добавлена возможность заменить вызовы Serial на uart (через меню выбора платы)
- 1.8.3
- uart улучшен, добавлен буфер на отправку данных

View File

@ -19,7 +19,7 @@ byte data11 = 0b11101011;
uint32_t data12 = 0xFAB666; uint32_t data12 = 0xFAB666;
void setup() { void setup() {
uart.begin(); uart.begin(9600);
uart.println(data0); uart.println(data0);
uart.println(data1); uart.println(data1);
uart.println(data2); uart.println(data2);

View File

@ -218,6 +218,20 @@
{"name": "ATmega328 based boards"} {"name": "ATmega328 based boards"}
], ],
"toolsDependencies": [] "toolsDependencies": []
},
{
"name": "GyverCore",
"architecture": "avr",
"version": "1.8.3",
"category": "Contributed",
"url": "https://github.com/AlexGyver/GyverCore/releases/download/GyverCore-1.8.3/GyverCore.zip",
"archiveFileName": "GyverCore.zip",
"checksum": "MD5:a8c1027f1e91b24bcc93396081f4de6d",
"size": "116149",
"boards": [
{"name": "ATmega328 based boards"}
],
"toolsDependencies": []
} }
], ],
"tools": [] "tools": []