mirror of
https://github.com/AlexGyver/GyverCore.git
synced 2025-07-04 15:22:25 +03:00
upd
This commit is contained in:
@ -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.no_init=disable
|
||||||
nano.menu.init.light_init.build.extra_flags=-D_GYVERCORE_LIGHT_INIT
|
nano.menu.init.no_init.extra_flags.init=-D_GYVERCORE_NOINIT
|
||||||
nano.menu.init.no_init=disable
|
|
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 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();
|
||||||
|
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>
|
#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(;;) { // бесконечный цикл
|
||||||
|
@ -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();
|
|
||||||
}
|
|
||||||
|
|
@ -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();
|
|
||||||
}
|
|
30
README.md
30
README.md
@ -1,6 +1,6 @@
|
|||||||

|

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