Добрый день, уважаемые коты. Помогите решить такую проблему. Есть устройство, измеряющее температуру четырьмя датчиками DS1820. Номер датчика и значение его температуры выводится на трехразрядный семисегментный индикатор на сдвиговых регистрах.
вот так организован вывод в основном цикле
{
write_byte(pgm_read_byte(&SEGMENTE[10])); // Выводим "-"
write_byte(pgm_read_byte(&SEGMENTE[i + 1])); // Выводим номер датчика
write_byte(pgm_read_byte(&SEGMENTE[10])); // Выводим "-"
_delay_ms(1000);
if (error_crc)
{
if (znak == 0)
{
write_byte(pgm_read_byte(&SEGMENTE[temperature % 10])); // Выводим 3 разряд
write_byte((pgm_read_byte(&SEGMENTE[temperature % 100 / 10])) | 0x80); // Выводим 2 разряд
write_byte(pgm_read_byte(&SEGMENTE[temperature % 1000 / 100])); // Выводим 1 разряд
}
if (znak == 1)
{
write_byte(pgm_read_byte(&SEGMENTE[temperature % 10])); // Выводим 3 разряд
write_byte((pgm_read_byte(&SEGMENTE[temperature % 100 / 10])) | 0x80); // Выводим 2 разряд
write_byte(pgm_read_byte(&SEGMENTE[10])); // Выводим 1 разряд
}
}
else
{
write_byte(pgm_read_byte(&SEGMENTE[10])); // Выводим "-"
write_byte(pgm_read_byte(&SEGMENTE[10]));// Выводим "-"
write_byte(pgm_read_byte(&SEGMENTE[10])); // Выводим "-"
}
_delay_ms(2000);
}
}
Не нравится то, что в основном цикле происходит "затык": 1 секунда на вывод номера датчика и 2 секунды для вывода температуры. А так как датчиков 4, то имеем "затык" - 12 секунд. Как правильно организовать вывод показаний, чтобы основной цикл был максимально коротким, а показания выводились в фоне, с выдержкой соответствующих задержек. Есть таймер с прерыванием, тикающий каждую 1 мс.
вот так организован вывод в основном цикле
Спойлер
for (unsigned char i = 0; i < ds18b20_devices; i++){
write_byte(pgm_read_byte(&SEGMENTE[10])); // Выводим "-"
write_byte(pgm_read_byte(&SEGMENTE[i + 1])); // Выводим номер датчика
write_byte(pgm_read_byte(&SEGMENTE[10])); // Выводим "-"
_delay_ms(1000);
if (error_crc)
{
if (znak == 0)
{
write_byte(pgm_read_byte(&SEGMENTE[temperature % 10])); // Выводим 3 разряд
write_byte((pgm_read_byte(&SEGMENTE[temperature % 100 / 10])) | 0x80); // Выводим 2 разряд
write_byte(pgm_read_byte(&SEGMENTE[temperature % 1000 / 100])); // Выводим 1 разряд
}
if (znak == 1)
{
write_byte(pgm_read_byte(&SEGMENTE[temperature % 10])); // Выводим 3 разряд
write_byte((pgm_read_byte(&SEGMENTE[temperature % 100 / 10])) | 0x80); // Выводим 2 разряд
write_byte(pgm_read_byte(&SEGMENTE[10])); // Выводим 1 разряд
}
}
else
{
write_byte(pgm_read_byte(&SEGMENTE[10])); // Выводим "-"
write_byte(pgm_read_byte(&SEGMENTE[10]));// Выводим "-"
write_byte(pgm_read_byte(&SEGMENTE[10])); // Выводим "-"
}
_delay_ms(2000);
}
}
Не нравится то, что в основном цикле происходит "затык": 1 секунда на вывод номера датчика и 2 секунды для вывода температуры. А так как датчиков 4, то имеем "затык" - 12 секунд. Как правильно организовать вывод показаний, чтобы основной цикл был максимально коротким, а показания выводились в фоне, с выдержкой соответствующих задержек. Есть таймер с прерыванием, тикающий каждую 1 мс.
