diff --git a/GyverCore/boards.txt b/GyverCore/boards.txt index 907beea..f6e524f 100644 --- a/GyverCore/boards.txt +++ b/GyverCore/boards.txt @@ -5,6 +5,9 @@ ################################### ## GyverCore on 328 based boards ## ################################### + +nano.build.extra_flags={extra_flags.timer} {extra_flags.init} + ## BOARD ## 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.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.upload.maximum_size=32768 nano.menu.boot.no.fuses.BOOT=111 @@ -111,6 +122,7 @@ nano.menu.boot.no.speeds.US1MHZ=666 menu.timers=System timer 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.build.extra_flags=-D_GYVERCORE_NOMILLIS @@ -129,8 +141,7 @@ nano.menu.bod.bod_4_3.bootloader.extended_fuses=0xFC ## INIT ## menu.init=Initialization -nano.menu.init.default=default -nano.menu.init.default.build.extra_flags=-D_GYVERCORE_DEF_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 \ No newline at end of file +nano.menu.init.enable=enable +nano.menu.init.enable.extra_flags.init= +nano.menu.init.no_init=disable +nano.menu.init.no_init.extra_flags.init=-D_GYVERCORE_NOINIT \ No newline at end of file diff --git a/GyverCore/bootloaders/optiboot_v8/atmega328.hex b/GyverCore/bootloaders/optiboot_v8/atmega328.hex new file mode 100644 index 0000000..6be487c --- /dev/null +++ b/GyverCore/bootloaders/optiboot_v8/atmega328.hex @@ -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 diff --git a/GyverCore/bootloaders/optiboot_v8/emptyBoot.hex b/GyverCore/bootloaders/optiboot_v8/emptyBoot.hex new file mode 100644 index 0000000..708647b --- /dev/null +++ b/GyverCore/bootloaders/optiboot_v8/emptyBoot.hex @@ -0,0 +1 @@ +:107E0000112484B714BE81FFF0D085E080938100F7 \ No newline at end of file diff --git a/GyverCore/cores/arduino/Arduino.h b/GyverCore/cores/arduino/Arduino.h index 836ee0b..326c514 100644 --- a/GyverCore/cores/arduino/Arduino.h +++ b/GyverCore/cores/arduino/Arduino.h @@ -44,13 +44,6 @@ extern "C"{ #define EXTERNAL 0 #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 ===== #ifdef abs #undef abs @@ -111,10 +104,6 @@ void init(void); // ===== PIN OPERATION ====== // new 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 analogPrescaler(uint8_t prescl); int analogGet(); diff --git a/GyverCore/cores/arduino/Init.cpp b/GyverCore/cores/arduino/Init.cpp new file mode 100644 index 0000000..24c7ddf --- /dev/null +++ b/GyverCore/cores/arduino/Init.cpp @@ -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<> /2 010 >> /4 011 >> /8 100 >> /16 101 >> /32 110 >> /64 111 >> /128*/ + /* UART */ + UCSR0B = 0; // пока не вызван Serial.begin / uartBegin выводы 0/1 свободны для работы. + sei(); +} \ No newline at end of file diff --git a/GyverCore/cores/arduino/lightInit.cpp b/GyverCore/cores/arduino/lightInit.cpp deleted file mode 100644 index 84f2b14..0000000 --- a/GyverCore/cores/arduino/lightInit.cpp +++ /dev/null @@ -1,20 +0,0 @@ -#include "Arduino.h" - - -/* Легкий вариант инцииализации периферии ATmega328 */ -void lightInit() { - /* timer 0*/ - TCCR0A = 0b00000011; - TCCR0B = 0b00000011; -#ifndef _GYVERCORE_NOMILLIS - TIMSK0 |= (1< -int main(void) -{ WDTCSR |= (1< + /* функции времени и инициализация таймеров , АЦП*/ -/* -#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) -#include -#endif +#ifndef _GYVERCORE_NOMILLIS // millis включен +#define MICROSECONDS_PER_TIMER0_OVERFLOW (clockCyclesToMicroseconds(64 * 256)) +#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 - -#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_millis = 0; static unsigned char timer0_fract = 0; -ISR(TIMER0_OVF_vect) -{ +ISR(TIMER0_OVF_vect){ timer0_millis += MILLIS_INC; timer0_fract += FRACT_INC; if (timer0_fract >= FRACT_MAX) { @@ -74,13 +39,11 @@ unsigned long micros() { m++; sei(); // продолжить счет return (long)(((m << 8) + t) * MICROS_MULT); // вернуть микросекунды - - // return ((m << 8) + t) * (64 / clockCyclesPerMicrosecond()); // default } #endif void delay(unsigned long ms) { -#if defined (_GYVERCORE_NOMILLIS) +#ifdef _GYVERCORE_NOMILLIS _delay_ms(ms); #else @@ -96,7 +59,7 @@ void delay(unsigned long ms) { } void delayMicroseconds(unsigned int us) { -#if defined (_GYVERCORE_NOMILLIS) +#if defined(_GYVERCORE_NOMILLIS) || F_CPU < 1000000L _delay_us(us); #else @@ -114,41 +77,13 @@ void delayMicroseconds(unsigned int us) { if (us <= 25) return; //= 3 cycles, (4 when true) us -= 22; // = 2 cycles us >>= 2; // us div 4, = 4 cycles - #endif -#if F_CPU > 128000L // busy wait __asm__ __volatile__ ( "1: sbiw %0,1" "\n\t" // 2 cycles "brne 1b" : "=w" (us) : "0" (us) // 2 cycles ); // return = 4 cycles -#else - _delay_us(us); #endif -#endif -} - -void init() // функция инициализации -{ - cli(); - /* timer 0 */ - TCCR0A = 0b00000011; // fast pwm 8 bit - TCCR0B = 0b00000011; // делитель 64 -#ifndef _GYVERCORE_NOMILLIS - TIMSK0 |= (1<> /2 010 >> /4 011 >> /8 100 >> /16 101 >> /32 110 >> /64 111 >> /128*/ - /* UART */ - UCSR0B = 0; // пока не вызван Serial.begin / uartBegin выводы 0/1 свободны для работы. - sei(); -} +} \ No newline at end of file diff --git a/README.md b/README.md index eb56feb..067ec19 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![CORE_PHOTO](https://github.com/AlexGyver/GyverCore/blob/master/gyverCoreLogo.jpg) # GyverCore for ATmega328 - **Версия 1.7.0 от 31.08.2019** + **Версия 1.7.3 от 01.09.2019** Быстрое и лёгкое ядро для Arduino IDE с расширенной конфигурацией. Основано на оригинальном ядре Arduino версии 1.8.9, большинство функций заменены на более быстрые и лёгкие аналоги, убрано всё лишнее и не относящееся к микроконтроллеру ATmega328p, убран почти весь Wiring-мусор, код упрощён и причёсан. Добавлено несколько функций и интересных вариантов компиляции. Разработано by Александр **AlexGyver** и Egor 'Nich1con' Zaharov @@ -19,13 +19,11 @@ - Жми **Установка** - Закрой окно - Выбери плату в **Инструменты > Плата > 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** - Быстрая функция **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) - начать преобразование с выбранного пина - **analogGet()** - получить преобразованное значение (между analogStartConvert и analogGet можно выполнять действия, в отличие от ожидания в analogRead()) @@ -128,8 +120,9 @@ parseFloat | 1070 | 246 | 824 ## Настройки платы **Bootloader** - выбор загрузчика (требует перезаписи загрузчика): -- Старый **old bootloader** +- **old bootloader** - cтарый загрузчик (стоит на большинстве китайских плат) - Новый с **optiBoot**, киатйцы тоже потихоньку начинают продавать платы с ним +- **optiBoot v8** - [optiboot](https://github.com/Optiboot/optiboot) самой свежей версии - Вариант **without bootloader** для прошивки скетча во всю доступную (32 кБ) память МК --- **Clock** - выбор частоты и источника тактирования (требует перезаписи загрузчика): @@ -161,11 +154,9 @@ parseFloat | 1070 | 246 | 824 - **2.7V (default)** - сброс при напряжении питания ниже 2.5-2.9V - **4.3V** - сброс при напряжении питания ниже 4.1-4.5V --- -**Initialization** - инициализация периферии в начале скетча: +**Initialization** - инициализация периферии (таймеры, ацп) в начале скетча: - **default** - стандартная инициализация -- **light (beta)** - облегчённая инициализация (некоторые библиотеки могут не работать) - **disable** - инициализация отключена -- Примечание: при отключении инициализации также отвалятся функции времени! Если выбрать **disable** в **System timer** - работа задержек будет восстановлена (работает на avr/util.h) --- ## Больше контроля! Для большего контроля за периферией микроконтроллера рекомендую попробовать следующие наши библиотеки: @@ -216,4 +207,11 @@ parseFloat | 1070 | 246 | 824 - Поправлены баги с I/O - Улучшен uart - 1.7.2 - - Поправлено отключение millis \ No newline at end of file + - Поправлено отключение millis +- 1.7.3 + - Сокращён аналогРид + - Убран расширенный ШИМ + - Убран сброс WDT (не работал) + - Пофикшены различные баги + - Убран lightInit + - Добавлен загрузчик optiBoot v8 \ No newline at end of file diff --git a/package_GyverCore_index.json b/package_GyverCore_index.json index 86a8b6d..178c49c 100644 --- a/package_GyverCore_index.json +++ b/package_GyverCore_index.json @@ -148,6 +148,20 @@ {"name": "ATmega328 based boards"} ], "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": []