mirror of
https://github.com/AlexGyver/GyverCore.git
synced 2025-07-31 06:24:21 +03:00
add
This commit is contained in:
@ -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/
|
||||
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
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1 +1 @@
|
||||
:107E0000112484B714BE81FFF0D085E080938100F7
|
||||
:00000001FF
|
@ -1 +1 @@
|
||||
:107E000001C0DCC0112484B7882361F0982F9A70D8
|
||||
:00000001FF
|
@ -1 +1 @@
|
||||
:107E0000112484B714BE81FFF0D085E080938100F7
|
||||
:00000001FF
|
@ -1 +1 @@
|
||||
:107E0000112484B714BE81FFF0D085E080938100F7
|
||||
:00000001FF
|
@ -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
|
||||
|
180
GyverCore/cores/arduino/GyverCore_gpio.cpp
Normal file
180
GyverCore/cores/arduino/GyverCore_gpio.cpp
Normal file
@ -0,0 +1,180 @@
|
||||
/*
|
||||
GyverCore digital / analog IO functions
|
||||
*/
|
||||
|
||||
#define ARDUINO_MAIN
|
||||
#include "Arduino.h"
|
||||
#include <avr/io.h>
|
||||
|
||||
|
||||
/************************************
|
||||
* 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;
|
||||
}
|
||||
}
|
40
GyverCore/cores/arduino/GyverCore_interrupts.c
Normal file
40
GyverCore/cores/arduino/GyverCore_interrupts.c
Normal file
@ -0,0 +1,40 @@
|
||||
/********************************************
|
||||
* GyverCore external interrupts *
|
||||
********************************************/
|
||||
|
||||
#include <avr/interrupt.h>
|
||||
#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
|
||||
}
|
32
GyverCore/cores/arduino/GyverCore_shift.c
Normal file
32
GyverCore/cores/arduino/GyverCore_shift.c
Normal file
@ -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);
|
||||
}
|
||||
}
|
91
GyverCore/cores/arduino/GyverCore_tone.cpp
Normal file
91
GyverCore/cores/arduino/GyverCore_tone.cpp
Normal file
@ -0,0 +1,91 @@
|
||||
#include <avr/interrupt.h>
|
||||
#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
|
||||
}
|
||||
}
|
@ -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;
|
138
GyverCore/cores/arduino/GyverCore_uptime.cpp
Normal file
138
GyverCore/cores/arduino/GyverCore_uptime.cpp
Normal file
@ -0,0 +1,138 @@
|
||||
#include "Arduino.h"
|
||||
#include <util/delay.h>
|
||||
|
||||
/* функции времени и инициализация таймеров , АЦП*/
|
||||
|
||||
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
|
||||
}
|
||||
|
@ -18,6 +18,9 @@
|
||||
*/
|
||||
|
||||
#include <Arduino.h>
|
||||
|
||||
#ifndef _GYVERCORE_GYVERUART
|
||||
|
||||
#include <IPAddress.h>
|
||||
|
||||
IPAddress::IPAddress()
|
||||
@ -112,3 +115,4 @@ size_t IPAddress::printTo(Print& p) const
|
||||
return n;
|
||||
}
|
||||
|
||||
#endif
|
@ -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
|
@ -1,72 +0,0 @@
|
||||
#include <avr/interrupt.h>
|
||||
#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++; // икремент счетчика
|
||||
}
|
||||
}
|
@ -1,47 +0,0 @@
|
||||
/* внешние прерывания*/
|
||||
#include <inttypes.h>
|
||||
#include <avr/io.h>
|
||||
#include <avr/interrupt.h>
|
||||
#include <avr/pgmspace.h>
|
||||
#include <stdio.h>
|
||||
#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<<INT0);
|
||||
break;
|
||||
case 1:
|
||||
EIMSK &=~ (1<<INT1);
|
||||
break;
|
||||
}
|
||||
}
|
@ -1,6 +1,6 @@
|
||||
/* Главный цикл программы */
|
||||
#pragma message "Нас тут заперли, вызовите 911!"
|
||||
#pragma message "GyverCore v1.10.2 inside. Enjoy"
|
||||
#pragma message "GyverCore v2.0 inside. Enjoy"
|
||||
|
||||
#include <Arduino.h>
|
||||
|
||||
|
@ -1,241 +0,0 @@
|
||||
/*
|
||||
Нормальный ввод/вывод
|
||||
*/
|
||||
#define ARDUINO_MAIN
|
||||
#include "Arduino.h"
|
||||
#include <avr/io.h>
|
||||
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; // если прерывания не были включены - не включаем и наоборот
|
||||
}
|
@ -1,112 +0,0 @@
|
||||
#include "Arduino.h"
|
||||
#include <util/delay.h>
|
||||
|
||||
/* функции времени и инициализация таймеров , АЦП*/
|
||||
|
||||
#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<<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,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);
|
||||
}
|
||||
}
|
@ -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
|
||||
# ---------------------
|
||||
|
27
README.md
27
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нижен вес
|
||||
- Повышена скорость некоторых функций
|
||||
- Повышена скорость некоторых функций
|
||||
- Исправлены ошибки в пустых загрузчиках
|
@ -1,6 +1,6 @@
|
||||

|
||||
# 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
|
||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -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);
|
||||
}
|
@ -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);
|
||||
}
|
Reference in New Issue
Block a user