0 / 0 / 0
Регистрация: 02.03.2016
Сообщений: 90
|
|||||||||||
1 | |||||||||||
Прерывания программ микроконтроллеров, создаваемых в Atmel Studio 6.002.03.2016, 18:50. Показов 7589. Ответов 47
Метки нет Все метки)
(
Я недавно начал осваивать микроконтроллеры и пока еще тока сумел освоить работу с портами ввода/вывода. Сейчас начал пытаться создать программы с использованием функций прерывания. Сначала я пробовал создавать программы используя программу CodeVisionAVR, а сейчас перешел на Atmel Studio 6.0 для проверки работы созданного проекта программы использую Proteus VSM. Когда я создал простую программу с использованием внешних прерываний в CodeVisionAVR то проверка в Proteus VSM дала положительный результат, а скопировав этот код (с небольшой корректировкой) в Atmel Studio 6.0 компиляция проходила без ошибок, а при проверке в Proteus VSM не было результата.
Код из CodeVisionAVR:
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
|
|
02.03.2016, 18:50 | |
Ответы с готовыми решениями:
47
Atmel Studio 6.1 прерывания Atmel Studio 7 AVR и прерывания по умолчанию Отладка программ созданных в Atmel Studio 6.0 Текущая стоимость микроконтроллеров atmel |
1961 / 1275 / 130
Регистрация: 04.01.2010
Сообщений: 4,607
|
||||||
02.03.2016, 21:57 | 2 | |||||
это потому что программы под avr написанные в CV AVR и Atmel Studio не совместимы.
1
|
0 / 0 / 0
Регистрация: 02.03.2016
Сообщений: 90
|
|
03.03.2016, 09:52 [ТС] | 3 |
Спасибо за ответ, возможно я действительно ошибся с символом логической операции, сейчас обязательно попробую это исправить.
Добавлено через 24 минуты Я извиняюсь, но после исправления логической операции И на |= проверка в Proteuse результата не дала, я уже не знаю где еще можно искать ошибку в программе, если тока это глюк самой Studio.
0
|
Модератор
![]() |
||||||
03.03.2016, 10:02 | 4 | |||||
А в результате таких действий
0
|
1961 / 1275 / 130
Регистрация: 04.01.2010
Сообщений: 4,607
|
||||||
03.03.2016, 10:05 | 5 | |||||
объявите переменную T как
Добавлено через 1 минуту не будут. Но ошибка там действительно есть. Потому что в момент выполнение по условия может сработать еще одно прерывание, которое снова "перевернет" флаг. В итоге получится двойное срабатывание события.
1
|
0 / 0 / 0
Регистрация: 02.03.2016
Сообщений: 90
|
|
03.03.2016, 11:10 [ТС] | 6 |
Вопрос Voland-у: во-первых уточните пожалуйста почему не подходит "int T;", а вы рекомендуете "unsigned char volatile T;", для Использование в будущем. А во вторых подскажите как вызвать отладчик в Proteuse (этот отладчик может быть тока на ассемблере или на Си его тоже можно включить), и как отследить вход в функцию прерывания. С протеусом я еще тоже тока начал знакомится поэтому знаю не все его возможности. А вход в функцию прерывания я пытался отследить в Studio в пошаговом режиме но этот режим становился неактивным после одного оборота цикла while(1) и я не мог определить заходит он в функцию прерывания или нет.
0
|
1961 / 1275 / 130
Регистрация: 04.01.2010
Сообщений: 4,607
|
|
03.03.2016, 11:18 | 7 |
ключевое здесь "volatile". Эта директива заставляет компилер использовать постоянное чтение/запись переменной в/из памяти. При использовании такой глобальной переменной в прерываниях это имеет архиважное значение, т.к. иначе (как раз как в вашем случае) обновление значения переменной в прерывании может не учитыватья в главном цикле main(). Что касается int vs char - у вас 8ми-битный контроллер в руках. Это значит, что любые операции с 16тибитным числом займут раза в 2-2,5 больше инструкций по сравнению с 8ми-битной. Мало того, у AVR есть побитовые инструкции работы и условий, поэтому, объявление "bit volatile T;" будет еще более предпочтительнее, т.к. линкер в потенциале может группировать подобные переменные в одну байтовую группу битовых(булевых) переменных.
я использовал брейпоинты в Протеусе и АСМ-овский дизассемблер. Это встроеннная в него функция. В момент запуска симуляци вы можете нажать на паузу и открыть код. Да, не идеально удобно, но возможно, тем не менее.
1
|
Модератор
![]() |
|||||||||||
03.03.2016, 11:32 | 8 | ||||||||||
grey-vsm, как вы контролируете выполнение прерывания? По переменной Т? Тогда ещё раз проверьте, чему будет равно значение Т после
Добавлено через 6 минут Плюс. После завершения обработки прерывания (в самом обработчике), нужно сбросить флаги прерываний (так для AtTiny2313):
1
|
0 / 0 / 0
Регистрация: 02.03.2016
Сообщений: 90
|
|
03.03.2016, 12:01 [ТС] | 9 |
Ну а как в Протеусе можно отследить значение переменной Т, и как там включать дизассемблер.
Добавлено через 5 минут А после завершения обработки прерывания флаги прерываний разве не сбрасываются автоматически при выходе из функции, или строчки сброса этих флагов при выходе обезательно нужно прописывать самому?
0
|
1961 / 1275 / 130
Регистрация: 04.01.2010
Сообщений: 4,607
|
|
03.03.2016, 12:27 | 10 |
ФедосеевПавел, слона-то я и не приметил )).
почитайте ДШ для своего чипа. Есть прерывания, которые надо сбрасывать вручную, либо другими способами, типа вычитки данных из какого-то регистра.
0
|
0 / 0 / 0
Регистрация: 02.03.2016
Сообщений: 90
|
|
03.03.2016, 14:19 [ТС] | 11 |
Поискав в файлах описания программы Proteus, я нашел описание режима отладки, там написано, что начать отладку можно нажав клавиши CTRL+F12, должны появиться два всплывающих окна, но у меня не появляется ни одного. Далее написано, если они не появляются их можно активировать из меню Debug, выбрать нужно CPU Source Code и CPU Registers. Но у меня в этом меню из этих двух пунктов есть тока CPU Registers, а другого нет, как же я тогда могу провести отладку программы если окно с исходным кодом программы не активируется.
0
|
1961 / 1275 / 130
Регистрация: 04.01.2010
Сообщений: 4,607
|
|
03.03.2016, 14:54 | 12 |
... я так вспоминаю, окна доступны из контекстного меню к МК в Протеусе в момент паузы эмуляции. В другие моменты окна не доступны.
0
|
0 / 0 / 0
Регистрация: 02.03.2016
Сообщений: 90
|
||||||
03.03.2016, 17:33 [ТС] | 13 | |||||
По поводу контроля значения переменной Т, я в текст программы в главную функцию main(), я решил записывать это значение в порт С.
0
|
0 / 0 / 0
Регистрация: 02.03.2016
Сообщений: 90
|
|
03.03.2016, 17:39 [ТС] | 14 |
Ни как не могу понять почему PortB не меняет своего состояния
0
|
Модератор
![]() |
|
03.03.2016, 17:47 | 15 |
Упёртый до смешного, grey-vsm. Я уже не буду третий раз подсказывать, почему не выполняется Т==1. Это ваша беда - неумение читать.
0
|
0 / 0 / 0
Регистрация: 02.03.2016
Сообщений: 90
|
|
03.03.2016, 18:16 [ТС] | 16 |
Я не упертый, а всего навсего использую свои знания языка программирования Си. А Т==1 у меня это условие выполнения оператора ветвления if(условное_выражение). Или в программе Studio условие записывается как то иначе?
0
|
Модератор
![]() |
||||||
03.03.2016, 18:32 | 17 | |||||
При T=0 после T=~T в переменной T будет 0xFF.
Что мешает написать
1
|
0 / 0 / 0
Регистрация: 02.03.2016
Сообщений: 90
|
|
03.03.2016, 18:45 [ТС] | 18 |
Спасибо такой вариант помог, но все-таки мне непонятно а чем не устраивал вариант Т==1, ведь это по правилам языка Си
0
|
Модератор
![]() |
|
03.03.2016, 18:55 | 19 |
После возникновения прерывания в переменной Т значение становилось равным то 0х00, то 0хFF, но никогда 0х01.
Хотя бы поэтому. И "добро пожаловать в С". В этом языке принято, что значение 0 - ложь, а не ноль - истина. Там ещё много чего, в том числе и ошибки вида if (T=1) - присваивание вместо сравнения. В общем "Хулиган Ритчи" в помощь (в смысле Керриган и Ритчи "Язык программирования С").
1
|
0 / 0 / 0
Регистрация: 02.03.2016
Сообщений: 90
|
|
03.03.2016, 19:07 [ТС] | 20 |
Ну вообще-то if (T=1) я бы и не написал, т.к. язык Си я начал изучать еще в институте, но только мы там с переменными в которые записываются двоичные и шеснадцатиричные числа не использовали поэтому с такими числами у меня нет опыта работы.
0
|
03.03.2016, 19:07 | |
Помогаю со студенческими работами здесь
20
Ассемблер для микроконтроллеров Atmel AVR Ищем инженера-программиста микроконтроллеров для Atmel 8-bit ARM Прерывания по таймеру на Arduino Due (Atmel SAM3X8E) Почему AVR Studio 4, а не Atmel Studio 6? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |