ну, тогда и тинька13 справится - на тупых задержках пока формируется Т1, идет общение с DS18x20, а потом при помощи _delay_us формируется Т2 если на ассемблере писать, то и attiny9 хватит, пожалуй
Да и на сях хватит attiny10/9. ШИМ генерить - копейки кода. Считать с 1-Wire температуру знамо как, код влезает в тиньки эти. У меня в тини10 прекрасно влез код софтового I2C, опроса датчика освещенности и расстояния. На C.
В качестве ликбеза, приведите код и hex для tiny10/9. На входе данные, считанные из DS18B20 один раз в 10 секунд, на выходе ШИМ Т1+Т2 в формате TMP03/04.
Вот на очень скорую руку состряпал. Не проверял в работе и не планирую ,т.к. мне это не нужно. Код для DS18B20 взял с сети первый попавшийся. EDIT: Поправил код, отошел и вспомнил что забыл в одном месте канал ШИМа A на B сменить.
// Global temp temp_t temp; volatile uint16_t pwm_reg;
// сброс датчика uint8_t therm_reset() { uint8_t i; // опускаем ногу вниз на 480uS THERM_LOW(); THERM_OUTPUT_MODE(); _delay_us(480); // замените функцию задержки на свою // подымаем линию на 60uS THERM_INPUT_MODE(); _delay_us(60); // получаем значение на линии в период 480uS i = (THERM_PIN & (1 << THERM_DQ)); _delay_us(420); // возвращаем значение (0=OK, 1=датчик не найден) return i; }
// функция отправки бита void therm_write_bit(uint8_t bit) { // опускаем на 1uS THERM_LOW(); THERM_OUTPUT_MODE(); _delay_us(1); // если хотим отправить 1, поднимаем линию (если нет, оставляем как есть) if (bit) THERM_INPUT_MODE(); // ждем 60uS и поднимаем линию _delay_us(60); THERM_INPUT_MODE(); }
// чтение бита uint8_t therm_read_bit(void) { uint8_t bit = 0; // опускаем на 1uS THERM_LOW(); THERM_OUTPUT_MODE(); _delay_us(1); // поднимаем на 14uS THERM_INPUT_MODE(); _delay_us(14); // читаем состояние if (THERM_PIN & (1 << THERM_DQ)) bit = 1; // ждем 45 мкс и возвращаем значение _delay_us(45); return bit; }
// читаем байт uint8_t therm_read_byte(void) { uint8_t i = 8, n = 0; while (i--) { // сдвигаем в право на 1 и сохраняем следующее значение n >>= 1; n |= (therm_read_bit() << 7); } return n; }
// отправляем байт void therm_write_byte(uint8_t byte) { uint8_t i = 8; while (i--) { // отправляем бит и сдвигаем вправо на 1 therm_write_bit(byte & 1); byte >>= 1; } }
korob, у 13ой тиньки таймер 8-битный - неудобно. И само собой точность хуже будет. Написать можно, но куда сложнее. А под тиньку10 за счет 16-битного таймера всё аппаратно работает и просто. Тиньки 10ые даже в ЧиД по 50р есть, на Али еще дешевле. А для 2313 на прошлой странице уже на АСМе написали вариант. Я мельком глянул сейчас - почти аналог того, что для C написал для т10. Только у меня Phase & Freq correct PWM режим используется, а там Fast PWM. Там кстати тоже 16-битный таймер есть, вот и вся прелесть.
akl, правильно, нашли ошибки. Код для DS я как уже сказал нашел в сети и особо не глядел. Проглядел этот момент. Криво конечно, надо 2's нормально считать. PRR надо 0 в PRTIM0 записать, PRR = ~(1 << PRTIM0);
Дополнил измерением температуры. Проверил с имеющимся у меня датчиком DS18B20P с паразитным!!! питанием. Работа с датчиком по линии PB7 (подтяжка - внешний резистор 1,1к ), признак присутствия датчика - лог.1 на PB0. При отсутствии датчика формируется ШИМ соответствующий -100ºC. Выход ШИМ на PB4/OC1B. 15:10 Нашел ошибку. Заменил файлы. Ток потребления при 3,6V ~4мА. Во время преобразования возрастает до 5мА. Период преобразования порядка 6...9 секунд.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 19
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения