From b23c0d5da187e90da0533b73b52c1f2fca7524cd Mon Sep 17 00:00:00 2001 From: Alex Date: Tue, 3 Sep 2019 14:17:33 +0300 Subject: [PATCH] add --- GyverCore/boards.txt | 2 +- GyverCore/cores/arduino/Init.cpp | 23 ------------- GyverCore/cores/arduino/Tone.cpp | 6 ++++ GyverCore/cores/arduino/main.cpp | 3 +- GyverCore/cores/arduino/pinOperation.cpp | 22 +++++++++---- .../cores/arduino/{time.cpp => time_init.cpp} | 32 ++++++++++++++++--- GyverCore/cores/arduino/uart.cpp | 2 +- README.md | 6 +++- package_GyverCore_index.json | 14 ++++++++ 9 files changed, 73 insertions(+), 37 deletions(-) delete mode 100644 GyverCore/cores/arduino/Init.cpp rename GyverCore/cores/arduino/{time.cpp => time_init.cpp} (64%) diff --git a/GyverCore/boards.txt b/GyverCore/boards.txt index f6e524f..26feddb 100644 --- a/GyverCore/boards.txt +++ b/GyverCore/boards.txt @@ -124,7 +124,7 @@ 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 +nano.menu.timers.no_millis.build.extra_flags.timer=-D_GYVERCORE_NOMILLIS ## BOD ## menu.bod=B.O.D. diff --git a/GyverCore/cores/arduino/Init.cpp b/GyverCore/cores/arduino/Init.cpp deleted file mode 100644 index 24c7ddf..0000000 --- a/GyverCore/cores/arduino/Init.cpp +++ /dev/null @@ -1,23 +0,0 @@ -#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/Tone.cpp b/GyverCore/cores/arduino/Tone.cpp index 34bc28b..7dfb2d1 100644 --- a/GyverCore/cores/arduino/Tone.cpp +++ b/GyverCore/cores/arduino/Tone.cpp @@ -10,6 +10,8 @@ void tone(uint8_t pin , uint16_t freq, uint32_t duration = 0){ tone_pin = pin; // присвоили номер пина для прерывания willStop = duration;// если введено время генерации - будет ненулевым toggle_top = (freq * duration)/500; // расчет кол-ва toggl'ов за указанное время генерации + uint8_t oldSREG = SREG; // запомнинаем были ли включены прерывания + cli();//выключаем прерывания TCCR2A = (1< diff --git a/GyverCore/cores/arduino/pinOperation.cpp b/GyverCore/cores/arduino/pinOperation.cpp index dd39bb4..6408eb4 100644 --- a/GyverCore/cores/arduino/pinOperation.cpp +++ b/GyverCore/cores/arduino/pinOperation.cpp @@ -8,7 +8,8 @@ uint8_t a_ref = DEFAULT; // глобальная переменная для х // ============= DIGITAL ============= void pinMode(uint8_t pin, uint8_t mode) -{ +{ uint8_t oldSREG = SREG; // запомнинаем были ли включены прерывания + cli();//выключаем прерывания switch (mode) { case 0: // input if (pin < 8) bitWrite(DDRD, pin, 0); // расставляем нули в DDRn @@ -35,9 +36,12 @@ void pinMode(uint8_t pin, uint8_t mode) } break; } + SREG = oldSREG; // если прерывания не были включены - не включаем и наоборот } void digitalWrite(uint8_t pin, uint8_t x) { + uint8_t oldSREG = SREG; // запомнинаем были ли включены прерывания + cli();//выключаем прерывания switch (pin) { // откл pwm case 3: // 2B TCCR2A &= ~(1 << COM2B1); @@ -61,6 +65,7 @@ void digitalWrite(uint8_t pin, uint8_t x) { if (pin < 8) bitWrite(PORTD, pin, x); else if (pin < 14) bitWrite(PORTB, (pin - 8), x); else if (pin < 20) bitWrite(PORTC, (pin - 14), x); + SREG = oldSREG; // если прерывания не были включены - не включаем и наоборот } int digitalRead (uint8_t pin) { @@ -71,6 +76,8 @@ int digitalRead (uint8_t pin) { void digitalToggle(uint8_t pin){ + uint8_t oldSREG = SREG; // запомнинаем были ли включены прерывания + cli();//выключаем прерывания if (pin < 8) bitToggle(PORTD, pin); else if (pin < 14) bitToggle(PORTB, pin - 8); else if (pin < 20) bitToggle(PORTC, pin - 14); @@ -85,10 +92,12 @@ void digitalToggle(uint8_t pin){ bitWrite(PORTC, (pin - 14), !bitRead(PORTC,(pin-14))); } */ + SREG = oldSREG; // если прерывания не были включены - не включаем и наоборот } // ============= ANALOG ============= void analogPrescaler (uint8_t prescl) { - cli(); + uint8_t oldSREG = SREG; // запомнинаем были ли включены прерывания + cli();//выключаем прерывания switch (prescl) { case 2: ADCSRA &= ~((1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0)); @@ -117,7 +126,7 @@ void analogPrescaler (uint8_t prescl) { ADCSRA |= ((1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0)); break; } - sei(); + SREG = oldSREG; // если прерывания не были включены - не включаем и наоборот } void analogReference(uint8_t mode) @@ -138,9 +147,9 @@ void analogStartConvert(byte pin) { 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); // начинаем преобразование + SREG = oldSREG; // если прерывания не были включены - не включаем и наоборот } int analogGet() { @@ -150,7 +159,8 @@ int analogGet() { // ============= PWM ============= void analogWrite(uint8_t pin, int val) { - cli(); + uint8_t oldSREG = SREG; // запомнинаем были ли включены прерывания + cli();//выключаем прерывания switch (val) { case 5: bitSet(TCCR0A, COM0B1); @@ -179,5 +189,5 @@ void analogWrite(uint8_t pin, int val) { default: break; } - sei(); + SREG = oldSREG; // если прерывания не были включены - не включаем и наоборот } \ No newline at end of file diff --git a/GyverCore/cores/arduino/time.cpp b/GyverCore/cores/arduino/time_init.cpp similarity index 64% rename from GyverCore/cores/arduino/time.cpp rename to GyverCore/cores/arduino/time_init.cpp index d4b8f0b..0dcbb56 100644 --- a/GyverCore/cores/arduino/time.cpp +++ b/GyverCore/cores/arduino/time_init.cpp @@ -25,19 +25,21 @@ ISR(TIMER0_OVF_vect){ } unsigned long millis() { - cli(); // остановить счет + uint8_t oldSREG = SREG; // запомнинаем были ли включены прерывания + cli();//выключаем прерывания unsigned long m = timer0_millis; // перехватить значение - sei(); // продолжить счет + SREG = oldSREG; // если прерывания не были включены - не включаем и наоборот return m; // вернуть миллисекунды } unsigned long micros() { - cli(); // остановить прерывания + uint8_t oldSREG = SREG; // запомнинаем были ли включены прерывания + cli();//выключаем прерывания unsigned long m = timer0_overflow_count; // счет переполнений uint8_t t = TCNT0; // считать содержимое счетного регистра if ((TIFR0 & _BV(TOV0)) && (t < 255)) //инкремент по переполнению m++; - sei(); // продолжить счет + SREG = oldSREG; // если прерывания не были включены - не включаем и наоборот return (long)(((m << 8) + t) * MICROS_MULT); // вернуть микросекунды } #endif @@ -86,4 +88,26 @@ void delayMicroseconds(unsigned int us) { ); // return = 4 cycles #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/GyverCore/cores/arduino/uart.cpp b/GyverCore/cores/arduino/uart.cpp index 4cbede6..8e181cb 100644 --- a/GyverCore/cores/arduino/uart.cpp +++ b/GyverCore/cores/arduino/uart.cpp @@ -8,7 +8,7 @@ volatile uint8_t _UART_RX_BUFFER_TAIL; // ===== INIT ===== void uartBegin(uint32_t baudrate){ - uint16_t speed = (F_CPU / (8 * baudrate)) - 1; + uint16_t speed = (F_CPU / (8L * baudrate)) - 1; UBRR0H = highByte(speed); UBRR0L = lowByte(speed); UCSR0A = (1 << U2X0); diff --git a/README.md b/README.md index bea824a..55305f2 100644 --- a/README.md +++ b/README.md @@ -214,4 +214,8 @@ parseFloat | 1070 | 246 | 824 - Убран сброс WDT (не работал) - Пофикшены различные баги - Убран lightInit - - Добавлен загрузчик optiBoot v8 \ No newline at end of file + - Добавлен загрузчик optiBoot v8 +- 1.7.4 + - Поправлены баги с Serial + - И не только с Serial + - Оптимизированы прерывания \ No newline at end of file diff --git a/package_GyverCore_index.json b/package_GyverCore_index.json index 178c49c..1639f71 100644 --- a/package_GyverCore_index.json +++ b/package_GyverCore_index.json @@ -162,6 +162,20 @@ {"name": "ATmega328 based boards"} ], "toolsDependencies": [] + }, + { + "name": "GyverCore", + "architecture": "avr", + "version": "1.7.4", + "category": "Contributed", + "url": "https://github.com/AlexGyver/GyverCore/releases/download/GyverCore-1.7.4/GyverCore.zip", + "archiveFileName": "GyverCore.zip", + "checksum": "MD5:e6df1cf0ef4f6c2ee987a9d3bc7df918", + "size": "115466", + "boards": [ + {"name": "ATmega328 based boards"} + ], + "toolsDependencies": [] } ], "tools": []