1
0
mirror of https://github.com/AlexGyver/GyverCore.git synced 2025-11-18 21:20:52 +03:00
This commit is contained in:
Alex
2019-09-03 14:17:33 +03:00
parent 62a69cb21b
commit b23c0d5da1
9 changed files with 73 additions and 37 deletions

View File

@@ -124,7 +124,7 @@ menu.timers=System timer
nano.menu.timers.yes_millis=enable nano.menu.timers.yes_millis=enable
nano.menu.timers.yes_millis.extra_flags.timer= nano.menu.timers.yes_millis.extra_flags.timer=
nano.menu.timers.no_millis=disable 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 ## ## BOD ##
menu.bod=B.O.D. menu.bod=B.O.D.

View File

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

View File

@@ -10,6 +10,8 @@ void tone(uint8_t pin , uint16_t freq, uint32_t duration = 0){
tone_pin = pin; // присвоили номер пина для прерывания tone_pin = pin; // присвоили номер пина для прерывания
willStop = duration;// если введено время генерации - будет ненулевым willStop = duration;// если введено время генерации - будет ненулевым
toggle_top = (freq * duration)/500; // расчет кол-ва toggl'ов за указанное время генерации toggle_top = (freq * duration)/500; // расчет кол-ва toggl'ов за указанное время генерации
uint8_t oldSREG = SREG; // запомнинаем были ли включены прерывания
cli();//выключаем прерывания
TCCR2A = (1<<WGM21); // вкл CTC TCCR2A = (1<<WGM21); // вкл CTC
TIMSK2 |= (1<<OCIE2A); //Вкл прерывание TIMSK2 |= (1<<OCIE2A); //Вкл прерывание
if(freq < 122){ // максимальный делитель if(freq < 122){ // максимальный делитель
@@ -25,15 +27,19 @@ void tone(uint8_t pin , uint16_t freq, uint32_t duration = 0){
OCR2A = (125000/freq)-1; // по аналогии см выше OCR2A = (125000/freq)-1; // по аналогии см выше
} }
toggle_counter = 0; // обнулили счетчик toggl'ов toggle_counter = 0; // обнулили счетчик toggl'ов
SREG = oldSREG;
} }
void noTone(uint8_t pin){ // если вызван noTone void noTone(uint8_t pin){ // если вызван noTone
digitalWrite(pin,0);// устанавливаем 0 на выходе digitalWrite(pin,0);// устанавливаем 0 на выходе
uint8_t oldSREG = SREG; // запомнинаем были ли включены прерывания
cli();//выключаем прерывания
TIMSK2 &=~ (1<<OCIE2A); // остановить прерывания TIMSK2 &=~ (1<<OCIE2A); // остановить прерывания
TCCR2A = 0b00000011; // установить стандартные настройки для таймера 2 TCCR2A = 0b00000011; // установить стандартные настройки для таймера 2
TCCR2B = 0b00000100; TCCR2B = 0b00000100;
OCR2A = 0; //обнуляем регистр сравнения OCR2A = 0; //обнуляем регистр сравнения
TCCR2A &=~ ((1<<COM2A1)|(1<<COM2B1)); // откл регистры сравнения (подстраховка) TCCR2A &=~ ((1<<COM2A1)|(1<<COM2B1)); // откл регистры сравнения (подстраховка)
SREG = oldSREG;
} }

View File

@@ -1,5 +1,6 @@
/* Главный цикл программы */ /* Главный цикл программы */
#pragma message "Это фиксики , помогите !"
#pragma message "Нас тут заперли, вызовите 911!"
#pragma message "GyverCore v1.7.3 inside. Enjoy" #pragma message "GyverCore v1.7.3 inside. Enjoy"
#include <Arduino.h> #include <Arduino.h>

View File

