1
0
mirror of https://github.com/AlexGyver/GyverCore.git synced 2025-07-31 06:24:21 +03:00
This commit is contained in:
Alex
2020-02-03 01:06:51 +03:00
parent 82980d5fb2
commit 3e6aa354ce
29 changed files with 629 additions and 654 deletions

View File

@ -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=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

View File

@ -1 +1 @@
:107E0000112484B714BE81FFF0D085E080938100F7
:00000001FF

View File

@ -1 +1 @@
:107E000001C0DCC0112484B7882361F0982F9A70D8
:00000001FF

View File

@ -1 +1 @@
:107E0000112484B714BE81FFF0D085E080938100F7
:00000001FF

View File

@ -1 +1 @@
:107E0000112484B714BE81FFF0D085E080938100F7
:00000001FF

View File

@ -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

View 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;
}
}

View 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
}

View 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);
}
}

View 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
}
}

View File

@ -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;

View 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
}

View File

@ -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

View File

@ -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

View File

@ -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++; // икремент счетчика
}
}

View File

@ -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;
}
}

View File

@ -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>

View File

@ -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; // если прерывания не были включены - не включаем и наоборот
}

View File

@ -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();
}

View File

@ -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);
}
}

View File

@ -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
# ---------------------

View File

@ -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нижен вес
- Повышена скорость некоторых функций
- Исправлены ошибки в пустых загрузчиках

View File

@ -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

View File

@ -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);
}

View File

@ -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);
}