Схему придется нарисовать. А на счет запрещения прерываний - обнаружился мелкий глюк - при опросе 1307 едва заметно блымает одна из цифр - запрещение нарушает развертку. Не соображу, как это побороть. Может, частоту развертки повысить? Сейчас около 200Гц.
У Вас термодатчик по I2C подключен, что ли? Шина I2C синхронная, поэтому на время работы с ней прерывания можно не выключать, в отличие от асинхронной 1Wire, чувствительной к таймингам сигналов.
_________________ Этот пост оказался полезен? Не поленись, нажми слева! Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.
А на счет запрещения прерываний - обнаружился мелкий глюк - при опросе 1307 едва заметно блымает одна из цифр - запрещение нарушает развертку. Не соображу, как это побороть. Может, частоту развертки повысить? Сейчас около 200Гц.
Это не поможет, при запрещении прерываний неизбежен срыв динамической индикации особенно заметен при различных эфектах смены цифр. Да и вообще запрещать прерывания плохая затея советую посмотреть в сторону подключения ds18b20 через uart, я так делаю ничего не запрещаю и проблем нет.
Вы все равно собирались выкладывать исходники. Чтоб не гадать как у Вас все сделано. Блымает скорее опрос 18b20, если вы конечно не запретили прерывания и при опросе 1307. Обычно,я прячу опрос датчика в задержку между включением следующей цифры,когда все лампы потушены. 200 тиков таймера идёт индикация 50 задержка. Частота ~122Гц.
_________________ У того, кто делает — получается редко. У того, кто не делает — не получается никогда.
В 1-wire критичен только тайм-слот. Который длится всего 120 мкс максимум. Вот на именно это время и следует запрещать прерывания. Все остальное время задержки совершенно не критичны.
А еще тайм-слоты можно делать аппаратно. Используя, например, таймер с compare-capture регистрами, UART-ом или, даже, SPI. Тогда вообще никаких задержек не будет.
_________________ А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Схему придется нарисовать. А на счет запрещения прерываний - обнаружился мелкий глюк - при опросе 1307 едва заметно блымает одна из цифр - запрещение нарушает развертку. Не соображу, как это побороть. Может, частоту развертки повысить? Сейчас около 200Гц.
Точно такая же фигня. Думаю даже от динамической индикации отказаться.
Я запретил прерывания и при опросе 1307. Наверное, придется разрешить. 18В20 подключен по I2c, по крайней мере, библиотека так называется, но после запрета прерываний, глюки с неправильными данными прошли.
А что мешает использовать любой другой датчик ? Вам же не цыплят выращивать, по мне, так и аналоговый (с заводской калибровкой) вполне подойдет. LM35, напр.
Блымание при опросе 18В20, в принципе, не проблема, т. к. опрос происходит только по нажатию кнопки или раз в 2 минуты в режиме с индикацией температуры. Спойлер
Код:
// Инициализирую DS18B20 void DS18B20_init (void) { if ((DS18B20_PIN & (1 << DS18B20)) == 0) ds18b20_err++; // Проверяю КЗ линии данных DS18B20_PORT &= ~(1 << DS18B20); // Устанавливаю низкий уровень DS18B20_DDR |= (1 << DS18B20); _delay_us(490); DS18B20_DDR &= ~(1 << DS18B20); _delay_us(68); if ((DS18B20_PIN & (1 << DS18B20)) > 0) ds18b20_err++; // Ловлю импульс присутствия датчика // Если датчик не подключен, Presense_errors увеличиваю на 1 _delay_us(422); }
// Функция чтения байта из DS18B20 uint8_t DS18B20_read (void) { uint8_t dat = 0; for (uint8_t i=0; i<8; i++) { DS18B20_DDR |= (1 << DS18B20); _delay_us(2); DS18B20_DDR &= ~(1 << DS18B20); _delay_us(4); dat = dat >> 1; if (DS18B20_PIN & (1 << DS18B20)) { dat |= 0x80; } _delay_us(62); } return dat; }
// Функция чтения "блокнота" из DS18B20 void DS18B20_read_scratchpad (void) { for (uint8_t i=0; i<9; i++) // Считываю 9 байт данных, или так называемый "блокнот" { DS_scratchpad[i] = DS18B20_read(); } }
// Функция записи байта в DS18B20 void DS18B20_write (uint8_t dat) { for (uint8_t i=0; i<8; i++) { DS18B20_DDR |= (1 << DS18B20); _delay_us(2); if (dat & 0x01) { DS18B20_DDR &= ~(1 << DS18B20); } else { DS18B20_DDR |= (1 << DS18B20); } dat = dat >> 1; _delay_us(62); DS18B20_DDR &= ~(1 << DS18B20); _delay_us(2); } }
///////// int curr_temp() { cli(); DS18B20_init(); // Инициализирую DS18B20 DS18B20_write(0xCC); // Пропускаю проверку серийного номера DS18B20 DS18B20_write(0x44); // Запускаю температурное преобразование sei(); _delay_ms(500); // Жду окончания температурного преобразования cli(); DS18B20_init(); // Инициализирую DS18B20 DS18B20_write(0xCC); // Пропускаю проверку серийного номера DS18B20 DS18B20_write(0xBE); // Команда на чтение содержимого ОЗУ DS18B20_read_scratchpad(); // Считываю "блокнот" sei();
Temperature=((DS_scratchpad[1]<<8)+DS_scratchpad[0])/1.60; if (Temperature < 0) { Temperature =-Temperature; // Перевожу отрицательное число в положительное szero=1; } else // Положительная температура { szero=0; } return Temperature; }
#define I2C_SDA_PORT_DIR DDRD //порт направления #define I2C_SCL_PORT_DIR DDRB //порт направления #define I2C_SDA_PORT PORTD //порт выхода #define I2C_SCL_PORT PORTB //порт выхода
Ндя... в плане портабельности - это хорошо, можно и на attiny запустить, но в меге есть аппаратный i2c всё сильно бы упростилось и кода меньше. Ну да ладно... Выше Вам правильно сказали, строго выдерживать тайминги i2c нет необходимости, потому что шина синхронная, прерывания можно не запрещать и нічого не буде блимати.
Всем привет Народ, может есть у кого чертеж отверстия для лицевой панели корпуса под ИН-17? А то не представляю, как измерить изгиб на торцах лампы чтобы корпус правильно нарисовать.
_________________ Опыт растет прямо пропорционально выведенному из строя оборудованию...
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 240
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения