|
Помогите разобраться с средой разработки для AVR
| |
| Чт, 17.01.2019, 18:52 | Сообщение # 1
|
gorvinyk
Постов: 5
ОК |
Всем привет, читаю самоучитель по программированию AVR на ассемблере. Файл с текстом программы прикрепил. Хочу пошагово выполнить программу в симуляторе. В программе мы должны зависнуть в бесконечном цикле до возникновения прерывания по INT0. Изменения значения регистров я отслеживаю добавляя их в окно Watch Имею следующие проблемы: 1. При работе в AVR Studio4 в подпрограмме Int0: , командой out gifr,temp в переменную gifr записывается значение 63 , хотя при этом в temp было значение 255, Как-так??? Если дальше выполнять, то команда sbr flag,0 не устанавливает бит 0 в регистре flag...
2. Поставил Atmel Studio7 загнал туда тот же текст и имею другие проблемы: Регистр timsk имеет значение 57 при выполнении команды out timsk,temp его значение не меняется , при этом в temp находилось значение 1 и изменить значение этого регистра в окне Watch не получается.
3. Загнал тот же текст в MPLAB X IDE 5.10 выполняются все команды до метки Cykle: в нём мы будем висеть до безконечности пока не произойдёт прерывание по INT0. меняю состояние INT0 в окне I/O pins и прерывание не происходит. Попробовал открыть меню Window/simulator/stimulus, ничего не открылось. Кто что может посоветовать? И может кто подскажет почему в MPLAB X в окно Watches не получается добавить регистр прописывая его имя, если я пишу temp, ничего не добавляется, если пишу r16 он добавляется и отображаются данные этого регистра, можно написать его адрес 0x10, тоже всё ок, но работать так не удобно?
|
|
| Чт, 17.01.2019, 23:03 | Сообщение # 2
|
msmmmm
Постов: 891
Друзья |
Цитата gorvinyk ( ) Поставил Atmel Studio7 загнал туда тот же текст и имею другие проблемы: Регистр timsk имеет значение 57 при выполнении команды out timsk,temp его значение не меняется ...... gorvinyk, не там смотришь: Watch - это для наблюдения за переменными, а timsk - это объявленная в хидере константа (адрес регистра ввода/вывода), тип dword. За регистрами ввода/вывода наблюдай во вкладке "I/O". Все там меняется.
|
|
| Вс, 20.01.2019, 01:10 | Сообщение # 3
|
gorvinyk
Постов: 5
ОК |
Спасибо, но помогло не сильно. Теперь смотрю в "I/O". 1. В avrstudio4 имеем следующее: Проходит весь блок от метки Start: до Cykle: без проблем, меняю уровень на pd2. Перехожу по прерыванию к метке Int0: , командой out gifr,temp в рег. gifr записывается число 63, хотя в temp находится значение 255. У gifr рабочие только два самые старшие биты, остальные, я так понимаю должны читаться как единица. До выполнения записи значение gifr равнялось 0(точнее два самых старших бита пустые, а остальные вроде как полные, но неактивные,менять значения нельзя.)после записи значение ровняется 63 хотя биты не изменились. Почему 63 а ни 255? Почему биты не изменились? Ну и команда sbr flag,0 не меняет содержимое рег. flag. Не меняется его значение и в окне memory раздел register. А с atmelstudio7 такая - же картина как и с mplab, не срабатывает прерывание при изменении уровня на pd2. Что может быть не так?
|
|
| Вс, 20.01.2019, 15:47 | Сообщение # 4
|
msmmmm
Постов: 891
Друзья |
Цитата gorvinyk ( ) с atmelstudio7 такая - же картина как и с mplab, не срабатывает прерывание при изменении уровня на pd2. Что может быть не так? Да, действительно, переход на обработчики прерываний в пошаговом режиме по умолчанию отключен (если пользоваться точками останова и run-ом, то все работает). Фикс: debug -> options -> tools -> Mask interrups while stepping -> FALSE
Цитата gorvinyk ( ) gifr записывается число 63, хотя в temp находится значение 255. А переведи 63 из десятичной системы в двоичную . И переключи индикацию данных в шестнадцатеричный режим (правой кнопкой) - меньше путаницы будет.
Цитата gorvinyk ( ) Ну и команда sbr flag,0 не меняет содержимое рег. flag. Не меняется его значение и в окне memory раздел register. Невнимательно прочитал описание команды. Смотри во вложении.
|
|
| Вс, 20.01.2019, 20:30 | Сообщение # 5
|
gorvinyk
Постов: 5
ОК |
Цитата msmmmm ( ) А переведи 63 из десятичной системы в двоичную Да, это будет равно 3F ,т.е. шесть младших битов единицы, но команда должна была записить в рег. число 255, т.е и два самых старших бита установить в 1 или я что-то не понял? За файлик спасибо! А на русском такого же нет? Или, даже, чего нибудь более подробного, с подробнейшим описанием каждой команды. А по atmelstudio7 нет ли чего - нибудь в роде руководства пользователя (на русском)? И по mplabX не подскажешь? Там тоже не происходят прерывания в пошаговом режиме и с окном watches не могу разобраться, если добавляю имя переменной, то ничего не добавляется, напр. добавляю temp - ничего не происходит, добавляю r16, или адрес 0x10 всё добавляется, но так - же невозможно работать. Хотел уже отправлять, но поклацал в симуляторах и непоняток стало больше: 1.Правильнее всего происходит в mplabX, поставил вместо rjmp Start команду rjmp Int_0 чтоб сразу попасть в эту подпрограмму, так вот, при выполнении out gifr в него записывается значение 192 - это похоже на правду (все младшие чиатются как 0 а два старших как 1) 2. в avrstudio4 той-же командой в gifr записывается значение 63 3. в atmelstudio7 той-же командой значение gifr вообще не меняется. P.S. все числа указываю в десятичном формате, если буду указывать в 16-ричном буду писать 0x10, если в бинарном то 0b00010000.
|
|
| Вс, 20.01.2019, 22:03 | Сообщение # 6
|
msmmmm
Постов: 891
Друзья |
Цитата gorvinyk ( ) два самых старших бита установить в 1 или я что-то не понял? Ответ находится прямо в твоей программе: ldi temp,255 out gifr,temp ; gifr очищается записью единиц
Но зарезервированные биты gifr у меня (Atmel Studio 7, Version: 7.0.1931) читаются как 0. Посмотрел даташит - должны быть нули. И флаги сбрасываются записью единиц. Не забывай, что они же сбрасываются аппаратно при входе в обработчик прерывания. Попробуй установи флаг в 1 (gifr=0х40), выполни обсуждаемые команды - регистр должен сброситься в 0.
По atmelstudio7 есть в свободном доступе Atmel Studio 7 User Guide, но на английском. Проблемы чаще решаются методом научного тыка или гуглением. На русском о контроллерах есть неплохая книга А. В. Евстифеева "Микроконтроллеры AVR семейств Tiny и Mega фирмы ATMEL". Там же и описание команд на русском, только в случае проблем сверяйся с оригиналом, я перестал читать неоригинальные даташиты после нескольких танцев с бубном из-за неправильного перевода.
По Atmel Studio 4 и mplabX подсказать не могу, не пользуюсь.
|
|
| Пн, 21.01.2019, 21:16 | Сообщение # 7
|
gorvinyk
Постов: 5
ОК |
Всё прекрасно. Да, действительно рег. gifr очищается записью единиц. А можно как нибудь сделать, чтоб в окне watch значения некоторых переменный отображалось в двоичной ситсеме, других в десятичной а третьих в шестнадцатиричной?
|
|
| Пн, 21.01.2019, 22:18 | Сообщение # 8
|
msmmmm
Постов: 891
Друзья |
Я такой возможности не знаю, да и не нужно это. Двоичный код в уме переводится в шестнадцатеричный и обратно уже не задумываясь, а в десятичный переключается в IDE.
|
|
| Вт, 22.01.2019, 19:53 | Сообщение # 9
|
gorvinyk
Постов: 5
ОК |
Большое спасибо за помощь!
|
|
Внимание! Форум переехал на Tehnodium.ru
|
|