diff --git a/GyverCore/boards.txt b/GyverCore/boards.txt index d0b59c5..8bea132 100644 --- a/GyverCore/boards.txt +++ b/GyverCore/boards.txt @@ -26,63 +26,6 @@ nano.build.core=arduino nano.build.mcu=atmega328p -## CLOCK ## -menu.clock=Clock - -nano.menu.clock.external_16=external 16 MHz -nano.menu.clock.external_16.fuses.CKDIV8=1 -nano.menu.clock.external_16.fuses.CKSEL=111111 -nano.menu.clock.external_16.build.f_cpu=16000000L -nano.menu.clock.external_16.bootloader.suffix=atmega328 -nano.menu.clock.external_16.upload.speed={speeds.US16MHZ} - -nano.menu.clock.external_8=external 8 MHz -nano.menu.clock.external_8.fuses.CKDIV8=1 -nano.menu.clock.external_8.fuses.CKSEL=111111 -nano.menu.clock.external_8.build.f_cpu=8000000L -nano.menu.clock.external_8.bootloader.suffix=atmega328 -nano.menu.clock.external_8.upload.speed={speeds.US8MHZ} - -nano.menu.clock.internal_8=internal 8 MHz -nano.menu.clock.internal_8.fuses.CKDIV8=1 -nano.menu.clock.internal_8.fuses.CKSEL=010010 -nano.menu.clock.internal_8.build.f_cpu=8000000L -nano.menu.clock.internal_8.bootloader.suffix=atmega328 -nano.menu.clock.internal_8.upload.speed={speeds.US8MHZ} - -nano.menu.clock.internal_1=internal 1 MHz -nano.menu.clock.internal_1.fuses.CKDIV8=0 -nano.menu.clock.internal_1.fuses.CKSEL=010010 -nano.menu.clock.internal_1.build.f_cpu=1000000L -nano.menu.clock.internal_1.bootloader.suffix=atmega328 -nano.menu.clock.internal_1.upload.speed={speeds.US1MHZ} - -nano.menu.clock.internal_128=internal 128 kHz -nano.menu.clock.internal_128.fuses.CKDIV8=1 -nano.menu.clock.internal_128.fuses.CKSEL=010011 -nano.menu.clock.internal_128.build.f_cpu=128000L -nano.menu.clock.internal_128.bootloader.suffix=emptyBoot -nano.menu.clock.internal_128.upload.speed=666 - -## CLOCKOUT -menu.co=Clock out PB0 (D8) - -nano.menu.co.disabled=disable -nano.menu.co.disabled.fuses.CKOUT=1 - -nano.menu.co.enabled=enable -nano.menu.co.enabled.fuses.CKOUT=0 - -## EESAVE -menu.es=Save EEPROM - -nano.menu.es.enabled=enable -nano.menu.es.enabled.fuses.EESAVE=0 - -nano.menu.es.disabled=disable -nano.menu.es.disabled.fuses.EESAVE=1 - - ## BOOT ## menu.boot=Bootloader @@ -110,7 +53,7 @@ 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 [Warning!] nano.menu.boot.no.upload.maximum_size=32768 nano.menu.boot.no.fuses.BOOT=111 nano.menu.boot.no.bootloader.dir=empty @@ -118,46 +61,124 @@ nano.menu.boot.no.speeds.US16MHZ=666 nano.menu.boot.no.speeds.US8MHZ=666 nano.menu.boot.no.speeds.US1MHZ=666 -## TIMER ## -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.extra_flags.timer=-D_GYVERCORE_NOMILLIS + +## CLOCK ## +menu.clock=Clock + +nano.menu.clock.external_16=External 16 MHz +nano.menu.clock.external_16.fuses.CKDIV8=1 +nano.menu.clock.external_16.fuses.CKSEL=111111 +nano.menu.clock.external_16.build.f_cpu=16000000L +nano.menu.clock.external_16.bootloader.suffix=atmega328 +nano.menu.clock.external_16.upload.speed={speeds.US16MHZ} + +nano.menu.clock.external_8=External 8 MHz +nano.menu.clock.external_8.fuses.CKDIV8=1 +nano.menu.clock.external_8.fuses.CKSEL=111111 +nano.menu.clock.external_8.build.f_cpu=8000000L +nano.menu.clock.external_8.bootloader.suffix=atmega328 +nano.menu.clock.external_8.upload.speed={speeds.US8MHZ} + +nano.menu.clock.internal_8=Internal 8 MHz +nano.menu.clock.internal_8.fuses.CKDIV8=1 +nano.menu.clock.internal_8.fuses.CKSEL=010010 +nano.menu.clock.internal_8.build.f_cpu=8000000L +nano.menu.clock.internal_8.bootloader.suffix=atmega328 +nano.menu.clock.internal_8.upload.speed={speeds.US8MHZ} + +nano.menu.clock.internal_1=Internal 1 MHz [CKDIV8] +nano.menu.clock.internal_1.fuses.CKDIV8=0 +nano.menu.clock.internal_1.fuses.CKSEL=010010 +nano.menu.clock.internal_1.build.f_cpu=1000000L +nano.menu.clock.internal_1.bootloader.suffix=atmega328 +nano.menu.clock.internal_1.upload.speed={speeds.US1MHZ} + +nano.menu.clock.internal_128=Internal 128 kHz [Warning!] +nano.menu.clock.internal_128.fuses.CKDIV8=1 +nano.menu.clock.internal_128.fuses.CKSEL=010011 +nano.menu.clock.internal_128.build.f_cpu=128000L +nano.menu.clock.internal_128.bootloader.suffix=emptyBoot +nano.menu.clock.internal_128.upload.speed=666 + ## Serial ## menu.serial=Serial -nano.menu.serial.default=default Serial +nano.menu.serial.default=Default Serial nano.menu.serial.default.extra_flags.uart= -nano.menu.serial.gyverUart=GyverUART +nano.menu.serial.gyverUart=GyverUART [Warning!] nano.menu.serial.gyverUart.extra_flags.uart=-D_GYVERCORE_GYVERUART -## BOD ## -menu.bod=B.O.D. - -nano.menu.bod.disable=disable -nano.menu.bod.disable.bootloader.extended_fuses=0xFF -nano.menu.bod.bod_1_8=1.8V -nano.menu.bod.bod_1_8.bootloader.extended_fuses=0xFE -nano.menu.bod.bod_2_7=2.7V (default) -nano.menu.bod.bod_2_7.bootloader.extended_fuses=0xFD -nano.menu.bod.bod_4_3=4.3V -nano.menu.bod.bod_4_3.bootloader.extended_fuses=0xFC - -## INIT ## -menu.init=Initialization - -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 - ## COMPILER ## menu.compiler_version=Compiler version -nano.menu.compiler_version.avrgcc5=default v5.4.0 +nano.menu.compiler_version.avrgcc5=AVR-GCC v5.4.0 [Default] nano.menu.compiler_version.avrgcc5.compiler.path={runtime.tools.avr-gcc.path}/bin/ -nano.menu.compiler_version.avrgcc8=avr-gcc v8.3.0 -nano.menu.compiler_version.avrgcc8.compiler.path={runtime.platform.path}/tools/avr-gcc/bin/ \ No newline at end of file +nano.menu.compiler_version.avrgcc8=AVR-GCC v8.3.0 [Warning!] +nano.menu.compiler_version.avrgcc8.compiler.path={runtime.platform.path}/tools/avr-gcc/bin/ + + +## TIMER ## +menu.timers=System timer + +nano.menu.timers.yes_millis=Enable [Default] +nano.menu.timers.yes_millis.extra_flags.timer= +nano.menu.timers.no_millis=Disable [Warning!] +nano.menu.timers.no_millis.extra_flags.timer=-D_GYVERCORE_NOMILLIS + + +## INIT ## +menu.init=Initialization + +nano.menu.init.enable=Enable [Default] +nano.menu.init.enable.extra_flags.init= +nano.menu.init.no_init=Disable [Warning!] +nano.menu.init.no_init.extra_flags.init=-D_GYVERCORE_NOINIT + + +## EESAVE +menu.es=Save EEPROM + +nano.menu.es.disabled=Disable +nano.menu.es.disabled.fuses.EESAVE=1 +nano.menu.es.enabled=Enable +nano.menu.es.enabled.fuses.EESAVE=0 + + +## BOD ## +menu.bod=B.O.D. + +nano.menu.bod.bod_2_7=2.7V [Default] +nano.menu.bod.bod_2_7.bootloader.extended_fuses=0xFD +nano.menu.bod.bod_4_3=4.3V +nano.menu.bod.bod_4_3.bootloader.extended_fuses=0xFC +nano.menu.bod.bod_1_8=1.8V +nano.menu.bod.bod_1_8.bootloader.extended_fuses=0xFE +nano.menu.bod.disable=Disable [Warning!] +nano.menu.bod.disable.bootloader.extended_fuses=0xFF + +## CLOCKOUT +menu.co=Clock out + +nano.menu.co.disabled=Disable [Default] +nano.menu.co.disabled.fuses.CKOUT=1 + +nano.menu.co.enabled=Enable [Warning!] +nano.menu.co.enabled.fuses.CKOUT=0 + + + + + + + + + + + + + + + + diff --git a/GyverCore/bootloaders/atmega/emptyBoot.hex b/GyverCore/bootloaders/atmega/emptyBoot.hex index 708647b..7ef5593 100644 --- a/GyverCore/bootloaders/atmega/emptyBoot.hex +++ b/GyverCore/bootloaders/atmega/emptyBoot.hex @@ -1 +1 @@ -:107E0000112484B714BE81FFF0D085E080938100F7 \ No newline at end of file +:00000001FF \ No newline at end of file diff --git a/GyverCore/bootloaders/empty/emptyBoot.hex b/GyverCore/bootloaders/empty/emptyBoot.hex index 690d492..7ef5593 100644 --- a/GyverCore/bootloaders/empty/emptyBoot.hex +++ b/GyverCore/bootloaders/empty/emptyBoot.hex @@ -1 +1 @@ -:107E000001C0DCC0112484B7882361F0982F9A70D8 +:00000001FF \ No newline at end of file diff --git a/GyverCore/bootloaders/optiboot/emptyBoot.hex b/GyverCore/bootloaders/optiboot/emptyBoot.hex index 708647b..7ef5593 100644 --- a/GyverCore/bootloaders/optiboot/emptyBoot.hex +++ b/GyverCore/bootloaders/optiboot/emptyBoot.hex @@ -1 +1 @@ -:107E0000112484B714BE81FFF0D085E080938100F7 \ No newline at end of file +:00000001FF \ No newline at end of file diff --git a/GyverCore/bootloaders/optiboot_v8/emptyBoot.hex b/GyverCore/bootloaders/optiboot_v8/emptyBoot.hex index 708647b..7ef5593 100644 --- a/GyverCore/bootloaders/optiboot_v8/emptyBoot.hex +++ b/GyverCore/bootloaders/optiboot_v8/emptyBoot.hex @@ -1 +1 @@ -:107E0000112484B714BE81FFF0D085E080938100F7 \ No newline at end of file +:00000001FF \ No newline at end of file diff --git a/GyverCore/cores/arduino/Arduino.h b/GyverCore/cores/arduino/Arduino.h index 5bc41a5..18a4ed8 100644 --- a/GyverCore/cores/arduino/Arduino.h +++ b/GyverCore/cores/arduino/Arduino.h @@ -39,10 +39,10 @@ extern "C"{ #define FALLING 2 #define RISING 3 -#define INTERNAL 28 +#define INTERNAL 3 #define DEFAULT 1 #define EXTERNAL 0 -#define THERMOMETR 22 + // ===== MATH MACRO ===== #ifdef abs @@ -103,18 +103,15 @@ void init(void); // ===== PIN OPERATION ====== // new -void lightInit(void); -void analogStartConvert(byte pin); void analogPrescaler(uint8_t prescl); -int analogGet(); void digitalToggle(uint8_t pin); // old void pinMode(uint8_t pin, uint8_t mode); -void digitalWrite(uint8_t pin, uint8_t x); +void digitalWrite(uint8_t pin, bool x); bool digitalRead (uint8_t pin); -int analogRead(uint8_t pin); +uint16_t analogRead(uint8_t pin); void analogReference(uint8_t mode); -void analogWrite(uint8_t pin, int val); +void analogWrite(uint8_t pin, uint16_t val); #if defined (_GYVERCORE_NOMILLIS) #define millis() 0 @@ -214,7 +211,7 @@ extern const uint8_t PROGMEM digital_pin_to_timer_PGM[]; #include "WCharacter.h" #include "WString.h" #include "HardwareSerial.h" -#include "uart.h" +#include "GyverCore_uart.h" #ifdef _GYVERCORE_GYVERUART #define Serial uart diff --git a/GyverCore/cores/arduino/GyverCore_gpio.cpp b/GyverCore/cores/arduino/GyverCore_gpio.cpp new file mode 100644 index 0000000..3e486fb --- /dev/null +++ b/GyverCore/cores/arduino/GyverCore_gpio.cpp @@ -0,0 +1,180 @@ +/* + GyverCore digital / analog IO functions +*/ + +#define ARDUINO_MAIN +#include "Arduino.h" +#include + + +/************************************ +* Digital I/O functions * +************************************/ + +void pinMode(uint8_t pin, uint8_t mode) { + switch (mode) { + case INPUT: + if (pin < 8) { + bitClear(DDRD, pin); + bitClear(PORTD, pin); + } else if (pin < 14) { + bitClear(DDRB, (pin - 8)); + bitClear(PORTB, (pin - 8)); + } else if (pin < 20) { + bitClear(DDRC, (pin - 14)); // Mode: INPUT + bitClear(PORTC, (pin - 8)); // State: LOW + } + return; + case OUTPUT: + if (pin < 8) { + bitSet(DDRD, pin); + bitClear(PORTD, pin); + } else if (pin < 14) { + bitSet(DDRB, (pin - 8)); + bitClear(PORTB, (pin - 8)); + } else if (pin < 20) { + bitSet(DDRC, (pin - 14)); // Mode: OUTPUT + bitClear(PORTC, (pin - 8)); // State: LOW + } + return; + case INPUT_PULLUP: + if (pin < 8) { + bitClear(DDRD, pin); + bitSet(PORTD, pin); + } else if (pin < 14) { + bitClear(DDRB, (pin - 8)); + bitSet(PORTB, (pin - 8)); + } else if (pin < 20) { + bitClear(DDRC, (pin - 14)); // Mode: OUTPUT + bitSet(PORTC, (pin - 14)); // State: HIGH + } + return; + } +} + +void digitalWrite(uint8_t pin, bool x) { + switch (pin) { + case 3: bitClear(TCCR2A, COM2B1); + break; + case 5: bitClear(TCCR0A, COM0B1); + break; + case 6: bitClear(TCCR0A, COM0A1); + break; + case 9: bitClear(TCCR1A, COM1A1); + break; + case 10: bitClear(TCCR1A, COM1B1); + break; + case 11: bitClear(TCCR2A, COM2A1); // PWM disable + break; + } + + 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); // Set pin to HIGH / LOW + } +} + +bool digitalRead (uint8_t pin) { + if (pin < 8) { + return bitRead(PIND, pin); + } else if (pin < 14) { + return bitRead(PINB, pin - 8); + } else if (pin < 20) { + return bitRead(PINC, pin - 14); // Return pin state + } +} + + +void digitalToggle(uint8_t pin) { + if (pin < 8) { + bitToggle(PORTD, pin); + } else if (pin < 14) { + bitToggle(PORTB, (pin - 8)); + } else if (pin < 20) { + bitToggle(PORTC, (pin - 14)); // Toggle pin state (for 'tone()') + } +} + +/**************************************** +* Analog inputs functions * +****************************************/ + +uint8_t analog_reference = DEFAULT; + + /* + Available prescalers: 2,4,8,16,32,64,128 + */ + +void analogPrescaler(uint8_t prescaler) { + switch (prescaler) { + case 2: ADCSRA = (ADCSRA & 0xF8) | 0x01; + break; + case 4: ADCSRA = (ADCSRA & 0xF8) | 0x02; + break; + case 8: ADCSRA = (ADCSRA & 0xF8) | 0x03; + break; + case 16: ADCSRA = (ADCSRA & 0xF8) | 0x04; + break; + case 32: ADCSRA = (ADCSRA & 0xF8) | 0x05; + break; + case 64: ADCSRA = (ADCSRA & 0xF8) | 0x06; + break; + case 128: ADCSRA = (ADCSRA & 0xF8) | 0x07; + break; + } +} + +void analogReference(uint8_t mode) { + analog_reference = mode; +} + +uint16_t analogRead(uint8_t pin) { + pin = ((pin < 8) ? pin : pin - 14); // analogRead(2) = analogRead(A2) + ADMUX = (analog_reference << 6) | pin; // Set analog MUX & reference + bitSet(ADCSRA, ADSC); // Start + while (ADCSRA & (1 << ADSC)); // Wait + return ADCL | (ADCH << 8); // Return result +} + + +/**************************** +* PWM function * +****************************/ + +void analogWrite(uint8_t pin, uint16_t duty) { + + if (!duty) { // If duty = 0 + digitalWrite(pin, LOW); // Disable PWM and set pin to LOW + return; // Skip next code + } + + switch (pin) { + case 5: + bitSet(TCCR0A, COM0B1); // Enable hardware timer output + OCR0B = duty; // Load duty to compare register + return; + case 6: + bitSet(TCCR0A, COM0A1); + OCR0A = duty; + return; + case 10: + bitSet(TCCR1A, COM1B1); + OCR1B = duty; + return; + case 9: + bitSet(TCCR1A, COM1A1); + OCR1A = duty; + return; + case 3: + bitSet(TCCR2A, COM2B1); + OCR2B = duty; + return; + case 11: + bitSet(TCCR2A, COM2A1); + OCR2A = duty; + return; + } +} \ No newline at end of file diff --git a/GyverCore/cores/arduino/GyverCore_interrupts.c b/GyverCore/cores/arduino/GyverCore_interrupts.c new file mode 100644 index 0000000..2dc2883 --- /dev/null +++ b/GyverCore/cores/arduino/GyverCore_interrupts.c @@ -0,0 +1,40 @@ +/******************************************** +* GyverCore external interrupts * +********************************************/ + +#include +#include "Arduino.h" + +extern void (*ext_isr_0)(); // Functions pointers +extern void (*ext_isr_1)(); +void (*ext_isr_0)(); +void (*ext_isr_1)(); + +ISR(INT0_vect) { // External interrupt vectors + (*ext_isr_0)(); +} + +ISR(INT1_vect) { + (*ext_isr_1)(); +} + + +void attachInterrupt(uint8_t num, void (*handler)(), uint8_t type) { + switch (num) { + case 0: + ext_isr_0 = *handler; // Pass a handler to the pointer + EICRA = (EICRA & 0x0C) | type; // Setup interrupt type + bitSet(EIMSK, INT0); // Enable external interrupt + return; + case 1: + ext_isr_1 = *handler; + EICRA = (EICRA & 0x03) | (type << 2); + bitSet(EIMSK, INT1); + return; + } +} + + +void detachInterrupt(uint8_t num) { + bitClear(EIMSK, num); // Disable external interrupt +} \ No newline at end of file diff --git a/GyverCore/cores/arduino/GyverCore_shift.c b/GyverCore/cores/arduino/GyverCore_shift.c new file mode 100644 index 0000000..b7d06b3 --- /dev/null +++ b/GyverCore/cores/arduino/GyverCore_shift.c @@ -0,0 +1,32 @@ +/* Програмный SPI */ +#include "Arduino.h" + +uint8_t shiftIn(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder) { + + uint8_t data = 0; + + for (uint8_t i = 0; i < 8; ++i) { + + digitalWrite(clockPin, HIGH); + + if (bitOrder == LSBFIRST) data |= digitalRead(dataPin) << i; + else data |= digitalRead(dataPin) << (7 - i); + + digitalWrite(clockPin, LOW); + } + + return data; +} + +void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val) +{ + + for (uint8_t i = 0; i < 8; i++) { + + if (bitOrder == LSBFIRST) digitalWrite(dataPin, !!(val & (1 << i))); + else digitalWrite(dataPin, !!(val & (1 << (7 - i)))); + + digitalWrite(clockPin, HIGH); + digitalWrite(clockPin, LOW); + } +} diff --git a/GyverCore/cores/arduino/GyverCore_tone.cpp b/GyverCore/cores/arduino/GyverCore_tone.cpp new file mode 100644 index 0000000..61099b7 --- /dev/null +++ b/GyverCore/cores/arduino/GyverCore_tone.cpp @@ -0,0 +1,91 @@ +#include +#include "Arduino.h" + +/********************************************** +* GyverCore tone() by Egor 'Nich1con' Zaharov * +**********************************************/ + + +uint8_t tone_pin; // Global pin varible +uint32_t toggle_counter; // Toggles counter +uint32_t toggle_top; // Toggles top +bool willStop; // Infinity generation flag + + +void tone(uint8_t pin , uint16_t freq, uint32_t duration = 0) { + + tone_pin = pin; // Global pin = local pin + willStop = duration; // If the generation time is entered , it will not be infinite + toggle_top = (freq * duration) / 500; // Calulation of the number of toggles + + uint8_t oldSREG = SREG; // Save global interupts settings + cli(); // Disable global interrupts + + TCCR2A = 0x02; // Enable timer CTC mode + TIMSK2 |= (1 << OCIE2A); // Enable COMPA interrupt + + if (freq < (F_CPU >> 18)) { // (< 240 Hz) + + TCCR2B = 0x07; // Prescaler = /1024 + OCR2A = ((F_CPU >> 11) / freq) - 1; + + } else if (freq < (F_CPU >> 15)) { // (240 - 480 Hz) + + TCCR2B = 0x06; // Prescaler = /256 + OCR2A = ((F_CPU >> 9) / freq) - 1; + + } else if (freq <= (F_CPU >> 14)) { // (480 - 970 Hz) + + TCCR2B = 0x05; // Prescaler = /128 + OCR2A = ((F_CPU >> 8) / freq) - 1; + + } else if (freq <= (F_CPU >> 13)) { // (970 - 1900 Hz) + + TCCR2B = 0x04; // Prescaler = /64 + OCR2A = ((F_CPU >> 7) / freq) - 1; + + } else if (freq <= (F_CPU >> 11)) { // (1.9 - 7.8 kHz) + + TCCR2B = 0x03; // Prescaler = /32 + OCR2A = ((F_CPU >> 6) / freq) - 1; + + } else if (freq <= (F_CPU >> 8)) { // (7.8 - 62 kHz) + + TCCR2B = 0x02; // Prescaler = /8 + OCR2A = ((F_CPU >> 4) / freq) - 1; + + } else { // (> 62 kHz) + + TCCR2B = 0x01; // Prescaler = /1 + OCR2A = ((F_CPU >> 1) / freq) - 1; + + } + + toggle_counter = 0; // Reset toggle counter + SREG = oldSREG; // Return interrupt settings + +} + +void noTone(uint8_t pin) { + + digitalWrite(pin, LOW); // Set tone pin to LOW + + uint8_t oldSREG = SREG; // Save global interupts settings + cli(); // Disable global interrupts + + TIMSK2 &= ~ (1 << OCIE2A); // Disable COMPA interrupt + TCCR2A = (1 << WGM20); // Load default timer settings + TCCR2B = (1 << CS22); + OCR2A = 0x00; + + SREG = oldSREG; // Return interrupt settings + +} + + +ISR(TIMER2_COMPA_vect) { + if (!willStop || toggle_counter < toggle_top ) { // Generate until the top is reached + digitalToggle(tone_pin); // Toggle pin + toggle_counter++; // Toggle counter increment + } +} \ No newline at end of file diff --git a/GyverCore/cores/arduino/uart.cpp b/GyverCore/cores/arduino/GyverCore_uart.cpp similarity index 99% rename from GyverCore/cores/arduino/uart.cpp rename to GyverCore/cores/arduino/GyverCore_uart.cpp index 5f71d67..12bf7b6 100644 --- a/GyverCore/cores/arduino/uart.cpp +++ b/GyverCore/cores/arduino/GyverCore_uart.cpp @@ -1,4 +1,4 @@ -#include "uart.h" +#include "GyverCore_uart.h" #define UART_RX_BUFFER_SIZE 64 static volatile char _UART_RX_BUFFER[UART_RX_BUFFER_SIZE]; static volatile uint8_t _UART_RX_BUFFER_HEAD; diff --git a/GyverCore/cores/arduino/uart.h b/GyverCore/cores/arduino/GyverCore_uart.h similarity index 100% rename from GyverCore/cores/arduino/uart.h rename to GyverCore/cores/arduino/GyverCore_uart.h diff --git a/GyverCore/cores/arduino/GyverCore_uptime.cpp b/GyverCore/cores/arduino/GyverCore_uptime.cpp new file mode 100644 index 0000000..6e0ceb3 --- /dev/null +++ b/GyverCore/cores/arduino/GyverCore_uptime.cpp @@ -0,0 +1,138 @@ +#include "Arduino.h" +#include + +/* функции времени и инициализация таймеров , АЦП*/ + +void init() { + cli(); + + /*************** ADC ***************/ + +#ifndef ADC_PRESCALER +#define ADC_PRESCALER 0x02 +#endif + + /****************************************************************** + * ADC prescaler: [ /2 ]-[ /4 ]-[ /8 ]-[ /16]-[ /32]-[ /64]-[/128] * + * ADC_PRESCALER: [0x01]-[0x02]-[0x03]-[0x04]-[0x05]-[0x06]-[0x07] * + ******************************************************************/ + ADCSRA = (1 << ADEN) | ADC_PRESCALER; + + + + /************ Timers ************/ + + TCCR0A = (1 << WGM01) | (1 << WGM00); + TCCR0B = (1 << CS01) | (1 << CS00); + #ifndef _GYVERCORE_NOMILLIS + TIMSK0 |= (1 << TOIE0); +#endif + + TCCR1A = (1 << WGM10); + TCCR1B = (1 << WGM12) | (1 << CS11) | (1 << CS10); + + TCCR2A = (1 << WGM20); + TCCR2B = (1 << CS22); + + + /************** USART **************/ + UCSR0B = 0x00; + + sei(); +} + + +#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()) + +volatile unsigned long timer0_overflow_count = 0; +volatile unsigned long timer0_millis = 0; +static unsigned char timer0_fract = 0; + +ISR(TIMER0_OVF_vect){ + timer0_millis += MILLIS_INC; + timer0_fract += FRACT_INC; + if (timer0_fract >= FRACT_MAX) { + timer0_fract -= FRACT_MAX; + timer0_millis++; + } + timer0_overflow_count++; +} + +unsigned long millis() { + uint8_t oldSREG = SREG; // запомнинаем были ли включены прерывания + cli(); // выключаем прерывания + unsigned long m = timer0_millis; // перехватить значение + SREG = oldSREG; // если прерывания не были включены - не включаем и наоборот + return m; // вернуть миллисекунды +} + +unsigned long micros() { + uint8_t oldSREG = SREG; // запомнинаем были ли включены прерывания + cli(); // выключаем прерывания + unsigned long m = timer0_overflow_count; // счет переполнений + uint8_t t = TCNT0; // считать содержимое счетного регистра + if ((TIFR0 & _BV(TOV0)) && (t < 255)) // инкремент по переполнению + m++; + SREG = oldSREG; // если прерывания не были включены - не включаем и наоборот + return (long)(((m << 8) + t) * MICROS_MULT); // вернуть микросекунды +} +#endif + +void delay(unsigned long ms) { + +#ifdef _GYVERCORE_NOMILLIS + while(ms){ + _delay_ms(ms); + ms--; + } +#else + uint32_t start = micros(); + while (ms > 0) { // ведем отсчет + while ( ms > 0 && (micros() - start) >= 1000) { + ms--; + start += 1000; + } + } + +#endif +} + +void delayMicroseconds(unsigned int us) { + +#if F_CPU < 1000000L + _delay_us(us); +#else + +#if F_CPU >= 16000000L + if (us <= 1) return; // = 3 cycles, (4 when true) + us <<= 2; // x4 us, = 4 cycles + us -= 5; +#elif F_CPU >= 8000000L + if (us <= 2) return; // = 3 cycles, (4 when true) + us <<= 1; //x2 us, = 2 cycles + us -= 4; // = 2 cycles +#elif F_CPU >= 1000000L + if (us <= 16) return; //= 3 cycles, (4 when true) + if (us <= 25) return; //= 3 cycles, (4 when true) + us -= 22; // = 2 cycles + us >>= 2; // us div 4, = 4 cycles +#endif + + asm volatile + ( + "loop: \n\t" + "sbiw %[counter],1 \n\t" // 2 cycles + "brne loop \n\t" + : [counter]"=w" (us) + : "0" (us) // 2 cycles + ); + + // return = 4 cycles +#endif +} + diff --git a/GyverCore/cores/arduino/IPAddress.cpp b/GyverCore/cores/arduino/IPAddress.cpp index d9fe5be..7124ac8 100644 --- a/GyverCore/cores/arduino/IPAddress.cpp +++ b/GyverCore/cores/arduino/IPAddress.cpp @@ -18,6 +18,9 @@ */ #include + +#ifndef _GYVERCORE_GYVERUART + #include IPAddress::IPAddress() @@ -112,3 +115,4 @@ size_t IPAddress::printTo(Print& p) const return n; } +#endif \ No newline at end of file diff --git a/GyverCore/cores/arduino/IPAddress.h b/GyverCore/cores/arduino/IPAddress.h index d762f2c..2bb0532 100644 --- a/GyverCore/cores/arduino/IPAddress.h +++ b/GyverCore/cores/arduino/IPAddress.h @@ -17,6 +17,8 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ +#ifndef _GYVERCORE_GYVERUART + #ifndef IPAddress_h #define IPAddress_h @@ -76,3 +78,4 @@ public: const IPAddress INADDR_NONE(0,0,0,0); #endif +#endif \ No newline at end of file diff --git a/GyverCore/cores/arduino/Tone.cpp b/GyverCore/cores/arduino/Tone.cpp deleted file mode 100644 index 7dce212..0000000 --- a/GyverCore/cores/arduino/Tone.cpp +++ /dev/null @@ -1,72 +0,0 @@ -#include -#include "Arduino.h" -/* оптимизированный вариант реализации tone */ -uint8_t tone_pin; // глобальная переменная для пина -uint32_t toggle_counter; // счетчик toggl'ов -uint32_t toggle_top; // предел счета для toggl'ов -bool willStop; // флаг позволяющий генерировать сигнал бесконечно долго - -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 = 0x2; // вкл CTC - TIMSK2 |= (1 << OCIE2A); //Вкл прерывание - - if (freq < (F_CPU >> 18)) { // ( < 240 Hz) - TCCR2B = 0x7; // prescaler = 1024 - OCR2A = ((F_CPU >> 11) / freq) - 1; - } - else if (freq < (F_CPU >> 15)) { // ( 240 - 480 Hz) - TCCR2B = 0x6; // prescaler = 256 - OCR2A = ((F_CPU >> 9) / freq) - 1; - } - else if (freq <= (F_CPU >> 14)) { // ( 480 - 970 Hz) - TCCR2B = 0x5; // prescaler = 128 - OCR2A = ((F_CPU >> 8) / freq) - 1; - } - else if (freq <= (F_CPU >> 13)) { // ( 970 - 1900 Hz) - TCCR2B = 0x4; // prescaler = 64 - OCR2A = ((F_CPU >> 7) / freq) - 1; - } - else if (freq <= (F_CPU >> 11)) { // ( 1.9 - 7.8 kHz) - TCCR2B = 0x3; // prescaler = 32 - OCR2A = ((F_CPU >> 6) / freq) - 1; - } - else if (freq <= (F_CPU >> 8)) { // ( 7.8 - 62 kHz) - TCCR2B = 0x2; // prescaler = 8 - OCR2A = ((F_CPU >> 4) / freq) - 1; - } - else { // ( > 62 kHz) - TCCR2B = 0x1; // prescaler = 1 - OCR2A = ((F_CPU >> 1) / freq) - 1; - } - - toggle_counter = 0; // обнулили счетчик toggl'ов - SREG = oldSREG; - -} - -void noTone(uint8_t pin) { // если вызван noTone - digitalWrite(pin, 0); // устанавливаем 0 на выходе - uint8_t oldSREG = SREG; // запомнинаем были ли включены прерывания - cli();//выключаем прерывания - TIMSK2 &= ~ (1 << OCIE2A); // остановить прерывания - TCCR2A = 0x3; // установить стандартные настройки для таймера 2 - TCCR2B = 0x4; - OCR2A = 0; //обнуляем регистр сравнения - SREG = oldSREG; -} - - -ISR(TIMER2_COMPA_vect) { // прерывание генерации - if (!willStop || toggle_counter < toggle_top ) { // если количество toggl'ов не достигло предела или процесс бесконечен - генерация - digitalToggle(tone_pin); // иневертируем состоние на ноге - toggle_counter++; // икремент счетчика - } -} \ No newline at end of file diff --git a/GyverCore/cores/arduino/WInterrupts.c b/GyverCore/cores/arduino/WInterrupts.c deleted file mode 100644 index e0b7ceb..0000000 --- a/GyverCore/cores/arduino/WInterrupts.c +++ /dev/null @@ -1,47 +0,0 @@ -/* внешние прерывания*/ -#include -#include -#include -#include -#include -#include "Arduino.h" - -extern void (*ext_isr0)(); -extern void (*ext_isr1)(); -void (*ext_isr0)(); -void (*ext_isr1)(); - -ISR(INT0_vect){ -(*ext_isr0)(); -} -ISR(INT1_vect){ -(*ext_isr1)(); -} - - -void attachInterrupt(uint8_t num,void (*isr)(), uint8_t type){ -switch(num){ -case 0: -ext_isr0 = *isr; -EICRA = (EICRA & ~((1 << ISC00) | (1 << ISC01))) | (type << ISC00); -EIMSK |= (1 << INT0); -break; -case 1: -ext_isr1 = *isr; -EICRA = (EICRA & ~((1 << ISC10) | (1 << ISC11))) | (type << ISC10); -EIMSK |= (1 << INT1); -break; -} -} - - -void detachInterrupt(uint8_t num){ -switch(num){ -case 0: -EIMSK &=~ (1< diff --git a/GyverCore/cores/arduino/pinOperation.cpp b/GyverCore/cores/arduino/pinOperation.cpp deleted file mode 100644 index fab67ac..0000000 --- a/GyverCore/cores/arduino/pinOperation.cpp +++ /dev/null @@ -1,241 +0,0 @@ -/* - Нормальный ввод/вывод -*/ -#define ARDUINO_MAIN -#include "Arduino.h" -#include -static uint8_t a_ref = DEFAULT; // глобальная переменная для хранения опорного напряжения АЦП -// ============= DIGITAL ============= - -/* -// service func -uint8_t getOutputRegister(uint8_t pin) { - if (pin < 8) return &PORTD; - else if (pin < 14) return &PORTB; - else return &PORTC; -} - -uint8_t getInputRegister(uint8_t pin) { - if (pin < 8) return &PIND; - else if (pin < 14) return &PINB; - else return &PINC; -} - -uint8_t getModeRegister(uint8_t pin) { - if (pin < 8) return &DDRD; - else if (pin < 14) return &DDRB; - else return &DDRC; -} - -uint8_t getBitMask(uint8_t pin) { - if (pin < 8) return (1 << pin); - else if (pin < 14) return (1 << (pin - 8)); - else return (1 << (pin - 14)); -} -*/ -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 - else if (pin < 14) bitWrite(DDRB, (pin - 8), 0); - else if (pin < 20) bitWrite(DDRC, (pin - 14), 0); - break; - case 1: // output - if (pin < 8) bitWrite(DDRD, pin, 1); // расставляем еденицы в DDRn - else if (pin < 14) bitWrite(DDRB, (pin - 8), 1); - else if (pin < 20) bitWrite(DDRC, (pin - 14), 1); - break; - case 2: // in_pullup - if (pin < 8) { - bitWrite(DDRD, pin, 0); // настраиваем как вх - bitWrite(PORTD, pin, 1); // вкл подтяжку - } - else if (pin < 14) { - bitWrite(DDRB, (pin - 8), 0); - bitWrite(PORTB, (pin - 8), 1); - } - else if (pin < 20) { - bitWrite(DDRC, (pin - 14), 0); - bitWrite(PORTC, (pin - 14), 1); - } - break; - } - //SREG = oldSREG; // если прерывания не были включены - не включаем и наоборот*/ - /* - uint8_t *modeReg = getModeRegister(pin); - uint8_t *outputReg = getOutputRegister(pin); - uint8_t mask = getBitMask(pin); - switch (mode) { - case 0x00: - *modeReg &= ~ mask; - return; - case 0x01: - *modeReg |= mask; - return; - case 0x02: - *modeReg &= ~ mask; - *outputReg |= mask; - return; - }*/ -} - -void digitalWrite(uint8_t pin, uint8_t x) { - //uint8_t oldSREG = SREG; // запомнинаем были ли включены прерывания - //cli();//выключаем прерывания - switch (pin) { // откл pwm - case 3: // 2B - TCCR2A &= ~(1 << COM2B1); - break; - case 5: // 0B - TCCR0A &= ~(1 << COM0B1); - break; - case 6: // 0A - TCCR0A &= ~(1 << COM0A1); - break; - case 9: // 1A - TCCR1A &= ~(1 << COM1A1); - break; - case 10: // 1B - TCCR1A &= ~(1 << COM1B1); - break; - case 11: // 2A - TCCR2A &= ~(1 << COM2A1); - break; - } - 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; // если прерывания не были включены - не включаем и наоборот - - /*uint8_t *outputReg = getOutputRegister(pin); - uint8_t mask = getBitMask(pin); - if (x) *outputReg |= mask; - else *outputReg &= ~ mask;*/ -} - -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); - - //SREG = oldSREG; // если прерывания не были включены - не включаем и наоборот - - /*uint8_t *outputReg = getOutputRegister(pin); - uint8_t mask = getBitMask(pin); - *outputReg ^= mask;*/ -} - -bool digitalRead (uint8_t pin) { - if (pin < 8) return bitRead(PIND, pin); - else if (pin < 14) return bitRead(PINB, pin - 8); - else if (pin < 20) return bitRead(PINC, pin - 14); - - /*uint8_t *inputReg = getInputRegister(pin); - uint8_t mask = getBitMask(pin); - //return ((*inputReg & mask) ? true : false); - return bool(*inputReg & mask);*/ -} - -// ================ ANALOG ================ -void analogPrescaler(uint8_t prescl) { - uint8_t oldSREG = SREG; // запомнинаем были ли включены прерывания - cli();//выключаем прерывания - switch (prescl) { - case 2: - ADCSRA &= ~((1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0)); - break; - case 4: // (defalut) - ADCSRA &= ~((1 << ADPS2) | (1 << ADPS0)); - ADCSRA |= (1 << ADPS1); - break; - case 8: - ADCSRA &= ~ (1 << ADPS2); - ADCSRA |= ((1 << ADPS1) | (1 << ADPS0)); - break; - case 16: - ADCSRA &= ~((1 << ADPS1) | (1 << ADPS0)); - ADCSRA |= (1 << ADPS2); - break; - case 32: - ADCSRA &= ~ (1 << ADPS1); - ADCSRA |= ((1 << ADPS2) | (1 << ADPS0)); - break; - case 64: - ADCSRA &= ~ (1 << ADPS0); - ADCSRA |= ((1 << ADPS2) | (1 << ADPS1)); - break; - case 128: - ADCSRA |= ((1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0)); - break; - } - SREG = oldSREG; // если прерывания не были включены - не включаем и наоборот -} - -void analogReference(uint8_t mode) { - a_ref = mode; // изменения будут приняты в силу при следующем analogRead() / analogStartConvert() -} - -int analogRead(uint8_t pin) { - analogStartConvert(pin); - return analogGet(); -} - -void analogStartConvert(byte 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; // задвигаем опорное и номер входа - if (pin == 8 || pin == 14) delay(2); // Wait for Vref to settle для VCC и термометра - ADCSRA |= (1 << ADSC); // начинаем преобразование - SREG = oldSREG; // если прерывания не были включены - не включаем и наоборот -} - -int analogGet() { - while (ADCSRA & (1 << ADSC)); // ждем окончания - return ADCL | (ADCH << 8); // склеить и вернуть результат -} - -// ================= PWM ================= -void analogWrite(uint8_t pin, int val) { - if (val == 0) { - digitalWrite(pin, 0); - return; - } - uint8_t oldSREG = SREG; // запомнинаем были ли включены прерывания - cli();//выключаем прерывания - switch (pin) { - case 5: - bitSet(TCCR0A, COM0B1); - OCR0B = val; - break; - case 6: - bitSet(TCCR0A, COM0A1); - OCR0A = val; - break; - case 10: - bitSet(TCCR1A, COM1B1); - OCR1B = val; - break; - case 9: - bitSet(TCCR1A, COM1A1); - OCR1A = val; - break; - case 3: - bitSet(TCCR2A, COM2B1); - OCR2B = val; - break; - case 11: - bitSet(TCCR2A, COM2A1); - OCR2A = val; - break; - default: - break; - } - SREG = oldSREG; // если прерывания не были включены - не включаем и наоборот -} \ No newline at end of file diff --git a/GyverCore/cores/arduino/time_init.cpp b/GyverCore/cores/arduino/time_init.cpp deleted file mode 100644 index 60e6bc9..0000000 --- a/GyverCore/cores/arduino/time_init.cpp +++ /dev/null @@ -1,112 +0,0 @@ -#include "Arduino.h" -#include - -/* функции времени и инициализация таймеров , АЦП*/ - -#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()) - -volatile unsigned long timer0_overflow_count = 0; -volatile unsigned long timer0_millis = 0; -static unsigned char timer0_fract = 0; - -ISR(TIMER0_OVF_vect){ - timer0_millis += MILLIS_INC; - timer0_fract += FRACT_INC; - if (timer0_fract >= FRACT_MAX) { - timer0_fract -= FRACT_MAX; - timer0_millis++; - } - timer0_overflow_count++; -} - -unsigned long millis() { - uint8_t oldSREG = SREG; // запомнинаем были ли включены прерывания - cli();//выключаем прерывания - unsigned long m = timer0_millis; // перехватить значение - SREG = oldSREG; // если прерывания не были включены - не включаем и наоборот - return m; // вернуть миллисекунды -} - -unsigned long micros() { - uint8_t oldSREG = SREG; // запомнинаем были ли включены прерывания - cli();//выключаем прерывания - unsigned long m = timer0_overflow_count; // счет переполнений - uint8_t t = TCNT0; // считать содержимое счетного регистра - if ((TIFR0 & _BV(TOV0)) && (t < 255)) //инкремент по переполнению - m++; - SREG = oldSREG; // если прерывания не были включены - не включаем и наоборот - return (long)(((m << 8) + t) * MICROS_MULT); // вернуть микросекунды -} -#endif - -void delay(unsigned long ms) { -#ifdef _GYVERCORE_NOMILLIS - _delay_ms(ms); -#else - uint32_t start = micros(); // запомнили время старта - while (ms > 0) { // ведем отсчет - yield(); - while ( ms > 0 && (micros() - start) >= 1000) { - ms--; - start += 1000; - } - } -#endif -} - -void delayMicroseconds(unsigned int us) { -#if defined(_GYVERCORE_NOMILLIS) || F_CPU < 1000000L - _delay_us(us); -#else - - // работает на счете тиков -#if F_CPU >= 16000000L - if (us <= 1) return; // = 3 cycles, (4 when true) - us <<= 2; // x4 us, = 4 cycles - us -= 5; -#elif F_CPU >= 8000000L - if (us <= 2) return; // = 3 cycles, (4 when true) - us <<= 1; //x2 us, = 2 cycles - us -= 4; // = 2 cycles -#elif F_CPU >= 1000000L - if (us <= 16) return; //= 3 cycles, (4 when true) - if (us <= 25) return; //= 3 cycles, (4 when true) - us -= 22; // = 2 cycles - us >>= 2; // us div 4, = 4 cycles -#endif - - // busy wait - __asm__ __volatile__ ( - "1: sbiw %0,1" "\n\t" // 2 cycles - "brne 1b" : "=w" (us) : "0" (us) // 2 cycles - ); - // 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/wiring_shift.c b/GyverCore/cores/arduino/wiring_shift.c deleted file mode 100644 index b87917e..0000000 --- a/GyverCore/cores/arduino/wiring_shift.c +++ /dev/null @@ -1,32 +0,0 @@ -/* Програмный SPI */ -#include "Arduino.h" - -uint8_t shiftIn(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder) { - uint8_t value = 0; - uint8_t i; - - for (i = 0; i < 8; ++i) { - digitalWrite(clockPin, HIGH); - if (bitOrder == LSBFIRST) - value |= digitalRead(dataPin) << i; - else - value |= digitalRead(dataPin) << (7 - i); - digitalWrite(clockPin, LOW); - } - return value; -} - -void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val) -{ - uint8_t i; - - for (i = 0; i < 8; i++) { - if (bitOrder == LSBFIRST) - digitalWrite(dataPin, !!(val & (1 << i))); - else - digitalWrite(dataPin, !!(val & (1 << (7 - i)))); - - digitalWrite(clockPin, HIGH); - digitalWrite(clockPin, LOW); - } -} diff --git a/GyverCore/platform.txt b/GyverCore/platform.txt index 3eef991..b21d2e9 100644 --- a/GyverCore/platform.txt +++ b/GyverCore/platform.txt @@ -5,7 +5,7 @@ # https://github.com/arduino/Arduino/wiki/Arduino-IDE-1.5-3rd-party-Hardware-specification name=GyverCore -version=1.10.2 +version=2.0 # AVR compile variables # --------------------- diff --git a/README.md b/README.md index 522c3e0..b58e36b 100644 --- a/README.md +++ b/README.md @@ -39,17 +39,19 @@ ----------------|-----------|-----------|---------- millis | 0.69 us | 0.69 us | - micros | 0.81 us | 0.81 us | - -pinMode | 2.56 us | 0.125 us | 20.5 -digitalWrite | 2.40 us | 0.125 us* | 19 -digitalRead | 2.06 us | 0.063 us | 33 -analogWrite | 5.9 us | 0.63 us | 9.3 -analogRead | 107.2 us | 5.94 us | 18 +pinMode | 2.56 us | 0.25 us | 10.25 +digitalWrite | 2.40 us | 0.125 us | 19 +digitalWrite PWM| 3.25 us | 0.30 us | 7.4 +digitalRead | 2.80 us | 0.063 us | 46 +analogWrite | 3.8 us | 0.33 us | 8.4 +analogRead | 111.2 us | 5.63 us | 20 analogReference | 0.19 us | 0.19 us | - -attachInterrupt | 1.06 us | 1.0 us | - -detachInterrupt | 0.5 us | 0.13 us | 3.8 +attachInterrupt | 1.06 us | 0.8 us | - +detachInterrupt | 0.5 us | 0.25 us | 2 tone | 9.0 us | 2.25 us | 4 +shiftIn | 111 us | 8 us | 13 +shiftOut | 117 us | 24 us | 4.5 -_*digitalWrite для ШИМ пинов занимает 0.43 мкс_ Занимаемое место, Flash, байт @@ -105,7 +107,7 @@ parseFloat | 1070 | 246 | 824 - **32**: 28.04 мкс (частота оцифровки 35 600 кГц) - **64**: 56.04 мкс (частота оцифровки 17 800 кГц) - **128**: 112 мкс (частота оцифровки 8 900 Гц) - - В функции **analogRead(pin)** вместо пина можно указать **INTERNAL** (получить значение внутреннего опорного напряжения) или **THERMOMETR** (получить приблизительную температуру МК). *Примечание: нужно установить предделитель 128* + - Убрано в 2.0 ~~В функции **analogRead(pin)** вместо пина можно указать **INTERNAL** (получить значение внутреннего опорного напряжения) или **THERMOMETR** (получить приблизительную температуру МК). *Примечание: нужно установить предделитель 128*~~ - Добавлен очень быстрый и лёгкий **uart** (аналог классу Serial) - **uart.begin()** - запустить соединение по последовательному порту со скоростью 9600 - **uart.begin(baudrate)** - запустить соединение по последовательному порту со скоростью baudrate @@ -277,11 +279,12 @@ parseFloat | 1070 | 246 | 824 - 1.10.2 - Пара багфиксов с IO - Вернули заголовочные для WiFi -- 2.0.0 - - Убраны все дополнительные функции кроме analogPrescaler и digitalToggle +- 2.0 + - Убраны все дополнительные функции кроме analogPrescaler и digitalToggle. Все "приколы" переезжают в отдельную либу GyverHacks - Почищены и отформатированы файлы - Исправлен конфликт с IP - Подкорректировано меню платы - Исправлена уязвимость в pinMode - Cнижен вес - - Повышена скорость некоторых функций \ No newline at end of file + - Повышена скорость некоторых функций + - Исправлены ошибки в пустых загрузчиках \ No newline at end of file diff --git a/README_eng.md b/README_eng.md index 7ee60a2..a7c987b 100644 --- a/README_eng.md +++ b/README_eng.md @@ -1,6 +1,6 @@ ![CORE_PHOTO](https://github.com/AlexGyver/GyverCore/blob/master/gyverCoreLogo.jpg) # GyverCore for ATmega328 - **Version 1.10.2 from 07.11.2019** + **Version 2.0 from 01.02.2020** Fast and light core for Arduino IDE with advanced configuration. **Only for ATmega328 boards!** Based on original Arduino 1.8.9 core, all functions are replaced by faster versions, a bunch of interesting staff is added. Made by **AlexGyver** and Egor 'Nich1con' Zaharov from mother Russia. @@ -79,8 +79,8 @@ All libraries, based on Wiring functions, works much faster. Even SPI (more than - Macros **bitToggle**(value, bit), for fast bit inversion - Function **digitalToggle**(pin), for fast pin inversion - Advanced ADC - - **analogStartConvert**(byte pin) - start convert from choosed pin - - **analogGet()** - get converted value (you can make some actions between start and get) + - ~~**analogStartConvert**(byte pin) - start convert from choosed pin~~ + - ~~**analogGet()** - get converted value (you can make some actions between start and get)~~ - **analogPrescaler**(uint8_t prescl) - set prescaler for ADC. Prescaler: - **2**: 3.04 us per conversion - **4**: 4.72 us per conversion diff --git a/Release v1.10.2/GyverCore_linux.zip b/Release v2.0/GyverCore_linux.zip similarity index 80% rename from Release v1.10.2/GyverCore_linux.zip rename to Release v2.0/GyverCore_linux.zip index 74915a9..e76ef0d 100644 Binary files a/Release v1.10.2/GyverCore_linux.zip and b/Release v2.0/GyverCore_linux.zip differ diff --git a/Release v1.10.2/GyverCore_win32.zip b/Release v2.0/GyverCore_win32.zip similarity index 79% rename from Release v1.10.2/GyverCore_win32.zip rename to Release v2.0/GyverCore_win32.zip index 018b3ed..abbb3df 100644 Binary files a/Release v1.10.2/GyverCore_win32.zip and b/Release v2.0/GyverCore_win32.zip differ diff --git a/Release v1.10.2/GyverCore_win64.zip b/Release v2.0/GyverCore_win64.zip similarity index 79% rename from Release v1.10.2/GyverCore_win64.zip rename to Release v2.0/GyverCore_win64.zip index 33d002e..2ae479e 100644 Binary files a/Release v1.10.2/GyverCore_win64.zip and b/Release v2.0/GyverCore_win64.zip differ diff --git a/examples/temp_measure/temp_measure.ino b/examples/temp_measure/temp_measure.ino deleted file mode 100644 index 7a2a91b..0000000 --- a/examples/temp_measure/temp_measure.ino +++ /dev/null @@ -1,16 +0,0 @@ -// измерение приблизительной температуры ядра - -void setup() { - uartBegin(9600); - analogReference(INTERNAL); // подключаем АЦП к опорному - analogPrescaler(128); // установить предделитель 128 (иначе некорректно измеряет) - // в стандартном ядре делитель 129 является стандартным - // в GyverCore по умполчанию 4 (быстрее измеряет) -} - -void loop() { - // analogRead(THERMOMETR) вернёт напряжение в мв - // (val - 324.31 ) / 1.22 - примерное уравнение перевода в градусы по цельсию - uartPrintln((float)(analogRead(THERMOMETR) - 324.31) / 1.22); - delay(100); -} diff --git a/examples/vcc_measure/vcc_measure.ino b/examples/vcc_measure/vcc_measure.ino deleted file mode 100644 index fb664fb..0000000 --- a/examples/vcc_measure/vcc_measure.ino +++ /dev/null @@ -1,14 +0,0 @@ -// измерение опорного напряжения - -void setup() { - uartBegin(9600); - analogPrescaler(128); // установить предделитель 128 (иначе некорректно измеряет) -} - -void loop() { - // 1100 является константной, которую нужно калибровать (+- лапоть) - int vcc = (float)1100 * 1023 / (analogRead(INTERNAL)); - uartPrint("vcc: "); - uartPrintln(vcc); // напряжение в милливольтах - delay(300); -}