


Ну чему тут удивляться - логическая обработка на уровне решения задач третьего класса. Какое-то деление или умножение на какой-то коэффциент, зачем-то подсчёт герц, ...Martian
Если 4000 импульсов на километр, то при скорости 300 км/ч какая частота импульсов? 350 герц? И не успевает?
Да уж и с работой с прерываниями не совсем и попытка в языке высокого уровня изгаляться при решении простейших текущих задач, решаемых в две команды на ассмеблере.Martian
...а вот с программой что-то не то...
Код: Выделить всё
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; // Вернем значение стека
Выделил Ваш текст, вставил в сообщение, выделил, обрамил тегом 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;
}чтобы не делать до хера выделений, сначала вставляешь тег spoiler, потом внутри его вставляешь тег code, и потом внутри тега code вставляешь текст.akl писал(а):Выделил Ваш текст, вставил в сообщение, выделил, обрамил тегом Code, выделил всё, обрамил тегом spoiler.
Если вы не возражаете, то давайте переведём вашу мысль, т.е. вы предлагаете:a_b_r_a писал(а): я вам скину проект, можете конкретно указать, что не так написано или конкретно кодом помочь в оптимизации? Там собственно все структурировано.
Starichok51 писал(а):valentinovich, пишется не PSS, а PPS.
Вам бы только возможности ляктроники обкакать.>TEHb< писал(а):Надо на автомобиль установить курвиметр
Оооо, это надо было видеть (слышать).Martian писал(а):в качестве сенсора что?