mirror of
https://github.com/AlexGyver/GyverCore.git
synced 2025-07-03 04:22:31 +03:00
upd
This commit is contained in:
@ -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.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
|
33
GyverCore/bootloaders/optiboot_v8/atmega328.hex
Normal file
33
GyverCore/bootloaders/optiboot_v8/atmega328.hex
Normal 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
|
1
GyverCore/bootloaders/optiboot_v8/emptyBoot.hex
Normal file
1
GyverCore/bootloaders/optiboot_v8/emptyBoot.hex
Normal file
@ -0,0 +1 @@
|
||||
:107E0000112484B714BE81FFF0D085E080938100F7
|
@ -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();
|
||||
|
23
GyverCore/cores/arduino/Init.cpp
Normal file
23
GyverCore/cores/arduino/Init.cpp
Normal 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();
|
||||
}
|
@ -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;
|
||||
}
|
@ -1,14 +1,11 @@
|
||||
/* Главный цикл программы */
|
||||
|
||||
#pragma message "GyverCore v1.7.2 inside. Enjoy"
|
||||
#pragma message "GyverCore v1.7.3 inside. Enjoy"
|
||||
|
||||
#include <Arduino.h>
|
||||
int main(void)
|
||||
{ WDTCSR |= (1<<WDCE); // даем разрешение отключить ватчдог
|
||||
WDTCSR = 0; // Первым делом отключаем ватчдог
|
||||
#if defined (_GYVERCORE_DEF_INIT)
|
||||
int main(void) {
|
||||
#ifndef _GYVERCORE_NOINIT
|
||||
init(); // инициализация таймеров и ацп
|
||||
#elif defined (_GYVERCORE_LIGHT_INIT)
|
||||
lightInit();// лёгкая инициализация таймеров и ацп
|
||||
#endif
|
||||
setup(); // функция setup
|
||||
for(;;) { // бесконечный цикл
|
||||
|
@ -127,17 +127,8 @@ void analogReference(uint8_t mode)
|
||||
|
||||
int analogRead(uint8_t pin)
|
||||
{
|
||||
if(a_ref == INTERNAL) a_ref = 3; // для удобства задвигания
|
||||
uint8_t oldSREG = SREG; // запомнинаем были ли включены прерывания
|
||||
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); // склеить и вернуть результат
|
||||
analogStartConvert(pin);
|
||||
analogGet();
|
||||
}
|
||||
|
||||
void analogStartConvert(byte pin) {
|
||||
@ -158,230 +149,35 @@ int analogGet() {
|
||||
}
|
||||
|
||||
// ============= PWM =============
|
||||
|
||||
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)
|
||||
{
|
||||
void analogWrite(uint8_t pin, int val) {
|
||||
cli();
|
||||
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 {
|
||||
case 5:
|
||||
bitSet(TCCR0A, COM0B1);
|
||||
OCR0B = map(val, 0, 255, 0, 99);
|
||||
}
|
||||
}
|
||||
|
||||
OCR0B = val;
|
||||
break;
|
||||
case 6: // 0A
|
||||
TCCR0A |= (1 << COM0A1);
|
||||
case 6:
|
||||
bitSet(TCCR0A, 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);
|
||||
case 10:
|
||||
bitSet(TCCR1A, 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 6: //Timer0
|
||||
switch (freq) {
|
||||
case 0:
|
||||
TCCR0B = 0b00000011; // x64
|
||||
TCCR0A = 0b00000011; // fast pwm
|
||||
break;
|
||||
case 1:
|
||||
TCCR0B = 0b00000010; // x8
|
||||
TCCR0A = 0b00000011; // fast pwm
|
||||
break;
|
||||
case 2:
|
||||
TCCR0B = 0b00000001; // x1
|
||||
TCCR0A = 0b00000001; // phase correct
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case 9:
|
||||
case 10: //Timer1
|
||||
_TMR1_HR_PWM = false;
|
||||
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;
|
||||
}
|
||||
bitSet(TCCR1A, COM1A1);
|
||||
OCR1A = val;
|
||||
break;
|
||||
case 3:
|
||||
case 11: //Timer2
|
||||
switch (freq) {
|
||||
case 0:
|
||||
TCCR2B = 0b00000100; // x64
|
||||
TCCR2A = 0b00000001; // phase correct
|
||||
bitSet(TCCR2A, COM2B1);
|
||||
OCR2B = val;
|
||||
break;
|
||||
case 1:
|
||||
// Пины D3 и D11 - 8 кГц
|
||||
TCCR2B = 0b00000010; // x8
|
||||
TCCR2A = 0b00000011; // fast pwm
|
||||
case 11:
|
||||
bitSet(TCCR2A, COM2A1);
|
||||
OCR2A = val;
|
||||
break;
|
||||
case 2:
|
||||
TCCR2B = 0b00000001; // x1
|
||||
TCCR2A = 0b00000001; // phase correct
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
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();
|
||||
}
|
||||
|
||||
|
@ -1,55 +1,20 @@
|
||||
#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)
|
||||
#include <util/delay.h>
|
||||
#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 <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_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<<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();
|
||||
}
|
28
README.md
28
README.md
@ -1,6 +1,6 @@
|
||||

|
||||
# 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)
|
||||
---
|
||||
## Больше контроля!
|
||||
Для большего контроля за периферией микроконтроллера рекомендую попробовать следующие наши библиотеки:
|
||||
@ -217,3 +208,10 @@ parseFloat | 1070 | 246 | 824
|
||||
- Улучшен uart
|
||||
- 1.7.2
|
||||
- Поправлено отключение millis
|
||||
- 1.7.3
|
||||
- Сокращён аналогРид
|
||||
- Убран расширенный ШИМ
|
||||
- Убран сброс WDT (не работал)
|
||||
- Пофикшены различные баги
|
||||
- Убран lightInit
|
||||
- Добавлен загрузчик optiBoot v8
|
@ -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": []
|
||||
|
Reference in New Issue
Block a user