Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Сбылась мечта идиота - приехали программатор и SAM7S256
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
Страницы: 1, 2, 3
zheka
Цитата
Нет. Из SODR читать вообще нельзя. Для чтения состояния там соседний регистр. Логику вы поняли правильно.

Я понимаю, что читать нельзя, читаю не я, а логическая схема порта, которая определяет будет ли на вызоде ноль или единица.
Под соседним регистром вы имеете ввиду ODSR?

Цитата
Вы полагаете, это плохо,


Я понимаю, что более гибкий доступ к функциям камня это хорошо, мне непонятно, почему так сделано. Ведь в любом слчуае выполняется оперция присваивания. Ну ведь логически проще написать ВЫХОД_Х=1, чем писать ПРИЗНАК_ВКЛЮЧЕННОСТИ=БИНАРНОЕ_ЧИСЛО_ОПРЕДЕЛЯЮЕЕ_НОМЕРА_ВЫХОДОВ_ПРИЗНАК_ВКЛЮЧЕННО
СТИ_КОТОРЫХ_НАСТРАИВАЕТСЯ или ПРИЗНАК_ВЫКЛЮЧЕННОСТИ=БИНАРНОЕ_ЧИСЛО_ОПРЕДЕЛЯЮЩЕЕ_НОМЕРА_ВЫХОДОВ_ПРИЗНАК_ВЫКЛЮЧЕ
ННОСТИ_КОТОРЫХ_НАСТРАИВАЕТСЯ. Опять таки, если я правильно понял логику работы.


Цитата
аппаратно реализованы так же и установка отдельных битов регистра в 1,
установка отдельных битов регистра в 0 и побитовая адресация регистров?

Разве в AVR такого не было?

Вопрос такой, каковы преимущества порта в ARM по сравнению с AVR, кроме того, что можно читать состояние пинов, как пишет Редькин, непосредственно на выходе?

Вот скажем, в ODSR откуда берется информация? Она попадает туда во время записи в регистр SODR, или же состояние ODSR зависит от фактического состояни пина? Ну скажем, что-то на выходе порта выгорело, или на выходе значительная просадка напряжения, мы пишем в него единичку, а результата не имеем, можно ли это диагностировать с помощью ODSR ?

Посмотрел я макросы Аскольда. А не слишком ли громоздко?
Например
Код
#define _setL(port,bit)         do { AT91C_BASE_PIO##port##->PIO_CODR = (1 << bit); } while(0)


Не до хрена ли это тактов займет?

Или вот еще круче - одно и то ж действие по-разному обзывается:
Код
#define _setH(port,bit)         do { AT91C_BASE_PIO##port##->PIO_SODR = (1 << bit); } while(0)
#define _clrL(port,bit)         do { AT91C_BASE_PIO##port##->PIO_SODR = (1 << bit); } while(0)


Ведь как я понял, по принципу двух исключающих друг друга конпок, SetH автоматом делает ClearL.

охох..голова кругом, сколько плясок с бубном...
Сергей Борщ
Цитата(zheka @ May 13 2010, 11:17) *
Под соседним регистром вы имеете ввиду ODSR?
Да. И в него можно писать состояние всего порта, как и в PORTx в AVR (записав единицы в нужные биты OWSR).
Цитата(zheka @ May 13 2010, 11:17) *
Я понимаю, что более гибкий доступ к функциям камня это хорошо, мне непонятно, почему так сделано. Ведь в любом слчуае выполняется оперция присваивания.
Ну ведь логически проще написать ВЫХОД_Х=1, чем писать
Это вам на С кажется, что PORTC.1=1 это одна операция присваивания. На ассемблере (без оптимизации или для портов, не попавших в IO space, как PORTE) это операция чтения, наложения маски по "или" и запись обратно в порт. А перед этим еще загрузка маски в регистр, потому что AVR умеет "или" только с регистром. А в случае SODR/CODR это будет действительно одна операция записи (и одна загрузки маски в регистр). Причем если надо одной командой установить до восьми соседних битов, то даже загрузку маски можно уместить в эту же команду за счет использования аппаратного сдвигателя ARM.

Цитата(zheka @ May 13 2010, 11:17) *
Вопрос такой, каковы преимущества порта в ARM по сравнению с AVR, кроме того, что можно читать состояние пинов, как пишет Редькин, непосредственно на выходе?
Хотелось бы спросить у Редькина - а что, у AVR чтение PINx/PORTx работает по-другому?
Цитата(zheka @ May 13 2010, 11:17) *
Вот скажем, в ODSR откуда берется информация? Она попадает туда во время записи в регистр SODR, или же состояние ODSR зависит от фактического состояни пина? Ну скажем, что-то на выходе порта выгорело, или на выходе значительная просадка напряжения, мы пишем в него единичку, а результата не имеем, можно ли это диагностировать с помощью ODSR ?
Нет, нельзя. Выкиньте Редькина, откройте даташит (на худой конец его перевод с gaw.ru), посмотрите картинку 15-3 и сразу увидете, что ODSR - это то, что вы хотите вывести на ноги (аналог PORTx в AVR). А PDSR - то, что читается с ног, аналог PINx у AVR.
Цитата(zheka @ May 13 2010, 11:17) *
Посмотрел я макросы Аскольда. А не слишком ли громоздко?
Например
Код
#define _setL(port,bit)         do { AT91C_BASE_PIO##port##->PIO_CODR = (1 << bit); } while(0)

Не до хрена ли это тактов займет?
Нет. Быстрее точно никак. К тому же сдвиг вычисляется на этапе компиляции.
Цитата(zheka @ May 13 2010, 11:17) *
Или вот еще круче - одно и то ж действие по-разному обзывается:
Да, с тех пор утекло много времени, все развивается. Вот более оптимальный с точки зрения исходника вариант для ARM под gcc (но компилится он в абсолютно те же команды).
zheka
Ну вот еще одна непонятка. Опять таки сравниваем c AVR
PORTA=0xF0;
PORTA=0x0F;
На выходе будет 0x0F, сразу же;

Если же работать с SAM7:
AT91C_BASE_PIOA->PIO_SODR = 0xFFFF0000;
AT91C_BASE_PIOA->PIO_SODR = 0x0000FFFF;

То на выходе будет 0xFFFFFFFF. Для того чтобы получить искомые 0x0000FFFF нужно сначала обнулить, а это лишние такты. А если я хочу это сделать быстро, как мне быть?

МОжно ли как-то записать 32битное число в порт, чтобы не беспокоиться о том что же в этот момент в порту записано, или нужно взять за правило обнулять порт перед записью нового числа?
Прошу прощения за чайниковые вопросы.


Цитата
Выкиньте Редькина, откройте даташит


А есть что-нибудь такое же правильное как даташит, но такое же русское, как Редькин?

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

У меня к присутствющим просьба: вот задача - есть PIOA c его 32 ножками. Есть два 8-ми битных числа a и b. Мне нужно поместить биты числа а в биты №№0-7 порта, а биты числа b вы биты №№24-31 порта.

Подскажите как это сделать, тогда мне будет от чего отталкиваться, а то от макроса в последнем вложении голова кругом пошла.
vallav
Цитата(zheka @ May 13 2010, 14:43) *
Ну вот еще одна непонятка. Опять таки сравниваем c AVR
PORTA=0xF0;
PORTA=0x0F;
На выходе будет 0x0F, сразу же;

Если же работать с SAM7:
AT91C_BASE_PIOA->PIO_SODR = 0xFFFF0000;
AT91C_BASE_PIOA->PIO_SODR = 0x0000FFFF;

То на выходе будет 0xFFFFFFFF. Для того чтобы получить искомые 0x0000FFFF нужно сначала обнулить, а это лишние такты. А если я хочу это сделать быстро, как мне быть?

МОжно ли как-то записать 32битное число в порт, чтобы не беспокоиться о том что же в этот момент в порту записано, или нужно взять за правило обнулять порт перед записью нового числа?
Прошу прощения за чайниковые вопросы.


А разве вSAM7 нет вывода в регистр?
Тогда переходите на кортекс
Там есть все три
LPC_GPIO0->FIOPIN=i // выводит значение i в регстр0
LPC_GPIO0->FIOSET=i // устанавливает в регстре0 в 1 те биты, которые в i равны 1, остальные не меняются
LPC_GPIO0->FIOCLR=i // устанавливает в регстре0 в 0 те биты, которые в i равны 1, остальные не меняются
zheka
vallav, спасибо за идею, теперь я понял как задать вопрос. Есть ли в SAM7 анало FIOPIN=i ? А то совершенно непонятно, почему я должен обнулять что-то прежде чем записать новое значение.
aaarrr
Почитайте в мануале про OWER, ODSR.
Сергей Борщ
Цитата(zheka @ May 13 2010, 14:27) *
Ну вот еще одна непонятка. Опять таки сравниваем c AVR
PORTA=0xF0;
PORTA=0x0F;
На выходе будет 0x0F, сразу же;

Если же работать с SAM7:
AT91C_BASE_PIOA->PIO_SODR = 0xFFFF0000;
AT91C_BASE_PIOA->PIO_SODR = 0x0000FFFF;

