|
|
  |
Сбылась мечта идиота - приехали программатор и SAM7S256, Теперь нужен ликбез. |
|
|
|
Apr 27 2010, 12:37
|
Гуру
     
Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164

|
Господа, прочел сегодня в умной книжке следующее: "... по умолчанию все выходы настроены как входы со включенными пуллап резисторами, подтянутыми к плюсу питания. Если подключить такой вход к плюсу питания, то последствия будут непредсказуемыми..."
Где-то уже на форуме читал жалобу, что мол, подключенное к этому входу реле пр включении питания срабатывает. Оно и понятно - вывод настроен как вход, но включенный резистор подает на ключ этого реле плюс питания вызывающий срабатывание.
Но мне непонятно то что написано в книжке - какие могут быть последствия? Ну подам я плюс питания на вход, подтянутый к плюсу - что будет? по факту - это шунтирование внутреннего резистора, не более того.
Ну и раз уж все так страшно - чем руководствовались разработчики, раз допустили такую лажу? Какой-то скрытый смысл в этом есть? Ну и последний вопрос - в книге это писалось про SAM7X серию. А в каких еще атмеловских ARM7 этот баг присутствует?
|
|
|
|
|
Apr 27 2010, 13:45
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
В книжке, конечно, написана чушь, если Вы дословно ее цитируете. Проблемы будут в том случае, если на вход с включенным pull-up'ом подать напряжение выше напряжения питания IO, например, 5V при VDDIO 3.3V. Тогда через pull-up'ы начнет течь ток на VDDIO, что может вызвать его повышение и выход за разрешенные границы. Цитата(zheka @ Apr 27 2010, 16:37)  Ну и раз уж все так страшно - чем руководствовались разработчики, раз допустили такую лажу? Какой-то скрытый смысл в этом есть? Это у них надо бы спросить. Цитата(zheka @ Apr 27 2010, 16:37)  Ну и последний вопрос - в книге это писалось про SAM7X серию. А в каких еще атмеловских ARM7 этот баг присутствует? Во всех SAM7. В новых SAM3, кстати, тоже, но там это багом не является, т.к. входы не толерантны к 5V.
|
|
|
|
|
Apr 27 2010, 14:33
|
Гуру
     
Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164

|
Цитата Думаю, что это была книжка Редькина Точно. Он самый. А ведь как легко этот Редискин читается, жаль что чушь пишет. Посоветуйте что-нибудь из литературы? ПРичем мнебы какую-нибудь литературку, ориентированную на использование языка С для ARM. Ну а если пофантазировать какие еще проблемы с этим пуллапом могут быть? Когда действительно нужно быть осторожным?
|
|
|
|
|
May 11 2010, 05:38
|

Частый гость
 
Группа: Свой
Сообщений: 130
Регистрация: 8-08-08
Из: Новосибирск
Пользователь №: 39 488

|
Цитата(andrewlekar @ May 11 2010, 11:23)  IAR как IDE мне очень нравится. Чем?
|
|
|
|
|
May 11 2010, 09:00
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(kosyak© @ May 11 2010, 12:54)  А не могли бы Вы дать развернутую характеристику RVDS? Чем от keil'a отличается? - Поддерживает все ядра - Включает более продвинутый отладчик - Не содержит лишних "рюшечек" в виде MCU Database Компиляторы одинаковые, т.е. если работать с микроконтроллерами, и не прыгать выше 926-го ядра, то Keil подходит больше.
|
|
|
|
|
May 11 2010, 16:01
|
Гуру
     
Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164

|
ДОброго времени суток, господа! Вот и я делаю первые шаги в освоении ARM7. Сразу понял - как хорошо, что я все-таки сразу купил и программатор и отладочную плату. По крайней мере сэкономлю кучу времени, а денег не жаль. Плата - OLIMEX SAM7-P256 c контроллером AT91SAM7S256. Установил я себе KEIL 4.10 http://rutracker.org/forum/viewtopic.php?t=2305709Подключил отладчик, запустил простейший пример blinker, который мне при загрузке подсунул KEIL. ЗАпустил отладку. Подсоединил осциллограф, дабы засвидетельствовать блиньканье и удивился. Идут импульсы - по фронту плюс 0.5 вольт, по спаду - минус 3.3 вольт. Это как? Я ожидал видеть плюсовые импульсы. И ноль ожидал видеть нулем. Кстати, те выходы, которые в программе не задействованы - на них действительно ноль. А я уже собрался светодиоды напаивать - JTAG конечно хорошо, но от "визуальной" отладки никогда не откажусь. Осциллограмму прилагаю.
|
|
|
|
|
May 11 2010, 17:24
|
Местный
  
