1
0
mirror of https://github.com/AlexGyver/GyverCore.git synced 2025-07-03 04:22:31 +03:00
This commit is contained in:
Alex
2019-09-02 01:10:13 +03:00
parent 9b679e0340
commit ad84f21a0f
11 changed files with 142 additions and 365 deletions

View File

@ -5,6 +5,9 @@
################################### ###################################
## GyverCore on 328 based boards ## ## GyverCore on 328 based boards ##
################################### ###################################
nano.build.extra_flags={extra_flags.timer} {extra_flags.init}
## BOARD ## ## BOARD ##
nano.name=ATmega328 based nano.name=ATmega328 based
@ -99,6 +102,14 @@ nano.menu.boot.optiboot.speeds.US16MHZ=115200
nano.menu.boot.optiboot.speeds.US8MHZ=57600 nano.menu.boot.optiboot.speeds.US8MHZ=57600
nano.menu.boot.optiboot.speeds.US1MHZ=7200 nano.menu.boot.optiboot.speeds.US1MHZ=7200
nano.menu.boot.optiboot_v8=OptiBoot v8
nano.menu.boot.optiboot_v8.upload.maximum_size=32256
nano.menu.boot.optiboot_v8.fuses.BOOT=110
nano.menu.boot.optiboot_v8.bootloader.dir=optiboot_v8
nano.menu.boot.optiboot_v8.speeds.US16MHZ=115200
nano.menu.boot.optiboot_v8.speeds.US8MHZ=57600
nano.menu.boot.optiboot_v8.speeds.US1MHZ=7200
nano.menu.boot.no=Without bootloader nano.menu.boot.no=Without bootloader
nano.menu.boot.no.upload.maximum_size=32768 nano.menu.boot.no.upload.maximum_size=32768
nano.menu.boot.no.fuses.BOOT=111 nano.menu.boot.no.fuses.BOOT=111
@ -111,6 +122,7 @@ nano.menu.boot.no.speeds.US1MHZ=666
menu.timers=System timer menu.timers=System timer
nano.menu.timers.yes_millis=enable nano.menu.timers.yes_millis=enable
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.build.extra_flags=-D_GYVERCORE_NOMILLIS nano.menu.timers.no_millis.build.extra_flags=-D_GYVERCORE_NOMILLIS
@ -129,8 +141,7 @@ nano.menu.bod.bod_4_3.bootloader.extended_fuses=0xFC
## INIT ## ## INIT ##
menu.init=Initialization menu.init=Initialization
nano.menu.init.default=default nano.menu.init.enable=enable
nano.menu.init.default.build.extra_flags=-D_GYVERCORE_DEF_INIT nano.menu.init.enable.extra_flags.init=
nano.menu.init.light_init=light (beta)
nano.menu.init.light_init.build.extra_flags=-D_GYVERCORE_LIGHT_INIT
nano.menu.init.no_init=disable nano.menu.init.no_init=disable
nano.menu.init.no_init.extra_flags.init=-D_GYVERCORE_NOINIT

View File

@ -0,0 +1,33 @@
:107E000001C0DCC0112484B7882361F0982F9A70D8
:107E1000923041F081FF02C097EF94BF282E80E09E
:107E2000B8D0EEC085E08093810082E08093C000EE
:107E300088E18093C10086E08093C20080E1809356
:107E4000C4008EE0A6D0259A86E020E33CEF91E0C6
:107E5000309385002093840096BBB09BFECF1D9A83
:107E6000A8954091C00047FD02C0815089F7EE24DB
:107E7000E39495E0D92E21E1C22E7FD0813461F4C4
:107E80007CD0182F8CD01238E9F0113811F488E02A
:107E900001C083E06BD067C0823411F484E103C079
:107EA000853419F485E083D05EC0853539F465D01A
:107EB000C82F63D0D82FCC0FDD1F54C0863521F4D6
:107EC00084E075D080E0E6CF843609F02EC055D02E
:107ED00054D0F82E52D0B82E00E011E04ED0F80168
:107EE00081938F01FE12FACF5AD0F5E4BF1201C080
:107EF000FFCF83E0FE0187BFE89507B600FCFDCF0A
:107F0000A0E0B1E0FE018D919D910C01E7BEE895E6
:107F100011243296FA12F7CFFE01D7BEE89507B6C4
:107F200000FCFDCFC7BEE8951EC0843771F425D094
:107F300024D0F82E22D033D08E01F80185918F0104
:107F400015D0FA94F110F9CF0EC0853739F427D047
:107F50008EE10CD085E90AD08FE09CCF813511F4F9
:107F600088E017D01CD080E101D087CF9091C0006D
:107F700095FFFCCF8093C60008958091C00087FFD5
:107F8000FCCF8091C00084FD01C0A8958091C600FF
:107F90000895E0E6F0E098E1908380830895EDDFB6
:107FA000803219F088E0F5DFFFCF84E1DFCFCF9397
:107FB000C82FE3DFC150E9F7CF91F1CFFC010A01EF
:107FC00067BFE895112407B600FCFDCF667029F065
:0C7FD000452B19F481E187BFE895089566
:027FFE00000879
:0400000300007E007B
:00000001FF

