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


[ Раскрыть online-чат / Закрыть ] · [ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Модератор форума: nightmare, Huntswarrior, Aleks_Crow  
Форум » Программирование микроконтроллеров AVR, PIC » Вопросы по програмированию » Прерывания и с чем их едят (*icon-1*)
Прерывания и с чем их едят
Отправлено 14.05.2011 - 19:531
БЛОГГЕР
340 сообщений
Мужчина
В этой теме я (может не только я) буду задавать вопросы по прерываниям. Внешние и внутренние, таймеры и кнопки и т.п.
Начну...

1) Как научить МК внешним прерываниям? Что делать с Int0? Как подсоединить и настроить кнопку?
(на Bascom)



Профиль Личное сообщение Дом. страница icq Skype
16
Отправлено 14.05.2011 - 20:082
Модераторы
211 сообщений
Мужчина
Начнём с того что прерывания могут быть как аппаратные то есть строго "закреплены" за конкретными физическими ножками микроконтроллера так и программными. Для успешного освоения достаточно собрать простенькую схемку из не фиксируемой кнопки, светодиода и токоограничительного резистора.


Профиль Личное сообщение Дом. страница icq Skype
50
Отправлено 14.05.2011 - 20:333
БЛОГГЕР
340 сообщений
Мужчина
Droid, как раз такая схемка у меня и не получается sad


Профиль Личное сообщение Дом. страница icq Skype
16
Отправлено 14.05.2011 - 21:144
Модераторы
211 сообщений
Мужчина
Небольшое вступление... Микроконтроллеры серии ATmega8L рассчитаны на широкий диапазон питающих напряжений от 2,7 до 5,5 вольт. Поэтому для питания этого микроконтроллера достаточно двух "свежих" батареек 2х1,5В с суммарным напряжением 3 вольта! Не забывайте что напряжение превышающее верхний порог 5,5В испортит микроконтроллер!

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

Схема управления кнопкой проста. Необходимо соединить выводы строго по схеме и подключить светодиод для индикации срабатывания кнопки.

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

Добавлено (14.05.2011, 21:14)
---------------------------------------------
аппаратные прерывания организовать не сложно. Но нужно учесть что одной строчкой кода в BAscom они не вызываются.
Так для разрешения прерывания на ножке микроконтроллера необходимо:
-указать на какой потенциал должна произойти реакция (положительный или отрицательный);
-задать метку на которую будет переходить программа при возникновении прерывания;
-разрешить глобальные прерывания;
-разрешить прерывания на физической ножке микроконтроллера;

Только после соблюдения этих условий произойдёт программное прерывание!
Вот часть кода осуществляющего указанное выше..

Config Int0 = Falling 'разрешаем прерывания по спаду напряжения On Int0 Perekluch1
On Int0 Perekluch1 'задаём метку перехода по прерыванию
Enable Interrupts 'разрешаем глобальные прерывания
Enable Int0 'разрешаем прерывания на ножке int0

ВАЖНО! Прерывание-это остановка выполнения кода программы на очень короткое время. Во время прерывания происходит опрос указанного вывода сконфигурированого как вход. И переход на метку подпрограммы. Запомните код в подпрограмме должен быть минимальным. Потому что пока он обрабатывается программа стоит! Лучшим вариантом будет размещение там флагов меняющих своё состояние и не стоит размещать вычисления!

Далее будет приведена программа полностью и в уже скомпилированном HEX-коде.



1743301.jpg (126.4 Kb)
Профиль Личное сообщение Дом. страница icq Skype
50
Отправлено 14.05.2011 - 21:275
БЛОГГЕР
340 сообщений
Мужчина
Droid, это копипаст и сам писал?

------------------------------------------------------
Добавлено от Droid (14.05.2011, 21:44)
---------------------------------------------
Какой ещё копипаст angry Я тебе кто по твоему? И схему рисовал и программку при тебе делал, тем более, что ничего сложного тут нет. И запомни у меня ни когда не бывает копипаста, потому что я сам разработчик!