Группа: Свой
Сообщений: 283
Регистрация: 13-06-07
Из: Челябинск
Пользователь №: 28 391

|
Цитата(zheka @ May 11 2010, 22:50)  Так вот если (первый вариант==true), то я должен был столкнуться с этими же проблемами и при работе с AVR. Совершенно не обязательно. Знаю одного товарища, работает с AVR инженером (!!!), а пользоваться осциллографом как таковым и не умеет... PS. Если он прочитает эти мои слова - пускай ему будет стыдно
|
|
|
|
|
May 11 2010, 17:37
|
Гуру
     
Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164

|
Вот черт.... Я из-за вас разнервничался и крокодилом замкнул две соседние ножки - GND и VREF. Светодиод питания на мгновение погас - как при КЗ. И наверное я спалил стабилизатор LM1117, ибо он теперь при входном питании 12 вольт на выходе дает 5.9 вольт. Но - чудо!!! Горелым от чипа не запахло, импульсы на выходах идут с той же частотой, только они равны 5.9 вольт. KEIL отказывается работать с ним, предупреждая, что J-LINK будет поврежден. ПРогрмма J-LINK ARM тоже при загрузке предупреждает что высокое напряжение, но тем не менее, ядро видит и распознает. ПРограмма в проце, как я уже писал, шуршит, а ведь написано в даташите - "ABSOLUTE maximum operating voltage - 4.0 вольт."
|
|
|
|
|
May 11 2010, 18:08
|
Гуру
     
Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164

|
Цитата Ваша невнимательность... Учитесь признавать свои ошибки Признаю только свою криворукость на нервной почве. Но другого выхода, кроме как подсоединить крокодила на штырь в опасной близости к VREF, дабы доказать кое-кому что я не идиот и землю осциллографа цепляю именно к земле платы, у меня не было. По закону Мэрфи неприятность случилась. Впрочем, с другой стороны спасибо aaarrr за эту идею - я взял другую заведомо рабочую плату с АВР и обнаружил что картина осциллографии та же. Боюсь что ошибку придется признать не мне, а уважаемому zltigo. Ибо в итоге причина заключалась в предположенном мной пункте 2. А именно - глючил осциллограф. Я его выключил, включил и перезапустил софт. Все стало на свои места. На спаде 0 вольт, на фронте - напряжение питания. А выводы я делаю в очередной раз одни и те же: 1. Профессионализм не всегда отягощен вежливостью по отношению к менее опытным собеседникам, к сожалению наоборот. 2. Если человек отсылает к мануалам и матчасти - значит его настроение находится где-то посередине между "хочу как-то обозначить себя" и "хочу дать дельный совет". Это я по поводу обвинений меня в незнании осциллографии. Да, я знаю ее поверхностно, но логики мне хватило чтобы понять, что не умей я пользоваться осциллографом - у меня теже проблемы были бы и с АВР. До дающих советы профи это не дошло - как же, перед глазами возможность плюнуть в невежду. Была где-то здесь тема - у автора перестали вдруг программироваться ATMegи. Сколько плевков было в его адрес, сколько посылов к мануалам, сколько грамотеев искали соринки в разводке платы, в организации питания. И абсоютно пофиг что автор с пеной у рта объяснял - я 3 года раньше так делал, я и раньше так разводил платы, я вообще блокировочные конденсаторы по питанию не ставил - все получалось. В итоге оказалось, что автор купил новый комп и поставил туда плату расширения c LPT портом, а комп новый, быстрый. Вот и не успевал Byte Blaster за компом. Изготовление USB Petka полностью решило проблему. ОДнако!!! 6 вольт питания - проц работает и не греется, исправно шлет на выходы импульсы амплитудой 6 вольт. Хвала разработчикам.
Сообщение отредактировал zheka - May 11 2010, 18:17
|
|
|
|
|
May 11 2010, 18:19
|
Местный
  