@@ -8,7 +8,8 @@ uint8_t a_ref = DEFAULT; // глобальная переменная для х
// ============= DIGITAL ============= // ============= DIGITAL =============
void pinMode(uint8_t pin, uint8_t mode) void pinMode(uint8_t pin, uint8_t mode)
{ { uint8_t oldSREG = SREG; // запомнинаем были ли включены прерывания
cli();//выключаем прерывания
switch (mode) { switch (mode) {
case 0: // input case 0: // input
if (pin < 8) bitWrite(DDRD, pin, 0); // расставляем нули в DDRn if (pin < 8) bitWrite(DDRD, pin, 0); // расставляем нули в DDRn
@@ -35,9 +36,12 @@ void pinMode(uint8_t pin, uint8_t mode)
} }
break; break;
} }
SREG = oldSREG; // если прерывания не были включены - не включаем и наоборот
} }
void digitalWrite(uint8_t pin, uint8_t x) { void digitalWrite(uint8_t pin, uint8_t x) {
uint8_t oldSREG = SREG; // запомнинаем были ли включены прерывания
cli();//выключаем прерывания
switch (pin) { // откл pwm switch (pin) { // откл pwm
case 3: // 2B case 3: // 2B
TCCR2A &= ~(1 << COM2B1); TCCR2A &= ~(1 << COM2B1);
@@ -61,6 +65,7 @@ void digitalWrite(uint8_t pin, uint8_t x) {
if (pin < 8) bitWrite(PORTD, pin, x); if (pin < 8) bitWrite(PORTD, pin, x);
else if (pin < 14) bitWrite(PORTB, (pin - 8), x); else if (pin < 14) bitWrite(PORTB, (pin - 8), x);
else if (pin < 20) bitWrite(PORTC, (pin - 14), x); else if (pin < 20) bitWrite(PORTC, (pin - 14), x);
SREG = oldSREG; // если прерывания не были включены - не включаем и наоборот
} }
int digitalRead (uint8_t pin) { int digitalRead (uint8_t pin) {
@@ -71,6 +76,8 @@ int digitalRead (uint8_t pin) {
void digitalToggle(uint8_t pin){ void digitalToggle(uint8_t pin){
uint8_t oldSREG = SREG; // запомнинаем были ли включены прерывания
cli();//выключаем прерывания
if (pin < 8) bitToggle(PORTD, pin); if (pin < 8) bitToggle(PORTD, pin);
else if (pin < 14) bitToggle(PORTB, pin - 8); else if (pin < 14) bitToggle(PORTB, pin - 8);
else if (pin < 20) bitToggle(PORTC, pin - 14); 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))); bitWrite(PORTC, (pin - 14), !bitRead(PORTC,(pin-14)));
} }
*/ */
SREG = oldSREG; // если прерывания не были включены - не включаем и наоборот
} }
// ============= ANALOG ============= // ============= ANALOG =============
void analogPrescaler (uint8_t prescl) { void analogPrescaler (uint8_t prescl) {
cli(); uint8_t oldSREG = SREG; // запомнинаем были ли включены прерывания
cli();//выключаем прерывания
switch (prescl) { switch (prescl) {
case 2: case 2:
ADCSRA &= ~((1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0)); ADCSRA &= ~((1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0));
@@ -117,7 +126,7 @@ void analogPrescaler (uint8_t prescl) {
ADCSRA |= ((1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0)); ADCSRA |= ((1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0));
break; break;
} }
sei(); SREG = oldSREG; // если прерывания не были включены - не включаем и наоборот
} }
void analogReference(uint8_t mode) 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 pin = (pin < 14) ? (pin) : (pin - 14); // совместимость между A0, A1.. A7 и 0, 1.. 7
ADMUX = 0; // обнуляем опорное и мультиплексор ADMUX = 0; // обнуляем опорное и мультиплексор
ADMUX = (a_ref << 6) | pin; // задвигаем опорное и номер входа ADMUX = (a_ref << 6) | pin; // задвигаем опорное и номер входа
SREG = oldSREG; // если прерывания не были включены - не включаем и наоборот
if (pin == 8 || pin == 14) delay(2); // Wait for Vref to settle для VCC и термометра if (pin == 8 || pin == 14) delay(2); // Wait for Vref to settle для VCC и термометра
ADCSRA |= (1 << ADSC); // начинаем преобразование ADCSRA |= (1 << ADSC); // начинаем преобразование
SREG = oldSREG; // если прерывания не были включены - не включаем и наоборот
} }
int analogGet() { int analogGet() {
@@ -150,7 +159,8 @@ int analogGet() {
// ============= PWM ============= // ============= PWM =============
void analogWrite(uint8_t pin, int val) { void analogWrite(uint8_t pin, int val) {
cli(); uint8_t oldSREG = SREG; // запомнинаем были ли включены прерывания
cli();//выключаем прерывания
switch (val) { switch (val) {
case 5: case 5:
bitSet(TCCR0A, COM0B1); bitSet(TCCR0A, COM0B1);
@@ -179,5 +189,5 @@ void analogWrite(uint8_t pin, int val) {
default: default:
break; break;
} }
sei(); SREG = oldSREG; // если прерывания не были включены - не включаем и наоборот
} }

View File

@@ -25,19 +25,21 @@ ISR(TIMER0_OVF_vect){
} }
unsigned long millis() { unsigned long millis() {
cli(); // остановить счет uint8_t oldSREG = SREG; // запомнинаем были ли включены прерывания
cli();//выключаем прерывания
unsigned long m = timer0_millis; // перехватить значение unsigned long m = timer0_millis; // перехватить значение
sei(); // продолжить счет SREG = oldSREG; // если прерывания не были включены - не включаем и наоборот
return m; // вернуть миллисекунды return m; // вернуть миллисекунды
} }
unsigned long micros() { unsigned long micros() {
cli(); // остановить прерывания uint8_t oldSREG = SREG; // запомнинаем были ли включены прерывания
cli();//выключаем прерывания
unsigned long m = timer0_overflow_count; // счет переполнений unsigned long m = timer0_overflow_count; // счет переполнений
uint8_t t = TCNT0; // считать содержимое счетного регистра uint8_t t = TCNT0; // считать содержимое счетного регистра
if ((TIFR0 & _BV(TOV0)) && (t < 255)) //инкремент по переполнению if ((TIFR0 & _BV(TOV0)) && (t < 255)) //инкремент по переполнению
m++; m++;
sei(); // продолжить счет SREG = oldSREG; // если прерывания не были включены - не включаем и наоборот
return (long)(((m << 8) + t) * MICROS_MULT); // вернуть микросекунды return (long)(((m << 8) + t) * MICROS_MULT); // вернуть микросекунды
} }
#endif #endif
@@ -87,3 +89,25 @@ void delayMicroseconds(unsigned int us) {
// return = 4 cycles // return = 4 cycles
#endif #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

@@ -8,7 +8,7 @@ volatile uint8_t _UART_RX_BUFFER_TAIL;
// ===== INIT ===== // ===== INIT =====
void uartBegin(uint32_t baudrate){ void uartBegin(uint32_t baudrate){
uint16_t speed = (F_CPU / (8 * baudrate)) - 1; uint16_t speed = (F_CPU / (8L * baudrate)) - 1;
UBRR0H = highByte(speed); UBRR0H = highByte(speed);
UBRR0L = lowByte(speed); UBRR0L = lowByte(speed);
UCSR0A = (1 << U2X0); UCSR0A = (1 << U2X0);

View File

@@ -215,3 +215,7 @@ parseFloat | 1070 | 246 | 824
- Пофикшены различные баги - Пофикшены различные баги
- Убран lightInit - Убран lightInit
- Добавлен загрузчик optiBoot v8 - Добавлен загрузчик optiBoot v8
- 1.7.4
- Поправлены баги с Serial
- И не только с Serial
- Оптимизированы прерывания

View File

@@ -162,6 +162,20 @@
{"name": "ATmega328 based boards"} {"name": "ATmega328 based boards"}
], ],
"toolsDependencies": [] "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": [] "tools": []