Профиль Личное сообщение Дом. страница icq Skype
16
Отправлено 14.05.2011 - 21:446
Модераторы
211 сообщений
Мужчина
Теперь программа полностью реализующая алгоритм работы кнопки.

$regfile = "m8def.dat" 'подключаем описание микроконтроллера
$crystal = 1000000 'устанавливаем частоту внутреннего генератора 1Mhz

Config Portc.5 = Output 'задаём конфигурацию порта PORTС.5 как выход
Config Pind.2 = Input 'задаём конфигурацию PIND.2 как вход

Config Int0 = Falling 'разрешаем прерывания по спаду напряжения On Int0 Perekluch1
On Int0 Perekluch1 'задаём метку перехода по прерыванию
Enable Interrupts 'разрешаем глобальные прерывания
Enable Int0 'разрешаем прерывания на ножке int0
Portd.2 = 1 'этой командой подключаем внутренний резистор на +

Do ' начало бесконечного цикла

Loop

'далее метка Perekluch1 перехода при возникновении прерывания

Perekluch1:

Toggle Portc.5 'инверсия логического уровня на ножке PORTC.5
Waitms 200 'небольшая задержка 200 миллисекунд защита от дребезга контактов кнопки
Return 'возврат из подпрограммы в точку где произошло прерывание

Добавлено (14.05.2011, 21:35)
---------------------------------------------
Здесь приведена скомпилированная программа, тоесть HEX-файл для программирования.
:1000000012C039C018951895189518951895189517
:100010001895189518951895189518951895189578
:100020001895189518958FE58DBFC0 E4E8E34E2E1E
:1000300084E08EBFD4E0F4E05F2EEEEFF3E0A0E6C4
:10004000B0E0A89584B7082E877F84BF88E1992700
:1000500081BD91BD88278D933197E9F7662 4A59AD4
:100060008A9885B78C7F826085BF78948BB78064CF
:100070008BBF929AFFCF0F921F922F923F924F9277
:100080005F927F92AF92BF920F931F932F933F93 F4
:100090004F935F936F937F938F939F93AF93BF9390
:1000A000CF93DF93EF93FF938FB78F9385B390E256
:1000B000892785BB88EC90E025D08F918FBFFF9179
: 1000C000EF91DF91CF91BF91AF919F918F917F91F0
:1000D0006F915F914F913F912F911F910F91BF9021
:1000E000AF907F905F904F903F902F901F900F9018
:1000F 00018953197F1F70895689462F80895E89497
:1001000062F80895EF93FF93EE27E82BE92B31F087
:10011000EAEFF0E03197F1F70197D1F7FF91EF9116
:0201200008 9540
:00000001FF



Профиль Личное сообщение Дом. страница icq Skype
50
Отправлено 14.05.2011 - 22:017
БЛОГГЕР
340 сообщений
Мужчина
КРУТО! Работает! biggrin

Droid, осталось только сесть, понять и как зачётную работу создать програму лайнтрэйсера.

Добавлено (14.05.2011, 22:01)
---------------------------------------------
Во, появились вопросы!
1) Внешние прерывания можно делать с ногами Int0 и Int1??? т.е. они всегда должны учавствовать в действиях кнопки как напр тут:

Тут Int0 подкл через диоды. Прерывание наступает при поступлении сигнала на PD2, а затем проверяется состояние порта B. Так всегда небходимо делать?



8427988.png (10.6 Kb)
Профиль Личное сообщение Дом. страница icq Skype
16
Отправлено 14.05.2011 - 22:268
Начальная группа
1798 сообщений
Мужчина
Для лайнтрейсера прерывания не нужны.