Группа: Свой
Сообщений: 283
Регистрация: 13-06-07
Из: Челябинск
Пользователь №: 28 391

|
Цитата ОДнако!!! 6 вольт питания - проц работает и не греется, исправно шлет на выходы импульсы амплитудой 6 вольт. Хвала разработчикам. Верх дилетантства использовать абы какие режимы работы РЭК... Было вполне верно послать Вас читать DS. PS. Прежде чем пенять на zltigo стоило бы "руки выпрямить" и перестать нервничать...
|
|
|
|
|
May 11 2010, 18:21
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(zheka @ May 11 2010, 22:08)  Боюсь что ошибку придется признать не мне, а уважаемому zltigo. Ибо в итоге причина заключалась в предположенном мной пункте 2. А именно - глючил осциллограф. Я его выключил, включил и перезапустил софт. Все стало на свои места. На спаде 0 вольт, на фронте - напряжение питания. Ну, с кем не бывает. Вот только обнаружив отрицательные напряжения на выводах, я бы прежде всего крепко задумался о правильности подключения и исправности измерительных приборов, ибо взяться подобному безобразию там решительно неоткуда, чудес не бывает. Цитата(zheka @ May 11 2010, 22:08)  6 вольт питания - проц работает и не греется, исправно шлет на выходы импульсы амплитудой 6 вольт. Хвала разработчикам. А что ему не работать? Вот на ядро подайте 6В, тогда посмотрим
|
|
|
|
|
May 11 2010, 18:24
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(zheka @ May 11 2010, 19:50)  уважаемый zltigo. Варианта два: 1. я не знаю азов осциллографии. 2. я достаточно хорошо для начинающего (кажется так называется этот раздел) знаю основы работы с осциллографом, но столкнулся с чем-то что мне простительно не знать. Выберете любой пункт. Цитата Вы же язвите. Ни в малейшей степени - просто констатация того непреложного факта, что отрицательного напряжения там НЕТ. Что Вы там со своим осциллографом сотворили мене неведомо, а гадать просто не берусь.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
May 11 2010, 18:26
|
Местный
  
Группа: Свой
Сообщений: 283
Регистрация: 13-06-07
Из: Челябинск
Пользователь №: 28 391

|
Цитата(zheka @ May 12 2010, 00:24)  Где криминал и дилетантство? Вот в этом Цитата 6 вольт питания - проц работает и не греется, исправно шлет на выходы импульсы амплитудой 6 вольт. Хвала разработчикам.
|
|
|
|
|
May 11 2010, 18:29
|
Гуру
     
Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164

|
Цитата Вот только обнаружив отрицательные напряжения на выводах, я бы прежде всего крепко задумался о правильности подключения и исправности измерительных приборов, Это вы, знающий АРМ. А я новичок, ожидающий любых сюрпризов от нового камня. Цитата Ни в малейшей степени - просто констатация того непреложного факта, что отрицательного напряжения там НЕТ.Что Вы там со своим осциллографом сотворили мене неведомо. Не обманывайте. Вы тут же написали "Это значит, что надо начинать освоение осциллографа ". Могу согласиться лишь с тем, что глюков осциллографа вы предположить не могли. Но и не в праве были ставить диагноз "незнание матчасти".
|
|
|
|
|
May 11 2010, 18:41
|
Гуру
     
Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164

|
Цитата 6 вольт питания - проц работает и не греется, исправно шлет на выходы импульсы амплитудой 6 вольт. Хвала разработчикам. Ну если радость от того, что кто-то, кроме вас идиот, останавливает всякое мышления, для вас пишу пошагово: 1. Случайно замыкаю GND и VREF - получаю RESET. (проц в это время работает от 6 вольт, я об этом не знаю) 2. Не отключая плату, подключаю устройство на AVR, щупаю осциллографом (проц в это время работает от 6 вольт, я об этом не знаю) 3. Вижу ту же лажу на AVR, понимаю, что дело в осциллографе (проц в это время работает от 6 вольт, я об этом не знаю) 4. Перезагружаю софт, и осциллограф, щупаю плату с АВР, вижу нормальные сигналы (проц в это время работает от 6 вольт, я об этом не знаю) п.п.1-4 - около 1 минуты 5. Щупаю осциллографом AT91SAM7s256 - вижу 6-ти вольтовые импульсы. охреневание после п.5 ~ 2-3 секунды. 6. ОТключаю плату, трогаю микросхему - еле теплая. 7. Несмотря на то что плата отключена, понимаю что "6 вольт питания - проц работает и не греется, исправно шлет на выходы импульсы амплитудой 6 вольт." И НЕ ВИЖУ В ЭТОМ НИКАКОГО ДИЛЕТАНСТВА, а лишь отсутствие тактового генератора в воспитании оппонента. Спасибо. Свои глупые вопросы продолжу завтра, когда заменю стабилизатор. Кого я раздражаю, можете в тему не заходить. Цитата Все именно так и есть - понакрутили неведомо что в осциллографе вот и все. Это значит, что надо начинать освоение осциллографа. Все так и есть. Лады, вы правы, теперь буду знать что раз в 4 года в моем USB осциллографе возможне такой глюк. Только на матчасть эта информация никак не тянет. Хм.. насколько я знаю, в ARM есть встроенный стабилизатор, который наверное и спас ядро от 6 вольт. Значит наверное периферия могла погореть. Но ведь порты не погорели...
Сообщение отредактировал zheka - May 11 2010, 19:24
|
|
|
|
|
May 12 2010, 02:15
|
Местный
  
Группа: Свой
Сообщений: 283
Регистрация: 13-06-07
Из: Челябинск
Пользователь №: 28 391

|
Цитата(mdmitry @ May 12 2010, 03:44)  По поводу осциллографа: у некоторых есть дифференциальный режим работы входов и/или инверсия входа. Тип осциллографа и настройки органов управления хотелось бы узнать. Ну судя по скрину сигнала похоже на софт от этого аппарата: USB осциллограф DISCO http://www.avtodiagnostika.com/images/moto...ter/usb_osc.jpghttp://usb-osc.narod.ru/osc.htm
|
|
|
|
|
May 12 2010, 03:38
|
Гуру
     
Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164

|
mrKirill, с осциллографом вы угадали. Сергей БорщЦитата Есть SAM7S64. Тоже 6В подал и тоже из-за сгоревшего стабилизатора. Из ОЗУ работает без нареканий, флеш не шьется. Во время вчерашних "экспериментов" я ресетил плату и отсоединял шлейф. КОнтроллер работал. Значит с флешью все в порядке. Кстати, может быть вы при 6 вольтах пытались флеш шить, а я нет? Во всем нужно видеть плюсы. Из опасения что что-то сгорело я теперь в кратчайшие сроки начну разбираться со всеми узлами и проверять их, даже если они мне не нужны. ПРи работае с АВР я с такой необходимостью не сталкивался и как следствие - до сих пор не имею представления например, как работать со сторожевым таймером и аналоговым компаратором. P.S. прошу прощения у всех за свою вчерашнюю нервозность.
Сообщение отредактировал zheka - May 12 2010, 03:55
|
|
|
|
|
May 12 2010, 14:11
|
Гуру
     
Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164

|
Перепаял я стабилизатор, все нормально. Решил немного поиграться с кодом. Стандартный в KEIL UVision 4.03 пример blinky - не компилится. Пишет ошибку: Цитата Build target 'SAM7S RAM - ULINK' compiling Retarget.c... Retarget.c(11): error: #5: cannot open source input file "rt_misc.h": No such file or directory Target not created НАшел я поиском этот файл где-то далеко в подпапках, а куда копировать или где к нему прописать путь не нашел. Скопировал на всякий случай в папку Blinky - все равно не видит. Что делать? Еще вопрос - все функции в пункте меню Debug работают уже со скомпилированными файлами? То есть если я внес изменения и выбрал Debug, в проц зашьется страый вариант? И еще - в Options for target->debug->use в ниспадающем списке есть ulink, J-Link и еще что-то. Я выбираю J-Link. ОДнако в ниспадающем списке в верхнем горизонтальном меню во время отладки виден только ULINK, то есть SAM7S-FLASH ULINK, SAM7S-RAM ULINK и SAM7S-FLASH SAMICE. Почему так?
|
|
|
|
|
May 12 2010, 17:21
|
Местный
  
Группа: Свой
Сообщений: 244
Регистрация: 21-02-05
Из: Урал
Пользователь №: 2 806