То на выходе будет 0xFFFFFFFF. Для того чтобы получить искомые 0x0000FFFF нужно сначала обнулить, а это лишние такты. А если я хочу это сделать быстро, как мне быть?
Читать даташит. В крайнем случае его перевод на русский язык с сайта gaw.ru.
Код
AT91C_BASE_PIOA->PIO_OWER = 0xFFFFFFFF; // <-- один раз в начале программы
AT91C_BASE_PIOA->PIO_ODSR = 0x12345678;        // Записали 32 бита в порт

Цитата(zheka @ May 13 2010, 14:27) *
У меня к присутствющим просьба: вот задача - есть PIOA c его 32 ножками. Есть два 8-ми битных числа a и b. Мне нужно поместить биты числа а в биты №№0-7 порта, а биты числа b вы биты №№24-31 порта.
А что вы хотите сделать с остальными битами (8-23)? Если не хотите их менять:
Код
// Вариант А:
uint32_t Tmp = AT91C_BASE_PIOA->PIO_OWSR;
AT91C_BASE_PIOA->PIO_OWER = 0xFF0000FF;
AT91C_BASE_PIOA->PIO_OWDR = ~0xFF0000FF;
AT91C_BASE_PIOA->PIO_ODSR = (b << 23) | (a<<0);
AT91C_BASE_PIOA->PIO_OWER = Tmp;
AT91C_BASE_PIOA->PIO_OWDR = ~Tmp;
// Вариант B:
AT91C_BASE_PIOA->PIO_SODR = (b << 23) | (a<<0);
AT91C_BASE_PIOA->PIO_CODR = ~((b << 23) | (a<<0) | (0xFFFF << 8));
А как бы вы записали по 2 бита из каждой переменной в биты 0,1 и 6,7 на AVR?
zheka
С битами 8-23 я ничего не собирался делать. А в АВР я делал бы точно так же как и с АРМ, так как вы написали с этим то проблем не было, я даже в симулятор гонял. В от только когда в 0-7 записано 0xFF, а затем 0xAA, то все равно остается 0xFF. Ваш ответ про OWDR я прочел, сейчас буду пробовать.

Код
// Вариант B:
AT91C_BASE_PIOA->PIO_SODR = (b << 23) | (a<<0);
AT91C_BASE_PIOA->PIO_CODR = ~((b << 23) | (a<<0) | (0xFFFF << 8));


А второй строкой вы что хортели сделать? НИже код - наличие/присутствие строки ничего в симуляторе не изменило.


Код
AT91C_BASE_PIOA->PIO_SODR = 0x00AAAA00; //записываем AAAA в биты 8-23, неузявимость которых хотим проверить
      AT91C_BASE_PIOA->PIO_SODR = (0xFF << 23) | (0xFF<<0); ///записываем 0xFF по краям.
      //AT91C_BASE_PIOA->PIO_CODR = ~((0xFF << 23) | (0xFF<<0) | (0xFFFF << 8) );   ///Ваша строка
       AT91C_BASE_PIOA->PIO_SODR = (0xAA << 23); // Записываем 0xAA в биты 24-31, чтобы проверить, затирается ли 0xFF после записи и остается ли сохранной информация в битах 8-23. Результат - в битах 24-31 остается 0xFF, биты 8-23 целы. Комментирование/раскомментирование Вашей строки не меняет результат.
zltigo
Цитата(vallav @ May 13 2010, 14:44) *
Тогда переходите на кортекс
Там есть все три
LPC_GPIO0->FIOPIN=i // выводит значение i в регстр0
LPC_GPIO0->FIOSET=i // устанавливает в регстре0 в 1 те биты, которые в i равны 1, остальные не меняются
LPC_GPIO0->FIOCLR=i // устанавливает в регстре0 в 0 те биты, которые в i равны 1, остальные не меняются

