mirror of
https://github.com/AlexGyver/GyverCore.git
synced 2025-11-17 10:02:40 +03:00
add
This commit is contained in:
@@ -124,7 +124,7 @@ menu.timers=System timer
|
||||
nano.menu.timers.yes_millis=enable
|
||||
nano.menu.timers.yes_millis.extra_flags.timer=
|
||||
nano.menu.timers.no_millis=disable
|
||||
nano.menu.timers.no_millis.build.extra_flags=-D_GYVERCORE_NOMILLIS
|
||||
nano.menu.timers.no_millis.build.extra_flags.timer=-D_GYVERCORE_NOMILLIS
|
||||
|
||||
## BOD ##
|
||||
menu.bod=B.O.D.
|
||||
|
||||
@@ -1,23 +0,0 @@
|
||||
#include "Arduino.h"
|
||||
|
||||
void init() { // функция инициализации
|
||||
cli();
|
||||
/* timer 0 */
|
||||
TCCR0A = 0b00000011; // fast pwm 8 bit
|
||||
TCCR0B = 0b00000011; // делитель 64
|
||||
#ifndef _GYVERCORE_NOMILLIS
|
||||
TIMSK0 |= (1<<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();
|
||||
}
|
||||
@@ -10,6 +10,8 @@ void tone(uint8_t pin , uint16_t freq, uint32_t duration = 0){
|
||||
tone_pin = pin; // присвоили номер пина для прерывания
|
||||
willStop = duration;// если введено время генерации - будет ненулевым
|
||||
toggle_top = (freq * duration)/500; // расчет кол-ва toggl'ов за указанное время генерации
|
||||
uint8_t oldSREG = SREG; // запомнинаем были ли включены прерывания
|
||||
cli();//выключаем прерывания
|
||||
TCCR2A = (1<<WGM21); // вкл CTC
|
||||
TIMSK2 |= (1<<OCIE2A); //Вкл прерывание
|
||||
if(freq < 122){ // максимальный делитель
|
||||
@@ -25,15 +27,19 @@ void tone(uint8_t pin , uint16_t freq, uint32_t duration = 0){
|
||||
OCR2A = (125000/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 = 0b00000011; // установить стандартные настройки для таймера 2
|
||||
TCCR2B = 0b00000100;
|
||||
OCR2A = 0; //обнуляем регистр сравнения
|
||||
TCCR2A &=~ ((1<<COM2A1)|(1<<COM2B1)); // откл регистры сравнения (подстраховка)
|
||||
SREG = oldSREG;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
/* Главный цикл программы */
|
||||
|
||||
#pragma message "Это фиксики , помогите !"
|
||||
#pragma message "Нас тут заперли, вызовите 911!"
|
||||
#pragma message "GyverCore v1.7.3 inside. Enjoy"
|
||||
|
||||
#include <Arduino.h>
|
||||
|
||||
@@ -8,7 +8,8 @@ uint8_t a_ref = DEFAULT; // глобальная переменная для х
|
||||
// ============= DIGITAL =============
|
||||
|
||||
void pinMode(uint8_t pin, uint8_t mode)
|
||||
{
|
||||
{ uint8_t oldSREG = SREG; // запомнинаем были ли включены прерывания
|
||||
cli();//выключаем прерывания
|
||||
switch (mode) {
|
||||
case 0: // input
|
||||
if (pin < 8) bitWrite(DDRD, pin, 0); // расставляем нули в DDRn
|
||||
@@ -35,9 +36,12 @@ void pinMode(uint8_t pin, uint8_t mode)
|
||||
}
|
||||
break;
|
||||
}
|
||||
SREG = oldSREG; // если прерывания не были включены - не включаем и наоборот
|
||||
}
|
||||
|
||||
void digitalWrite(uint8_t pin, uint8_t x) {
|
||||
uint8_t oldSREG = SREG; // запомнинаем были ли включены прерывания
|
||||
cli();//выключаем прерывания
|
||||
switch (pin) { // откл pwm
|
||||
case 3: // 2B
|
||||
TCCR2A &= ~(1 << COM2B1);
|
||||
@@ -61,6 +65,7 @@ void digitalWrite(uint8_t pin, uint8_t x) {
|
||||
if (pin < 8) bitWrite(PORTD, pin, x);
|
||||
else if (pin < 14) bitWrite(PORTB, (pin - 8), x);
|
||||
else if (pin < 20) bitWrite(PORTC, (pin - 14), x);
|
||||
SREG = oldSREG; // если прерывания не были включены - не включаем и наоборот
|
||||
}
|
||||
|
||||
int digitalRead (uint8_t pin) {
|
||||
@@ -71,6 +76,8 @@ int digitalRead (uint8_t pin) {
|
||||
|
||||
|
||||
void digitalToggle(uint8_t pin){
|
||||
uint8_t oldSREG = SREG; // запомнинаем были ли включены прерывания
|
||||
cli();//выключаем прерывания
|
||||
if (pin < 8) bitToggle(PORTD, pin);
|
||||
else if (pin < 14) bitToggle(PORTB, pin - 8);
|
||||
else if (pin < 20) bitToggle(PORTC, pin - 14);
|
||||
@@ -85,10 +92,12 @@ void digitalToggle(uint8_t pin){
|
||||
bitWrite(PORTC, (pin - 14), !bitRead(PORTC,(pin-14)));
|
||||
}
|
||||
*/
|
||||
SREG = oldSREG; // если прерывания не были включены - не включаем и наоборот
|
||||
}
|
||||
// ============= ANALOG =============
|
||||
void analogPrescaler (uint8_t prescl) {
|
||||
cli();
|
||||
uint8_t oldSREG = SREG; // запомнинаем были ли включены прерывания
|
||||
cli();//выключаем прерывания
|
||||
switch (prescl) {
|
||||
case 2:
|
||||
ADCSRA &= ~((1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0));
|
||||
@@ -117,7 +126,7 @@ void analogPrescaler (uint8_t prescl) {
|
||||
ADCSRA |= ((1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0));
|
||||
break;
|
||||
}
|
||||
sei();
|
||||
SREG = oldSREG; // если прерывания не были включены - не включаем и наоборот
|
||||
}
|
||||
|
||||
void analogReference(uint8_t mode)
|
||||
@@ -138,9 +147,9 @@ void analogStartConvert(byte pin) {
|
||||
pin = (pin < 14) ? (pin) : (pin - 14); // совместимость между A0, A1.. A7 и 0, 1.. 7
|
||||
ADMUX = 0; // обнуляем опорное и мультиплексор
|
||||
ADMUX = (a_ref << 6) | pin; // задвигаем опорное и номер входа
|
||||
SREG = oldSREG; // если прерывания не были включены - не включаем и наоборот
|
||||
if (pin == 8 || pin == 14) delay(2); // Wait for Vref to settle для VCC и термометра
|
||||
ADCSRA |= (1 << ADSC); // начинаем преобразование
|
||||
SREG = oldSREG; // если прерывания не были включены - не включаем и наоборот
|
||||
}
|
||||
|
||||
int analogGet() {
|
||||
@@ -150,7 +159,8 @@ int analogGet() {
|
||||
|
||||
// ============= PWM =============
|
||||
void analogWrite(uint8_t pin, int val) {
|
||||
cli();
|
||||
uint8_t oldSREG = SREG; // запомнинаем были ли включены прерывания
|
||||
cli();//выключаем прерывания
|
||||
switch (val) {
|
||||
case 5:
|
||||
bitSet(TCCR0A, COM0B1);
|
||||
@@ -179,5 +189,5 @@ void analogWrite(uint8_t pin, int val) {
|
||||
default:
|
||||
break;
|
||||
}
|
||||
sei();
|
||||
SREG = oldSREG; // если прерывания не были включены - не включаем и наоборот
|
||||
}
|
||||
@@ -25,19 +25,21 @@ ISR(TIMER0_OVF_vect){
|
||||
}
|
||||
|
||||
unsigned long millis() {
|
||||
cli(); // остановить счет
|
||||
uint8_t oldSREG = SREG; // запомнинаем были ли включены прерывания
|
||||
cli();//выключаем прерывания
|
||||
unsigned long m = timer0_millis; // перехватить значение
|
||||
sei(); // продолжить счет
|
||||
SREG = oldSREG; // если прерывания не были включены - не включаем и наоборот
|
||||
return m; // вернуть миллисекунды
|
||||
}
|
||||
|
||||
unsigned long micros() {
|
||||
cli(); // остановить прерывания
|
||||
uint8_t oldSREG = SREG; // запомнинаем были ли включены прерывания
|
||||
cli();//выключаем прерывания
|
||||
unsigned long m = timer0_overflow_count; // счет переполнений
|
||||
uint8_t t = TCNT0; // считать содержимое счетного регистра
|
||||
if ((TIFR0 & _BV(TOV0)) && (t < 255)) //инкремент по переполнению
|
||||
m++;
|
||||
sei(); // продолжить счет
|
||||
SREG = oldSREG; // если прерывания не были включены - не включаем и наоборот
|
||||
return (long)(((m << 8) + t) * MICROS_MULT); // вернуть микросекунды
|
||||
}
|
||||
#endif
|
||||
@@ -87,3 +89,25 @@ void delayMicroseconds(unsigned int us) {
|
||||
// return = 4 cycles
|
||||
#endif
|
||||
}
|
||||
|
||||
void init() { // функция инициализации
|
||||
cli();
|
||||
/* timer 0 */
|
||||
TCCR0A = 0b00000011; // fast pwm 8 bit
|
||||
TCCR0B = 0b00000011; // делитель 64
|
||||
#ifndef _GYVERCORE_NOMILLIS
|
||||
TIMSK0 |= (1<<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();
|
||||
}
|
||||
@@ -8,7 +8,7 @@ volatile uint8_t _UART_RX_BUFFER_TAIL;
|
||||
|
||||
// ===== INIT =====
|
||||
void uartBegin(uint32_t baudrate){
|
||||
uint16_t speed = (F_CPU / (8 * baudrate)) - 1;
|
||||
uint16_t speed = (F_CPU / (8L * baudrate)) - 1;
|
||||
UBRR0H = highByte(speed);
|
||||
UBRR0L = lowByte(speed);
|
||||
UCSR0A = (1 << U2X0);
|
||||
|
||||
@@ -215,3 +215,7 @@ parseFloat | 1070 | 246 | 824
|
||||
- Пофикшены различные баги
|
||||
- Убран lightInit
|
||||
- Добавлен загрузчик optiBoot v8
|
||||
- 1.7.4
|
||||
- Поправлены баги с Serial
|
||||
- И не только с Serial
|
||||
- Оптимизированы прерывания
|
||||
@@ -162,6 +162,20 @@
|
||||
{"name": "ATmega328 based boards"}
|
||||
],
|
||||
"toolsDependencies": []
|
||||
},
|
||||
{
|
||||
"name": "GyverCore",
|
||||
"architecture": "avr",
|
||||
"version": "1.7.4",
|
||||
"category": "Contributed",
|
||||
"url": "https://github.com/AlexGyver/GyverCore/releases/download/GyverCore-1.7.4/GyverCore.zip",
|
||||
"archiveFileName": "GyverCore.zip",
|
||||
"checksum": "MD5:e6df1cf0ef4f6c2ee987a9d3bc7df918",
|
||||
"size": "115466",
|
||||
"boards": [
|
||||
{"name": "ATmega328 based boards"}
|
||||
],
|
||||
"toolsDependencies": []
|
||||
}
|
||||
],
|
||||
"tools": []
|
||||
|
||||
Reference in New Issue
Block a user