mirror of
https://github.com/AlexGyver/GyverCore.git
synced 2025-12-09 21:41:23 +03:00
upd
This commit is contained in:
@@ -66,6 +66,13 @@ nano.menu.boot.no.speeds.US1MHZ=666
|
|||||||
## CLOCK ##
|
## CLOCK ##
|
||||||
menu.clock=Clock
|
menu.clock=Clock
|
||||||
|
|
||||||
|
nano.menu.clock.external_20=External 20 MHz
|
||||||
|
nano.menu.clock.external_20.fuses.CKDIV8=1
|
||||||
|
nano.menu.clock.external_20.fuses.CKSEL=111111
|
||||||
|
nano.menu.clock.external_20.build.f_cpu=20000000L
|
||||||
|
nano.menu.clock.external_20.bootloader.suffix=atmega328
|
||||||
|
nano.menu.clock.external_20.upload.speed={speeds.US16MHZ}
|
||||||
|
|
||||||
nano.menu.clock.external_16=External 16 MHz
|
nano.menu.clock.external_16=External 16 MHz
|
||||||
nano.menu.clock.external_16.fuses.CKDIV8=1
|
nano.menu.clock.external_16.fuses.CKDIV8=1
|
||||||
nano.menu.clock.external_16.fuses.CKSEL=111111
|
nano.menu.clock.external_16.fuses.CKSEL=111111
|
||||||
|
|||||||
@@ -90,11 +90,11 @@ bool digitalRead (uint8_t pin) {
|
|||||||
|
|
||||||
void digitalToggle(uint8_t pin) {
|
void digitalToggle(uint8_t pin) {
|
||||||
if (pin < 8) {
|
if (pin < 8) {
|
||||||
bitToggle(PORTD, pin);
|
bitSet(PIND, pin);
|
||||||
} else if (pin < 14) {
|
} else if (pin < 14) {
|
||||||
bitToggle(PORTB, (pin - 8));
|
bitSet(PINB, (pin - 8));
|
||||||
} else if (pin < 20) {
|
} else if (pin < 20) {
|
||||||
bitToggle(PORTC, (pin - 14)); // Toggle pin state (for 'tone()')
|
bitSet(PINC, (pin - 14)); // Toggle pin state (for 'tone()')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -136,7 +136,7 @@ uint16_t analogRead(uint8_t pin) {
|
|||||||
ADMUX = (analog_reference << 6) | pin; // Set analog MUX & reference
|
ADMUX = (analog_reference << 6) | pin; // Set analog MUX & reference
|
||||||
bitSet(ADCSRA, ADSC); // Start
|
bitSet(ADCSRA, ADSC); // Start
|
||||||
while (ADCSRA & (1 << ADSC)); // Wait
|
while (ADCSRA & (1 << ADSC)); // Wait
|
||||||
return ADCL | (ADCH << 8); // Return result
|
return ADC; // Return result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -194,13 +194,13 @@ String GyverUart::readStringUntil(char terminator) {
|
|||||||
// ====================== WRITE ===========================
|
// ====================== WRITE ===========================
|
||||||
/*
|
/*
|
||||||
// прямая запись без буфера
|
// прямая запись без буфера
|
||||||
void GyverUart::write(byte data){
|
void GyverUart::writeBuffer(byte data){
|
||||||
while (!(UCSR0A & (1<<UDRE0)));
|
while (!(UCSR0A & (1<<UDRE0)));
|
||||||
UDR0 = data;
|
UDR0 = data;
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void GyverUart::write(byte data) {
|
void GyverUart::writeBuffer(byte data) {
|
||||||
uint8_t i = (unsigned int)(_UART_TX_BUFFER_HEAD + 1 >= UART_TX_BUFFER_SIZE) ? 0 : _UART_TX_BUFFER_HEAD + 1;
|
uint8_t i = (unsigned int)(_UART_TX_BUFFER_HEAD + 1 >= UART_TX_BUFFER_SIZE) ? 0 : _UART_TX_BUFFER_HEAD + 1;
|
||||||
// ждать освобождения места в буфере
|
// ждать освобождения места в буфере
|
||||||
while ( (i + 1) == _UART_TX_BUFFER_TAIL);
|
while ( (i + 1) == _UART_TX_BUFFER_TAIL);
|
||||||
@@ -229,15 +229,19 @@ ISR(USART_TX_vect) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void GyverUart::println(void) {
|
void GyverUart::write(byte data) {
|
||||||
write('\r');
|
writeBuffer(data);
|
||||||
startTransmission();
|
startTransmission();
|
||||||
write('\n');
|
}
|
||||||
|
|
||||||
|
void GyverUart::println(void) {
|
||||||
|
writeBuffer('\r');
|
||||||
|
writeBuffer('\n');
|
||||||
startTransmission();
|
startTransmission();
|
||||||
}
|
}
|
||||||
|
|
||||||
void GyverUart::print(char data) {
|
void GyverUart::print(char data) {
|
||||||
write(data);
|
writeBuffer(data);
|
||||||
startTransmission();
|
startTransmission();
|
||||||
}
|
}
|
||||||
void GyverUart::println(char data) {
|
void GyverUart::println(char data) {
|
||||||
@@ -245,24 +249,23 @@ void GyverUart::println(char data) {
|
|||||||
println();
|
println();
|
||||||
}
|
}
|
||||||
|
|
||||||
void GyverUart::print(int8_t data, byte base) {printHelper( (long) data, base);}
|
void GyverUart::print(int8_t data, byte base) {printHelper( (int32_t) data, base);}
|
||||||
void GyverUart::print(uint8_t data, byte base) {printHelper( (uint32_t) data, base);}
|
void GyverUart::print(uint8_t data, byte base) {printHelper( (uint32_t) data, base);}
|
||||||
void GyverUart::print(int16_t data, byte base) {printHelper( (long) data, base);}
|
void GyverUart::print(int16_t data, byte base) {printHelper( (int32_t) data, base);}
|
||||||
void GyverUart::print(uint16_t data, byte base) {printHelper( (uint32_t) data, base);}
|
void GyverUart::print(uint16_t data, byte base) {printHelper( (uint32_t) data, base);}
|
||||||
void GyverUart::print(int32_t data, byte base) {printHelper( (long) data, base);}
|
void GyverUart::print(int32_t data, byte base) {printHelper( (int32_t) data, base);}
|
||||||
void GyverUart::print(uint32_t data, byte base) {printHelper( (uint32_t) data, base);}
|
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(int8_t data, byte base) {printHelper( (int32_t) data, base); println();}
|
||||||
void GyverUart::println(uint8_t data, byte base) {printHelper( (uint32_t) 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(int16_t data, byte base) {printHelper( (int32_t) data, base); println();}
|
||||||
void GyverUart::println(uint16_t data, byte base) {printHelper( (uint32_t) 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(int32_t data, byte base) {printHelper( (int32_t) data, base); println();}
|
||||||
void GyverUart::println(uint32_t data, byte base) {printHelper( (uint32_t) data, base); println();}
|
void GyverUart::println(uint32_t data, byte base) {printHelper( (uint32_t) data, base); println();}
|
||||||
|
|
||||||
|
|
||||||
void GyverUart::printHelper(int32_t data, byte base) {
|
void GyverUart::printHelper(int32_t data, byte base) {
|
||||||
if (data < 0) {
|
if (data < 0) {
|
||||||
write(45);
|
writeBuffer(45);
|
||||||
data = -data;
|
data = -data;
|
||||||
}
|
}
|
||||||
printHelper((uint32_t) data, base);
|
printHelper((uint32_t) data, base);
|
||||||
@@ -297,18 +300,18 @@ void GyverUart::printBytes(uint32_t data) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (int8_t i = amount; i >= 0; i--) {
|
for (int8_t i = amount; i >= 0; i--) {
|
||||||
write(bytes[i] + '0');
|
writeBuffer(bytes[i] + '0');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void GyverUart::print(double data, byte decimals) {
|
void GyverUart::print(double data, byte decimals) {
|
||||||
if (data < 0) {
|
if (data < 0) {
|
||||||
write(45);
|
writeBuffer(45);
|
||||||
data = -data;
|
data = -data;
|
||||||
}
|
}
|
||||||
uint32_t integer = data;
|
uint32_t integer = data;
|
||||||
printBytes(integer);
|
printBytes(integer);
|
||||||
write(46); // точка
|
writeBuffer(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;
|
||||||
|
|||||||
@@ -4,6 +4,8 @@
|
|||||||
// Версия 1.4 - либа собрана в класс
|
// Версия 1.4 - либа собрана в класс
|
||||||
// Версия 1.5 - добавлен буфер на отправку и flush
|
// Версия 1.5 - добавлен буфер на отправку и flush
|
||||||
// Версия 1.6 - ускорена запись и чтение
|
// Версия 1.6 - ускорена запись и чтение
|
||||||
|
// Версия 1.7 - чуть оптимизирован код
|
||||||
|
// Версия 1.8 - пофикшен write (спасибо eugenebartosh)
|
||||||
|
|
||||||
#ifndef GyverUART_h
|
#ifndef GyverUART_h
|
||||||
#define GyverUART_h
|
#define GyverUART_h
|
||||||
@@ -61,6 +63,7 @@ public:
|
|||||||
void println(char data[]);
|
void println(char data[]);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void writeBuffer(byte data);
|
||||||
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);
|
||||||
|
|||||||
@@ -4,41 +4,41 @@
|
|||||||
/* функции времени и инициализация таймеров , АЦП*/
|
/* функции времени и инициализация таймеров , АЦП*/
|
||||||
|
|
||||||
void init() {
|
void init() {
|
||||||
cli();
|
cli();
|
||||||
|
|
||||||
/*************** ADC ***************/
|
/*************** ADC ***************/
|
||||||
|
|
||||||
#ifndef ADC_PRESCALER
|
#ifndef ADC_PRESCALER
|
||||||
#define ADC_PRESCALER 0x02
|
#define ADC_PRESCALER 0x02
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/******************************************************************
|
/******************************************************************
|
||||||
* ADC prescaler: [ /2 ]-[ /4 ]-[ /8 ]-[ /16]-[ /32]-[ /64]-[/128] *
|
* ADC prescaler: [ /2 ]-[ /4 ]-[ /8 ]-[ /16]-[ /32]-[ /64]-[/128] *
|
||||||
* ADC_PRESCALER: [0x01]-[0x02]-[0x03]-[0x04]-[0x05]-[0x06]-[0x07] *
|
* ADC_PRESCALER: [0x01]-[0x02]-[0x03]-[0x04]-[0x05]-[0x06]-[0x07] *
|
||||||
******************************************************************/
|
******************************************************************/
|
||||||
ADCSRA = (1 << ADEN) | ADC_PRESCALER;
|
ADCSRA = (1 << ADEN) | ADC_PRESCALER;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/************ Timers ************/
|
/************ Timers ************/
|
||||||
|
|
||||||
TCCR0A = (1 << WGM01) | (1 << WGM00);
|
TCCR0A = (1 << WGM01) | (1 << WGM00);
|
||||||
TCCR0B = (1 << CS01) | (1 << CS00);
|
TCCR0B = (1 << CS01) | (1 << CS00);
|
||||||
#ifndef _GYVERCORE_NOMILLIS
|
#ifndef _GYVERCORE_NOMILLIS
|
||||||
TIMSK0 |= (1 << TOIE0);
|
TIMSK0 |= (1 << TOIE0);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
TCCR1A = (1 << WGM10);
|
TCCR1A = (1 << WGM10);
|
||||||
TCCR1B = (1 << WGM12) | (1 << CS11) | (1 << CS10);
|
TCCR1B = (1 << WGM12) | (1 << CS11) | (1 << CS10);
|
||||||
|
|
||||||
TCCR2A = (1 << WGM20);
|
TCCR2A = (1 << WGM20);
|
||||||
TCCR2B = (1 << CS22);
|
TCCR2B = (1 << CS22);
|
||||||
|
|
||||||
|
|
||||||
/************** USART **************/
|
/************** USART **************/
|
||||||
UCSR0B = 0x00;
|
UCSR0B = 0x00;
|
||||||
|
|
||||||
sei();
|
sei();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -86,9 +86,9 @@ unsigned long micros() {
|
|||||||
void delay(unsigned long ms) {
|
void delay(unsigned long ms) {
|
||||||
|
|
||||||
#ifdef _GYVERCORE_NOMILLIS
|
#ifdef _GYVERCORE_NOMILLIS
|
||||||
while(ms){
|
while(ms){
|
||||||
_delay_ms(ms);
|
_delay_ms(ms);
|
||||||
ms--;
|
ms--;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
uint32_t start = micros();
|
uint32_t start = micros();
|
||||||
@@ -105,34 +105,48 @@ void delay(unsigned long ms) {
|
|||||||
void delayMicroseconds(unsigned int us) {
|
void delayMicroseconds(unsigned int us) {
|
||||||
|
|
||||||
#if F_CPU < 1000000L
|
#if F_CPU < 1000000L
|
||||||
_delay_us(us);
|
_delay_us(us);
|
||||||
#else
|
#else
|
||||||
|
|
||||||
#if F_CPU >= 16000000L
|
|
||||||
if (us <= 1) return; // = 3 cycles, (4 when true)
|
#if F_CPU >= 24000000L
|
||||||
us <<= 2; // x4 us, = 4 cycles
|
if (!us) return; // = 3 cycles, (4 when true)
|
||||||
us -= 5;
|
us *= 6; // x6 us, = 7 cycles
|
||||||
|
us -= 5; //=2 cycles
|
||||||
|
#elif F_CPU >= 20000000L
|
||||||
|
__asm__ __volatile__ (
|
||||||
|
"nop" "\n\t"
|
||||||
|
"nop" "\n\t"
|
||||||
|
"nop" "\n\t"
|
||||||
|
"nop"); //just waiting 4 cycles
|
||||||
|
if (us <= 1) return; // = 3 cycles, (4 when true)
|
||||||
|
us = (us << 2) + us; // x5 us, = 7 cycles
|
||||||
|
us -= 7; // 2 cycles
|
||||||
|
#elif F_CPU >= 16000000L
|
||||||
|
if (us <= 1) return; // = 3 cycles, (4 when true)
|
||||||
|
us <<= 2; // x4 us, = 4 cycles
|
||||||
|
us -= 5;
|
||||||
#elif F_CPU >= 8000000L
|
#elif F_CPU >= 8000000L
|
||||||
if (us <= 2) return; // = 3 cycles, (4 when true)
|
if (us <= 2) return; // = 3 cycles, (4 when true)
|
||||||
us <<= 1; //x2 us, = 2 cycles
|
us <<= 1; //x2 us, = 2 cycles
|
||||||
us -= 4; // = 2 cycles
|
us -= 4; // = 2 cycles
|
||||||
#elif F_CPU >= 1000000L
|
#elif F_CPU >= 1000000L
|
||||||
if (us <= 16) return; //= 3 cycles, (4 when true)
|
if (us <= 16) return; //= 3 cycles, (4 when true)
|
||||||
if (us <= 25) return; //= 3 cycles, (4 when true)
|
if (us <= 25) return; //= 3 cycles, (4 when true)
|
||||||
us -= 22; // = 2 cycles
|
us -= 22; // = 2 cycles
|
||||||
us >>= 2; // us div 4, = 4 cycles
|
us >>= 2; // us div 4, = 4 cycles
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
asm volatile
|
asm volatile
|
||||||
(
|
(
|
||||||
"loop_%=: \n\t"
|
"loop_%=: \n\t"
|
||||||
"sbiw %[counter],1 \n\t" // 2 cycles
|
"sbiw %[counter],1 \n\t" // 2 cycles
|
||||||
"brne loop_%= \n\t"
|
"brne loop_%= \n\t"
|
||||||
: [counter]"=w" (us)
|
: [counter]"=w" (us)
|
||||||
: "0" (us) // 2 cycles
|
: "0" (us) // 2 cycles
|
||||||
);
|
);
|
||||||
|
|
||||||
// return = 4 cycles
|
// return = 4 cycles
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/* Главный цикл программы */
|
/* Главный цикл программы */
|
||||||
#pragma message "Нас тут заперли, вызовите 911!"
|
#pragma message "Нас тут заперли, вызовите 911!"
|
||||||
#pragma message "GyverCore v2.0.1 inside. Enjoy"
|
#pragma message "GyverCore v2.0.2 inside. Enjoy"
|
||||||
|
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
|
|
||||||
|
|||||||
@@ -151,6 +151,7 @@ parseFloat | 1070 | 246 | 824
|
|||||||
- Вариант **without bootloader** для прошивки скетча во всю доступную (32 кБ) память МК
|
- Вариант **without bootloader** для прошивки скетча во всю доступную (32 кБ) память МК
|
||||||
---
|
---
|
||||||
**Clock** - выбор частоты и источника тактирования **(требует перезаписи загрузчика)**:
|
**Clock** - выбор частоты и источника тактирования **(требует перезаписи загрузчика)**:
|
||||||
|
- **External 20 MHz** (макс. частота для ATmega328, для своих плат)
|
||||||
- **External 16 MHz** (стандартный вариант для платы Nano 16 МГц)
|
- **External 16 MHz** (стандартный вариант для платы Nano 16 МГц)
|
||||||
- **External 8 MHz** (стандартный вариант для платы Nano 8 МГц)
|
- **External 8 MHz** (стандартный вариант для платы Nano 8 МГц)
|
||||||
- **Internal 8 MHz** (внутренний генератор: можно работать с голым камнем без кварца)
|
- **Internal 8 MHz** (внутренний генератор: можно работать с голым камнем без кварца)
|
||||||
@@ -294,3 +295,8 @@ parseFloat | 1070 | 246 | 824
|
|||||||
- 2.0.1
|
- 2.0.1
|
||||||
- Исправлена ошибка с delayMicroseconds
|
- Исправлена ошибка с delayMicroseconds
|
||||||
- Исправлено предупреждение файла у "без загрузчика"
|
- Исправлено предупреждение файла у "без загрузчика"
|
||||||
|
- 2.0.2
|
||||||
|
- Ускорен digitalToggle
|
||||||
|
- Обновлён uart
|
||||||
|
- Чуть ускорен analogRead
|
||||||
|
- Добавлена поддержка клока 20 МГц
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -330,6 +330,20 @@
|
|||||||
{"name": "ATmega328 based boards"}
|
{"name": "ATmega328 based boards"}
|
||||||
],
|
],
|
||||||
"toolsDependencies": []
|
"toolsDependencies": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "GyverCore",
|
||||||
|
"architecture": "avr",
|
||||||
|
"version": "2.0.2",
|
||||||
|
"category": "Contributed",
|
||||||
|
"url": "https://github.com/AlexGyver/GyverCore/releases/download/GyverCore-2.0.2/GyverCore.zip",
|
||||||
|
"archiveFileName": "GyverCore.zip",
|
||||||
|
"checksum": "MD5:81c4dc9d256ae55647b1002d56801f1e",
|
||||||
|
"size": "59050976",
|
||||||
|
"boards": [
|
||||||
|
{"name": "ATmega328 based boards"}
|
||||||
|
],
|
||||||
|
"toolsDependencies": []
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"tools": []
|
"tools": []
|
||||||
|
|||||||
Reference in New Issue
Block a user