Теперь в нашем онлайн-магазине доступна уникальная книга «BEAM-робототехника. От азов до создания практических устройств», идеально подходящая как для кружков робототехники, так и для самообучения дома. Вы можете приобрести её по привлекательной цене в 699 рублей. Дополнительная информация о книге доступна на нашем сайте. Также в ассортименте нашего онлайн-магазина представлены готовые наборы для сборки роботов, с помощью которых ваш ребенок сможет легко собрать своего первого робота, следуя нашим подробным инструкциям. Перейти в магазин


[ Раскрыть online-чат / Закрыть ] · [ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 2 из 3
  • «
  • 1
  • 2
  • 3
  • »
Модератор форума: nightmare, Huntswarrior, Aleks_Crow  
Форум » Программирование микроконтроллеров AVR, PIC » Вопросы по програмированию » Прерывания и с чем их едят (*icon-1*)
Прерывания и с чем их едят
Отправлено 24.05.2011 - 23:0016
Начальная группа
1798 сообщений
Мужчина
Такую пепяку городить не надо, там хватит одного транзистора и резистор в базе от 1 кОм.
Какой по счету хз, всегда через AVR Studio прошиваю, там удобно, пощелкал по менюшкам и всё.


Профиль Личное сообщение Дом. страница icq Skype
38
Отправлено 24.05.2011 - 23:0517
Модераторы
211 сообщений
Мужчина
Если исходить из того что уже установлено..., то
1. транзистор Q1 неправильно подключен, через его базу течёт сейчас очень большой ток. Его база должна быть включена через резистор не менее 1кОм!
2. Почем ты используешь свою странную двухсекционную кнопку полностью? Тебе нужна только одна секция. Нет ни смысла ни логического обоснования, почему ты подключаешь нижнюю секцию кнопки к минусу источника питания и к одному из выводов по входу индикатора. Эту секцию вообще не нужно никуда подключать!
3.Программа твоя несколько странновата, и это ещё мягко сказано...

...Где прерывания INT0 ? На ноге 5 PORTB.2, тогда почему ты её конфигурировал на выход, непонято? Если это выход, тогда зачем включать здесь прерывания?
...Далее, кнопка включена на обычный вход..а почему бы её не подключить к выв.5. где включены прерывания?


Профиль Личное сообщение Дом. страница icq Skype
50
Отправлено 25.05.2011 - 08:4618
БЛОГГЕР
340 сообщений
Мужчина
1. Ключ на буржуйских запчастях будет стоять только в проекте. На практике возьму один КТ815А.
2. Кнопка мутант. Двух выводных кнопок без фиксации у нас нет (или просто надо обегать весь город). А с четырёх ногой кнопкой не нужен диод.
3. Если верить протеусу тут они от INT0 до INT10. Я взял INT0 на ноге PA0. Подтянул к минусу. Настроил на вход Ddra = &B01111111.
PB2 и PB3, один мне нужен для организации програмного UART, другой для включения/выключения индикатора на время прерывания.

На PB3 постоянно 1. Я подозреваю в этом встроенный подтягивающий резюк для Reset.
На PB2 постоянно 0. Почему, не знаю.


Профиль Личное сообщение Дом. страница icq Skype
16
Отправлено 25.05.2011 - 23:4919
Модераторы
211 сообщений
Мужчина
Верить нужно не протеусу, а datashits к микроконтроллеру с которым работаешь. Ты путаешь внешние прерывания по INT0 с прерываниями по PCINT. Все выводы микроконтроллера помеченные PCINT0-PCINT11, могут быть переназначены для вызова прерывания. Если с прерываниями по INT0 всё просто и так как описано выше, то для PCINT немного по другому. И прерывания будут назначаться по маске уже другим кодом.

Кстати, чтобы на выходе PORTB.3 была лог.1. Нужно чтобы в программе была запись PORTB.3=1 или SET PORTB.3.


Профиль Личное сообщение Дом. страница icq Skype
50
Отправлено 26.05.2011 - 21:2020
БЛОГГЕР
340 сообщений
Мужчина
Droid, от куда Вы всё знаете!?
Ближе к делу. Скрины из ДШ на ATtiny24:



Глава11. Внешние прерывания.
С моим слабеньким английским я понял что за INT0 отвечает MCU Control Register. Читаю ниже...



Глава11.2 Описание регистров.
Пробегаю глазками по теории и внимательно читаю таблицу 11-1. В ней указаны все необходимые значения.
Сходил к Гуглу. Он сказал что нужно написать "MCUCR = <восьмиразрядное двоичное число>

Набросал в BASCOM`е код:
Code
$regfile = "attiny24.dat"                    'юзаем ATtiny24
$crystal = 4000000                    'тактовая частота 4МГц
Mcucr = 00000011

Dim Simbol As Byte
Simbol = 1

Config Portb.2 = Input
Config Int0 = Rising
On Int0 Buttons
Enable Interrupts
Enable Int0

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 отправляется единица, сработает прерывание и отключится (на время проверки кнопок) индикатор. Из изображения видно что это не происходит.
Кто найдёт где я напортачил?


3609420.png (96.2 Kb) · 6593978.png (71.7 Kb) · 9222369.png (34.4 Kb)
Профиль Личное сообщение Дом. страница icq Skype
16
Администраторы
3417 сообщений
Мужчина
biggrin biggrin


Только дурак нуждается в порядке-гений господствует над хаосом...
Онлайн ЧАТ по робототехнике ! Заходи и общайся без регистрации =)
Профиль Личное сообщение Дом. страница icq Skype
34
Отправлено 26.05.2011 - 22:3322
Начальная группа
1798 сообщений
Мужчина
Число, записываемое в MCUCR немного по другому почему-то записано - без "&B".
Вообще, в Bascom AVR работа с регистрами вроде как "опущена".

ЗЫ:
В таком случае хорош Code Wizard, сгенерил код и всё работает B), не надо по даташиту лазить, вычитывать какой бит что делает. Хотя настраивать периферию по даташиту тоже надо уметь.


Профиль Личное сообщение Дом. страница icq Skype
38
Отправлено 26.05.2011 - 22:4123
Модераторы
211 сообщений
Мужчина
Проблема в этой строчке 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


Профиль Личное сообщение Дом. страница icq Skype
50
Отправлено 26.05.2011 - 23:0124
БЛОГГЕР
340 сообщений
Мужчина
Droid, Я ОТ ТЕБЯ ФАНАТЕЮ!!!
В коде добавил только GoTo (почему то на Call он заругался)
Code
$regfile = "attiny24.dat"                    'юзаем ATtiny24
$crystal = 4000000                    'тактовая частота 4МГц
Mcucr = &B00000011

Dim Simbol As Byte
Simbol = 1

Config Portb.2 = Input
Config Int0 = Rising
On Int0 Buttons
Enable Interrupts
Enable Int0

Do
Goto Indic
Loop

Buttons:
Porta.0 = 0
Return

Indic:
Ddra = &B11111111
Porta.0 = 1
Select Case Simbol
Case 0 : Porta = &B10000001
Case 1 : Porta = &B11110011
End Select


С предупреждениями в Proteus индикатор погас! Не всегда, и всего лишь на доли секунд, но он гаснет!
Счас подумаю над оптимизацией.


Профиль Личное сообщение Дом. страница icq Skype
16
Отправлено 26.05.2011 - 23:1425
Модераторы
211 сообщений
Мужчина
Попробуй вместо Goto вызов подпрограммы Gosub, тогда код будет таким

Code
14    Do
15    Gosub Indic 'вызов подпрограммы индикации
16 waitus 100 'задержка 100 микросекунд
17    Loop
18
19    Buttons:
20    Porta.0 = 0
21    Return
22
23    Indic:
24    Ddra = &B11111111
25    Porta.0 = 1
26    Select Case Simbol
27    Case 0 : Porta = &B10000001
28    Case 1 : Porta = &B11110011
29    End Select
30 Return 'выход из подпрограммы


Профиль Личное сообщение Дом. страница icq Skype
50
Отправлено 26.05.2011 - 23:3026
БЛОГГЕР
340 сообщений
Мужчина
Ещё +
Предупреждения из Proteus исчезли

Добавлено (26.05.2011, 23:30)
---------------------------------------------
Кстате и без Mcucr = 00000011 работает smile



Профиль Личное сообщение Дом. страница icq Skype
16
Отправлено 26.05.2011 - 23:3527
Модераторы
211 сообщений
Мужчина
Mcucr = 00000011 -эта запись здесь не нужна!


Профиль Личное сообщение Дом. страница icq Skype
50
Отправлено 26.05.2011 - 23:4228
БЛОГГЕР
340 сообщений
Мужчина
Quote (Droid)
Mcucr = 00000011 -эта запись здесь не нужна!

Quote (nightmare)
Вообще, в Bascom AVR работа с регистрами вроде как "опущена".

Droid, nightmare прав?
Ещё вопрос: програмный UART я смогу сделать на этом МК?


Профиль Личное сообщение Дом. страница icq Skype
16
Отправлено 27.05.2011 - 01:0429
Модераторы
211 сообщений
Мужчина
Bascom для AVR на сегодня уже довольно развитый язык программирования. Он многое может, кто бы что не говорил про него и также может работать с регистрами. В Bascom даже можно вставлять куски кода ассемблера. И программный UART тоже можно сделать.


Профиль Личное сообщение Дом. страница icq Skype
50
Отправлено 28.05.2011 - 23:5530
БЛОГГЕР
340 сообщений
Мужчина
Возник вопрос, под кодовым названием "залипание клавиш".
Вот возьмём мой всё тот же набор из семи кнопок. Он пока работает нормально. Нажимаешь кнопку -> пошло прерывание основной программы -> выполнился опрос нажатых клавишь и операции с преременными -> возвращение к основной программе.
Не смогу ли я загнать прерывание в перывание? Например зажав несколько кнопок.
Нужно ли отключать внешние прерывания в процедуре обработки прерываний?


Профиль Личное сообщение Дом. страница icq Skype
16
Форум » Программирование микроконтроллеров AVR, PIC » Вопросы по програмированию » Прерывания и с чем их едят (*icon-1*)
  • Страница 2 из 3
  • «
  • 1
  • 2
  • 3
  • »
Поиск: