Пт сен 08, 2023 00:25:48
Пт сен 08, 2023 00:56:41
Имхо главное это то, какая преследуется цель и что для решения задачи есть на данный момент в тумбочке.Martian писал(а):... сенсор самое главное и интересное и сложное и есть
Пт сен 08, 2023 08:24:12
Пт сен 08, 2023 22:06:37
Сб сен 09, 2023 12:32:07
void tim1_ini(void)
{
// Частота кварца 20000000Гц
TCCR1A=0x00; // Normal mode
TCCR1B &= ~((1<<WGM12)|(1<<WGM13)|(1<<CS11)); // Делитель 1024. Частота тактирования после делителя 19530 Гц.
TCCR1B |= ((1<<CS12)|(1<CS10)); // Захват по спаду
TCNT1=0;
TIMSK1 |=(1<<ICIE1); // Разрешение прерывания по захвату
}
volatile uint16_t cnt=0;
uint16_t frec=0;
ISR(TIMER1_CAPT_vect)
{
TCNT1=0;
cnt=ICR1;
}
int main(void)
{
tim1_ini();
sei();
While(1)
{
frec=19530/cnt; // Здесь понятно, что на ноль делить нельзя, просто для понимания.
sprintf(val_1,"%.0d",frec);
}
}
Сб сен 09, 2023 12:55:24
Сб сен 09, 2023 13:00:50
Сб сен 09, 2023 16:05:47
Сб сен 09, 2023 16:43:23
Сб сен 09, 2023 21:11:36
Сб сен 09, 2023 22:13:07
Сб сен 09, 2023 22:16:20
Сб сен 09, 2023 22:25:40
Сб сен 09, 2023 22:38:08
Сб сен 09, 2023 22:51:28
Сб сен 09, 2023 23:03:51
Сб сен 09, 2023 23:14:59
Сб сен 16, 2023 20:40:14
ISR(TIMER0_OVF_vect) // Прерывание по Таймеру 0
{
//TCNT0=131; // 8MHz
TCNT0=178; // 20 MHz
millis++; // Инкрементируем каждую миллисекунду
}
/*
* button.c
*
* Created: 17.04.2023 18:58:14
* Author: ADMIN
*/
#include "button.h"
uint8_t button1S; // храним состояния кнопок (S - State)
uint8_t button1F; // флажки кнопок (F - Flag)
uint8_t button1R; // флажки кнопок на отпускание (R - Release)
uint8_t button1P; // флажки кнопок на нажатие (P - Press)
uint8_t button1H; // флажки кнопок на удержание (многократный вызов) (H - Hold)
uint8_t button1HO; // флажки кнопок на удержание (один вызов при нажатии) (HO - Hold Once)
uint8_t button1D; // флажки кнопок на двойное нажатие (D - Double)
uint8_t button1DP; // флажки кнопок на двойное нажатие и отпускание (D - Double Pressed)
#define DOUBLE_TIMER 500 // время (мс), отведённое на второе нажатие
#define HOLD 2000 // время (мс), после которого кнопка считается зажатой
#define DEBOUNCE 50 // (мс), антидребезг
uint32_t button1_timer; // таймер последнего нажатия кнопки
uint32_t button1_double; // таймер двойного нажатия кнопки
uint8_t buttons(void)
{
uint8_t bt1=0; // Будем возвращать результат в этой переменной
if (BitIsClear(BUT1_PIN,BUT1)) button1S=1;
else button1S=0; // Состояние кнопки
// нажали (с антидребезгом)
if (button1S && !button1F && millis - button1_timer > DEBOUNCE)
{
button1F = 1; // Установим флаг кнопки
button1HO = 1; // флаг на удержание
button1_timer = millis; // таймер последнего нажатия кнопки
bt1=1;
}
// если отпустили до hold, считать отпущенной
if (!button1S && button1F && !button1R && !button1DP && millis - button1_timer < HOLD)
{
button1R = 1; // флаг на отпускание
button1F = 0; //флаг кнопки
bt1=2;
button1_double = millis; // Таймер двойного нажатия кнопки
}
// если отпустили и прошло больше double_timer, считать 1 нажатием
if (button1R && !button1DP && millis - button1_double > DOUBLE_TIMER)
{
button1R = 0;
button1P = 1;
bt1=3;
}
// если отпустили и прошло меньше double_timer и нажата снова, считать что нажата 2 разa
if (button1F && !button1DP && button1R && millis - button1_double < DOUBLE_TIMER)
{
button1F = 0;
button1R = 0;
button1DP = 1;
bt1=4;
}
// если была нажата 2 разa и отпущена, считать что была нажата 2 раза
if (button1DP && millis - button1_timer < HOLD)
{
button1DP = 0;
button1D = 1;
button1_timer = millis;
bt1=5;
}
// Если удерживается более hold, то считать удержанием
if (button1F && !button1D && !button1H && millis - button1_timer > HOLD)
{
button1H = 1;
bt1=6;
}
// Если отпущена после hold, то считать, что была удержана
if (!button1S && button1F && millis - button1_timer > HOLD)
{
button1F = 0;
button1H = 0;
button1_timer = millis;
bt1=7;
}
// отработка режимов (опускание флага обязательно!)
if (button1P) button1P = 0;
if (button1D) button1D = 0;
if (button1H && button1HO) button1HO = 0;
if (button1H) button1H = 0;
return bt1;
}
/*
* Dark_menu.c
*
* Created: 18.08.2023 18:05:08
* Author: ADMIN
*/
#include "dark_menu.h"
uint8_t main_dark_mode=0; // Переменная для хранения режима теневого меню.
uint8_t sub_mode=0; // флаг входа в подменю
uint8_t edit_mode=0; // пока не используется
uint8_t b=0; // счетчик нажатия кнопки
uint8_t pr_var=0; // Переменная, которая в подменю будет инкрементироваться по нажатию кнопки от 0 до 9
uint8_t pr[6]={0,1,2,3,4,5}; // Массив для разбивки пробега(или еще чего-то) поразрядно для возможности коррекции(тест)
void main_text(void) // Основной текст меню
// Построчный вывод пунктов меню
{
print_string_5x8(11,0,"MILEAGE(km)"); // Вывод типа " -> MILLEAGE(km)"
print_string_5x8(11,1,"SPEED SENSOR(imp)");
print_string_5x8(11,2,"INJECTOR (cc/min)");
print_string_5x8(11,3,"FUEL TANK MIN NOW");
print_string_5x8(11,4,"FUEL TANK MAX NOW");
}
void pointer_clear(void) // очистка стрелочки
{
for(uint8_t i=0; i<5; i++)
{
print_string_5x8(0,i," ");
}
}
void main_dark_menu(void)
{
screen_clear();
if (cod==3) // Если нажали и отпустили кнопку
{
main_dark_mode++; // Бегаем по основному меню
if(main_dark_mode>4) main_dark_mode=0; // Бегаем по кругу
}
switch (main_dark_mode)
{
case 0: // коррекция пробега
pointer_clear(); // Очистка стрелочки
print_string_5x8(0,main_dark_mode,"->"); // Cтрелка на нулевой строке, т.к. mode_1 сейчас равен нулю.
main_text(); // Выводим все пункты основного меню
if (cod==5) // Если двойное нажатие, заходим в подменю
{
cod=0; // Сразу обнулим код нажатия кнопки
screen_clear(); // Очистим экран
sub_mode=1; // Зайдем в режим подменю
while(sub_mode)
{
cod=buttons();
print_string_5x8(16,2,"SET MILEAGE(km)"); // Тут печать пояснительного текста
print_string_5x8(16,3,"x100000----x1");
print_string_5x8(16,4,"ALL 6 DIGIT");
screen_update();
correction(6,16,pr); // Заходим в функцию коррекции величин
if (cod==6) // Нужно как-то выйти из цикла..
{
sub_mode=0;
}
}
}
break;
case 1: // Speed sensor
pointer_clear();
print_string_5x8(0,main_dark_mode,"->");
main_text();
if (cod==5)
{
cod=0; // Сразу обнулим код нажатия кнопки
screen_clear(); // Очистим экран
sub_mode=1;
while(sub_mode)
{
cod=buttons();
print_string_5x8(16,2,"SET SPEED SENSOR");
print_string_5x8(16,3,"IMP/1000m");
print_string_5x8(16,4,"ALL 4 DIGIT");
screen_update();
if (cod==6)
{
sub_mode=0;
}
}
}
break;
case 2: // Injector
pointer_clear();
print_string_5x8(0,main_dark_mode,"->");
main_text();
if (cod==5)
{
cod=0; // Сразу обнулим код нажатия кнопки
screen_clear(); // Очистим экран
sub_mode=1;
while(sub_mode)
{
cod=buttons();
print_string_5x8(16,2,"SET INJECTOR");
print_string_5x8(16,3,"PRODUCTIVITY");
//print_string_5x8(16,4,"");
screen_update();
if (cod==6)
{
sub_mode=0;
}
}
}
break;
case 3: // Fuel min
pointer_clear();
print_string_5x8(0,main_dark_mode,"->");
main_text();
if (cod==5)
{
cod=0; // Сразу обнулим код нажатия кнопки
screen_clear(); // Очистим экран
sub_mode=1;
while(sub_mode)
{
cod=buttons();
print_string_5x8(16,2,"PRESS BUTTON ");
print_string_5x8(16,3,"FOR MEMORY");
print_string_5x8(16,4,"ENTRIES MIN");
screen_update();
if (cod==6)
{
sub_mode=0;
}
}
}
break;
case 4: // Fuel max
pointer_clear();
print_string_5x8(0,main_dark_mode,"->");
main_text();
if (cod==5)
{
cod=0; // Сразу обнулим код нажатия кнопки
screen_clear(); // Очистим экран
sub_mode=1;
while(sub_mode)
{
cod=buttons();
print_string_5x8(16,2,"PRESS BUTTON ");
print_string_5x8(16,3,"FOR MEMORY");
print_string_5x8(16,4,"ENTRIES MAX");
screen_update();
if (cod==6)
{
sub_mode=0;
}
}
}
break;
}
}
void correction(uint8_t size,uint16_t eep_number, uint8_t *par)
{
uint8_t a=51; // Параметр начала строки. Магическое число. С этой позиции курсора начинаем вывод
for (uint8_t i; i<size; i++)
{
print_MediumNumbers(a,6,par[i]%10 + '0'); // Выводим все разряды корректируемой величины
a+=12;
}
if (cod==5) // при двойном нажатии прыгаем на следующую циферку, которую нам необходимо изменить и подсвечиваем
// ее инверсией
{
b++; // при каждом двойном нажатии кнопки инкрементируем переменную
cod=0; //Обнуляем код нажатия для следующего скана
if(b==size) b=0; // В зависимости от переданного в функцию количества разрядов корректируемой величины
// инкрементируем разряды
pr_var=par[b]; // Читаем в переменную содержание элемента массива
}
print_invert_MediumNumbers(51+(b*12),6,par[b]%10 + '0'); // Инвертируем картинку редактируемого разряда
if(cod==3) // Если редактируем
{
pr_var++; // Если нажали кнопку, увеличиваем значение переменной на +1
if(pr_var>9) pr_var=0;
cod=0; // Обнуляем код нажатия кнопки
par[b]=pr_var; // Записываем это значение в выбранный элемент массива
}
}
Вс сен 17, 2023 10:52:08
Вс сен 17, 2023 16:46:04