View File

@ -0,0 +1 @@
:107E0000112484B714BE81FFF0D085E080938100F7

View File

@ -44,13 +44,6 @@ extern "C"{
#define EXTERNAL 0 #define EXTERNAL 0
#define THERMOMETR 22 #define THERMOMETR 22
#define PWM_8BIT 0
#define PWM_10BIT 1
#define PWM_DEFAULT 0
#define PWM_8KHZ 1
#define PWM_31KHZ 2
// ===== MATH MACRO ===== // ===== MATH MACRO =====
#ifdef abs #ifdef abs
#undef abs #undef abs
@ -111,10 +104,6 @@ void init(void);
// ===== PIN OPERATION ====== // ===== PIN OPERATION ======
// new // new
void lightInit(void); void lightInit(void);
void setPWM_20kHz(byte pin);
void setPWM_9_10_resolution(boolean resolution); // 0 - 8 бит, 1 - 10 бит
void setPwmFreqnuency(byte pin, byte freq); //default, 8KHZ, 31KHZ
void setPWM_default(byte pin);
void analogStartConvert(byte pin); void analogStartConvert(byte pin);
void analogPrescaler(uint8_t prescl); void analogPrescaler(uint8_t prescl);
int analogGet(); int analogGet();

View File

@ -0,0 +1,23 @@
#include "Arduino.h"
void init() { // функция инициализации
cli();
/* timer 0 */
TCCR0A = 0b00000011; // fast pwm 8 bit
TCCR0B = 0b00000011; // делитель 64
#ifndef _GYVERCORE_NOMILLIS
TIMSK0 |= (1<<TOIE0); // ovf interrupt вкл
#endif
/* timer 1 */
TCCR1A = 0b00000001; // phasecorrect pwm 8 bit
TCCR1B = 0b00001011; // делитель 64
/* timer 2 */
TCCR2A = 0b00000001; // phasecorrect pwm 8 bit
TCCR2B = 0b00000100; // делитель 64
/* adc */
ADCSRA = 0b10000010; // делитель - 4 [0,1,2 bits - делитель]
/* ADC prescalers: 001 >> /2 010 >> /4 011 >> /8 100 >> /16 101 >> /32 110 >> /64 111 >> /128*/
/* UART */
UCSR0B = 0; // пока не вызван Serial.begin / uartBegin выводы 0/1 свободны для работы.
sei();
}

View File

@ -1,20 +0,0 @@
#include "Arduino.h"
/* Легкий вариант инцииализации периферии ATmega328 */
void lightInit() {
/* timer 0*/
TCCR0A = 0b00000011;
TCCR0B = 0b00000011;
#ifndef _GYVERCORE_NOMILLIS
TIMSK0 |= (1<<TOIE0); // ovf interrupt вкл
#endif
/* timer 1 */
TCCR1A = 0b00000001;
TCCR1B = 0b00000011;
/*timer 2*/
TCCR2A = 0b00000001;
TCCR2B = 0b00000100;
/* adc */
ADCSRA = 0b10000010;
}

View File

@ -1,14 +1,11 @@
/* Главный цикл программы */ /* Главный цикл программы */
#pragma message "GyverCore v1.7.2 inside. Enjoy" #pragma message "GyverCore v1.7.3 inside. Enjoy"
#include <Arduino.h> #include <Arduino.h>
int main(void) int main(void) {
{ WDTCSR |= (1<<WDCE); // даем разрешение отключить ватчдог #ifndef _GYVERCORE_NOINIT
WDTCSR = 0; // Первым делом отключаем ватчдог
#if defined (_GYVERCORE_DEF_INIT)
init(); // инициализация таймеров и ацп init(); // инициализация таймеров и ацп
#elif defined (_GYVERCORE_LIGHT_INIT)
lightInit();// лёгкая инициализация таймеров и ацп
#endif #endif
setup(); // функция setup setup(); // функция setup
for(;;) { // бесконечный цикл for(;;) { // бесконечный цикл

View File

@ -127,17 +127,8 @@ void analogReference(uint8_t mode)
int analogRead(uint8_t pin) int analogRead(uint8_t pin)
{ {
if(a_ref == INTERNAL) a_ref = 3; // для удобства задвигания analogStartConvert(pin);
uint8_t oldSREG = SREG; // запомнинаем были ли включены прерывания analogGet();
cli();//выключаем прерывания
pin = (pin < 14) ? (pin) : (pin - 14); // совместимость между A0, A1.. A7 и 0, 1.. 7
ADMUX = 0; // обнуляем опорное и мультиплексор
ADMUX = (a_ref << 6) | pin; // задвигаем опорное и номер входа
SREG = oldSREG; // если прерывания не были включены - не включаем и наоборот
if (pin == 8 || pin == 14) delay(2); // Wait for Vref to settle для VCC и термометра
ADCSRA |= (1 << ADSC); // начинаем преобразование
while (ADCSRA & (1 << ADSC)); // ждем окончания
return ADCL | (ADCH << 8); // склеить и вернуть результат
} }
void analogStartConvert(byte pin) { void analogStartConvert(byte pin) {
@ -158,230 +149,35 @@ int analogGet() {
} }
// ============= PWM ============= // ============= PWM =============
void analogWrite(uint8_t pin, int val) {
boolean _TMR0_HF_PWM = false;
boolean _TMR1_HF_PWM = false;
boolean _TMR2_HF_PWM = false;
boolean _TMR1_HR_PWM = false;
void analogWrite(uint8_t pin, int val)
{
cli(); cli();
switch (val) { switch (val) {
case 0:
digitalWrite(pin, 0);
break;
/*case 255:
digitalWrite(pin, 1);
break;*/
default:
switch (pin) { // вкл pwm
case 3: // 2B
if (!_TMR2_HF_PWM) {
TCCR2A |= (1 << COM2B1);
OCR2B = val;
} else {
if (val == 0) {
bitClear(TCCR2A, COM2B1);
bitClear(PORTD, 3);
} else {
bitSet(TCCR2A, COM2B1);
OCR2B = map(val, 0, 255, 0, 99);
}
}
break;
case 5: // 0B
if (!_TMR0_HF_PWM) {
TCCR0A |= (1 << COM0B1);
OCR0B = val;
} else {
if (val == 0) {
bitClear(TCCR0A, COM0B1);
bitClear(PORTD, 5);
} else {
bitSet(TCCR0A, COM0B1);
OCR0B = map(val, 0, 255, 0, 99);
}
}
break;
case 6: // 0A
TCCR0A |= (1 << COM0A1);
OCR0A = val;
break;
case 9: // 1A
if (!_TMR1_HF_PWM) {
TCCR1A |= (1 << COM1A1);
OCR1A = val;
} else {
if (!_TMR1_HR_PWM) val *= 3.13;
else val *= 0.78;
OCR1AH = highByte(val);
OCR1AL = lowByte(val);
}
break;
case 10: // 1B
if (!_TMR1_HF_PWM) {
TCCR1A |= (1 << COM1B1);
OCR1B = val;
} else {
if (!_TMR1_HR_PWM) val *= 3.13;
else val *= 0.78;
OCR1BH = highByte(val);
OCR1BL = lowByte(val);
}
break;
case 11: // 2A
TCCR2A |= (1 << COM2A1);
OCR2A = val;
break;
}
break;
}
sei();
}
/*
void setPWM_20kHz(byte pin); // установить частоту ШИМ 20 кГц (8 бит) на 3, 5, 9, 10
void setPWM_9_10_resolution(boolean resolution); // разрешение ШИМ на пинах 9 и 10 для 20 кГц: 0 - 8 бит, 1 - 10 бит
void setPwmFreqnuency(pin, freq); // установить частоту ШИМ (8 бит) на 3, 5, 6, 9, 10, 11: default, 8KHZ, 31KHZ
void setPWM_default(byte pin); // настроить ШИМ по умолчанию
*/
void setPWM_20kHz(byte pin) {
cli();
switch (pin) { // вкл pwm
case 3: // 2B
TCCR2A = 0b10100011;
TCCR2B = 0b00001010;
OCR2A = 99;
_TMR2_HF_PWM = true;
break;
case 5: // 0B
TCCR0A = 0b10100011;
TCCR0B = 0b00001010;
OCR0A = 99;
_TMR0_HF_PWM = true;
break;
case 9: // 1A
TCCR1A = 0b10100010;
TCCR1B = 0b00011001;
ICR1H = 3; // highByte(799)
ICR1L = 31; // lowByte(799)
_TMR1_HF_PWM = true;
break;
case 10: // 1B
TCCR1A = 0b10100010;
TCCR1B = 0b00011001;
ICR1H = 3; // highByte(799)
ICR1L = 31; // lowByte(799)
_TMR1_HF_PWM = true;
break;
}
sei();
}
// 0 - 8 бит, 1 - 10 бит
void setPWM_9_10_resolution(boolean resolution) {
if (resolution) _TMR1_HR_PWM = true;
else _TMR1_HR_PWM = false;
}
void setPwmFreqnuency(byte pin, byte freq) { //default, 8KHZ, 31KHZ
cli();
switch (pin) {
case 5: case 5:
case 6: //Timer0 bitSet(TCCR0A, COM0B1);
switch (freq) { OCR0B = val;
case 0: break;
TCCR0B = 0b00000011; // x64 case 6:
TCCR0A = 0b00000011; // fast pwm bitSet(TCCR0A, COM0A1);
break; OCR0A = val;
case 1: break;
TCCR0B = 0b00000010; // x8 case 10:
TCCR0A = 0b00000011; // fast pwm bitSet(TCCR1A, COM1B1);
break; OCR1B = val;
case 2:
TCCR0B = 0b00000001; // x1
TCCR0A = 0b00000001; // phase correct
break;
}
break; break;
case 9: case 9:
case 10: //Timer1 bitSet(TCCR1A, COM1A1);
_TMR1_HR_PWM = false; OCR1A = val;
switch (freq) {
case 0:
TCCR1A = 0b00000001; // 8bit
TCCR1B = 0b00000011; // x64 phase correct
break;
case 1:
TCCR1A = 0b00000001; // 8bit
TCCR1B = 0b00001010; // x8 fast pwm
break;
case 2:
TCCR1A = 0b00000001; // 8bit
TCCR1B = 0b00000001; // x1 phase correct
break;
}
break; break;
case 3: case 3:
case 11: //Timer2 bitSet(TCCR2A, COM2B1);
switch (freq) { OCR2B = val;
case 0: break;
TCCR2B = 0b00000100; // x64 case 11:
TCCR2A = 0b00000001; // phase correct bitSet(TCCR2A, COM2A1);
break; OCR2A = val;
case 1: break;
// Пины D3 и D11 - 8 кГц default:
TCCR2B = 0b00000010; // x8
TCCR2A = 0b00000011; // fast pwm
break;
case 2:
TCCR2B = 0b00000001; // x1
TCCR2A = 0b00000001; // phase correct
break;
}
break; break;
} }
sei(); sei();
} }
void setPWM_default(byte pin) {
cli();
switch (pin) {
case 3: //Timer2_B // не хочешь /64 можешь сделать /1
TCCR2A = 0b10100001; //default pwm 8 bit phaseCorrect
TCCR2B = 0b00000100; // prescaler /64 // крайние левые 3 бита поменять на 001 для делителя 1
_TMR2_HF_PWM = false;
break;
case 5: //Timer0_B
TCCR0A = 0b10100011; //default pwm 8 bit FastPWM
TCCR0B = 0b00000011; // prescaler /64
_TMR0_HF_PWM = false;
break;
case 6: //Timer0_A
TCCR0A = 0b10100011; //default pwm 8 bit FastPWM
TCCR0B = 0b00000011; // prescaler /64
_TMR0_HF_PWM = false;
break;
case 9: //Timer1_A
TCCR1A = 0b10100001; // default pwm 8 bit phaseCorrect
TCCR1B = 0b00000011; // prescaler /64 // крайние левые 3 бита в 001 для делителя 1
_TMR1_HF_PWM = false;
break;
case 10: //Timer1_B
TCCR1A = 0b10100001; // default pwm 8 bit phaseCorrect
TCCR1B = 0b00000011; // prescaler /64
_TMR1_HF_PWM = false;
break;
case 11: //Timer2_A
TCCR2A = 0b10100011; //default pwm 8 bit FastPWM
TCCR2B = 0b00000011; // prescaler /64
_TMR2_HF_PWM = false;
break;
}
sei();
}

View File

@ -1,55 +1,20 @@
#include "Arduino.h" #include "Arduino.h"
#include <util/delay.h>
/* функции времени и инициализация таймеров , АЦП*/ /* функции времени и инициализация таймеров , АЦП*/
/*
#define MICROSECONDS_PER_TIMER0_OVERFLOW (clockCyclesToMicroseconds(64 * 256)) // 1024 на 16 МГц / 2048 на 8 МГц / 16384 на 1 МГц / 128000 на 128 кГц
#define MILLIS_INC (MICROSECONDS_PER_TIMER0_OVERFLOW / 1000) // 1 на 16 МГц / 2 на 8 МГц
#define FRACT_INC ((MICROSECONDS_PER_TIMER0_OVERFLOW % 1000) >> 3) // 3 на 16 МГц / 6 на 8 МГц
#define FRACT_MAX (1000 >> 3) // 125 на 16 МГц / 125 на 8 МГц
*/
#if defined (_GYVERCORE_NOMILLIS) #ifndef _GYVERCORE_NOMILLIS // millis включен
#include <util/delay.h> #define MICROSECONDS_PER_TIMER0_OVERFLOW (clockCyclesToMicroseconds(64 * 256))
#endif #define MILLIS_INC (MICROSECONDS_PER_TIMER0_OVERFLOW / 1000)
#define FRACT_INC ((MICROSECONDS_PER_TIMER0_OVERFLOW % 1000) >> 3)
#define FRACT_MAX (1000 >> 3)
#define MICROS_MULT (64 / clockCyclesPerMicrosecond())
#if F_CPU >= 16000000L
#define MILLIS_INC 1
#define FRACT_INC 3
#define FRACT_MAX 125
#define MICROS_MULT 4
#elif F_CPU >= 8000000L
#define MILLIS_INC 2
#define FRACT_INC 6
#define FRACT_MAX 125
#define MICROS_MULT 8
#elif F_CPU >= 1000000L
#define MILLIS_INC 16
#define FRACT_INC 48
#define FRACT_MAX 125
#define MICROS_MULT 64
#elif F_CPU == 128000L
#include <util/delay.h>
#define MILLIS_INC 128
#define FRACT_INC 0
#define FRACT_MAX 125
#define MICROS_MULT 500
#endif
#ifndef _GYVERCORE_NOMILLIS // переключатель, отключающий millis(), освобождающий вектор прерывания
volatile unsigned long timer0_overflow_count = 0; volatile unsigned long timer0_overflow_count = 0;
volatile unsigned long timer0_millis = 0; volatile unsigned long timer0_millis = 0;
static unsigned char timer0_fract = 0; static unsigned char timer0_fract = 0;
ISR(TIMER0_OVF_vect) ISR(TIMER0_OVF_vect){
{
timer0_millis += MILLIS_INC; timer0_millis += MILLIS_INC;
timer0_fract += FRACT_INC; timer0_fract += FRACT_INC;
if (timer0_fract >= FRACT_MAX) { if (timer0_fract >= FRACT_MAX) {
@ -74,13 +39,11 @@ unsigned long micros() {
m++; m++;
sei(); // продолжить счет sei(); // продолжить счет
return (long)(((m << 8) + t) * MICROS_MULT); // вернуть микросекунды return (long)(((m << 8) + t) * MICROS_MULT); // вернуть микросекунды
// return ((m << 8) + t) * (64 / clockCyclesPerMicrosecond()); // default
} }
#endif #endif
void delay(unsigned long ms) { void delay(unsigned long ms) {
#if defined (_GYVERCORE_NOMILLIS) #ifdef _GYVERCORE_NOMILLIS
_delay_ms(ms); _delay_ms(ms);
#else #else
@ -96,7 +59,7 @@ void delay(unsigned long ms) {
} }
void delayMicroseconds(unsigned int us) { void delayMicroseconds(unsigned int us) {
#if defined (_GYVERCORE_NOMILLIS) #if defined(_GYVERCORE_NOMILLIS) || F_CPU < 1000000L
_delay_us(us); _delay_us(us);
#else #else
@ -114,41 +77,13 @@ void delayMicroseconds(unsigned int us) {
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
#if F_CPU > 128000L
// busy wait // busy wait
__asm__ __volatile__ ( __asm__ __volatile__ (
"1: sbiw %0,1" "\n\t" // 2 cycles "1: sbiw %0,1" "\n\t" // 2 cycles
"brne 1b" : "=w" (us) : "0" (us) // 2 cycles "brne 1b" : "=w" (us) : "0" (us) // 2 cycles
); );
// return = 4 cycles // return = 4 cycles
#else
_delay_us(us);
#endif
#endif #endif
} }
void init() // функция инициализации
{
cli();
/* timer 0 */
TCCR0A = 0b00000011; // fast pwm 8 bit
TCCR0B = 0b00000011; // делитель 64
#ifndef _GYVERCORE_NOMILLIS
TIMSK0 |= (1<<TOIE0); // ovf interrupt вкл
#endif
/* timer 1 */
TCCR1A = 0b00000001; // phasecorrect pwm 8 bit
TCCR1B = 0b00001011; // делитель 64
/* timer 2 */
TCCR2A = 0b00000001; // phasecorrect pwm 8 bit
TCCR2B = 0b00000100; // делитель 64
/* adc */
ADCSRA = 0b10000010; // делитель - 4 [0,1,2 bits - делитель]
/* ADC prescalers: 001 >> /2 010 >> /4 011 >> /8 100 >> /16 101 >> /32 110 >> /64 111 >> /128*/
/* UART */
UCSR0B = 0; // пока не вызван Serial.begin / uartBegin выводы 0/1 свободны для работы.
sei();
}

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.7.0 от 31.08.2019** **Версия 1.7.3 от 01.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
@ -19,13 +19,11 @@
- Жми **Установка** - Жми **Установка**
- Закрой окно - Закрой окно
- Выбери плату в **Инструменты > Плата > GyverCore > ATmega328/168 based** - Выбери плату в **Инструменты > Плата > GyverCore > ATmega328/168 based**
- Выбери в **CPU & BOOT** нужный вариант платы (168/328) и загрузчика (optiBoot, old bootloader, without bootloader)
- Выбери частоту (8 MHz / 16 MHz)
- Готово! - Готово!
- *Примечание*: файлы ядра находятся по пути C:\Users\Username\AppData\Local\Arduino15\packages\GyverCore\hardware\avr\1.6.0\ - *Примечание*: файлы ядра находятся по пути C:\Users\Username\AppData\Local\Arduino15\packages\GyverCore\hardware\avr\1.7.3\
### Ручная ### Ручная
- Файлы из папки GyverCore в этом репозитории положить по пути C:\Users\Username\AppData\Local\Arduino15\packages\GyverCore\hardware\avr\1.6.0\ - Файлы из папки GyverCore в этом репозитории положить по пути C:\Users\Username\AppData\Local\Arduino15\packages\GyverCore\hardware\avr\1.7.3\
## Изменения ## Изменения
### Облегчено и ускорено ### Облегчено и ускорено
@ -88,12 +86,6 @@ parseFloat | 1070 | 246 | 824
- Расширена подсветка синтаксиса (вплоть до названий регистров и битов) - Расширена подсветка синтаксиса (вплоть до названий регистров и битов)
- Макрос **bitToggle**(value, bit), инвертирует состояние бита **bit** в байте **value** - Макрос **bitToggle**(value, bit), инвертирует состояние бита **bit** в байте **value**
- Быстрая функция **digitalToggle**(pin), инвертирует состояние пина - Быстрая функция **digitalToggle**(pin), инвертирует состояние пина
- В самом начале программы вызывается сброс **watchdog**, что спасёт от bootloop при настройке watchdog на старом загрузчике
- Расширенная генерация ШИМ (все частоты указаны для клока 16 МГц):
- **setPWM_20kHz**(byte pin) - установить частоту ШИМ 20 кГц (8 бит) **на D пинах 3, 5, 9, 10**
- **setPWM_9_10_resolution**(boolean resolution) - разрешение ШИМ **на D пинах 9 и 10** (для режима 20 кГц): **PWM_8BIT** / **PWM_10BIT**
- **setPwmFreqnuency**(pin, freq) - установить частоту ШИМ (8 бит) **на D пинах 3, 5, 6, 9, 10, 11**: **PWM_DEFAULT** / **PWM_8KHZ** / **PWM_31KHZ**
- **setPWM_default**(byte pin) - настроить ШИМ по умолчанию
- Расширенная работа с АЦП - Расширенная работа с АЦП
- **analogStartConvert**(byte pin) - начать преобразование с выбранного пина - **analogStartConvert**(byte pin) - начать преобразование с выбранного пина
- **analogGet()** - получить преобразованное значение (между analogStartConvert и analogGet можно выполнять действия, в отличие от ожидания в analogRead()) - **analogGet()** - получить преобразованное значение (между analogStartConvert и analogGet можно выполнять действия, в отличие от ожидания в analogRead())
@ -128,8 +120,9 @@ parseFloat | 1070 | 246 | 824
## Настройки платы ## Настройки платы
**Bootloader** - выбор загрузчика (требует перезаписи загрузчика): **Bootloader** - выбор загрузчика (требует перезаписи загрузчика):
- Старый **old bootloader** - **old bootloader** - cтарый загрузчик (стоит на большинстве китайских плат)
- Новый с **optiBoot**, киатйцы тоже потихоньку начинают продавать платы с ним - Новый с **optiBoot**, киатйцы тоже потихоньку начинают продавать платы с ним
- **optiBoot v8** - [optiboot](https://github.com/Optiboot/optiboot) самой свежей версии
- Вариант **without bootloader** для прошивки скетча во всю доступную (32 кБ) память МК - Вариант **without bootloader** для прошивки скетча во всю доступную (32 кБ) память МК
--- ---
**Clock** - выбор частоты и источника тактирования (требует перезаписи загрузчика): **Clock** - выбор частоты и источника тактирования (требует перезаписи загрузчика):
@ -161,11 +154,9 @@ parseFloat | 1070 | 246 | 824
- **2.7V (default)** - сброс при напряжении питания ниже 2.5-2.9V - **2.7V (default)** - сброс при напряжении питания ниже 2.5-2.9V
- **4.3V** - сброс при напряжении питания ниже 4.1-4.5V - **4.3V** - сброс при напряжении питания ниже 4.1-4.5V
--- ---
**Initialization** - инициализация периферии в начале скетча: **Initialization** - инициализация периферии (таймеры, ацп) в начале скетча:
- **default** - стандартная инициализация - **default** - стандартная инициализация
- **light (beta)** - облегчённая инициализация (некоторые библиотеки могут не работать)
- **disable** - инициализация отключена - **disable** - инициализация отключена
- Примечание: при отключении инициализации также отвалятся функции времени! Если выбрать **disable** в **System timer** - работа задержек будет восстановлена (работает на avr/util.h)
--- ---
## Больше контроля! ## Больше контроля!
Для большего контроля за периферией микроконтроллера рекомендую попробовать следующие наши библиотеки: Для большего контроля за периферией микроконтроллера рекомендую попробовать следующие наши библиотеки:
@ -217,3 +208,10 @@ parseFloat | 1070 | 246 | 824
- Улучшен uart - Улучшен uart
- 1.7.2 - 1.7.2
- Поправлено отключение millis - Поправлено отключение millis
- 1.7.3
- Сокращён аналогРид
- Убран расширенный ШИМ
- Убран сброс WDT (не работал)
- Пофикшены различные баги
- Убран lightInit
- Добавлен загрузчик optiBoot v8

View File

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