Вт сен 05, 2023 22:12:14
Вт сен 05, 2023 22:35:45
Вт сен 05, 2023 22:35:57
Ну чему тут удивляться - логическая обработка на уровне решения задач третьего класса. Какое-то деление или умножение на какой-то коэффциент, зачем-то подсчёт герц, ... . С "железом" надо работать несколькопо по друному. На его "мышлении" 0/1, т.е. как там в фильме: <без фанабериев всяких>, уходя от неоправданных сложных вычислений (тем более, что это вполне достаточный, но всё же маленький МК),Martian
Если 4000 импульсов на километр, то при скорости 300 км/ч какая частота импульсов? 350 герц? И не успевает?
Да уж и с работой с прерываниями не совсем и попытка в языке высокого уровня изгаляться при решении простейших текущих задач, решаемых в две команды на ассмеблере.Martian
...а вот с программой что-то не то...
Вт сен 05, 2023 22:39:40
Вт сен 05, 2023 22:47:59
Вт сен 05, 2023 22:53:14
Вт сен 05, 2023 22:58:07
uint8_t dt_test_device(void)
{
uint8_t stektemp=SREG; // сохранение значения стека
cli(); // запрещаем прерывания
uint8_t dt;
DDRTEMP |= 1<< BITTEMP;
PORTTEMP &= ~ (1<<BITTEMP); // Притягиваем к нулю шину
_delay_us(485); // Задержка на минимум 480 мкС
sei();
DDRTEMP &= ~ (1<<BITTEMP); // Отпускаем шину
_delay_us(65); //Задержка на минимум 60 мкС
if ((PINTEMP & (1<<BITTEMP))==0 ) // Проверяем, ответит ли устройство
{
dt=1; // Устройство ответило
}
else dt=0; // Устройства нет
SREG=stektemp; // Вернем значение стека
_delay_us(420); //
sei();
return dt;
}
uint8_t stektemp=SREG; // сохранение значения стека
uint8_t dt;
DDRTEMP |= 1<< BITTEMP;
PORTTEMP &= ~ (1<<BITTEMP); // Притягиваем к нулю шину
_delay_us(485); // Задержка на минимум 480 мкС
DDRTEMP &= ~ (1<<BITTEMP); // Отпускаем шину
cli(); // запрещаем прерывания
_delay_us(65); //Задержка на минимум 60 мкС
if ((PINTEMP & (1<<BITTEMP))==0 ) // Проверяем, ответит ли устройство
{
dt=1; // Устройство ответило
}
else dt=0; // Устройства нет
sei();
SREG=stektemp; // Вернем значение стека
_delay_us(420); //
return dt;
uint8_t dt_readbit(void)
{
uint8_t stektemp=SREG; // сохранение значения стека
cli(); // запрещаем прерывания
uint8_t bt; // Переменная хранения бита
DDRTEMP |= 1<< BITTEMP;
PORTTEMP &= ~ (1<<BITTEMP); // Притягиваем к нулю шину
_delay_us(2);
DDRTEMP &= ~ (1<<BITTEMP); // Отпускаем шину
_delay_us(13);
bt=(PINTEMP & (1<<BITTEMP))>>BITTEMP; // Читаем бит
_delay_us(45);
SREG=stektemp; // Вернем значение стека
sei();
return bt;
}
void dt_sendbit(uint8_t bt)
{
uint8_t stektemp=SREG; // сохранение значения стека
cli(); // запрещаем прерывания
DDRTEMP |= 1<< BITTEMP;
PORTTEMP &= ~ (1<<BITTEMP); // Притягиваем к нулю шину
_delay_us(2);
if(bt)
DDRTEMP &= ~ (1<<BITTEMP); // Отпускаем шину
_delay_us(65);
DDRTEMP &= ~ (1<<BITTEMP); // Отпускаем шину
SREG=stektemp; // Вернем значение стека
sei();
}
cli(); // запрещаем прерывания
DDRTEMP |= 1<< BITTEMP;
PORTTEMP &= ~ (1<<BITTEMP); // Притягиваем к нулю шину
_delay_us(2);
if(bt)
DDRTEMP &= ~ (1<<BITTEMP); // Отпускаем шину
sei();
_delay_us(65);
DDRTEMP &= ~ (1<<BITTEMP); // Отпускаем шину
SREG=stektemp; // Вернем значение стека
Вт сен 05, 2023 23:03:29
Ср сен 06, 2023 06:32:27
Выделил Ваш текст, вставил в сообщение, выделил, обрамил тегом Code, выделил всё, обрамил тегом spoiler.a_b_r_a писал(а):Блин, не знаю, как спойлер сделать.
#include "ds18b20.h"
volatile uint32_t last_time;
uint8_t st=0;
//=======
//Определение датчика на шине
uint8_t dt_test_device(void)
{
uint8_t stektemp=SREG; // сохранение значения стека
cli(); // запрещаем прерывания
uint8_t dt;
DDRTEMP |= 1<< BITTEMP;
PORTTEMP &= ~ (1<<BITTEMP); // Притягиваем к нулю шину
_delay_us(485); // Задержка на минимум 480 мкС
sei();
DDRTEMP &= ~ (1<<BITTEMP); // Отпускаем шину
_delay_us(65); //Задержка на минимум 60 мкС
if ((PINTEMP & (1<<BITTEMP))==0 ) // Проверяем, ответит ли устройство
{
dt=1; // Устройство ответило
}
else dt=0; // Устройства нет
SREG=stektemp; // Вернем значение стека
_delay_us(420); //
sei();
return dt;
}
//=======
// Функция чтения бита с датчика
uint8_t dt_readbit(void)
{
uint8_t stektemp=SREG; // сохранение значения стека
cli(); // запрещаем прерывания
uint8_t bt; // Переменная хранения бита
DDRTEMP |= 1<< BITTEMP;
PORTTEMP &= ~ (1<<BITTEMP); // Притягиваем к нулю шину
_delay_us(2);
DDRTEMP &= ~ (1<<BITTEMP); // Отпускаем шину
_delay_us(13);
bt=(PINTEMP & (1<<BITTEMP))>>BITTEMP; // Читаем бит
_delay_us(45);
SREG=stektemp; // Вернем значение стека
sei();
return bt;
}
//======
// Функция чтения байта с датчика
uint8_t dt_readbyte(void)
{
uint8_t c=0;
uint8_t i;
for(i=0;i<8;i++)
c|=dt_readbit()<<i; // Читаем бит
return c;
}
//=======
// Функция записи бита
void dt_sendbit(uint8_t bt)
{
uint8_t stektemp=SREG; // сохранение значения стека
cli(); // запрещаем прерывания
DDRTEMP |= 1<< BITTEMP;
PORTTEMP &= ~ (1<<BITTEMP); // Притягиваем к нулю шину
_delay_us(2);
if(bt)
DDRTEMP &= ~ (1<<BITTEMP); // Отпускаем шину
_delay_us(65);
DDRTEMP &= ~ (1<<BITTEMP); // Отпускаем шину
SREG=stektemp; // Вернем значение стека
sei();
}
//=======
// Функция записи байта в датчик
void dt_sendbyte(uint8_t bt)
{
uint8_t i;
for(i=0;i<8;i++)
{
if ((bt & (1<<i))==1<<i)
dt_sendbit(1); // Передаем 1
else
dt_sendbit(0); // Передаем 0
}
}
//========
uint16_t dt_check(void)
{
uint8_t bt; // переменная для считывания байта
if (!st) // Начало первой фазы измерения
{
if (dt_test_device()==1) // Если устройство нашлось
{
dt_sendbyte(NO_ID); // Пропускаем идентификацию
dt_sendbyte(T_CONVERT);// Измеряем температуру
st=1; // Установим флаг окончания первой фазы измерения
last_time=millis;
}
}
// Вторая фаза измерения
if (millis-last_time>750) // Проверяем, прошло ли 750 мС. В 12 битном режиме преобразование 750 мС
{
last_time=millis;
dt_test_device();
dt_sendbyte(NO_ID);
dt_sendbyte(READ_DATA); //Даем команду на чтение данных
bt=dt_readbyte(); // Читаем младший бит
ttt=dt_readbyte();
ttt=(ttt<<8)|bt; // Сдвигаем старший байт влево, на его место пишем младший байт
st=0; // Готовимся к новому измерению
}
else asm("nop");
return ttt; // Возвращаем измеренную температуру
}
//======
// Преобразование температуры в единицы
uint8_t converttemp(uint16_t tt)
{
uint16_t b=0;
uint8_t t;
b=tt;
b=b>>11; // Оставляем 5 старших знаковых бит
if (b) // Если хотя бы один из этих бит равен 1, то температура отрицательная
{
v=1; // Установим флаг отрицательной температуры
t=((~tt)+1)>>4; // Проинвертируем побитно и прибавим 1 для преобразования
}
else
{
v=0; // Температура положительная
t=tt>>4; // отсекаем часть младших битов. Оставляем только единицы градусов.
}
return t;
}
Ср сен 06, 2023 09:00:53
чтобы не делать до хера выделений, сначала вставляешь тег spoiler, потом внутри его вставляешь тег code, и потом внутри тега code вставляешь текст.akl писал(а):Выделил Ваш текст, вставил в сообщение, выделил, обрамил тегом Code, выделил всё, обрамил тегом spoiler.
Ср сен 06, 2023 23:15:19
Если вы не возражаете, то давайте переведём вашу мысль, т.е. вы предлагаете:a_b_r_a писал(а): я вам скину проект, можете конкретно указать, что не так написано или конкретно кодом помочь в оптимизации? Там собственно все структурировано.
Чт сен 07, 2023 07:51:21
Чт сен 07, 2023 08:44:19
Чт сен 07, 2023 13:56:26
Чт сен 07, 2023 14:39:44
Чт сен 07, 2023 14:44:18
Чт сен 07, 2023 16:40:37
Чт сен 07, 2023 23:29:04
Во блин, как оно оказывается.Starichok51 писал(а):valentinovich, пишется не PSS, а PPS.
Вам бы только возможности ляктроники обкакать.>TEHb< писал(а):Надо на автомобиль установить курвиметр
Чт сен 07, 2023 23:34:20
Пт сен 08, 2023 00:21:57
Оооо, это надо было видеть (слышать).Martian писал(а):в качестве сенсора что?