Все проекты

1. Заглянем внутрь

-

В предыдущем проекте мы увидели мигающий светодиод. То есть - результат работы программы "снаружи". Но хотелось бы посмотреть что творится внутри...

И дело здесь не только в любопытстве. При отладке программ, которые немного посложнее мигания светодиодом, это совершенно необходимо.

Что мы и сделаем в этом проекте. Посмотрев на тексты программы (загрузить архив с проектом вы можете внизу странички) вы увидите, что отличий от предыдущего проекта совсем немного.

  • В проекте появился новый модуль - spiint, написанный на ассемблере.

  • Появились несколько новых переменных - spixxxx - нужны для работы модуля отладки, ciklow - для визуального контроля того, что программа "вертится"

  • Чуть длиннее стала инициализация программы (настройка переменных, настройка SPI интерфейса и разрешение прерываний).

Вот и все изменения. Компилируем, линкуем, зашиваем в микроконтроллер (не забываем предварительно стереть  :-). Жмем на кнопочку с лупой (большой), светодиод замигал в точности так же, как и в предыдущем проекте...

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


Примечание - поскольку наш МК работает на тактовой всего 1 МГц, перед запуском отладки поставьте галочку "тормоз" - что прячется под окном EEPROM - иначе из-за недостатка быстродействия МК в обмене будут возникать ошибки!

Тут надобно отметить, что этот славный отладчик - продукт некоммерческий, писался для собственного употребления и потому с виду весьма неказист и местами неудобен. Но работает. Давайте разберемся, что и как этим инструментом можно увидеть.

Во первых, кликните по рожице с пивом (зеленая стрелка)и загрузите .MAP файл проекта. В окне отображения, где возможно, вместо адресов появятся имена переменных (красная стрелка). Чтобы не прокручивать все окно, можно развернуть окошко со списком имен (синяя стрелка)

Замечаем, что переменная ciklow изменяется примерно раз в секунду. 

Формат вывода значений можно изменять. Правый клик мыши по значению ($10) покажет меню форматов. Ctrl-клик по значению - вставит адрес этого байта в окошко "Запись". Клик по адресу или имени (красная стрелка) позволит ввести или изменить имя, как вам заблагорассудится (см.рис.4-зеленая стрелка)

 

Рис.1

Взглянем на рамку _spicmd. Ранее я все _spixxx переменные обозвал служебными - что не совсем верно. Переменная _spicmd может устанавливаться в любое значение с компьютера, причем 1..12 прямым нажатием на кнопку в этом окне (Рис.2 - черная стрелка). Кликаем по кнопке - и кликнутое значение видим в окне отображения (красная стрелка).

Как и для чего это можно использовать? Да как угодно. Переменную _spicmd вы можете читать в программе, а также произвольно ее изменять. Ну вот навскидку варианты использования:


if (_spicmd ==1) {ДЕЛАТЬ_ОДНО; } else {ДЕЛАТЬ_ДРУГОЕ; } - два варианта алгоритма


if (_spicmd ==1) { ДЕЙСТВИЕ; _spicmd = 0; }  одиночное действие


......
_spicmd = 2;
while (spicmd==2) {};
точка останова (прерывания работают!)
......


Короче, используйте на свое усмотрение. Теперь - окошко "Запись". Левое поле ввода - адрес, правое - значение (синяя стрелка). Формат - байт, ввод шестнадцатеричных - в стандарте паскаля. Кнопочка Send - правильно, введенное значение занесет в требуемый адрес. Как я уже указывал выше, адрес можно не вводить ручками, а Ctrl-кликнуть по значению переменной (зеленая стрелка).

Рис.2

 Учитывая линейную структуру адресного пространства AVR, просматривать и записывать можно и РОН, и РСФ, и ОЗУ. Допустим, мы хотим посмотреть состояние портов ввода-вывода. Обращение к порту В было в программе, соответственно имя _A_PORTB есть в списке. Если надо обратиться к произвольному порту - смотрим его адрес в даташите. Так, для PORTB там указано 0x18 (0x38). Так вот, нам нужен адрес обращения "как к памяти", то есть значение в скобках.

Итак, смотрим на порт В. Там будут изменяться 0 и 6 биты. Нулевой - это наш светодиод, шестой - это состояние выхода SPI - передача от МК к компу всей информации. Мы увидим там хаотическое (для нас - скорость передачи в порядки выше) изменение.