А причем тут какое-либо ядро к организации GPIO конкретного контроллера? В отношении Cortex-M3, ну там разве только от ядра bit-band может быть использован для частичной эмуляции помянутых Вами LPC-шных SET/CLR
zheka
Значит так, господа давайте изложу проблему детально.
1. Записываю информацию в серединку 8-23, записываю, скажем так, навсегда.
2. Пишу в биты 0-7 и 23-31 числа 0xFF.
3. Убеждаюсь что биты 8-23 не тронуты.
4. Снова пишу другое число - 0xAA в биты 0-7 и 23-31. Очень хочу, чтобы там оказались AA - чередование 0 и 1. Можно ли это сделать без предварительной очистки в ноль битов 0-7 и 23-31 ???
Пока сделал так:
Код
AT91C_BASE_PIOA->PIO_PER  = 0xFFFFFFFF;
  AT91C_BASE_PIOA->PIO_OER  = 0xFFFFFFFF;
  AT91C_BASE_PIOA->PIO_OWER  = 0xFFFFFFFF;


      AT91C_BASE_PIOA->PIO_SODR = 0x00AAAA00;
      AT91C_BASE_PIOA->PIO_SODR = (0xFF << 24) | (0xFF<<0);
      //AT91C_BASE_PIOA->PIO_CODR = ~((0xFF << 24) | (0xFF<<0) | (0xFFFF << 8) );
       AT91C_BASE_PIOA->PIO_SODR = (0xAA << 24) | (0xAA<<0);


Средние биты защищены. А вот в крайних так и остается 0xFF.
aaarrr
Код
AT91C_BASE_PIOA->PIO_OWER  = 0xFF0000FF;
AT91C_BASE_PIOA->PIO_ODSR  = 0xYY0000ZZ;
zheka
aaarrr спасибо, то что надо.
то есть OWER нужно включать единожды? И все что в нем единица будет рабоать как старый добрый PORTA=0xAA ?
aaarrr
Цитата(zheka @ May 13 2010, 19:45) *
то есть OWER нужно включать единожды?

Можно единожды.

Цитата(zheka @ May 13 2010, 19:45) *
И все что в нем единица будет рабоать как старый добрый PORTA=0xAA ?

При записи в ODSR - да.
Сергей Борщ
Цитата(zheka @ May 13 2010, 17:44) *
А второй строкой вы что хортели сделать?
Сбросить в 0 те биты, которые равны нулю в байтах a и b. Для этого на месте этих битов надо записать единицы в CODR.
Цитата(zheka @ May 13 2010, 17:44) *
НИже код - наличие/присутствие строки ничего в симуляторе не изменило.
Естественно - результат вашего выражения - ноль, а запись нулевых битов в CODR не имеет эффекта. Именно поэтому ваши средние биты остаются нетронутыми в моей записи.
zheka
Тьфу, тфу разобрался. Напаял на плату светодиодов, сделал через (1<<i) в цикле бегущий огонь (OSDR) и заполняющийся столбик (SODR).
Разобрался почему у меня не запускался код в RAM.
ТОлько объясните моему детскому мозгу, чем же контроллер порта в ARM круче чем в AVR, коль требует к себе такого отношения?


P.S. Сцк, интересный однако, камень, почему я не напрягся с ним раньше?...
aaarrr
Цитата(zheka @ May 13 2010, 22:45) *
ТОлько объясните моему детскому мозгу, чем же контроллер порта в ARM круче чем в AVR, коль требует к себе такого отношения?

Какого отношения - чтения документации?
zltigo
Цитата(aaarrr @ May 13 2010, 22:52) *
Какого отношения - чтения документации?

Представляю, что случится с zheka, когда он узнает о, например, существовании Luminary smile.gif - там 20 регистров за каждым восьмибитовым GPIO + еще восемь в bit-band итого 28 smile.gif
zheka
Цитата
Какого отношения - чтения документации?

Не спорю. Но описание OWER и ODSR в документации не сразу наталкивает на мысль что это решение моей проблемы. Если бы вам дали задание найти кухонный нож, а на коробке было бы написано что-то вроде "твердотельный дезинтегратор органических энергоносителей для питания билогических систем" вы бы сразу догадались что в коробке то что вам нужно?
vallav
Цитата(zltigo @ May 13 2010, 18:46) *
А причем тут какое-либо ядро к организации GPIO конкретного контроллера? В отношении Cortex-M3, ну там разве только от ядра bit-band может быть использован для частичной эмуляции помянутых Вами LPC-шных SET/CLR


А при чем тут bit-band и частичная эмуляция?
Bit-band - это четвертый способ ввода/вывода в регистры - с побитовой адресацией.
И все они не эмулируются а существуют на аппаратном уровне - в железе.

Или Вы имели в виду, что нужно было вместо "переходите на кортекс" сказать "переходите на lpc1xxx"?
Но прямо об этом сказать постеснялись...




Цитата(zheka @ May 13 2010, 22:45) *
Тьфу, тфу разобрался. Напаял на плату светодиодов, сделал через (1<<i) в цикле бегущий огонь (OSDR) и заполняющийся столбик (SODR).
Разобрался почему у меня не запускался код в RAM.
ТОлько объясните моему детскому мозгу, чем же контроллер порта в ARM круче чем в AVR, коль требует к себе такого отношения?


