|
Часы на AtMega8
| |
| Сообщение # 131
|
viktor0105
Постов: 67
ОК |
Тёмыч, только к вечеру добрался до компа. Да. Контролер, транзисторы и индикаторы на одной стороне. Индикаторы съёмные, стоять буду на кусках от цанговых панелей микросхем, транзисторы лягут на бочёк . Вопрос, что означают белые линии на: резисторе в в базе транзистора идущего на "А1" и на резисторе идущего на сегмент "е" индикатора градусов.
|
|
| Сообщение # 132
|
Тёмыч
Постов: 759
Друзья |
Цитата viktor0105 ( ) Вопрос, что означают белые линии на: резисторе в в базе транзистора идущего на "А1" и на резисторе идущего на сегмент "е" индикатора градусов.
viktor0105, на это не обращайте внимания, просто забыл убрать лишние связи когда проверил, а вот то что в квадратах надо соединить между собой дорожкой.
Цитата viktor0105 ( ) Контролер, транзисторы и индикаторы на одной стороне. Индикаторы съёмные, стоять буду на кусках от цанговых панелей микросхем, транзисторы лягут на бочёк .
ли ж бы влезло всё туда, под индикаторы...
|
|
| Сообщение # 133
|
msmmmm
Постов: 891
Друзья |
Тёмыч, импульсы исправил, теперь термометр... Библиотека слишком избыточна и забирает слишком много ресурсов. Ну и ошибки, куда же без них. return (*((int *) &__ds18b20_scratch_pad.temp_lsb) & ((int) bit_mask[resolution]))*0.0625; два инт-а, умножаются на флоат, в итоге по умолчанию получаем флоат. Дальше желаем чуда, а его нет: signed int t; - - - - - - - - t = ds18b20_temperature(0); Приведи явно к signed int, может помочь, а может и нет. Как компилятор пожелают. И еще. Зачем при каждом тушении или зажигании индикаторов писать неработающие команды? Вначале все потушены. Зажгли первый -> потушили только его -> зажгли следующий -> потушили только его и т.д. Может оптимизатор и удалит ненужные операции, а может и нет. Нужно дизассемблером смотреть, но лучше не создавать лишних проблем изначально.
Добавлено (18.03.2017, 22:44) ---------------------------------------------
Цитата Тёмыч ( ) протеус опять всякую хрень показывает Что ему рисуешь, то и показывает. Небось транзисторов натыкал? Протеус работает нормально с логическими уровнями, ему токи на выходах МК и индикаторов по барабану. Ставь вместо транзисторов логический примитив НЕТ и будет тебе счастье. И резисторы ставь только там, где подтяжка нужна. Для симуляции аналоговых сигналов есть другие программы.
Добавлено (18.03.2017, 23:47) --------------------------------------------- Тёмыч, Решил немного почитать программу - часы в протеусе так нормально и не идут. Сильно запутал сам себя. Зачем считать секунды отдельно, а двоеточие отсчитывать по ДИ? Уменьши делитель счетчика 2 с 128 до 64, получишь счетчик полусекунд, если 1- точки горят, нет - тушим. Больше 1 - инкрементируем единицы секунд. И быстрее и проще для понимания. В прерывании Сч2 только увеличиваем полусекунды. В главном цикле рассчитываем все цифири, переключаем ДИ, запускаем термометр и опрашиваем кнопки. В прерывании Сч0 только выбрасываем флаг - пора менять цифру, можно и без прерывания. Оператору case фигурные скобки не нужны - сильно загромождают программу, а смысловой нагрузки нет. Превратится в Разница огромная. А вообще, понимать, как работает чужая программа - проще и быстрее свою написать. Но не хочу наступать на горло твоей песне. Совет дам, пользоваться или нет - твое дело.
|
|
| Сообщение # 134
|
viktor0105
Постов: 67
ОК |
Тёмыч, вот поправил печать:
|
|
| Сообщение # 135
|
Тёмыч
Постов: 759
Друзья |
Цитата msmmmm ( ) Зачем при каждом тушении или зажигании индикаторов писать неработающие команды?
Цитата msmmmm ( ) Зачем считать секунды отдельно, а двоеточие отсчитывать по ДИ? Уменьши делитель счетчика 2 с 128 до 64, получишь счетчик полусекунд, если 1- точки горят, нет - тушим. Больше 1 - инкрементируем единицы секунд.
msmmmm, с этим всё понятно, сделал
Цитата msmmmm ( ) Ну и ошибки, куда же без них. return (*((int *) &__ds18b20_scratch_pad.temp_lsb) & ((int) bit_mask[resolution]))*0.0625; два инт-а, умножаются на флоат, в итоге по умолчанию получаем флоат. Дальше желаем чуда, а его нет: signed int t; - - - - - - - - t = ds18b20_temperature(0); Приведи явно к signed int,
А вот это не знаю как сделать , если не сложно напиши как должно быть.
Цитата msmmmm ( ) В прерывании Сч0 только выбрасываем флаг - пора менять цифру, можно и без прерывания.
На счёт флагов надо ещё почитать, не вникал пока ещё.
Цитата msmmmm ( ) Оператору case фигурные скобки не нужны - сильно загромождают программу, а смысловой нагрузки нет.
Это если после case всё влезает в одну строчку, а если идет целый блок, то скобки нужны, правильно понял?
|
|
| Сообщение # 136
|
msmmmm
Постов: 891
Друзья |
Цитата Тёмыч ( ) А вот это не знаю как сделать Не сложно, но ты там, похоже, покопался изрядно. return (int)((*((int *) &__ds18b20_scratch_pad.temp_lsb) & 0xFFF0)*0.0625); хотя лучше бы было сразу в signed char: return (signed char)((*((int *) &__ds18b20_scratch_pad.temp_lsb) & 0xFFF0)>>4); 0xFFF0 - это потому, что нас интересуют только единицы градусов. t объявить как signed char. Попробуй и так и так, второй вариант должен быть намного быстрее. delay_ms(conv_delay[resolution]); // задержка -----ничего считать не нужно, достаточно выдержать время больше 800 мс, тем более, что расчет уже кто-то закомментировал : delay_ms(1000); ------ быстродействие здесь не важно.Цитата Тёмыч ( ) На счёт флагов надо ещё почитать Флаги можно использовать аппаратные, если работать без прерываний, или любую переменную, например, как у тебя meny. В прерывании задал ей значение, а в основном цикле проверил и если надо обработал. Твоя программа (в последний вариант не вникал, пардон, цейтнот) в каждом цикле рассчитывала значения температуры и проверяла каждую цифру часов. Это лишнее. Часы рассчитывай после прерывания Сч2, температуру - после завершения преобразования. В промежутках используй готовые данные.
Цитата Тёмыч ( ) если после case всё влезает в одну строчку, а если идет целый блок, то скобки нужны, правильно понял? Нет, они ему вообще не нужны. Оператор switch работает как вычисляемый переход, а case - это просто метка, куда перейдет программный счетчик в случае совпадения аргумента switch. Если убрать все break, то выполнятся последовательно все команды от того места, куда послал switch до его закрывающей фигурной скобки. Применение фигурных скобок внутри case (объединяя несколько последовательных команд) сродни скобок в выражении a+(в*c) - вроде бы и результат не меняется, и толку никакого. С протеусом разобрался, заработало? Последний вариант, если успею, уже вечером посмотрю.
|
|
| Сообщение # 137
|
viktor0105
Постов: 67
ОК |
Тёмыч, в схеме будут изменения? Если нет, то я начну воплощать в железе.
|
|
| Сообщение # 138
|
Тёмыч
Постов: 759
Друзья |
viktor0105, по схеме всё нормально, проверьте ещё раз что бы плата соответствовала схеме и можете собирать, а с программой будем пока общими усилиями разбираться. Соберёте попробуйте последнюю прошивку которую я выкладывал.
|
|
| Сообщение # 139
|
viktor0105
Постов: 67
ОК |
Тёмыч, Добро.
Добавлено (22.03.2017, 12:56) --------------------------------------------- Тёмыч, Часы: стоят, коррекция до 60, как часы так и минуты, перепутаны десятки-единицы. не горит точка. Термометр: нет счёта высвечивается 00. Очень заметно мерцание индикаторов.
|
|
| Сообщение # 140
|
Тёмыч
Постов: 759
Друзья |
viktor0105, хорошо, сейчас пока маленько занят, чуть позже посмотрю.
|
|
Внимание! Форум переехал на Tehnodium.ru
|
|