Теперь в нашем онлайн-магазине доступна уникальная книга «BEAM-робототехника. От азов до создания практических устройств», идеально подходящая как для кружков робототехники, так и для самообучения дома. Вы можете приобрести её по привлекательной цене в 699 рублей. Дополнительная информация о книге доступна на нашем сайте. Также в ассортименте нашего онлайн-магазина представлены готовые наборы для сборки роботов, с помощью которых ваш ребенок сможет легко собрать своего первого робота, следуя нашим подробным инструкциям. Перейти в магазин
Такую пепяку городить не надо, там хватит одного транзистора и резистор в базе от 1 кОм. Какой по счету хз, всегда через AVR Studio прошиваю, там удобно, пощелкал по менюшкам и всё.
Если исходить из того что уже установлено..., то 1. транзистор Q1 неправильно подключен, через его базу течёт сейчас очень большой ток. Его база должна быть включена через резистор не менее 1кОм! 2. Почем ты используешь свою странную двухсекционную кнопку полностью? Тебе нужна только одна секция. Нет ни смысла ни логического обоснования, почему ты подключаешь нижнюю секцию кнопки к минусу источника питания и к одному из выводов по входу индикатора. Эту секцию вообще не нужно никуда подключать! 3.Программа твоя несколько странновата, и это ещё мягко сказано...
...Где прерывания INT0 ? На ноге 5 PORTB.2, тогда почему ты её конфигурировал на выход, непонято? Если это выход, тогда зачем включать здесь прерывания? ...Далее, кнопка включена на обычный вход..а почему бы её не подключить к выв.5. где включены прерывания?
1. Ключ на буржуйских запчастях будет стоять только в проекте. На практике возьму один КТ815А. 2. Кнопка мутант. Двух выводных кнопок без фиксации у нас нет (или просто надо обегать весь город). А с четырёх ногой кнопкой не нужен диод. 3. Если верить протеусу тут они от INT0 до INT10. Я взял INT0 на ноге PA0. Подтянул к минусу. Настроил на вход Ddra = &B01111111. PB2 и PB3, один мне нужен для организации програмного UART, другой для включения/выключения индикатора на время прерывания.
На PB3 постоянно 1. Я подозреваю в этом встроенный подтягивающий резюк для Reset. На PB2 постоянно 0. Почему, не знаю.
Верить нужно не протеусу, а datashits к микроконтроллеру с которым работаешь. Ты путаешь внешние прерывания по INT0 с прерываниями по PCINT. Все выводы микроконтроллера помеченные PCINT0-PCINT11, могут быть переназначены для вызова прерывания. Если с прерываниями по INT0 всё просто и так как описано выше, то для PCINT немного по другому. И прерывания будут назначаться по маске уже другим кодом.
Кстати, чтобы на выходе PORTB.3 была лог.1. Нужно чтобы в программе была запись PORTB.3=1 или SET PORTB.3.
Droid, от куда Вы всё знаете!? Ближе к делу. Скрины из ДШ на ATtiny24:
Глава11. Внешние прерывания. С моим слабеньким английским я понял что за INT0 отвечает MCU Control Register. Читаю ниже...
Глава11.2 Описание регистров. Пробегаю глазками по теории и внимательно читаю таблицу 11-1. В ней указаны все необходимые значения. Сходил к Гуглу. Он сказал что нужно написать "MCUCR = <восьмиразрядное двоичное число>
Do Ddra = &B11111111 Porta.0 = 1 Select Case Simbol Case 0 : Porta = &B10000001 Case 1 : Porta = &B11110011 End Select Loop
Buttons: Porta.0 = 0 Return
Скрин из Proteus:
На скрине PB2 (он же и INT0) подтянут к земле. При нажатии кнопки на PB2 отправляется единица, сработает прерывание и отключится (на время проверки кнопок) индикатор. Из изображения видно что это не происходит. Кто найдёт где я напортачил?
Число, записываемое в MCUCR немного по другому почему-то записано - без "&B". Вообще, в Bascom AVR работа с регистрами вроде как "опущена".
ЗЫ: В таком случае хорош Code Wizard, сгенерил код и всё работает B), не надо по даташиту лазить, вычитывать какой бит что делает. Хотя настраивать периферию по даташиту тоже надо уметь.
Проблема в этой строчке Case 1 : Porta = &B11110011 у тебя младший бит PA0 (отсчёт справа налево) установлен 1. Это значит что на транзистор Q2 идёт постоянно открывающий положительный потенциал. Причём ты устанавливаешь этот бит в лог.1 бесконечном цикле основной программы, а по прерыванию лог.0 для него. Это не совсем корректная программа. А всё потому, что ты бинарным кодом &B11110011 устанавливаешь показания индикатора и одновременно управляешь транзисторами, ведь они на одном порте PORTA ! Выходов из ситуации несколько.. Первый -это нужно записать вывод символов на индикатор не бинарным кодом, а по-битно. PortA.1=1.. и т.д, тогда появиться возможность управлять отдельно транзисторами; Второй-нужно убрать из основного тела программы (между Do -Loop) эти строки Case 0 :Porta = &B10000001 Case 1 : Porta = &B11110011 и перенеси эти строки в подпрограмму рисования символов на индикаторе, которая будет находится за пределами Do-Loop
Indic: Ddra = &B11111111 Porta.0 = 1 Select Case Simbol Case 0 : Porta = &B10000001 Case 1 : Porta = &B11110011 End Select
С предупреждениями в Proteus индикатор погас! Не всегда, и всего лишь на доли секунд, но он гаснет! Счас подумаю над оптимизацией.
Последняя моя программа на VB6 была тетрис ("буря в стакане"). Она так и осталась незаконченной. Алгоритм падания блоков работал (на поле 6х32) плохо, очень, зато экран обновлялся раз в две секунды Быстрей просто код не позволял. Постараюсь с роботом так не сделать
Bascom для AVR на сегодня уже довольно развитый язык программирования. Он многое может, кто бы что не говорил про него и также может работать с регистрами. В Bascom даже можно вставлять куски кода ассемблера. И программный UART тоже можно сделать.
Возник вопрос, под кодовым названием "залипание клавиш". Вот возьмём мой всё тот же набор из семи кнопок. Он пока работает нормально. Нажимаешь кнопку -> пошло прерывание основной программы -> выполнился опрос нажатых клавишь и операции с преременными -> возвращение к основной программе. Не смогу ли я загнать прерывание в перывание? Например зажав несколько кнопок. Нужно ли отключать внешние прерывания в процедуре обработки прерываний?
Общайтесь с друзьями в нашем Online-чате по робототехнике
Мы рады, что в России открывается все больше кружков по робототехнике и мы стараемся прикладывать к этому свои усилия начиная с 2008 года :) Мы будем очень рады видеть в чате живое общение, обмен опытом между учащимися в робототехнике и просто увлеченными в этом направлении людей. Мы всегда онлайн, приходите, спрашивайте, помогайте другим - давайте сделаем Мир чуточку лучше!
Чтобы не потерять чат и быть всегда с нами на связи - откройте окно чата в новом окне браузера и добавьте его в заколадки. Открыть в новом окне