P.S. Сцк, интересный однако, камень, почему я не напрягся с ним раньше?...


Да не, просто чип кривоватый.
Ваша задача на lpc1768 делается так:

LPC_GPIO0->FIOPIN0=a; // вывод в младший байт порт_0 байта a
LPC_GPIO0->FIOPIN3=b; // вывод в старший байт порт_0 байта b

Но тут беда в другом - не все биты порта выведены на пины.
Почему? А кто же его знает...
zltigo
Цитата(vallav @ May 14 2010, 08:22) *
Или Вы имели в виду...

Я имел ввиду, то, что я написал - Ваши расуждения о свойствах GPIO конкретного LPC нималейшего отношения к какому-либо ядру не имеют и только по факту переходе на ядро Cortex-M3 счастья от обладания такими GPIO не появится. Все.
vallav
Цитата(zltigo @ May 14 2010, 10:49) *
Я имел ввиду, то, что я написал - Ваши расуждения о свойствах GPIO конкретного LPC нималейшего отношения к какому-либо ядру не имеют и только по факту переходе на ядро Cortex-M3 счастья от обладания такими GPIO не появится. Все.


Только у lpc GPIO реализовано корректно? Как ячейка памяти.
То есть поддерживает команду - вывод значения регистра в память?
У остальных производителей микропроцессоров на ядре кортекс GPIO не поддерживает этой команды и ее приходится эмулировать?
Извините, я этого не знал.

И что Вы так нервничаете?
Сказали бы - есть производители кортексов, у которых GPIO кривое, и все дела...
ViKo
Цитата(vallav @ May 14 2010, 10:01) *
Сказали бы - есть производители кортексов, у которых GPIO кривое, и все дела...

Есть производители микроконтроллеров, использующие Cortex ядро. Как они сделают порты - их дело. Обычно делают, как надо. Это не вытекает из Cortex напрямую.
Кстати, bit-band для портов - вещь мало нужная. Вполне должно хватать и тех регистров, которые отвечают за биты порта. Для того они и созданы.
vallav
Цитата(ViKo @ May 14 2010, 11:54) *
Есть производители микроконтроллеров, использующие Cortex ядро. Как они сделают порты - их дело. Обычно делают, как надо. Это не вытекает из Cortex напрямую.
Кстати, bit-band для портов - вещь мало нужная. Вполне должно хватать и тех регистров, которые отвечают за биты порта. Для того они и созданы.


Вы в курсе, что в кортексе нет пространства ввода-вывода.
И GPIO отображается на память.
В кортексе есть команды записи в память значения региситра.
Если по адресу GPIO стандартная команда ядра не работает - GPIO реализовано криво.
Согласны?

Кстати, есть такие кортексы, в которых эта команда для GPIO не реализована?
Или это чисто теоретические рассуждения - мол вполне может быть не реализована...

А в SAM7 насамом деле нет команды записи из регистра в GPIO?

А вот что Вы сюда bit-band пристроили, непонеятно.
Если и мало нужная то вроде и не мешает...
А понадобится, используем.

По этому поводу не ко мне, это не я заявлял -
"В отношении Cortex-M3, ну там разве только от ядра bit-band может быть использован для частичной эмуляции помянутых
Вами LPC-шных SET/CLR"
На мой вопрос - это про что - ответа не получено...
ViKo
Вот и Вы, похоже, нервничаете smile.gif
У ядра Cortex, которое Вы упомянули, есть только адресное пространство для периферийных устройств 0x40000000-0x5FFFFFFF. Какие там будут устройства, зависит от производителя конкретного микропроцессора. Когда Вы сказали "переходите на Cortex", подразумевая там некие регистры портов, это вызвало справедливое замечание zltigo. Надеюсь, я объяснил правильно?
А bit-band я просто так упомянул, высказал свое мнение.
Сергей Борщ
Цитата(vallav @ May 14 2010, 13:35) *
Вы в курсе, что в кортексе нет пространства ввода-вывода.
И GPIO отображается на память.
В кортексе есть команды записи в память значения региситра.

Вы в курсе, что в ARM7 (и в AT91SAM7 в частности) нет пространства ввода-вывода?
И GPIO отображается на память?
В ARM7 есть команды записи в память значения регистра.

И чем же тогда кортекс лучше?

Цитата(vallav @ May 14 2010, 13:35) *
А в SAM7 насамом деле нет команды записи из регистра в GPIO?
Если вы этого не знаете, то как можете делать вывод что кортекс лучше?

