РАДИОСХЕМЫ



СТАРЫЙ ФОРУМ

Форум на ЭЛВО


РАДИОФОРУМЫ


СХЕМЫ И СТАТЬИ



  • Страница 1 из 1
  • 1
Архив - только для чтения
Помогите разобраться с средой разработки для AVR
Сообщение # 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,
тоже всё ок, но работать так не удобно?
Файлы: main.asm (2.8 Kb)
Сообщение # 2        
msmmmm
аватар
  Постов: 891   Друзья 
Цитата gorvinyk ()
Поставил Atmel Studio7 загнал туда тот же текст и имею другие проблемы: Регистр timsk имеет значение 57 при выполнении команды out timsk,temp его значение не меняется ......

gorvinyk, не там смотришь: Watch - это для наблюдения за переменными, а timsk - это объявленная в хидере константа (адрес регистра ввода/вывода), тип dword.
За регистрами ввода/вывода наблюдай во вкладке "I/O". Все там меняется.
Сообщение # 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. Что может быть не так?
Сообщение # 4        
msmmmm
аватар
  Постов: 891   Друзья 
Цитата gorvinyk ()
с atmelstudio7 такая - же картина как и с mplab, не срабатывает прерывание при изменении уровня на pd2. Что может быть не так?
Да, действительно, переход на обработчики прерываний в пошаговом режиме по умолчанию отключен (если пользоваться точками останова и run-ом, то все работает). Фикс:
debug -> options -> tools -> Mask interrups while stepping -> FALSE
Цитата gorvinyk ()
gifr записывается число 63, хотя в temp находится значение 255.
А переведи 63 из десятичной системы в двоичную smile . И переключи индикацию данных в шестнадцатеричный режим (правой кнопкой) - меньше путаницы будет.
Цитата gorvinyk ()
Ну и команда sbr flag,0 не меняет содержимое рег. flag. Не меняется его значение и в окне memory раздел register.
Невнимательно прочитал описание команды. Смотри во вложении.
Файлы: AVR_Instruction.pdf (1.06 Mb)
Сообщение # 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.
Сообщение # 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 подсказать не могу, не пользуюсь.
Сообщение # 7        
gorvinyk
аватар
  Постов: 5   ОК 
Всё прекрасно. Да, действительно рег. gifr очищается записью единиц. А можно как нибудь сделать, чтоб в окне watch значения некоторых переменный отображалось в двоичной ситсеме, других в десятичной а третьих в шестнадцатиричной?
Сообщение # 8        
msmmmm
аватар
  Постов: 891   Друзья 
Я такой возможности не знаю, да и не нужно это. Двоичный код в уме переводится в шестнадцатеричный и обратно уже не задумываясь, а в десятичный переключается в IDE.
Сообщение # 9        
gorvinyk
аватар
  Постов: 5   ОК 
Большое спасибо за помощь!
  • Страница 1 из 1
  • 1
Поиск:

Внимание! Форум переехал на Tehnodium.ru



© 2010-2022 "Форум Радиосхемы". All Rights Reserved  Почта  PDA