1
0
mirror of https://github.com/AlexGyver/GyverCore.git synced 2025-07-04 15:22:25 +03:00
This commit is contained in:
Alex
2019-09-11 12:08:50 +03:00
parent 2b086789d3
commit 1931dfcb7a
12 changed files with 235 additions and 187 deletions

View File

@ -6,7 +6,7 @@
## GyverCore on 328 based boards ## ## GyverCore on 328 based boards ##
################################### ###################################
nano.build.extra_flags={extra_flags.timer} {extra_flags.init} nano.build.extra_flags={extra_flags.timer} {extra_flags.init} {extra_flags.uart}
## BOARD ## ## BOARD ##
nano.name=ATmega328 based nano.name=ATmega328 based
@ -126,6 +126,14 @@ nano.menu.timers.yes_millis.extra_flags.timer=
nano.menu.timers.no_millis=disable nano.menu.timers.no_millis=disable
nano.menu.timers.no_millis.extra_flags.timer=-D_GYVERCORE_NOMILLIS nano.menu.timers.no_millis.extra_flags.timer=-D_GYVERCORE_NOMILLIS
## Serial ##
menu.serial=Serial
nano.menu.serial.default=default Serial
nano.menu.serial.default.extra_flags.uart=
nano.menu.serial.gyverUart=GyverUART
nano.menu.serial.gyverUart.extra_flags.uart=-D_GYVERCORE_GYVERUART
## BOD ## ## BOD ##
menu.bod=B.O.D. menu.bod=B.O.D.

View File

@ -215,7 +215,10 @@ extern const uint8_t PROGMEM digital_pin_to_timer_PGM[];
#include "WString.h" #include "WString.h"
#include "HardwareSerial.h" #include "HardwareSerial.h"
#include "uart.h" #include "uart.h"
//#include "USBAPI.h"
#ifdef _GYVERCORE_GYVERUART
#define Serial uart
#endif
uint16_t makeWord(uint16_t w); uint16_t makeWord(uint16_t w);
uint16_t makeWord(byte h, byte l); uint16_t makeWord(byte h, byte l);

View File

@ -24,6 +24,8 @@
#ifndef HardwareSerial_h #ifndef HardwareSerial_h
#define HardwareSerial_h #define HardwareSerial_h
#ifndef _GYVERCORE_GYVERUART
#include <inttypes.h> #include <inttypes.h>
#include "Stream.h" #include "Stream.h"
@ -158,4 +160,5 @@ class HardwareSerial : public Stream
extern void serialEventRun(void) __attribute__((weak)); extern void serialEventRun(void) __attribute__((weak));
#endif
#endif #endif

View File

@ -1,16 +1,19 @@
/* Главный цикл программы */ /* Главный цикл программы */
#pragma message "Нас тут заперли, вызовите 911!" #pragma message "Нас тут заперли, вызовите 911!"
#pragma message "GyverCore v1.8 inside. Enjoy" #pragma message "GyverCore v1.8.2 inside. Enjoy"
#include <Arduino.h> #include <Arduino.h>
int main(void) {
int main(void) {
#ifndef _GYVERCORE_NOINIT #ifndef _GYVERCORE_NOINIT
init(); // инициализация таймеров и ацп init(); // инициализация таймеров и ацп
#endif #endif
setup(); // функция setup setup(); // функция setup
for(;;) { // бесконечный цикл for(;;) { // бесконечный цикл
loop(); // функция loop loop(); // функция loop
#ifndef _GYVERCORE_GYVERUART
if (serialEventRun) serialEventRun(); // обслуживание serial if (serialEventRun) serialEventRun(); // обслуживание serial
#endif
} }
return 0; return 0;
} }

View File

@ -1,13 +1,12 @@
#include "uart.h" #include "uart.h"
/* Реализация облегченного Serial от AlexGyver & Egor 'Nich1con' Zaharov*/
#define UART_RX_BUFFER_SIZE 64 #define UART_RX_BUFFER_SIZE 64
static volatile char _UART_RX_BUFFER[UART_RX_BUFFER_SIZE]; static volatile char _UART_RX_BUFFER[UART_RX_BUFFER_SIZE];
static volatile uint8_t _UART_RX_BUFFER_HEAD; 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;
// ===== INIT ===== // =========================== INIT ========================
void uartBegin(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);
@ -17,11 +16,11 @@ void uartBegin(uint32_t baudrate){
_UART_RX_BUFFER_HEAD = _UART_RX_BUFFER_TAIL = 0; _UART_RX_BUFFER_HEAD = _UART_RX_BUFFER_TAIL = 0;
} }
void uartEnd(){ void GyverUart::end(){
UCSR0B = 0; UCSR0B = 0;
} }
// ===== READ ===== // =========================== READ ============================
ISR(USART_RX_vect) { ISR(USART_RX_vect) {
if (bit_is_set(UCSR0A, UPE0)) UDR0; // Не сохранять новые данные если parity error if (bit_is_set(UCSR0A, UPE0)) UDR0; // Не сохранять новые данные если parity error
else { else {
@ -35,42 +34,42 @@ ISR(USART_RX_vect) {
} }
} }
char uartRead() { char GyverUart::read() {
if (_UART_RX_BUFFER_HEAD == _UART_RX_BUFFER_TAIL) return -1; if (_UART_RX_BUFFER_HEAD == _UART_RX_BUFFER_TAIL) return -1;
unsigned char c = _UART_RX_BUFFER[_UART_RX_BUFFER_TAIL]; unsigned char c = _UART_RX_BUFFER[_UART_RX_BUFFER_TAIL];
_UART_RX_BUFFER_TAIL = (_UART_RX_BUFFER_TAIL + 1) % UART_RX_BUFFER_SIZE; _UART_RX_BUFFER_TAIL = (_UART_RX_BUFFER_TAIL + 1) % UART_RX_BUFFER_SIZE;
return c; return c;
} }
char uartPeek() { char GyverUart::peek() {
//return _UART_RX_BUFFER[0]; //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;
} }
uint8_t uartAvailable() { uint8_t GyverUart::available() {
return ((unsigned int)(UART_RX_BUFFER_SIZE + _UART_RX_BUFFER_HEAD - _UART_RX_BUFFER_TAIL)) % UART_RX_BUFFER_SIZE; return ((unsigned int)(UART_RX_BUFFER_SIZE + _UART_RX_BUFFER_HEAD - _UART_RX_BUFFER_TAIL)) % UART_RX_BUFFER_SIZE;
} }
boolean uartAvailableForWrite() {return 1;} boolean GyverUart::availableForWrite() {return 1;}
void uartClear() { void GyverUart::clear() {
_UART_RX_BUFFER_HEAD = _UART_RX_BUFFER_TAIL = 0; _UART_RX_BUFFER_HEAD = _UART_RX_BUFFER_TAIL = 0;
} }
uint32_t _UART_TIMEOUT = 100;
void uartSetTimeout(int timeout) { void GyverUart::setTimeout(int timeout) {
_UART_TIMEOUT = timeout; _UART_TIMEOUT = timeout;
} }
int32_t uartParseInt() { int32_t GyverUart::parseInt() {
uint32_t timeoutTime = millis(); uint32_t timeoutTime = millis();
uint32_t value = 0; uint32_t value = 0;
boolean negative = false; boolean negative = false;
while (millis() - timeoutTime < _UART_TIMEOUT) { while (millis() - timeoutTime < _UART_TIMEOUT) {
if (uartAvailable()) { if (available()) {
timeoutTime = millis(); timeoutTime = millis();
char newByte = uartRead(); char newByte = read();
if (newByte == '-') negative = true; if (newByte == '-') negative = true;
else { else {
value += (newByte - '0'); value += (newByte - '0');
@ -82,35 +81,35 @@ int32_t uartParseInt() {
return (!negative) ? value : -value; return (!negative) ? value : -value;
} }
boolean uartParsePacket(int *intArray) { boolean GyverUart::parsePacket(int *intArray) {
if (uartAvailable()) { if (available()) {
uint32_t timeoutTime = millis(); uint32_t timeoutTime = millis();
int value = 0; int value = 0;
byte index = 0; byte index = 0;
boolean parseStart = 0; boolean parseStart = 0;
while (millis() - timeoutTime < 100) { while (millis() - timeoutTime < 100) {
if (uartAvailable()) { if (available()) {
timeoutTime = millis(); timeoutTime = millis();
if (uartPeek() == '$') { if (peek() == '$') {
parseStart = true; parseStart = true;
uartRead(); read();
continue; continue;
} }
if (parseStart) { if (parseStart) {
if (uartPeek() == ' ') { if (peek() == ' ') {
intArray[index] = value / 10; intArray[index] = value / 10;
value = 0; value = 0;
index++; index++;
uartRead(); read();
continue; continue;
} }
if (uartPeek() == ';') { if (peek() == ';') {
intArray[index] = value / 10; intArray[index] = value / 10;
uartRead(); read();
return true; return true;
} }
value += uartRead() - '0'; value += read() - '0';
value *= 10; value *= 10;
} }
} }
@ -119,7 +118,7 @@ boolean uartParsePacket(int *intArray) {
return false; return false;
} }
float uartParseFloat() { float GyverUart::parseFloat() {
uint32_t timeoutTime = millis(); uint32_t timeoutTime = millis();
float whole = 0.0; float whole = 0.0;
float fract = 0.0; float fract = 0.0;
@ -128,9 +127,9 @@ float uartParseFloat() {
byte fractSize = 0; byte fractSize = 0;
while (millis() - timeoutTime < 100) { while (millis() - timeoutTime < 100) {
if (uartAvailable()) { if (available()) {
timeoutTime = millis(); timeoutTime = millis();
char newByte = uartRead(); char newByte = read();
if (newByte == '-') { if (newByte == '-') {
negative = true; negative = true;
continue; continue;
@ -155,53 +154,77 @@ float uartParseFloat() {
return (!negative) ? whole : -whole; return (!negative) ? whole : -whole;
} }
String uartReadString() { String GyverUart::readString() {
uint32_t timeoutTime = millis(); uint32_t timeoutTime = millis();
String buf = ""; String buf = "";
while (millis() - timeoutTime < _UART_TIMEOUT) { while (millis() - timeoutTime < _UART_TIMEOUT) {
if (uartAvailable()) { if (available()) {
timeoutTime = millis(); timeoutTime = millis();
buf += uartRead(); buf += read();
} }
} }
return buf; return buf;
} }
// ===== WRITE ===== String GyverUart::readStringUntil(char terminator) {
uint32_t timeoutTime = millis();
String buf = "";
while (millis() - timeoutTime < _UART_TIMEOUT) {
if (available()) {
if (peek() == terminator) {
clear();
return buf;
}
timeoutTime = millis();
buf += read();
}
}
return buf;
}
void uartWrite(byte data){ // ====================== WRITE ===========================
void GyverUart::write(byte data){
while (!(UCSR0A & (1<<UDRE0))); while (!(UCSR0A & (1<<UDRE0)));
UDR0 = data; UDR0 = data;
} }
void uartPrintln(void) { void GyverUart::println(void) {
uartWrite('\r'); write('\r');
uartWrite('\n'); write('\n');
} }
void uartPrint(int8_t data, byte base) {printHelper( (long) data, base);} void GyverUart::print(char data) {
void uartPrint(uint8_t data, byte base) {printHelper( (uint32_t) data, base);} write(data);
void uartPrint(int16_t data, byte base) {printHelper( (long) data, base);} }
void uartPrint(uint16_t data, byte base) {printHelper( (uint32_t) data, base);} void GyverUart::println(char data) {
void uartPrint(int32_t data, byte base) {printHelper( (long) data, base);} print(data);
void uartPrint(uint32_t data, byte base) {printHelper( (uint32_t) data, base);} println();
}
void uartPrintln(int8_t data, byte base) {printHelper( (long) data, base); uartPrintln();} void GyverUart::print(int8_t data, byte base) {printHelper( (long) data, base);}
void uartPrintln(uint8_t data, byte base) {printHelper( (uint32_t) data, base); uartPrintln();} void GyverUart::print(uint8_t data, byte base) {printHelper( (uint32_t) data, base);}
void uartPrintln(int16_t data, byte base) {printHelper( (long) data, base); uartPrintln();} void GyverUart::print(int16_t data, byte base) {printHelper( (long) data, base);}
void uartPrintln(uint16_t data, byte base) {printHelper( (uint32_t) data, base); uartPrintln();} void GyverUart::print(uint16_t data, byte base) {printHelper( (uint32_t) data, base);}
void uartPrintln(int32_t data, byte base) {printHelper( (long) data, base); uartPrintln();} void GyverUart::print(int32_t data, byte base) {printHelper( (long) data, base);}
void uartPrintln(uint32_t data, byte base) {printHelper( (uint32_t) data, base); uartPrintln();} void GyverUart::print(uint32_t data, byte base) {printHelper( (uint32_t) data, base);}
void GyverUart::println(int8_t data, byte base) {printHelper( (long) data, base); println();}
void GyverUart::println(uint8_t data, byte base) {printHelper( (uint32_t) data, base); println();}
void GyverUart::println(int16_t data, byte base) {printHelper( (long) data, base); println();}
void GyverUart::println(uint16_t data, byte base) {printHelper( (uint32_t) data, base); println();}
void GyverUart::println(int32_t data, byte base) {printHelper( (long) data, base); println();}
void GyverUart::println(uint32_t data, byte base) {printHelper( (uint32_t) data, base); println();}
void printHelper(int32_t data, byte base) { void GyverUart::printHelper(int32_t data, byte base) {
if (data < 0) { if (data < 0) {
uartWrite(45); write(45);
data = -data; data = -data;
} }
printHelper((uint32_t) data, base); printHelper((uint32_t) data, base);
} }
void printHelper(uint32_t data, byte base) { void GyverUart::printHelper(uint32_t data, byte base) {
if (base == 10) { if (base == 10) {
printBytes(data); printBytes(data);
} else { } else {
@ -214,12 +237,12 @@ void printHelper(uint32_t data, byte base) {
data /= base; data /= base;
*--str = c < 10 ? c + '0' : c + 'A' - 10; *--str = c < 10 ? c + '0' : c + 'A' - 10;
} while (data); } while (data);
uartPrint(str); print(str);
} }
} }
void printBytes(uint32_t data) { void GyverUart::printBytes(uint32_t data) {
int8_t bytes[10]; int8_t bytes[10];
byte amount; byte amount;
for (byte i = 0; i < 10; i++) { for (byte i = 0; i < 10; i++) {
@ -231,55 +254,51 @@ void printBytes(uint32_t data) {
} }
} }
for (int8_t i = amount; i >= 0; i--) { for (int8_t i = amount; i >= 0; i--) {
uartWrite(bytes[i] + '0'); write(bytes[i] + '0');
} }
} }
void uartPrint(double data, byte decimals) { void GyverUart::print(double data, byte decimals) {
if (data < 0) { if (data < 0) {
uartWrite(45); write(45);
data = -data; data = -data;
} }
uint32_t integer = data; uint32_t integer = data;
printBytes(integer); printBytes(integer);
uartWrite(46); // точка write(46); // точка
data -= integer; data -= integer;
for (byte i = 0; i < decimals; i++) { for (byte i = 0; i < decimals; i++) {
data *= 10.0; data *= 10.0;
uartPrint((byte)data); print((byte)data);
data -= (byte)data; data -= (byte)data;
} }
} }
void uartPrint(double data) { void GyverUart::println(double data, byte decimals) {
uartPrint(data, 2); print(data, decimals);
} println();
void uartPrintln(double data, byte decimals) {
uartPrint(data, decimals);
uartPrintln();
} }
void uartPrint(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++) {
uartWrite(data[i]); write(data[i]);
} }
} }
void uartPrintln(String data) { void GyverUart::println(String data) {
uartPrint(data); print(data);
uartPrintln(); println();
} }
void uartPrint(char data[]) { void GyverUart::print(char data[]) {
byte i = 0; byte i = 0;
while (data[i] != '\0') { while (data[i] != '\0') {
uartWrite(data[i]); write(data[i]);
i++; i++;
} }
} }
void uartPrintln(char data[]) { void GyverUart::println(char data[]) {
uartPrint(data); print(data);
uartPrintln(); println();
} }

View File

@ -1,9 +1,10 @@
/* Облегченный Serial */ /* Облегченный Serial от AlexGyver & Egor 'Nich1con' Zaharov */
// Версия 1.2 - добавлен циклический буфер // Версия 1.2 - добавлен циклический буфер
// версия 1.3 - пофикшен вывод float, добавлен вывод с базисом // версия 1.3 - пофикшен вывод float, добавлен вывод с базисом
// Версия 1.4 - либа собрана в класс
#ifndef uart_h #ifndef GyverUART_h
#define uart_h #define GyverUART_h
#include "Arduino.h" #include "Arduino.h"
#include <avr/io.h> #include <avr/io.h>
@ -11,47 +12,57 @@
#define DEC 10 #define DEC 10
#define HEX 16 #define HEX 16
#define OCT 8 #define OCT 8
#define BIN 2
void uartBegin(uint32_t baudrate = 9600); class GyverUart {
void uartEnd(); public:
void begin(uint32_t baudrate = 9600);
void end();
uint8_t uartAvailable(); uint8_t available();
boolean uartAvailableForWrite(); boolean availableForWrite();
char uartRead(); char read();
char uartPeek(); char peek();
void uartClear(); void clear();
void uartSetTimeout(int timeout); void setTimeout(int timeout);
int32_t uartParseInt(); int32_t parseInt();
float uartParseFloat(); float parseFloat();
String uartReadString(); String readString();
boolean uartParsePacket(int *intArray); String readStringUntil(char terminator);
boolean parsePacket(int *intArray);
void uartWrite(byte data); void write(byte data);
void uartPrintln(void); void println(void);
void uartPrint(int8_t data, byte base = DEC); void print(char data);
void uartPrint(uint8_t data, byte base = DEC); void print(int8_t data, byte base = DEC);
void uartPrint(int16_t data, byte base = DEC); void print(uint8_t data, byte base = DEC);
void uartPrint(uint16_t data, byte base = DEC); void print(int16_t data, byte base = DEC);
void uartPrint(int32_t data, byte base = DEC); void print(uint16_t data, byte base = DEC);
void uartPrint(uint32_t data, byte base = DEC); void print(int32_t data, byte base = DEC);
void uartPrint(double data, byte decimals = 2); void print(uint32_t data, byte base = DEC);
void uartPrint(String data); void print(double data, byte decimals = 2);
void uartPrint(char data[]); void print(String data);
void print(char data[]);
void uartPrintln(int8_t data, byte base = DEC); void println(char data);
void uartPrintln(uint8_t data, byte base = DEC); void println(int8_t data, byte base = DEC);
void uartPrintln(int16_t data, byte base = DEC); void println(uint8_t data, byte base = DEC);
void uartPrintln(uint16_t data, byte base = DEC); void println(int16_t data, byte base = DEC);
void uartPrintln(int32_t data, byte base = DEC); void println(uint16_t data, byte base = DEC);
void uartPrintln(uint32_t data, byte base = DEC); void println(int32_t data, byte base = DEC);
void uartPrintln(double data, byte decimals = 2); void println(uint32_t data, byte base = DEC);
void uartPrintln(String data); void println(double data, byte decimals = 2);
void uartPrintln(char data[]); void println(String 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 printHelper(int32_t data, byte base); extern GyverUart uart;
void printHelper(uint32_t data, byte base);
void printBytes(uint32_t data);
#endif #endif

View File

@ -5,7 +5,7 @@
####################################### #######################################
# Datatypes (KEYWORD1) # Datatypes (KEYWORD1)
####################################### #######################################
uart KEYWORD1
####################################### #######################################
# Methods and Functions (KEYWORD2) # Methods and Functions (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 от 08.09.2019** **Версия 1.8.2 от 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\ - *Примечание*: файлы ядра находятся по пути 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\ - Файлы из папки GyverCore в этом репозитории положить по пути C:\Users\Username\AppData\Local\Arduino15\packages\GyverCore\hardware\avr\1.8.2\
## Изменения ## Изменения
### Облегчено и ускорено ### Облегчено и ускорено
@ -58,7 +58,7 @@ analogReference | 0 | 22 | -22
attachInterrupt | 212 | 180 | 32 attachInterrupt | 212 | 180 | 32
detachInterrupt | 198 | 150 | 48 detachInterrupt | 198 | 150 | 48
tone | 1410 | 740 | 670 tone | 1410 | 740 | 670
Serial.begin | 1028 | 166 | 862 Serial begin | 1028 | 166 | 862
print long | 1094 | 326 | 768 print long | 1094 | 326 | 768
print string | 2100 | 1484 | 616 print string | 2100 | 1484 | 616
print float | 2021 | 446 | 1575 print float | 2021 | 446 | 1575
@ -98,22 +98,23 @@ parseFloat | 1070 | 246 | 824
- **64**: 56.04 мкс (частота оцифровки 17 800 кГц) - **64**: 56.04 мкс (частота оцифровки 17 800 кГц)
- **128**: 112 мкс (частота оцифровки 8 900 Гц) - **128**: 112 мкс (частота оцифровки 8 900 Гц)
- В функции **analogRead(pin)** вместо пина можно указать **INTERNAL** (получить значение внутреннего опорного напряжения) или **THERMOMETR** (получить приблизительную температуру МК). *Примечание: нужно установить предделитель 128* - В функции **analogRead(pin)** вместо пина можно указать **INTERNAL** (получить значение внутреннего опорного напряжения) или **THERMOMETR** (получить приблизительную температуру МК). *Примечание: нужно установить предделитель 128*
- Добавлен очень быстрый и лёгкий **UART** (аналог классу Serial) - Добавлен очень быстрый и лёгкий **uart** (аналог классу Serial)
- **uartBegin()** - запустить соединение по последовательному порту со скоростью 9600 - **uart.begin()** - запустить соединение по последовательному порту со скоростью 9600
- **uartBegin(baudrate)** - запустить соединение по последовательному порту со скоростью baudrate - **uart.begin(baudrate)** - запустить соединение по последовательному порту со скоростью baudrate
- **uartEnd()** - выключить сериал - **uart.end()** - выключить сериал
- **uartPeek()** - вернуть крайний байт из буфера, не убирая его оттуда - **uart.peek()** - вернуть крайний байт из буфера, не убирая его оттуда
- **uartClear()** - очистить буфер - **uart.clear()** - очистить буфер
- **uartRead()** - вернуть крайний байт из буфера, убрав его оттуда - **uart.read()** - вернуть крайний байт из буфера, убрав его оттуда
- **uartWrite(val)** - запись в порт - **uart.write(val)** - запись в порт
- **uartPrint(val)** - печать в порт (числа, строки, char array) - **uart.print(val)** - печать в порт (числа, строки, char array)
- **uartPrintln(val)** - печать в порт с переводом строки - **uart.println(val)** - печать в порт с переводом строки
- **uartAvailable()** - возвразает true, если в буфере что-то есть - **uart.available()** - возвразает true, если в буфере что-то есть
- **uartSetTimeout(val)** - установить таймаут для функций парсинга (по умолчанию 100 мс) - **uart.setTimeout(val)** - установить таймаут для функций парсинга (по умолчанию 100 мс)
- **uartParseInt()** - принять целочисленное число - **uart.parseInt()** - принять целочисленное число
- **uartReadString()** - принять строку - **uart.readString()** - принять строку
- **uartParseFloat()** - принять число float - **uart.readStringUntil()** - принять строку по терминатору
- **uartParsePacket(dataArray)** - принять пакет вида **$50 60 70;** в массив dataArray (смотри пример) - **uart.parseFloat()** - принять число float
- **uart.parsePacket(dataArray)** - принять пакет вида **$50 60 70;** в массив dataArray (смотри пример)
### Убарно ### Убарно
Убраны всякие сервисные файлы и прочий хлам, не относящийся к ATmega328 (wifi, USB), почищен код. Ядро полностью совместимо с остальными библиотеками, ничего из стандартных функций не вырезано. Убраны всякие сервисные файлы и прочий хлам, не относящийся к ATmega328 (wifi, USB), почищен код. Ядро полностью совместимо с остальными библиотеками, ничего из стандартных функций не вырезано.
@ -148,6 +149,11 @@ parseFloat | 1070 | 246 | 824
- **disable** - вектор прерываний OVF таймера 0 освобождён для пользователя, delay/delayMicroseconds работают, millis/micros - нет - **disable** - вектор прерываний OVF таймера 0 освобождён для пользователя, delay/delayMicroseconds работают, millis/micros - нет
- Примечание: при отключенном таймере 0 функции delay и delayMicroseconds автоматически заменяются на _delay_ms и _delay_us из avr/util.h, а millis и micros заменены на 0 - Примечание: при отключенном таймере 0 функции delay и delayMicroseconds автоматически заменяются на _delay_ms и _delay_us из avr/util.h, а millis и micros заменены на 0
--- ---
**Serial** - работа с Serial:
- **default Serial** - при работе с **Serial** работает стандартная библиотека **Serial**
- **GyverUART** - все обращения к **Serial** в коде автоматически заменяются на **uart** из библиотеки GyverUART - код становится быстрее и легче!
- Примечание: в GyverUART нет функций find, findUntil, readBytes и readBytesUntil!
---
**B.O.D.** (Brown-out detector) - reset при падении напряжения **(требует перезаписи загрузчика)**: **B.O.D.** (Brown-out detector) - reset при падении напряжения **(требует перезаписи загрузчика)**:
- **disable** - отключен - **disable** - отключен
- **1.8V** - сброс при напряжении питания ниже 1.7-2.0V - **1.8V** - сброс при напряжении питания ниже 1.7-2.0V
@ -226,4 +232,7 @@ parseFloat | 1070 | 246 | 824
- Всё протестировано на всех загрузчиках (спасибо Egor!) - Всё протестировано на всех загрузчиках (спасибо Egor!)
- 1.8.1 - 1.8.1
- Пофикшен вывод float в uart - Пофикшен вывод float в uart
- В uart добавлен вывод с базисом числа - В uart добавлен вывод с базисом числа
- 1.8.2
- uart обёрнут в класс
- Добавлена возможность заменить вызовы Serial на uart (через меню выбора платы)

View File

@ -1,22 +0,0 @@
void setup() {
setPWM_20kHz(5); // частота шим на D5 установлена на 20 кГц
// ШИМ на выходе D6 больше не рабоатет!
// функции времени (millis/delay) теперь работают некорректно
analogWrite(5, 30); // запустить ШИМ на D5
setPwmFreqnuency(3, PWM_31KHZ); // частота ШИМ на пинах 3 (и на 11) установлена на 31 кГц
analogWrite(3, 30); // запустить ШИМ на D3
analogWrite(11, 200); // запустить ШИМ на D11
setPWM_20kHz(9); // частота шим на D9 (и автоматичсеки на D10) установлена на 20 кГц
// разрядность по умолчанию 8 бит (0-255)
setPWM_9_10_resolution(PWM_10BIT); // ШИМ на пинах 9 и 10 теперь 10 битный (0-1023)
analogWrite(9, 512); // ШИМ на пине 9 с 50% заполнением
analogWrite(10, 700); // ШИМ на пине 9 с заполнением 700/1023
}
void loop() {
}

View File

@ -1,21 +1,16 @@
// пример работы с функцией uartParsePacket
// функция принимает из порта строку вида
// $10 21 458 63 8 45 875 215;
// и запихивает в массив dataArray
int dataArray[8]; int dataArray[8];
void setup() { void setup() {
uartBegin(); // открыть на 9600 uart.begin(); // открыть на 9600
} }
void loop() { void loop() {
// $10 21 458 63 8 45 875 215; // $10 21 458 63 8 45 875 215;
if (uartParsePacket((int*)dataArray)) { if (uart.parsePacket((int*)dataArray)) {
for (byte i = 0; i < 8; i++) { for (byte i = 0; i < 8; i++) {
uartPrint(dataArray[i]); uart.print(dataArray[i]);
uartPrint(" "); uart.print(" ");
} }
uartPrintln(); uart.println();
} }
} }

View File

@ -1,5 +1,4 @@
// тест вывода в порт разных типов данных char data0 = 'b';
int8_t data1 = -50; int8_t data1 = -50;
uint8_t data2 = 125; uint8_t data2 = 125;
int16_t data3 = -2000; int16_t data3 = -2000;
@ -16,20 +15,26 @@ const char *data10[] = {
"CHEBUREK", "CHEBUREK",
}; };
byte data11 = 0b11101011;
uint32_t data12 = 0xFAB666;
void setup() { void setup() {
uartBegin(); uart.begin();
uartPrintln(data1); uart.println(data0);
uartPrintln(data2); uart.println(data1);
uartPrintln(data3); uart.println(data2);
uartPrintln(data4); uart.println(data3);
uartPrintln(data5); uart.println(data4);
uartPrintln(data6); uart.println(data5);
uartPrintln(data7); uart.println(data6);
uartPrintln(data8, 3); uart.println(data7);
uartPrintln(data9); uart.println(data8, 3);
uartPrintln("KEK KEK"); uart.println(data9);
uartPrintln(F("KEK KEK MACRO")); uart.println("KEK KEK");
uartPrintln(data10[2]); uart.println(F("KEK KEK MACRO"));
uart.println(data10[2]);
uart.println(data11, BIN);
uart.println(data12, HEX);
} }
void loop() { void loop() {

View File

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