Цитата(vallav @ May 14 2010, 13:35) *
На мой вопрос - это про что - ответа не получено...
Это про LPC и SAM7, которые вы обвиняете в кривизне. Как выясняется - даже не зная, как они устроены.
zheka
Цитата
Как выясняется - даже не зная, как они устроены.


Дык известный принцип - "Пастернака не читал, но осуждаю".
vallav
Цитата(Сергей Борщ @ May 14 2010, 16:46) *
Вы в курсе, что в ARM7 (и в AT91SAM7 в частности) нет пространства ввода-вывода?
И GPIO отображается на память?
В ARM7 есть команды записи в память значения регистра.

И чем же тогда кортекс лучше?

Если вы этого не знаете, то как можете делать вывод что кортекс лучше?

Это про LPC и SAM7, которые вы обвиняете в кривизне. Как выясняется - даже не зная, как они устроены.


Вы о чем?
Был пост, в котором интересовались, как одной командой записать значение в порт.
И куча ответов с паравозами вместо одной команды.
Они не знали, как этот чип устроен?
Я подумал, что в этом контроллере почему то нет команды записи в порт.
Ну не мог же я подумать, что отвечающий не знает, на что отвечает...
Вот и предложил - перейти на кортекс, где такая команда и даже команды побайтовой и побитовой записи есть.

Где Вы углядели, что я заявил - кортекс лучше всех?
Кортекс как контроллер - полный отстой по сравнению с ADI_шным ADSP21xx.
Им бы переферию туда добавит и разрядность до 32 поднять - цены бы этой игрушке не было...
Она без конвеера и на старинной технологии выдавала 80 МГц при всех командах - строго однотактовых.
А в кортексе - однотактность команд - это чисто враки.
А уж быстрые прерывания - через 20 тактов после запроса, или быстрое ПДП - по 5 тактов на пересылку...

Но что есть, то есть - GPIO у него на высоте.
Добавить бы сигналы синхронизации и однотактное ПДП в память с кольцевым буфером да все биты порта вывести на
пины...



Цитата(zheka @ May 14 2010, 17:05) *
Дык известный принцип - "Пастернака не читал, но осуждаю".


Это Вы про тех, кто выдал паровозы в ответ на вопрос, как записать значение в порт.
Не зная, что там это делается одной командой?

Или про меня?
Так как я выдал следующее:
"А разве вSAM7 нет вывода в регистр?
Тогда переходите на кортекс
Там есть все три"



Цитата(ViKo @ May 14 2010, 15:36) *
Вот и Вы, похоже, нервничаете smile.gif
У ядра Cortex, которое Вы упомянули, есть только адресное пространство для периферийных устройств 0x40000000-0x5FFFFFFF. Какие там будут устройства, зависит от производителя конкретного микропроцессора. Когда Вы сказали "переходите на Cortex", подразумевая там некие регистры портов, это вызвало справедливое замечание zltigo. Надеюсь, я объяснил правильно?
А bit-band я просто так упомянул, высказал свое мнение.


Он что то отмалчивается.

Может Вы ответите - есть кортекс, у которого нет команды вывода регистра в порт?
Или он разразился этим исходя из чисто теоретической возможности, что такой кортекс сделать можно?
В этом случае замечание ну очень справедливое...
И даже не замечание а целый разнос.
ViKo
Цитата(vallav @ May 14 2010, 16:35) *
Может Вы ответите - есть кортекс, у которого нет команды вывода регистра в порт?

Отвечу (еще раз) - у Cortex вообще нет портов!
Сергей Борщ
Цитата(vallav @ May 14 2010, 16:35) *
Был пост, в котором интересовались, как одной командой записать значение в порт.
И куча ответов с паравозами вместо одной команды.
Они не знали, как этот чип устроен?
Был вопос - как записать 2 байта в порт не трогая остальные 16. Ваш вариант из одной команды, пусть даже для кортекса?
vallav
Цитата(Сергей Борщ @ May 14 2010, 18:04) *
Был вопос - как записать 2 байта в порт не трогая остальные 16. Ваш вариант из одной команды, пусть даже для кортекса?


Это был второй вопрос.
Первый - как в порт записать 0x0000ffff а затем 0xaaaa5555.

И именно посмотрев ответы на этот вопрос я предложил перейти на кортекс.

А п овторому вопросу - полагаете, то, как это делается в кортексе, корявее чем приведенные для исходного чипа?


Цитата(ViKo @ May 14 2010, 17:50) *
Отвечу (еще раз) - у Cortex вообще нет портов!


Ага. У него всего навсего 6 букв из латинского алфавита. И что?
А вот если Вы про то, что под этим названием - то возможны разные варианты...

Уточню для любителей строгости - есть ли микропроцессоры с ядром Cortex M3, у которых не реализована команда вывода из
регистра в порт?

Если это не совсем строго, Вы не стесняйтесь, поправляйте.
Я не гордый, переспрошу...

Мне же интересно, на меня просто так наехали ( мимоходом ) или за этим хоть что то есть...
zheka
Vallav, я конечно еще лох, но попробую тявкнуть - те три варианта, которые вы написали для Кортекса, в АРМ пишутся как SODR, CODR и ODSR. Про ODSR вы не знали, вот и предложили Кортекс, решив что там этот третий вариант есть.
Господа, давайте не будетм засорять тему спорами об архитектуре камней. Я пришел с работы, сел за плату, сейчас ведь вновь засыплю вас глупыми вопросами)))
zheka
Подскажите, как грамотно организовать задержку на милли и микросекунды. "Тяжелое наследие CodeVision" навевает что-то вроде #include <delay.h> delay_ms(x) delay_us(x)
rezident
Цитата(zheka @ May 14 2010, 23:46) *
Подскажите, как грамотно организовать задержку на милли и микросекунды.
С помощью таймера.
ViKo
А можно я еще чуть-чуть про Cortex-M3? Вернее, про STMicroelectronics.
Для STM32F103 написал следующий код
Код
  while (1) {
   GPIOB->BSRR = 0x0002;
   GPIOB->BRR = 0x0002;
  }

Скомпилировалось в
Код
  0x08000226 F8C01C10  STR      r1,[r0,#0xC10]
  0x0800022A F8C01C14  STR      r1,[r0,#0xC14]
  0x0800022E E7FA      B        0x08000226

Весь цикл выполняется за 7 тактов - 2 + 2 + 3. Итого, на частоте 72MHz имеем "дрыгание ножкой" с частотой чуть больше 10MHz.
А вам с вашим SAM... слабо?
Я, извините, SAM... "не читал" smile.gif
zltigo
Цитата(vallav @ May 14 2010, 16:35) *
Он что то отмалчивается.

Я даже полным дятлам третий раз повторять не буду. А пытаться замазать потоками флейма свое ламерство ( причем уже не в первый раз ), это уже, как администратор, настоятельно не советую - флейм наказуем.
zheka
С помощью таймера можно было и в АВР. А можно было и библиотечной функцией
Неужели нет каких-нибудь библиотек?
zltigo
Цитата(zheka @ May 14 2010, 21:29) *
Неужели нет каких-нибудь библиотек?

А какая, простите Вам "библиотека" нужна, дабы организовать тупой цикл?
Код
void delay3t( unsigned long value )
{
__asm(    "    subs    r0, #1\n"
          "    bne.n   delay3t\n"
          "    bx      lr"    );
}

Мегагерцы по три такта в задержку сможете сказать препроцессору пересчитать?
zheka
ЧТо помешает? Например вот это:
Цитата
Blinky.c(32): error: #1094: Expected a register expression
Blinky.c(33): error: #1083: Inline assembler syntax error
Blinky.c(34): error: #1083: Inline assembler syntax error
zltigo
Цитата(zheka @ May 14 2010, 22:13) *
ЧТо помешает? Например вот это:

А чем компилим-то? А.... еще у меня крыша на Cortrex последние дни заклинила для ARM надо subs r0, r0, #1 и bne
Ну и задержки будут достаточно отфонарные, ибо waistates на Flash, ну и уcкорители с кэшами тоже встречаются даже на младшеньких ARM7
А вообще такие вещи надо куда-ибудь в ассеблерный фальчик, например, в startup запихивать.
vallav
Цитата(zheka @ May 14 2010, 18:24) *
Vallav, я конечно еще лох, но попробую тявкнуть - те три варианта, которые вы написали для Кортекса, в АРМ пишутся как SODR, CODR и ODSR. Про ODSR вы не знали, вот и предложили Кортекс, решив что там этот третий вариант есть.
Господа, давайте не будетм засорять тему спорами об архитектуре камней. Я пришел с работы, сел за плату, сейчас ведь вновь засыплю вас глупыми вопросами)))


Так вопрос решен?
И в SAM7 есть вывод значения регистра в порт?
Просто те, кто на этот вопрос отвечал, этого не знали...
Так что было бодягу разводить - сразу запостили бы это.
Или поговорить захотелось?

Цитата(zltigo @ May 14 2010, 22:15) *
Я даже полным дятлам третий раз повторять не буду. А пытаться замазать потоками флейма свое ламерство ( причем уже не в первый раз ), это уже, как администратор, настоятельно не советую - флейм наказуем.


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