|
Цитата(zheka @ May 12 2010, 20:11)  ... то есть SAM7S-FLASH ULINK, SAM7S-RAM ULINK и SAM7S-FLASH SAMICE. Почему так? Это названия "Project Targets", типов сборок ( типа Debug и Release) с разными опциями, меняются и добавляются в Project->Manage->Components,Environment>Books...
|
|
|
|
|
May 12 2010, 18:00
|
Гуру
     
Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164

|
То есть Вашмим словами - ULINK это не название программатора? Я указал путь к rt_misc.h явно. Теперь другая ошибка - Цитата .\Flash\Blinky.axf: Warning: L6310W: Unable to find ARM libraries. .\Flash\Blinky.axf: Error: L6411W: No compatible library exists with a definition of startup symbol __main. И это в простейшем примере, блин....
Сообщение отредактировал zheka - May 12 2010, 18:04
|
|
|
|
|
May 13 2010, 07:28
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(zheka @ May 13 2010, 09:57)  В АВР было просто - PORTA.1=1, либо PORTA.1=0; Тяжелое наследие CVAVR. В стандартном С нет записи вида Var.Bit Макросы имени Аскольда Волкова спрячут реализацию - что на AVR, что на ARM, что на PIC, что на MSP: on(LED); off(LED); Цитата(zheka @ May 13 2010, 09:57)  Объясните, если я пишу в CODR, то в SODR автоматом меняется значение и наоборот? Нет. Из SODR читать вообще нельзя. Для чтения состояния там соседний регистр. Логику вы поняли правильно. Цитата(zheka @ May 12 2010, 21:00)  То есть Вашмим словами - ULINK это не название программатора? Название программатора. Но ведь никто не запрещает этим же названием назвать совокупность значений опций среды, необходимых для сборки и отладки проекта именно этим программатором
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
May 13 2010, 07:38
|
Частый гость
 
Группа: Участник
Сообщений: 197
Регистрация: 8-04-05
Пользователь №: 3 977

|
Цитата(zheka @ May 13 2010, 10:57)  Как же все-таки сложно переделывать заложенные в голове азбучные истины. В АВР было просто - PORTA.1=1, либо PORTA.1=0; В ARM же CODR, SODR. Объясните, если я пишу в CODR, то в SODR автоматом меняется значение и наоборот? У меня складывается ассоциация как с кнопками - в АВР одна кнопка которую можно либо нажать либо отжать, а в SAM7 - две кнопки, из которых одновременно может быть нажата только одна, при нажатии одной, вторая автоматом отщелкивается. Я правильно понял логику работы пина? Вы полагаете, это плохо, что в ARM кроме записи слова в регистр аппаратно реализованы так же и установка отдельных битов регистра в 1, установка отдельных битов регистра в 0 и побитовая адресация регистров? Вам эти расширенные возможности обращения с регистрами мешают?
|
|
|
|
|
May 13 2010, 07:49
|

Профессионал
    
Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634

