mirror of
https://github.com/AlexGyver/GyverCore.git
synced 2025-07-29 19:01:12 +03:00
upd
This commit is contained in:
@ -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>
|
||||||
|
|
||||||
|
@ -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++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
10
README.md
10
README.md
@ -1,6 +1,6 @@
|
|||||||

|

|
||||||
# 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 улучшен, добавлен буфер на отправку данных
|
@ -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);
|
||||||
|
@ -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": []
|
||||||
|
Reference in New Issue
Block a user