Профиль Личное сообщение Дом. страница icq Skype
38
Отправлено 14.05.2011 - 22:309
Модераторы
211 сообщений
Мужчина
Для микроконтроллера Atmega8 на аппаратное прерывание выделены только две ножки ,выв.4 и выв.5 (int0,int1 соответственно). И мы можем подключить на каждую из ножек по кнопке.
У микроконтроллера семейства Tiny 2313 (на схеме старая модель AT90S2313) ножек для организации прерываний больше. Кроме того они имеют особенность их можно назначать программно! Маркируются они как PCINT0...PCINT7, то есть всего восемь ножек. Обрати внимание на схему, тот кто разрабатывал эту схему не знал об этом и поэтому использовал стандартное прерывание по INT0. А для того чтобы зафиксировать факт нажатия кнопок клавиатуры просто соединил их диодами. На какой сигнал реагирует прерывание в этой схеме? Очень просто на перепад с положительного на отрицательный. Он подключил к плюсу питания ножку прерываний через резистор 10кОм, хотя мог и обойтись программным подключением внутреннего резистора.
На вторые выводы кнопок клавиатуры поступает "бегущий" сигнал лог.0 (бегущий минус) с портов PB4-PB7.
И теперь отвечаю на твой последний вопрос.. Да прерывание наступает при поступлении минуса через диод от нажатия любой кнопки клавиатуры на int0. А подключить клавиатуру можно или так как показано на схеме или используя программное переназначение ножек для Attiny2313.
Вообще схемы включения кнопок могут быть разными всё зависит от поставленных задач и типа микроконтроллера.


Профиль Личное сообщение Дом. страница icq Skype
50
Отправлено 15.05.2011 - 19:5310
БЛОГГЕР
340 сообщений
Мужчина
nightmare, мы (я и мега) будем расти и развиваться! А прерывания у меня были как заноза в попе, ну не получалось. Не сегодня, так завтра этот материал пригодится happy

Добавлено (15.05.2011, 19:53)
---------------------------------------------
В железе ни чего не выходит. Программа залита а МК молчит.



Профиль Личное сообщение Дом. страница icq Skype
16
Отправлено 15.05.2011 - 20:1411
Начальная группа
1798 сообщений
Мужчина
В тексте прошивки пробел после двоеточия в 8-ой строке снизу не влияет никак?


Профиль Личное сообщение Дом. страница icq Skype
38
Отправлено 15.05.2011 - 20:2212
БЛОГГЕР
340 сообщений
Мужчина
nightmare, не знаю, я сам компилил с исходного кода...


Профиль Личное сообщение Дом. страница icq Skype
16
Отправлено 24.05.2011 - 20:4913
БЛОГГЕР
340 сообщений
Мужчина
"Сам удивляюсь своей косячности"

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



Сам код:
Code
$regfile = "attiny24.dat"                    'юзаем ATtiny24
$crystal = 4000000                    'тактовая частота 4МГц

Config Portb.2 = Output
Portb.2 = 1
Dim Simbol As Byte
Simbol = 1

Config Int0 = Rising
On Int0 Buttons

Enable Interrupts
Enable Int0

Do                    'бесконечный цикл, кот будет выводить цифру
Ddra = &B01111111
Portb.2 = 1
Select Case Simbol
Case 0 : Porta = &B10000000
Case 1 : Porta = &B11110010
End Select
Loop

Buttons:
Portb.2 = 0
'сдесь будут лежать вычисления и операции
Return


Получаем в итоге: при старте срабатывает прерывание настрроенное на 1, на пине подтянотому к земле.
Может я что не так сделал, наставте меня на путь истинный biggrin

P.S. Исходные проекты не секретные, если надо выложу


3677084.png (104.3 Kb)
Профиль Личное сообщение Дом. страница icq Skype
16
Отправлено 24.05.2011 - 21:1414
Начальная группа
1798 сообщений
Мужчина
А зачем такая пепяка из транзисторов? Там же одного транзистора хватит.
На CKOUT, емнип, выход тактовой частоты, если он включен по фьюзах, то отключить бы его.


Профиль Личное сообщение Дом. страница icq Skype
38
Отправлено 24.05.2011 - 22:5715
БЛОГГЕР
340 сообщений
Мужчина
Quote (nightmare)
А зачем такая пепяка из транзисторов?

Всё из-за Протеуса, в нём нет наших транзисторов из которых мне не составило бы труда сделать ключ. Пришлось выкручиваться. Доступно только для пользователей нашёл решение.

С фьюзами делов не имел. Знаю только что пишем "$prog" и шеснадцатиричные числа через запятую.
nightmare, не подскажешь какой CKOUT по счёту?


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