Одним адресом выше - регистр DDRB. В нем 0 и 6 биты в состоянии "1" - это определяет линии как выходные. Попробуйте, используя вышеописанную методику, записать в DDRB число $40 (01000000) - и вы увидите, что светодиод мигать перестал. Все правильно - пин, на котором он подключен, стал из выхода входом.

Если же в DDRB записать 0, то .... то ничего не увидите, поскольку отладочный обмен выключится, и вам придется пересбросить программу - например, закрыв отладочное окно и вновь открыв его. Или нажав кнопочку Reset.


Темп отладочного обмена можно изменять верхним левым движком. Тут все просто - темп выше - окно отображается чаще - но и ресурса МК "съедается" больше.

Под этим движком кнопка "Синхро" - жмите на нее, если обмен по каким-то причинам сбился. У меня такое наблюдается, если рядом включается станок. Нажать на нее требуется от 1 до 7 раз, пока обмен не появится.

Еще ниже - "Reset" - ну, это понятно. Единственная тонкость - после сброса может понадобиться кнопочка "Синхро". Сбрасывается МК коротким импульсом, порядка 100 ms.

 

Рис.3

Теперь посмотрим, что можно сделать еще. Ну, например, хотим "пощупать" таймер, а в проекте нашем его нету. Не беда. Давайте, например, запустим таймер 0.

Смотрим в даташит. Для пуска таймера с тактовой частотой нужно записать 0x01 в регистр TCCR0, его адрес 0x53. Выходим на этот адрес в окне отображения, для этого движок "сегмента" (рис.3, зеленая стрелка) выводим в самый верх. Видим вверху красную строчку @=0x0000 . Не пугайтесь что она стала красной, это указывает на то, что мы влезли в область периферии, или РСФ. Необдуманные действия там максимум что подвесят программу, сжечь ничего не сожжете.

Да, тут надо немного отвлечься, чтобы объяснить суть этого "сегмента". Для ускорения обмена МК передает не всю свою память, а небольшое "окно". Сегмент и определяет начало этого окна. Правда, еще с ассемблерных времен регистры передаются всегда, хотя для Си значения это уже почти не имеет.

Итак, сегмент установили, скроллбаром справа выходим на адрес 0x53. Сразу для облегчения восприятия даем ему имя, кликнув по адресу (рис.4, зеленая стрелка) и введя любую строку (у нас - "СамВвел"). Затем делаем Ctrl-клик по значению правее. В рамке "Запись" появляется адрес, $53. В той же рамке в окно правее вводим 1. Жмем "Send".

В окне отображения видим - эта 1 появилась в адресе 0x53, а в адресе 0x52 (красная стрелка) "забегали" циферки. Все правильно, в адресе 0x52 находится регистр TCNT0 - собственно счетчик.


Как видите, все весьма просто. Поэкспериментируйте - в TCCR0 (0x53) запишите не 1, 5. Увидите замедление изменения в 0x52 - так как при этом на вход таймера подается не тактовая частота МК напрямую, а тактовая / 1024.

Запишите в TCCR0 ноль - таймер остановится.

Далее, думаю, разберетесь сами. Экспериментируйте, не бойтесь. По сути, на этой прошивке можно "пощупать" почти всю периферию, за исключением некоторых 16-ти разрядных, которые надо писать-читать в определенном порядке... Но пока что не будем забивать голову сложностями.

Рис.4

В архиве - полный проект для IAR Си с требуемой программой. Распакуйте в отдельную папку и пользуйтесь :-) В тексте программы достаточно много комментариев, прошивка тоже присутствует - можете зашить в МК не компилируя.

В следующем уроке мы будем мигать тем же светодиодом, но используя прерывание таймера.

Что непонятно - пишите, спрашивайте - mailto:nml@tut.by, ваши вопросы помогут сделать этот материал понятнее. Не забывайте покликать по "Спасибо!" наверху - реклама дает возможность оплачивать хостинг этого сайта... Главное, не поленитесь дойти там до какого-нибудь сайта.

Удачи!

Загрузить архив с проектом

Загрузить архив с проектом

 


Rekl:Стиль определяется деталями. Хорошая рубашка, элегантный и строгий костюм и конечно же запонки. На сайте manestet.ru/shop/katalog-zaponok запонки мужские в большом ассортименте и различной ценовой категории.