Часеги v.1.0 beta

Обсуждаем контроллеры компании Atmel.
Ответить
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1518
Зарегистрирован: Пт дек 28, 2012 21:56:46
Откуда: St. Petersburg

Сообщение blackx »

А надо не порт целиком а отдельные пины конфигурить. По умолчанию значения в DDRx и PORTx - нули. Тоесть, записывая 1 в нужные биты регистра и 0 в ненужные, по сути ненужные никак не затронутся. Ну и можно командами sbi, cbi вообще управлять отдельными битами.

Код: Выделить всё

sbi PORTD, PB2
или

Код: Выделить всё

ldi r16, 0b00000200
out PORTD, r16
или

Код: Выделить всё

PORTD |= (1 << PB2);
ЗЫ. Вообще в AVR если на пине включена альтернативная функция (не GPIO), то настройки в регистрах DDRx, PORTx вообще ни на что не влияют. Можно смело писать что угодно. Однако, тут необходимо быть осторожным, так как если сначала сконфигурить пины, а затем - периферию, которая использует эти пины, можно получить на какое-то время нежелательное состояние пинов между этими двумя событиями. В отдельных случаях это может быть фатально для выводов МК.
Изображение only pure true norwegian blackx Изображение
Реклама
Открыл глаза
Аватара пользователя
Сообщения: 52
Зарегистрирован: Пн май 27, 2013 17:02:32

Сообщение BlYur »

Ну, что, господа.
Дождался я посылочки с радиодеталями, собрал свою схему на макетке (+PinBoard 1.1), прошил, запустил и...
Стрелять-колотить!!! ЗАРАБОТАЛО!!! С полтычка запустилось, и семисегментники стали вещать в пространство время!
Индикация не мигает, не моргает, не мерцает, как предсказывали некоторые скептики.
Теперь я уверен, что мой код рабочий. Возможно, моя программа не идеально организована, однако же она работает!
А какая программа - есть хорошая программа? Правильно! Та, которая работает!
Убежал перепаивать на плату...
Реклама
Открыл глаза
Аватара пользователя
Сообщения: 52
Зарегистрирован: Пн май 27, 2013 17:02:32

Сообщение BlYur »

Вопрос по кнопкам:
В схеме для обработки четырёх кнопок на одном прерывании я использую диоды 1N4148, чтобы с их помощью отделить кнопки друг от друга.
Терзают сомнения относительно правильности выбора данного диода.
В даташите сказано, что у этого диода максимальное прямое напряжение 1В... контроллер питается от 5В...
Походу не подходят диоды?
Изображение
Друг Кота
Аватара пользователя
Сообщения: 6321
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

Явное непонимание вопроса. Максимальное прямое - это не допустимая граница U, а параметр самого диода : при заданном прямом токе у исправного будет U < 1В. если больше - в топку.
Если по такому критерию подбирать, вообще диодов не найдешь : диоды с Uпр > 1В вряд ли существуют. Мне не попадались. Разве что какой сверх-узко-специализированный. А если бы такой и нашелся ( к примеру, Uпр = 2В ) , то еще хуже : притянув вход через такой диод к земле, мы не получим уровень нуля :(


------------------------------------------------------
Ставим плюсы :)
Реклама
Эиком - электронные компоненты и радиодетали
Открыл глаза
Аватара пользователя
Сообщения: 52
Зарегистрирован: Пн май 27, 2013 17:02:32

Сообщение BlYur »

Ура!!! Ура!!! Ура!!!
Забилось сердце в недрах камня ATMega8!!!
Заработало в разработанном, собранном и запрограммированном впервые в жизни лично мной железе!
Вам, технарям, не понять радость гуманитария от созерцания результата созидания пресловутых часиков.
Но это была борьба. Борьба с пайкой платы, ассмо-быдлокодингом, ну и с самим собой, когда контроллер работал не так, как я хочу а так, как я ему написал.
Изображение Изображение Изображение Изображение

Пару слов о логике работы программы.
Для каждого из четырёх сегментов предусмотрен регистр с нужным значением (R16-R19). В основном цикле эти значения из каждого регистра преобразовываются в соответствующие значения для портов вывода, от есть для каждого сегмента по очереди рассчитывается и выводится циферка, в зависимости от значений R16-R19. А в прерываниях по TCNT2 и INT0 изменяются значения R16-R19.

Нужно решить теперь три момента:
1) Устранить дребезг контактов, хотя удаётся-таки поймать момент вручную. Пробовал задержку, вроде работает, но в момент нажатия все сегменты гаснут.
2) Разобраться со спящим режимом. Пробовал Power Save, но гаснут все сегменты, и камень не просыпается от прерываний.
3) Смоделировать для 3D-печати корпус что-ли? Или так оставить?..

Ну, и конечно же бекап для потомков:
7segATMega8.zip
(11.54 КБ) 164 скачивания
Реклама
Друг Кота
Аватара пользователя
Сообщения: 6321
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

