mirror of
https://github.com/AlexGyver/GyverCore.git
synced 2025-07-04 15:22:25 +03:00
upd
This commit is contained in:
@ -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.
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
@ -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
|
@ -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;
|
||||||
}
|
}
|
@ -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();
|
||||||
}
|
}
|
@ -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
|
@ -5,7 +5,7 @@
|
|||||||
#######################################
|
#######################################
|
||||||
# Datatypes (KEYWORD1)
|
# Datatypes (KEYWORD1)
|
||||||
#######################################
|
#######################################
|
||||||
|
uart KEYWORD1
|
||||||
#######################################
|
#######################################
|
||||||
# Methods and Functions (KEYWORD2)
|
# Methods and Functions (KEYWORD2)
|
||||||
#######################################
|
#######################################
|
||||||
|
51
README.md
51
README.md
@ -1,6 +1,6 @@
|
|||||||

|

|
||||||
# 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 (через меню выбора платы)
|
@ -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() {
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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() {
|
||||||
|
@ -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": []
|
||||||
|
Reference in New Issue
Block a user