И флейм сразу прекратится...

Или не знаете такого чипа и решили включить административный ресурс?
А дятлом быть не хочется...
zheka
Цитата
А чем компилим-то?


Компилим в KEIL uVisioin4.

Цитата
для ARM надо subs r0, r0, #1 и bne


Я так понял, что дело не только в этом - компилятору само объявление ассемблерной строки не понравилось.
zltigo
Цитата(zheka @ May 15 2010, 10:38) *
Компилим в KEIL uVisioin4.

Это оболочка поддерживающая разные компиляторы. А компилятор Вы не назвали sad.gif.
Для ARM:
Код
__asm void __loopx( unsigned long cnt )
{
    subs    r0, r0, #1;
    bne     __loopx;
    bx      lr;
}

для GCC:
Код
void __attribute__((naked)) __loopx( unsigned long cnt )
{
    __asm("    subs    r0, r0, #1\n"
          "    bne     __loopx\n"
          "    bx      lr");
}

Ну а лучше, как уже писал где-нибудь в чисто ASM писать эти несколько строк - совсем никчему с этими диалектами разбираться в подавляющем большинстве случае.
ViKo
Для Cortex у меня есть такая штука. Ассемблер тут ни к чему, я думаю.
Код
/*!
*******************************************************************************
* @brief Delay (in sec)
* @details Программа задержки
* @note предполагается частота процессора 72000000 Hz \n
*  при задержке до 3.640 ms программа занимает 3 команды \n
*  при большей задержке используется 4-5 команд ассемблера
* @param TIME - время в секундах (максимум 238.609 сек)
* @return нет
*******************************************************************************/
#define  Delay(TIME)  for (uint32 i = (72000000 / 4 * TIME); i; i--);
zheka
Цитата
Это оболочка поддерживающая разные компиляторы. А компилятор Вы не назвали


Не знаю, там ли я смотрю: Project->manage->Components,Environments,Books->Вкладка Folders,Extensions и две галки - "Use RealView COmpiler" и "Use GNU COmpiler". У меня выбран RealView.


ЕЩе один вопрос: в папке с проектом у меня есть хидер. ПОдключаю его #include "TimesNR_8.h"
КОмпилятор пишет: "Blinky.c(14): error: #5: cannot open source input file "TimesNR_8.h": No such file or directory"

Ковыряюсь, лезу в Project->manage->Components,Environments,Books->Project COmponents. Там выбираю Project targets - SAM7 RAM ULINK; Groups - Source COde; Files - добавляю нужный хидер.

Компилятор все равно выдает ту же ошибку. ВОпрос - где он ищет этот хидер? Как заставить его искать в корневой папке проекта?
ViKo
Цитата(zheka @ May 15 2010, 11:09) *
ВОпрос - где он ищет этот хидер? Как заставить его искать в корневой папке проекта?

Project / Options for ... / C/C++ / IncludePath ...
zheka
VIKO спасибо, помогло.

Смотрим дальше, что ему не нравится:
Код
#define TimesNR_8_WIDTH 10
#define TimesNR_8_HEIGHT 8

const char TimesNR_8[] PROGMEM = {  // В ЭТОЙ СТРОКЕ ОШИБКА: "..\..\..\..\Examples\Blinky\TimesNR_8.h(7): error:  #65: expected a ";" "
    0x04, 0x1E, 0x0A, 0x08, 0x01, 0x20, 0xFF,
    0x05, 0x03, 0x03, 0x05, 0x05, 0x06, 0x05, 0x01, 0x02, 0x02, 0x05, 0x05, 0x01, 0x05, 0x01, 0x05,
AHTOXA
PROGMEM уберите, это от АВР.
zheka
Получилось. Идем дальше...

Еще такой вопросец, а как перенести из текстового файла в KEIL русский текст? В файле были русские комментарии, при включении в KEIL видны крякозяблики.
ViKo
Цитата(zheka @ May 15 2010, 11:36) *
Еще такой вопросец, а как перенести из текстового файла в KEIL русский текст? В файле были русские комментарии, при включении в KEIL видны крякозяблики.

Да, есть такая шняга.
Решений 2:
- изменить вид шрифта для комментариев с курсива на прямой
- изменить в ключе реестра HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage значение «1252» на «1251»
Я пользовался первым до недавнего времени. Теперь перешел на второй способ.
zltigo
Цитата(AHTOXA @ May 15 2010, 11:33) *
PROGMEM уберите, это от АВР.

Если таскать исходники туда сюда, то лучше
Код
#define PROGMEM

добавить.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.