я тут в некоторой прострации... попал на нечто, к чему никак не был готов, и пока не понимаю, куда копать...
итак, в небольшом проекте решил применить чарлиплексинг для управления линейной шкалой из 48 светодиодов, схема ниже. написал программку тестовую, исходник в спойлере. Спойлер#include <avr/io.h> #include <stdbool.h> #include "avr_helper.h"
казалось бы, ничего сложного, поведение прогнозируется элементарное: шкала нарастает и спадает с некоторой скоростью, определяемой значением DELAY, а частота обновления шкалы (динамическое обновление) зависит от значения, которое помечено комментарием "ЗАГАДОЧНОЕ ЧИСЛО".
а загадочное оно потому, что при изменении его с шагом в 10 в любую сторону (я другие варианты просто не пробовал, т.к. и без того странно) можно получать следующее поведение: - шкала не светится вообще - на шкале мерцает (примерно герц 10-15) только первый светодиод - шкала работает отлично, как задумано - на шкале не просвечиваются светодиоды, включенные катодами к линии LED6 (см. схему) - на шкале не просвечиваются светодиоды, подключенные к LED6.
хотя, как я предполагал, изменение этой константы меняет только частоты динамического чарлиплексинга и может повлиять только на степень мерцания светодиодов...
такая вот загадка. может, я чего-то очевидного не замечаю?
Чисто на основе интуиции. Имеет место быть интерференция исполняемого кода и "загадочной" задержки. То есть причина в том, что диапазон изменения задержек находится целиком в зоне интерференции. Его нужно увеличивать минимум на десятичный порядок.
чип - atmega328p, купленный недорого на Алиэкспресе. довольно много раз покупал и на проблемы не наталкивался, если не считать общей для всех проблемой несоответствие фьюзов правильным заводским настройкам.
а теперь, после долгих экспериментов, я выяснил, что регистр TCCR0A не работает, как должен по документации: биты старшей тетрады этого регистра пишутся и читаются, но на результат (т.е. на момент прерывания) влияет только бит 5 (т.е. маска 0x20), причем влияет как раз так, что не работает линия LED6; биты 2 и 3 младшей тетрады (маска 0x0C) не пишутся, читаются всегда нулями, соответственно и результат работы таймера странный остальные 2 бита и пишутся, и читаются, но результат работы таймера странный: если младший бит = 1, то прерывание по совпадению возникает в момент, когда у нормального таймера TCCR0A=255 или близкое к тому, т.е. поздно, а если младший бит =0, то прерывание возникает рано. такие вот пироги, товарищи...
будьте осторожны с алиэкспрессом.
P.S. в принципе, для моего проекта это не критично, т.к. подобрать значение регистра для минимальной и максимальной яркости шкалы можно, хотя, конечно, хотелось регулировать яркость более-менее плавно... главное, чтобы других багов не нашлось.
P.P.S. чисто теоретически я допускаю, что при пайке феном я чип перегрел... но это представляется маловероятным... хотя кто скажет наверняка?
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Наверняка скажет только заливка кода в другие 328р, купленные не на Али, и, желательно, гарантированно подлинные.
А то я лет 20 назад неделю просидел с непоняткой в своей программе, будучи уверенным, что нашёл баг в компиляторе Delphi. Уже думал разработчикам писать. Но через неделю пришло просветление, и оказалось, что компиляторы не ошибаются. Единственное, компилятор не китайцы ваяли, конечно.
_________________ Платы для HLDI - установки лазерной засветки фоторезиста. ФоторезистыOrdyl Alpha 350 и AM 140. Жидкое олово для лужения плат (видео) - самое лучшее и только у меня. Паяльная маска XV501T-4 и KSM-S6189 (5 цветов). Заказ печатных плат - pcbsmac@gmail.com
А то я лет 20 назад неделю просидел с непоняткой в своей программе, будучи уверенным, что нашёл баг в компиляторе Delphi
ну, как бы если я вывожу два числа (одно то, которое записал в регистр, а другое, которое считал из регистра после записи), и эти два числа разные, грешить на программу было бы странно...
shonty писал(а):
Макетка.. DIP-ка.. ZIF-ка..
во-первых, я уже много лет DIP стараюсь не применять, кроме как именно макетирование на единственном чипе в DIP-корпусе во-вторых, макетирование на одном чипе а изготовление на другом, как выяснилось, более не гарантирует результат...
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
во-вторых, макетирование на одном чипе а изготовление на другом, как выяснилось, более не гарантирует результат..
вот тут имею возразить)) макетирование на исправном чипе, также даст положительный результат на другом исправном чипе)) иначе - бесконечные исследования "случайных" чипов))
и макетирование на неизвестном чипе, может вообще не превести ни к какому результату))
Последний раз редактировалось shonty Вс авг 25, 2024 12:44:46, всего редактировалось 2 раз(а).
во-первых, я уже много лет DIP стараюсь не применять, кроме как именно макетирование на единственном чипе в DIP-корпусе во-вторых, макетирование на одном чипе а изготовление на другом, как выяснилось, более не гарантирует результат...
Как то закручено всё. А можно членораздельнее? Ибо не понятно. Для особо одарённых.)
ну... у меня есть единственная atmega328p в DIP-корпусе... я её только для макетирования и применяю. а в проектах, для которых разрабатываю платы, применяю TQFP32 корпуса (еще купил на пробу QFN, но пока не применял).
макетировать в TQFP32 смысла нет, т.к. панельки дорогие, да и нету у меня, а для QFN и панелек-то не существует. с учетом этой темы, результат макетирования в DIP-е не гарантия того, что в другом корпусе заработает, т.к. другой корпус может быть с сюрпризом.
а что касается грубых ошибок, из-за которых вообще не заработает, то я таких не допускаю, т.к. даже перед макетированием всё в протеусе отлаживаю.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
1. Контрафактные МК могут попасться. 2. Есть ревизии разных годов. Нужно смотреть Errata. 3. Разница по корпусам бывает (DIP SOIC). Нужно уточнять в даташитах.
Вот и мне посчастливилось столкнуться с подобным viewtopic.php?f=57&t=5931&p=4620636#p4620636 Написано под один чип, а на 2-х других не желает работать.. правда "аналог" - LGT8f328p Благо что всё на разъёмах, а проект штучный, для домашней лаборатории.
shonty, это просто бракованный чип. С купленным на Али, такое не редкость.
_________________ Платы для HLDI - установки лазерной засветки фоторезиста. ФоторезистыOrdyl Alpha 350 и AM 140. Жидкое олово для лужения плат (видео) - самое лучшее и только у меня. Паяльная маска XV501T-4 и KSM-S6189 (5 цветов). Заказ печатных плат - pcbsmac@gmail.com
А 16-битный таймер работает. Пришлось всё навесить на него, теперь и яркость регулируется, и прочее работает.
Добавлено after 4 hours 18 minutes 23 seconds: кстати, вот что вышло в итоге: шкальный термометр
измеряет в пределах того, что позволяет DS18B20, отображает на шкале от -10°С до +99°С, 48 точек на шкале, каждая точка - 1°, "деления" шкалы автоматически передвигаются так, чтобы текущее значение уместилось на шкале (т.е. на фото шкала 0 - 40, температура 31 но если бы температура была, например, 46, то шкала стала бы 10 - 50). опционально в нижнем "делении" может отображаться истинное значение температуры. так же опционально можно выводить температуру "нормальным способом", т.е. обычными символами (3 варианта), но в этом случае положение должно быть горизонтальным и шкала не отображается. 15 уровней яркости. управление режимами одной кнопкой.
есть лишних 4 платы, могу укомплектовать индикаторами (дешевле рынка, но все равно они очень дорогие, погуглите HCMS-2915). если кому нужно - пишите в ЛС.
Добавлено after 7 minutes 56 seconds: чарлиплексинг, скажу я вам, довольно противная штука - частота динамической индикации получается высокая, малейшая задержка прерывания индикации неизбежно ведет к изменению яркости одного или нескольких светодиодов... довольно долго ковырялся с тем, чтобы совместить все в коде - работу по 1-wire, где крайне необходимо в некоторые моменты запрещать прерывания на время до 70 микросекунд (примерно), и различные задачи, связанные с некритичным отсчетом времени - период опроса датчика, дребезг кнопки и т.п.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 67
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения