Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблемма с AT91SAM9260 и IAR EWARM
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
rtcveel
Доброго времени суток, уважаемые ГУРУ!

Решил в целях самообразования поработать с архитектурой отличной от класической MCS-51. Хотелось и частоты побольше и переферии, в общем выбор пал на микроконтроллер AT91SAM9260. Была куплена отладочная плата SK-AT91SAM9260 и JTAG программатор MT-LINK. Скачан и успешно вылечен IAR EWAVR версии 6.30. Казалось бы, ничего не предвещало проблемм но первый же блин оказался канечно же "комом", и не только первый.

В ступор встал после первой же простейшей программы, суть которой считывать логический уровень с 24 пина порта А и в зависимости от него включать или выключать светодиод на выходе 17 порта Б:

#include <AT91SAM9260/AT91SAM9260.h>

void main(void)
{
unsigned long a=1;

AT91C_BASE_PIOA -> PIO_PER = (0x1<<24); // PORTA.24 as PIO
AT91C_BASE_PIOA -> PIO_PPUER = (0x1<<24); // PORTA.24 PULLUP ON


AT91C_BASE_PIOB -> PIO_PER = (0x1<<17); // PORTB.17 as PIO
AT91C_BASE_PIOB -> PIO_OER = (0x1<<17); // PORTB.17 as OUTPUT
AT91C_BASE_PIOB -> PIO_OWER = (0x1<<17); // PORTB.17 Output Write Enable Registor
AT91C_BASE_PIOB -> PIO_CODR = (0x1<<17); // PORTB.17 = 0;

while(1){

a = (AT91C_BASE_PIOA->PIO_PDSR)&AT91C_PIO_PA24; // состояние ПИНа А.24

if (a){AT91C_BASE_PIOB->PIO_SODR = (1UL<17);} // если неравно нулю то PORTB.17 = 1;
if (!a){AT91C_BASE_PIOB->PIO_CODR = (1UL<17);} // если равно нулю то PORTB.17 = 0;
}

}

Сразу прошу прощения,что пользуюсь разными методами задания вывода, а именно (0x1<<17) или (1UL<17) или AT91C_PIO_PВ17 должно быть одно и тоже, насколько я понимаю...

Компляция проходит на "УРА", запускается дебаг, иар радостно сообщает что прошивка загружена по месту назначения и ... ничего не происходит, на обоих выводах висит +3.3 вольта, на нажатие кнопки не реагирует. Уже низнаю что и думать можт IAR обманывает? или отладчик? help.gif

Извиняюсь, опечатался: не (1UL<17) а (1UL<<17).
Lotor
С этим контроллером не работал, но возможно там в модуле управления питания надо включить нужные порты ног.
Если есть JTAG, то что мешает пройти по шагам стартовый код и узнать доходите ли до main.
Самый лучший способ - в ИАРе найти пример под Ваш МК и сделать на его основе.
rtcveel
Да я бы рад, только в режиме симулятора пошагово программа проходится, а как только в настройках переключаюсь на J-Link/J-Trace, дебаггинг запускается, но и на брейкпоинты в тексте "С" ругается "One or more brekepoints could not to be set" и в дизассемблере прыгает между двух строчек (если код запускается сразу как Run):

0x355d20 SUBS R0, R0, #1
0x355d24 BHI 0x355d20

Если в опциях J-Link/J-Trace не ставить галочку Run to "main", что, как я понимаю, означает пошагово пройтись с начала программы, то при нажатии на Step или подобные кнопки меню вылазиит ошибка "Filed to read current instruction. Abort debug session?" поэтому пройтись пошагово JTAGoм не получается поэтому и думаю, где косяк, в прграмме, программаторе или компиляторе %)
Lotor
Может более опытные товарищи по конкретно этому МК подскажут. Могу лишь посоветовать разобраться из какой памяти настроен (внешними пинами) запускаться контроллер.
rtcveel
Проблемма с J-linkом решилась обновлением соотвестсующих драйверов, ПО и прошивки, код пошагово проходит, но часть кода в которой проверяется состояние ПИНа А.24 выполняется както не так%) и в выполняются условие что как будто в переменной а всегда 0.

a = (AT91C_BASE_PIOA->PIO_PDSR)&AT91C_PIO_PA24; // состояние ПИНа А.24


if (a){AT91C_BASE_PIOB->PIO_SODR = (1UL<17);} // если неравно нулю то PORTB.17 = 1;
if (!a){AT91C_BASE_PIOB->PIO_CODR = (1UL<17);} // если равно нулю то PORTB.17 = 0;
Lotor
Цитата(rtcveel @ Jun 27 2012, 12:34) *
Проблемма с J-linkом решилась обновлением соотвестсующих драйверов, ПО и прошивки, код пошагово проходит, но часть кода в которой проверяется состояние ПИНа А.24 выполняется както не так%) и в выполняются условие что как будто в переменной а всегда 0.

Если решена проблема с джитагом и можно шагать по коду, что тогда мешает узнать действительное значение Вашей переменной после считывания кнопки.
rtcveel
Тема исчерпана, косяк нашёл rolleyes.gif Как написал уважаемый Lotor, (за что ему большое спасибо) действительно необходимо включить некий особый бит называемый PMC_PCER или Peripheral Clock Enable Register, без него порты ввода/вывода работать отказываются. Вот финальная версия инициализации:

unsigned long a;
AT91C_BASE_PMC -> PMC_PCER =(1UL << AT91C_ID_PIOA);
AT91C_BASE_PIOA -> PIO_PER = (0x1<<24); // PORTA.24 as PIO
AT91C_BASE_PIOA -> PIO_PPUER = (0x1<<24); // PORTA.24 PULLUP ON

AT91C_BASE_PMC -> PMC_PCER = (1UL << AT91C_ID_PIOB);
AT91C_BASE_PIOB -> PIO_PER = (0x1<<17); // PORTB.17 as PIO
AT91C_BASE_PIOB -> PIO_OER = (0x1<<17); // PORTB.17 as OUTPUT
AT91C_BASE_PIOB -> PIO_OWER = (0x1<<17); // PORTB.17 Output Write Enable Registor
AT91C_BASE_PIOB -> PIO_CODR = (0x1<<17); // PORTB.17 = 0;


Lotor
Цитата(rtcveel @ Jun 27 2012, 13:24) *
Вот финальная версия инициализации:

Поздравляю, только финальная версия красивее смотрится с тегами [code] wink.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.