|
Цитата(zheka @ May 13 2010, 10:57)  Как же все-таки сложно переделывать заложенные в голове азбучные истины. В АВР было просто - PORTA.1=1, либо PORTA.1=0; В ARM же CODR, SODR. Объясните, если я пишу в CODR, то в SODR автоматом меняется значение и наоборот? У меня складывается ассоциация как с кнопками - в АВР одна кнопка которую можно либо нажать либо отжать, а в SAM7 - две кнопки, из которых одновременно может быть нажата только одна, при нажатии одной, вторая автоматом отщелкивается. Я правильно понял логику работы пина? А мне очень понравилось это расширение от привычной по AVR схемы. Вот как выглядят привычные подпрогаммы выдачи полубайтов: Код #define LCD_TARGET_PORT_S (AT91C_BASE_PIOA->PIO_SODR) #define LCD_TARGET_PORT_C (AT91C_BASE_PIOA->PIO_CODR)
#define LCD_DIRECTION_PORT_S (AT91C_BASE_PIOA->PIO_OER) #define LCD_DIRECTION_PORT_C (AT91C_BASE_PIOA->PIO_ODR) #define LCD_INPUT_PORT (AT91C_BASE_PIOA->PIO_PDSR) // was PINA
#define STROBE_BIT AT91C_PIO_PA31 #define WRITEE_BIT AT91C_PIO_PA1 #define ADDRES_BIT AT91C_PIO_PA0 #define DATAS_BITS (AT91C_PIO_PA26 | AT91C_PIO_PA25 | AT91C_PIO_PA24 | AT91C_PIO_PA23) #define DATA_BIT_LOW 23 // какой бит данных младшй в слове считанном с порта
// sent four bits from d7..d4 of argument v static void ws1602_send4_high(uint_fast8_t v) { LCD_TARGET_PORT_S = (v << (DATA_BIT_LOW - 4)) & DATAS_BITS; LCD_TARGET_PORT_C = ~ (v << (DATA_BIT_LOW - 4)) & DATAS_BITS; }
// send four bits from d3..d0 of argument v static void ws1602_send4_low(uint_fast8_t v) { LCD_TARGET_PORT_S = (v << (DATA_BIT_LOW - 0)) & DATAS_BITS; LCD_TARGET_PORT_C = ~ (v << (DATA_BIT_LOW - 0)) & DATAS_BITS; }
static uint_least8_t ws1602_pulse_strobe(void) { uint_fast8_t v;
LCD_TARGET_PORT_S = STROBE_BIT; // activate EN signal ws1602_delay(); v = (LCD_INPUT_PORT & DATAS_BITS) >> DATA_BIT_LOW; LCD_TARGET_PORT_C = STROBE_BIT; // deactivate EN signal ws1602_delay(); return v; }
Сообщение отредактировал Genadi Zawidowski - May 13 2010, 07:54
|
|
|
|
|
May 13 2010, 08:17
|
Гуру
     
Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164

|
Цитата Нет. Из 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. охох..голова кругом, сколько плясок с бубном...
|
|
|
|
|
May 13 2010, 09:32
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(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 (но компилится он в абсолютно те же команды).
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
May 13 2010, 11:27
|
Гуру
     
Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164

|
Ну вот еще одна непонятка. Опять таки сравниваем 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 порта. Подскажите как это сделать, тогда мне будет от чего отталкиваться, а то от макроса в последнем вложении голова кругом пошла.
|
|
|
|
|
May 13 2010, 11:44
|
Частый гость
 
Группа: Участник
Сообщений: 197
Регистрация: 8-04-05
Пользователь №: 3 977

|
Цитата(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, остальные не меняются
|
|
|
|
|
May 13 2010, 12:38
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(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?
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
May 13 2010, 14:44
|
Гуру
     
Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164

|
С битами 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 целы. Комментирование/раскомментирование Вашей строки не меняет результат.
|
|
|
|
|
May 13 2010, 14:46
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(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
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
May 13 2010, 14:58
|
Гуру
     
Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164

|
Значит так, господа давайте изложу проблему детально. 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.
|
|
|
|
|
May 13 2010, 16:10
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(zheka @ May 13 2010, 19:45)  то есть OWER нужно включать единожды? Можно единожды. Цитата(zheka @ May 13 2010, 19:45)  И все что в нем единица будет рабоать как старый добрый PORTA=0xAA ? При записи в ODSR - да.
|
|
|
|
|
May 13 2010, 17:33
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(zheka @ May 13 2010, 17:44)  А второй строкой вы что хортели сделать? Сбросить в 0 те биты, которые равны нулю в байтах a и b. Для этого на месте этих битов надо записать единицы в CODR. Цитата(zheka @ May 13 2010, 17:44)  НИже код - наличие/присутствие строки ничего в симуляторе не изменило. Естественно - результат вашего выражения - ноль, а запись нулевых битов в CODR не имеет эффекта. Именно поэтому ваши средние биты остаются нетронутыми в моей записи.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
May 14 2010, 05:22
|
Частый гость
 
Группа: Участник
Сообщений: 197
Регистрация: 8-04-05
Пользователь №: 3 977

|
Цитата(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 Но тут беда в другом - не все биты порта выведены на пины. Почему? А кто же его знает...
|
|
|
|
|
May 14 2010, 07:01
|
Частый гость
 
Группа: Участник
Сообщений: 197
Регистрация: 8-04-05
Пользователь №: 3 977

|
Цитата(zltigo @ May 14 2010, 10:49)  Я имел ввиду, то, что я написал - Ваши расуждения о свойствах GPIO конкретного LPC нималейшего отношения к какому-либо ядру не имеют и только по факту переходе на ядро Cortex-M3 счастья от обладания такими GPIO не появится. Все. Только у lpc GPIO реализовано корректно? Как ячейка памяти. То есть поддерживает команду - вывод значения регистра в память? У остальных производителей микропроцессоров на ядре кортекс GPIO не поддерживает этой команды и ее приходится эмулировать? Извините, я этого не знал. И что Вы так нервничаете? Сказали бы - есть производители кортексов, у которых GPIO кривое, и все дела...
|
|
|
|
|
May 14 2010, 10:35
|
Частый гость
 
Группа: Участник
Сообщений: 197
Регистрация: 8-04-05
Пользователь №: 3 977

|
Цитата(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" На мой вопрос - это про что - ответа не получено...
|
|
|
|
|
May 14 2010, 11:36
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Вот и Вы, похоже, нервничаете  У ядра Cortex, которое Вы упомянули, есть только адресное пространство для периферийных устройств 0x40000000-0x5FFFFFFF. Какие там будут устройства, зависит от производителя конкретного микропроцессора. Когда Вы сказали "переходите на Cortex", подразумевая там некие регистры портов, это вызвало справедливое замечание zltigo. Надеюсь, я объяснил правильно? А bit-band я просто так упомянул, высказал свое мнение.
|
|
|
|
|
May 14 2010, 12:46
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(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, которые вы обвиняете в кривизне. Как выясняется - даже не зная, как они устроены.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
May 14 2010, 13:35
|
Частый гость
 
Группа: Участник
Сообщений: 197
Регистрация: 8-04-05
Пользователь №: 3 977

|
Цитата(Сергей Борщ @ 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)  Вот и Вы, похоже, нервничаете  У ядра Cortex, которое Вы упомянули, есть только адресное пространство для периферийных устройств 0x40000000-0x5FFFFFFF. Какие там будут устройства, зависит от производителя конкретного микропроцессора. Когда Вы сказали "переходите на Cortex", подразумевая там некие регистры портов, это вызвало справедливое замечание zltigo. Надеюсь, я объяснил правильно? А bit-band я просто так упомянул, высказал свое мнение. Он что то отмалчивается. Может Вы ответите - есть кортекс, у которого нет команды вывода регистра в порт? Или он разразился этим исходя из чисто теоретической возможности, что такой кортекс сделать можно? В этом случае замечание ну очень справедливое... И даже не замечание а целый разнос.
|
|
|
|
|
May 14 2010, 14:21
|
Частый гость
 
Группа: Участник
Сообщений: 197
Регистрация: 8-04-05
Пользователь №: 3 977

|
Цитата(Сергей Борщ @ May 14 2010, 18:04)  Был вопос - как записать 2 байта в порт не трогая остальные 16. Ваш вариант из одной команды, пусть даже для кортекса? Это был второй вопрос. Первый - как в порт записать 0x0000ffff а затем 0xaaaa5555. И именно посмотрев ответы на этот вопрос я предложил перейти на кортекс. А п овторому вопросу - полагаете, то, как это делается в кортексе, корявее чем приведенные для исходного чипа? Цитата(ViKo @ May 14 2010, 17:50)  Отвечу (еще раз) - у Cortex вообще нет портов! Ага. У него всего навсего 6 букв из латинского алфавита. И что? А вот если Вы про то, что под этим названием - то возможны разные варианты... Уточню для любителей строгости - есть ли микропроцессоры с ядром Cortex M3, у которых не реализована команда вывода из регистра в порт? Если это не совсем строго, Вы не стесняйтесь, поправляйте. Я не гордый, переспрошу... Мне же интересно, на меня просто так наехали ( мимоходом ) или за этим хоть что то есть...
|
|
|
|
|
May 14 2010, 14:24
|
Гуру
     
Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164

|
Vallav, я конечно еще лох, но попробую тявкнуть - те три варианта, которые вы написали для Кортекса, в АРМ пишутся как SODR, CODR и ODSR. Про ODSR вы не знали, вот и предложили Кортекс, решив что там этот третий вариант есть. Господа, давайте не будетм засорять тему спорами об архитектуре камней. Я пришел с работы, сел за плату, сейчас ведь вновь засыплю вас глупыми вопросами)))
|
|
|
|
|
May 14 2010, 18:03
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
А можно я еще чуть-чуть про 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... "не читал"
|
|
|
|
|
May 14 2010, 18:47
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(zheka @ May 14 2010, 21:29)  Неужели нет каких-нибудь библиотек? А какая, простите Вам "библиотека" нужна, дабы организовать тупой цикл? Код void delay3t( unsigned long value ) { __asm( " subs r0, #1\n" " bne.n delay3t\n" " bx lr" ); } Мегагерцы по три такта в задержку сможете сказать препроцессору пересчитать?
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
May 14 2010, 19:27
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(zheka @ May 14 2010, 22:13)  ЧТо помешает? Например вот это: А чем компилим-то? А.... еще у меня крыша на Cortrex последние дни заклинила для ARM надо subs r0, r0, #1 и bne Ну и задержки будут достаточно отфонарные, ибо waistates на Flash, ну и уcкорители с кэшами тоже встречаются даже на младшеньких ARM7 А вообще такие вещи надо куда-ибудь в ассеблерный фальчик, например, в startup запихивать.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
May 15 2010, 07:37
|
Частый гость
 
Группа: Участник
Сообщений: 197
Регистрация: 8-04-05
Пользователь №: 3 977

|
Цитата(zheka @ May 14 2010, 18:24)  Vallav, я конечно еще лох, но попробую тявкнуть - те три варианта, которые вы написали для Кортекса, в АРМ пишутся как SODR, CODR и ODSR. Про ODSR вы не знали, вот и предложили Кортекс, решив что там этот третий вариант есть. Господа, давайте не будетм засорять тему спорами об архитектуре камней. Я пришел с работы, сел за плату, сейчас ведь вновь засыплю вас глупыми вопросами))) Так вопрос решен? И в SAM7 есть вывод значения регистра в порт? Просто те, кто на этот вопрос отвечал, этого не знали... Так что было бодягу разводить - сразу запостили бы это. Или поговорить захотелось? Цитата(zltigo @ May 14 2010, 22:15)  Я даже полным дятлам третий раз повторять не буду. А пытаться замазать потоками флейма свое ламерство ( причем уже не в первый раз ), это уже, как администратор, настоятельно не советую - флейм наказуем. Тык Вы просто на вопрос ответьте, буквально коротко - В таком то чипе с ядром кортекса от такой то фирмы нет вывода значения регистра в порт. И флейм сразу прекратится... Или не знаете такого чипа и решили включить административный ресурс? А дятлом быть не хочется...
|
|
|
|
|
May 15 2010, 07:38
|
Гуру
     
Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164

|
Цитата А чем компилим-то? Компилим в KEIL uVisioin4. Цитата для ARM надо subs r0, r0, #1 и bne Я так понял, что дело не только в этом - компилятору само объявление ассемблерной строки не понравилось.
|
|
|
|
|
May 15 2010, 07:59
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(zheka @ May 15 2010, 10:38)  Компилим в KEIL uVisioin4. Это оболочка поддерживающая разные компиляторы. А компилятор Вы не назвали  . Для 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 писать эти несколько строк - совсем никчему с этими диалектами разбираться в подавляющем большинстве случае.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
May 15 2010, 08:09
|
Гуру
     
Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164

|
Цитата Это оболочка поддерживающая разные компиляторы. А компилятор Вы не назвали Не знаю, там ли я смотрю: 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 - добавляю нужный хидер. Компилятор все равно выдает ту же ошибку. ВОпрос - где он ищет этот хидер? Как заставить его искать в корневой папке проекта?
|
|
|
|
|
May 15 2010, 08:30
|
Гуру
     
Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164

|
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,
|
|
|
|
|
May 15 2010, 10:47
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Цитата(zheka @ May 15 2010, 11:36)  Еще такой вопросец, а как перенести из текстового файла в KEIL русский текст? В файле были русские комментарии, при включении в KEIL видны крякозяблики. Да, есть такая шняга. Решений 2: - изменить вид шрифта для комментариев с курсива на прямой - изменить в ключе реестра HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage значение «1252» на «1251» Я пользовался первым до недавнего времени. Теперь перешел на второй способ.
|
|
|
|
|
May 15 2010, 11:05
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(AHTOXA @ May 15 2010, 11:33)  PROGMEM уберите, это от АВР. Если таскать исходники туда сюда, то лучше Код #define PROGMEM добавить.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|