BlYur писал(а): 1) Устранить дребезг контактов, хотя удаётся-таки поймать момент вручную. Пробовал задержку, вроде работает, но в момент нажатия все сегменты гаснут.
Простой способ отлавливания дребезга: в прерывании с тактом где-то 20мс опрашиваем кнопки. Если состояние совпало с предыдущим и это совпавшее состояние = НАЖАТО, фиксируем нажатие, иначе копируем новое состояние в предыдущее . При фиксации нажатия не бросаемся сломя голову его обрабатывать в прерывании, а устанавливаем флаг ИЗМЕНЕНИЕ СОСТОЯНИЯ КНОПОК и в основном цикле обрабатываем. И ничего гаснуть не будет .
Ну если прерывание - сложно, то м. быть сделать аппаратный антидребезг ? Цена вопроса - 1 корпус триггеров Шмитта .

Изображение
Вложения
TSh.JPG
(3.91 КБ) 1331 скачивание
Реклама
Открыл глаза
Аватара пользователя
Сообщения: 52
Зарегистрирован: Пн май 27, 2013 17:02:32

Сообщение BlYur »

Блин, спешат, как на пожар...
Интересно это софтверная или хардверная проблема?
Может ли таиться дьявол в отсутствии сглаживающих блокировочных конденсаторов по питанию? (по ним вопрос ниже)
И батарейку сильно жрут... Надобно разобраться с режимом энергосбережения. Или запитать от сети.

Кругом пишут, из прерываний нужно выходить, как можно быстрее, стараться не делать там расчётов, а лишь устанавливать флаги, а все расчёты производить в основном цикле... бла-бла-бла...
Но вот моя ситуация с часиками:
Все основные расчёты производятся как раз в прерываниях, в основном цикле крутится лишь только динамическая индикация.
Почему я так сделал?
Ну нахрена мне в основном цикле каждый раз производить расчёт, проверять флаги?
Ведь я же знаю, что пока не переполнится таймер (раз в полсекунды) или пока не выскочит внешнее прерывание от кнопки (ещё реже) результаты расчётов остаются неизменными, и нет никакого смысла производить их на каждом витке основного цикла.
Даже если свести всё просто к проверке флагов. Ну зачем каждый раз проверять "а не случилось ли?", ведь для этого же есть прерывания, которые без лишних отнимающих ресурсы команд однозначно скажут: "Случилось!"

А по поводу конденсаторов по питанию: если пошарить по интернетам, то видно, что керамический кондёр ставят на 100 нФ, а вот с электролитическим сложнее - некоторые ставят электролит на 47мкФ, на других сайтах советуют ставить 100-1000 мкФ. Где правда, Брат? (В чём сила, Брат?(С)
Почему выбраны кондёры именно этих номиналов? Это значит, что заранее известна паразитная частота (кстати, а сколько она в Герцах?), откуда она в моём случае возникает? Ведь у меня в схеме нет элементов, типа электродвигателей итд. Неужели внешняя наводка? Так она может быть какой угодно, а кондёры ставят с конкретными номиналами. Или может сам камень в ходе работы создаёт паразитные частоты?
Есть такие, кто не за#бался слушать мои вопросы? :)
Друг Кота
Аватара пользователя
Сообщения: 6321
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

BlYur писал(а): Все основные расчёты производятся как раз в прерываниях, в основном цикле крутится лишь только динамическая индикация.
Ну нахрена мне в основном цикле каждый раз производить расчёт, проверять флаги?
Это общепринятая практика для устройств любой сложности. Для простейшего дивайса типа часики можно не соблюдать и писать через опу - работать будет. Приучить себя таким макаром, и когда ( не дай бог :) ) дойдет до серьезного устройства, начнутся стенания : "У меня прерывания одно на другое лезут!"
Ну зачем каждый раз проверять "а не случилось ли?", ведь для этого же есть прерывания, которые без лишних отнимающих ресурсы команд однозначно скажут: "Случилось!"
Правильно. Прерывния выставили флаг, в основном цикле глянули на него - если не случилось - дальше поехали то ли дин. инд. крутить, то ли музыку играть, то ли кнопки слушать. Ах да, громадная трата ресурсов... Две машинных команды, пол-микросекунды потратить раз в секунду - охренеть !
... керамический кондёр ставят на 100 нФ, а вот с электролитическим сложнее - некоторые ставят электролит на 47мкФ, на других сайтах советуют ставить 100-1000 мкФ.
....
значит, что заранее известна паразитная частота
Никаких паразитных частот. Кондер предохраняет от коротких просадок по питанию, это ФНЧ по существу. Если БП хреновый, то и 1000 мкФ не спасут. Особенного фанатизма тут не надо - нормальный БП, правильная разводка, экранирование - если помеховая обстановка суровая.
Ответить

Вернуться в «AVR»