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 "GyverCore v1.8.2 inside. Enjoy"
#pragma message "GyverCore v1.8.3 inside. Enjoy"
#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;
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 ========================
void GyverUart::begin(uint32_t baudrate){
uint16_t speed = (F_CPU / (8L * baudrate)) - 1;
UBRR0H = highByte(speed);
UBRR0L = lowByte(speed);
UCSR0A = (1 << U2X0);
UCSR0B = ((1<<TXEN0) | (1<<RXEN0) | (1<<RXCIE0));
UCSR0B = ((1<<TXEN0) | (1<<RXEN0) | (1<<RXCIE0) | (1<<TXCIE0));
UCSR0C = ((1<<UCSZ01) | (1<<UCSZ00));
_UART_RX_BUFFER_HEAD = _UART_RX_BUFFER_TAIL = 0;
_UART_TX_BUFFER_HEAD = _UART_TX_BUFFER_TAIL = 0;
}
void GyverUart::end(){
@ -42,8 +48,11 @@ char GyverUart::read() {
}
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() {
@ -183,19 +192,54 @@ String GyverUart::readStringUntil(char terminator) {
}
// ====================== WRITE ===========================
/*
// прямая запись без буфера
void GyverUart::write(byte data){
while (!(UCSR0A & (1<<UDRE0)));
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) {
write('\r');
startTransmission();
write('\n');
startTransmission();
}
void GyverUart::print(char data) {
write(data);
startTransmission();
}
void GyverUart::println(char data) {
print(data);
@ -283,7 +327,7 @@ void GyverUart::println(double data, byte decimals) {
void GyverUart::print(String data) {
byte stringSize = data.length();
for (byte i = 0; i < stringSize; i++) {
write(data[i]);
print(data[i]);
}
}
void GyverUart::println(String data) {
@ -294,7 +338,7 @@ void GyverUart::println(String data) {
void GyverUart::print(char data[]) {
byte i = 0;
while (data[i] != '\0') {
write(data[i]);
print(data[i]);
i++;
}
}

View File

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

View File

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

View File

@ -1,6 +1,6 @@
![CORE_PHOTO](https://github.com/AlexGyver/GyverCore/blob/master/gyverCoreLogo.jpg)
# GyverCore for ATmega328
**Версия 1.8.2 от 11.09.2019**
**Версия 1.8.3 от 11.09.2019**
Быстрое и лёгкое ядро для Arduino IDE с расширенной конфигурацией.
Основано на оригинальном ядре Arduino версии 1.8.9, большинство функций заменены на более быстрые и лёгкие аналоги, убрано всё лишнее и не относящееся к микроконтроллеру ATmega328p, убран почти весь Wiring-мусор, код упрощён и причёсан. Добавлено несколько функций и интересных вариантов компиляции.
Разработано by Александр **AlexGyver** и Egor 'Nich1con' Zaharov
@ -20,10 +20,10 @@
- Закрой окно
- Выбери плату в **Инструменты > Плата > 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 добавлен вывод с базисом числа
- 1.8.2
- uart обёрнут в класс
- Добавлена возможность заменить вызовы Serial на uart (через меню выбора платы)
- Добавлена возможность заменить вызовы Serial на uart (через меню выбора платы)
- 1.8.3
- uart улучшен, добавлен буфер на отправку данных

View File

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

View File

@ -218,6 +218,20 @@
{"name": "ATmega328 based boards"}
],
"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": []