Jump to content

    

Сергей Борщ

Модераторы
  • Content Count

    9105
  • Joined

  • Last visited

Everything posted by Сергей Борщ


  1. ASM: приказали долго жить?

    Цитата(vanner @ Jun 20 2006, 08:03) ЦитатаДаже программируя на асме не всегда можно получить что хотел - вмешивается компилятор. 2 arttab: Первый раз слышу, чтобы компилятор мешал при компиляции ассемблерного кода. Может примерчик. Пожалуйста. сделайте RJMP на +0x400 слов (переход из таблицы векторов Boot-области в Application). Согласно описанию AVR Instruction Set в качестве аргумента RJMP берет смещение в словах. Однако "втюхать" это смещение ассемблеру от IAR "в лоб" невозможно. Асм от WinAVR такое тоже есть отказался.
  2. AVR + Micrel

    Цитата(beer_warrior @ Jun 18 2006, 06:25) 2 jekler попробуйте для начала, хотя бы сделать меандр не 1Гц, а где-то на уровне килогерца, и подключить светодиод прямо на выход приемника.А чтобы не сломать глаз разглядывая на светодиоде 1 КГц, подключите к выходу приемника через конденсатор порядка 0.1мкф наушник.
  3. LCD DV-16244S1FBLY/R

    Цитата(Petka @ Jun 17 2006, 23:58) проскочила мысль. не перепутали ли вы нумерацию контактов?А чего тут гадать? Описаний на этот индикатор полный интернет. гугля по запросу "DV16244" выдал море ссылок. Вот одна из них: http://www.gaw.ru/pdf/lcd/lcm/Data_Vision/char/dv16244.pdf Не хочу никого расстраивать, но нумерация у него (ряд выводов внизу, слева направо): 14...1, 15, 16. Конечно это несколько неожиданно, "но так есть"
  4. Битовые сдвиги

    Цитата(CSB @ Jun 17 2006, 19:45) В ассемблере у меня получается две команды: очистка регистров и все! Оптимизация: переключатель в положении "скорость", в списке выбрано None (Best debug support). Кроме того получается разный результат при a = 1ULL << 7; и n = 7; a = 1ULL << n;Что-то не так. Приведи весь код. Вот что получается у меня: Кодvolatile int a; void main (void) {     int n = 7;     a = 1ULL << 7;     a = 1ULL << n; }      19          void main (void) {    \                     main:    \   00000000   939A               ST      -Y, R25    \   00000002   938A               ST      -Y, R24      20              int n = 7;      21              a = 1ULL << 7;    \   00000004   E800               LDI     R16, 128    \   00000006   E010               LDI     R17, 0    \   00000008   ....               LDI     R30, LOW(a)    \   0000000A   ....               LDI     R31, (a) >> 8    \   0000000C   8300               ST      Z, R16    \   0000000E   8311               STD     Z+1, R17      22              a = 1ULL << n;    \   00000010   8300               ST      Z, R16    \   00000012   8311               STD     Z+1, R17Результат одинаковый.
  5. Битовые сдвиги

    Цитата(CSB @ Jun 17 2006, 19:07) Спасибо. Но в сязи с этим возникает другой вопрос. Делаем тип переменной "а" unsigned long long. Как теперь сдвинуть на, например, 40 бит? Тут проблемы возникают даже при сдвиге на 7 бит.Где проблемы возникают? Код  unsigned long long a;   a = 1ULL << 40;      21              a = 1ULL << 40;    \   00000002   E000               LDI     R16, 0    \   00000004   E051               LDI     R21, 1    \   00000006   ....               LDI     R30, LOW(a)    \   00000008   ....               LDI     R31, (a) >> 8    \   0000000A   8300               ST      Z, R16    \   0000000C   8301               STD     Z+1, R16    \   0000000E   8302               STD     Z+2, R16    \   00000010   8303               STD     Z+3, R16    \   00000012   8304               STD     Z+4, R16    \   00000014   8355               STD     Z+5, R21    \   00000016   8306               STD     Z+6, R16    \   00000018   8307               STD     Z+7, R16 IAR AVR v4.10B Цитата(CSB @ Jun 17 2006, 19:07) Если провести присваивание вида a = 1ULL; то получим в "а" значение 0x0100000000000000; Получается какя-то путаница в байтах числа. При a = 0xAFFULL; а == 0xFF00000000000000 a = 0xABCDEFABCDEFABCD; a == 0xCD00000000000000 Похоже вы не в ту сторону считаете, это у вас от кейла для x51 привычка к BigEndian. У AVR младший байт располагается по младшему адресу.
  6. LCD DV-16244S1FBLY/R

    Цитата(ps1x @ Jun 17 2006, 17:32) Вот БЛИН!!! Что я мог сделать не так???!!!Подал вместо 5в 12?
  7. Битовые сдвиги

    Цитата(CSB @ Jun 17 2006, 18:01) Код     n = 16;     a = 1 << n; По идее в переменной "а" должен быть установлен 16 бит, а на деле там 0. Какие есть идеи? 1 имеет тип int. Для avr int имеет 16 бит. Соответственно любой int сдвинутый на 16 будет нулем, что и имеем. Решение: привести 1 к типу unsigned long (или к unsigned long long) или сразу указать что она такого типа: Код     a = (unsigned long long)1 << n; или      a = 1ULL << n;
  8. LPC2132

    Цитата(zltigo @ Jun 17 2006, 10:18) 1. Информация по складу обновляется четко.Ув. zltigo. У вас есть какие-либо каналы закупок в mt-sistem? Интересуют некоторые позиции, а гонцов в Питер что-то не намечается...
  9. Цитата(DRUID_3 @ Jun 16 2006, 05:33) Так, для статистики, выскажусь и я. Сам не паял но видел вживую таких умельцев. (Прямо как по Пелевину, сам не видел но видел тех кто видел ). И действительно тот человек пользовался обычным строительным феном с насадками купленным за 80 гривен (16$). Причем поскольку это был ремонт, то человеку удавалась как отпайка, так и припайка (!). Здесь правда сноровка нужна...Я тренировался на хардах-фуджиках. У них TQFP208(?) с большим теплоотводом под корпусом. Их отпаивал грея плату снизу тем же феном. где-то за 3-4минуты припой плавится даже при нагреве сквозь плату. Тут главное не спешить и не слишком приближать фен к плате - иначе текстолит перегревается и коробится. Тренировка минимальная - вторая-третья микросхема выпаивается уже без проблем. Только не спешить.
  10. Цитата(Mitek @ Jun 15 2006, 20:00) Что то никто непишет, а так хочется узнать секрет правильной пайки кроватки под PLCC, да как поаккуратнее отпаять сам чип тоже.Обычным строительным феном грею в минимальном режиме с расстояния 7-10 см. Грею около 40 сек подсунув под микросхему тонкий пинцет как рычаг. Когда припой расплавляется пинцет под собственным весом падает, микросхема приподнимается - это сигнал ее снимать. И тут же не прекращая нагрева кладу на площадки смазанную флюсом панельку, выравниваю, убираю фен. Все. Если я те панельки имею ввиду. Вот такие: http://www.brownbear.ru/foto/foto/60028.jpg
  11. Цитата(GetSmart @ Jun 14 2006, 16:05) Не пугайте сразу человека кучей конденсаторов. Достаточно по одному керам. 0.1 на микросхему.Так я так и написал...
  12. Цитата(li4 @ Jun 14 2006, 14:22) Люди, суперогромное вам спасибо! . За такой короткий срок уже даже схема получилась. Начинаю проектировать печатную плату и ближе к выходным думаю можно будет протестировать что получилось.Ага, начнем совместно писать прогу. Много нового о себе узнаем :-) ЦитатаА по поводу блокировочных емкостей, для вас, я понимаю, это очевидно, но я не еще не вкурсе, куда их надо лепить?Элементарно: по керамической емкости 0.1 мкф между ножками питания и земли каждой микросхемы как можно ближе к микросхеме. Для более высокочастотных схем ставят 0.1 и параллельно 0.01, для совсем вч еще 100пф можно поставить в параллель. Вот тут более детально рассказывают: http://electronix.ru/forum/index.php?showtopic=17382&hl=
  13. Цитата(GetSmart @ Jun 13 2006, 18:32) Господа, помогите человеку! Лично я не знаю чем конвертить, а граббить экраны прямо из пикада лень.Я тоже не знаю. Напечатал в pdf, в таком виде вроде все понимают.
  14. Цитата(GetSmart @ Jun 13 2006, 11:02) Желающие могут покритиковать схему1)То же что и в схеме li4: При переходе от записи к чтению будет конфликт на шине, когда память начинает выдавать данные а регистр еще не убрал с шины свои. Если регистр будет убирать раньше - скорее всегно будут сбои. В общем лучше какой-то из сигналов (LE?) завести на ~CS памяти. Заодно и потребление в режиме хранения снизится. 2) Где емкости блокировочные? :-)
  15. Цитата(li4 @ Jun 12 2006, 16:13) Опасаюсь что в ней могут быть ошибки, поэтому прошу вас посмотреть и если действительно что-то не так, то подсказать как сделать правильно.1)У тебя получилось, что в регистры мл. адреса и данных (DD1, DD8) всегда записывается одинаковая информация. Я бы регистр DD8 подцепил в цепочку к DD1, DD7. При чтении информация в нем не важна и достаточно будет задвинуть 16 бит адреса. 2) сигнал разрешения выхода на DD8 подается одновременно с сигналом записи. А память скорее всего требует чтобы к моменту сигнала записи данные уже стояли. Надо бы задержать сигнал записи RC-цепочкой. 3) Питание на регистры, память и емкости блокировочные у каждого корпуса не забудь. 4) Очень рекомендую керамику 0.1мкф параллельно С1
  16. Помогите начать с IAR

    Цитата(SasaVitebsk @ Jun 10 2006, 00:36) Существуют опции проекта. как сгенерировать .xcl файл соответствующий опциям проекта? поставить галочку "генерить .map" В шапке файла идет вся командная строка вызова линкера. То же и с компилятором - все ключи в шапке .lst файлов. Цитата1) Галочками всё (как уже оказалось у меня) не высставишь. В опциях компилятора есть специальное место куда можно вписать все недостающие опции в виде клюей командной строки компилятора. То же и для линкера. В качестве бонуса можно использовать макросы $TOOLKIT_DIR$, $PROJ_DIR$ и т.п. Цитата2) Опции проекта, при переустановке системы (вирусок хапнул) безвозвратно теряются. 3) А если бы был создан файл, то был бы сохранён. Чудеса говорите. Все опции проекта хранятся в файлах .ewp, .ewd которые обычно находятся в директории проекта вместе с исходниками. В качестве бонуса в директории проекта создается директория settings в которой хранятся файлы описывающие расположение окон и прочие установки C-SPY. Так что здесь все придумано за нас и именно так как надо. Цитата4) Даже при краткой работе с IDE понятно что надо куда-то линять. Можно перечислить 20 пунктов чем она меня не устраивает, но для человека достаточно и одного. Ну это "на вкус и цвет". Я привык, меня устраивает. Я с VIM не смог подружиться, а многие от него в восторге. Поэтому я для текстовых файлов пользую notepad а если нужны номера строк - ту же IAR IDE. ЦитатаС другой стороны внесение изменений в программу на С, - это же просто песня!!! После ассемблера. А вот это уже "слова юноши, но мужа" :-)) Кстати, символы _..X в начале имен констант в командной строке, придающие ужасность этим именам - это признак для C-SPY не воспринимать эти значения в качестве адресов меток и таким образом не показывать эти имена в окне дизассемблера.
  17. Переход с AVR на ARM

    Цитата(AVR @ Jun 9 2006, 02:05) Спасибо. Как увидеть содержимое регистров в EW-ARM? т.е. как по мере выполнения программы у меня меняется AT91C_BASE_PIOA->PIO_PDSR и любой другой регистр? Регистры общего назначения, статуса при отладке отображаются, но непонятно где посмотреть все прочие регистры. Добаления в список watch не помогает...Или в том же окне (там в верхней части окна есть выпадающее меню периферии-где написано CPU registers) или открыть еще одно такое же (View->Registers) и в нем выбрать какую периферию смотреть.
  18. Переход с AVR на ARM

    Цитата(AVR @ Jun 9 2006, 00:29) Мне для примера хотя бы увидеть программу, которая бы устанавливала в единицу все разряды. Код#include <stdint.h> #include <ioAT91SAM7S64.h> void main() {     AT91C_BASE_PIOA->PIO_PER = (uint32_t)-1;        // all outputs are IO     AT91C_BASE_PIOA->PIO_OWER = (uint32_t)-1;        // direct write to all pins allowed     for(;;) {         AT91C_BASE_PIOA->PIO_ODSR = 0;        // all outputs = 0         AT91C_BASE_PIOA->PIO_ODSR = (uint32_t)-1;    // all outputs = 1         AT91C_BASE_PIOA->PIO_SODR = (1<<0);    // PIOA.0 = 1         AT91C_BASE_PIOA->PIO_CODR = (1<<0);    // PIOA.0 = 0     } } примерно так...
  19. IAR, J-Link и прерывания

    Цитата(zltigo @ Jun 8 2006, 15:19) Цитата(Сергей Борщ @ Jun 8 2006, 10:19) Поборол принудительным сбросом контроллера прерываний в процедуре инициализации. У меня как правило работает часть прерываний. Можно, конечно попробовать и сбросы всего, что попало в скрипт инициализации добавить. Попробую на досуге. Может не совсем правильно выразился, вот sgrig понял. Под сбросом я понимал вот что: ЦитатаVICVectAddr: Writing to this register does not set the value for future reads from it. Rather, this register should be written near the end of an ISR, to update the priority hardware. Почему-то мне запомнилась фраза "This will reset VIC logic", хотя сейчас в мануале ее не нашел, видимо сам ассоциативно выдумал ;-). Для AT91 аналогичное происходит при записи в EOICR.
  20. Цитата(TamTam @ Jun 8 2006, 11:30) 00000000 10000000 01000000 00100000 00010000 00001000 00000100 00000010 00000001 loop КодPORT = (PORT >> 1) | (PORT << 7); Вроде так? Нет, или так: КодPORT = PORT ? PORT >> 1 : (1<<7); или так: PORT = (PORT >> 1) | ( (PORT == 0) <<7);
  21. IAR, J-Link и прерывания

    Цитата(sgrig @ Jun 7 2006, 14:53) Прежде чем пойти и тихо удавиться решил попросить совета здесь. В результате ряда манипуляций с программой, отлаживаемой в IAR ARM v.4.11a с помощью J-Link из IAR-KIT добился следующего: В отладчике не работают никакие прерывания, хотя все служебные регистры читаются как надо. Вне отладчика - все работает как надо. Еще несколько часов назад и в отладчике все было отлично. Что случилось, понять не могу, уже близок к суициду Буду рад любым соображениям по теме... Было подобное. То генрятся то нет. Соображения такие: при сбросе отладчиком происходит только сброс ядра, но не контроллера прерываний. Если перед этим обрабатывалось какое-то прерывание и логика контроллера не была сброшена (VICVecAddr = 0 или AIC_EOICR = 0) то следующее прерывание не генерится. Поборол принудительным сбросом контроллера прерываний в процедуре инициализации.
  22. const в ИАР

    Цитата(at90 @ Jun 8 2006, 09:07) Раньше работал в кодэвижен. Но теперь нада портировать Uc/gui для AVR. В кодэвижене это проблемно. Cобрал проект для меги 128 + внешнее озу 32kb + индикатор 320 на 240. Но постоянно не хватает стэка. Походу он переменные с CONST не помещает во влэш. Пытался вместо const посавить __flash. Но много ошибок на нессответсвие типов. И проект сдишком огромный. кучу текста нада перелопачивать. Можно как нить побороть эту беду. 1) использовать const __flash 2) обратить внимание на описание параметров функций, которым эти константы передаются (тоже должны быть описаны как const __flash)
  23. Вопрос начинающего по АРМ

    Цитата(evgforum @ Jun 6 2006, 00:25) Может надо какие-то настройки в Linker делать или еще где в проекте? Там все по дефолту. Оптимизацию отключал Ага, посмотрел проект - файл .xcl по умолчанию линкует для неизвестного процессора в результате ОЗУ попадает на адреса 0x10000. Отсюда все грабли.
  24. Вопрос начинающего по АРМ

    Цитата(evgforum @ Jun 6 2006, 13:04) Цитата И ногами дергал через макросы on() off() имени Аскольда Волкова. Что это? В 2000г Аскольд Волков посылал в конференцию ru.embedded свои макросы работы с портами для AVR. А это творческая переработка: Код#ifndef    ASCOLD_SAM7_H__ #define    ASCOLD_SAM7_H__ #ifdef    __IAR_SYSTEMS_ICC__ #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) #define _clrH(port,bit)                 do { AT91C_BASE_PIO##port##->PIO_CODR = (1 << bit); } while(0) #define _bitL(port,bit)                 (!(AT91C_BASE_PIO##port##->PIO_ODSR & (1 << bit))) #define _bitH(port,bit)                 ( AT91C_BASE_PIO##port##->PIO_ODSR & (1 << bit)) #define _cpl(port,bit,val)              do { AT91C_BASE_PIO##port##->PIO_ODSR ^= (1<<bit); } while(0) #define _dir_out(port,bit,val)          do { AT91C_BASE_PIO##port##->PIO_OER = (1<<bit); } while(0) #define _dir_in(port,bit,val)           do { AT91C_BASE_PIO##port##->PIO_ODR = (1<<bit); } while(0) #define dir_out(x)                      _dir_out (x) #define dir_in(x)                       _dir_in (x) #define _set(port,bit,val)              _set##val(port,bit) #define on(x)                           _set (x) #define SET                             _setH #define _clr(port,bit,val)              _clr##val(port,bit) #define off(x)                          _clr (x) #define CLR                             _clrH #define _bit(port,bit,val)              _bit##val(port,bit) #define signal(x)                       _bit (x) #define BIT                             _bitH #define cpl(x)                          _cpl (x) #endif    // __IAR_SYSTEMS_ICC__ #endif    //ASCOLD_SAM7_H__ Вот его комментарий по использованию: ЦитатаМакросы SET,CLR,BIT и CPL служат для работы со стандартными SFRами, описанными в стандартных заголовках. А для своих собственных определений я использую on,off,signal и cpl. Пример использования: #define Pin1 PORTD,5,H /* бит 5 порта PORTD, активный уровень высокий */ #define Pin2 PINA,3,L /* бит 3 порта PINA, активный уровень низкий */ ... if(signal(Pin2)) on(Pin1); else off(Pin1); Ну идею ты, наверное, понял. Описание активного уровня я добавил для большей наглядности, а также потому, что изменение полярности сигнала при модификации случается не реже,чем перестановка ножек. Ну а для AT91 это будет выглядеть так: Код#define    LED    A,0,H            // PIOA, bit 0, active high #define    KEY    A,20,L           // PIOA, bit 20, active low if(signal(KEY))     on(LED); else     off(LED); ЦитатаХотя с Самбой все работает. А как прошиваете?Из IAR C-SPY через JTAG.
  25. Пара вопросов по программированию

    Цитата(white.wind @ Jun 6 2006, 14:59) 1. Несколько раз встречал в исходниках на ассемблере двойную инициализацию стека на старте, один раз до SEI, второй сразу после. Недавно стал изучать программирование C и встретил опять, посмотрев генерируемый код. Чем может быть обусловлена двойная инициализация? 2. Мне казалось, заглянув в исходник delay, я там сразу увижу реализацию на таймере, по крайней мере возможность выбора, но там только циклы. Пож. ответветте хотя бы одним предложением почему так (неэффективно? сложно для реализации? ... ). 1. Неизвестно. Возможно стартап слинкован из двух кусков который писали разные люди. Всегда делаю один раз. Этак можно в любой регистр по нескольку раз записывать. 2. Разработчики компилятора не имели возможности знать какой именно таймер свободен в вашем проекте, как он настроен или может он и занят но свободно одно из его прерываний. Написать универсальный код для этого невозможно. А через циклы - оно дает гарантированную задержку "не менее чем" и должно использоваться там где ошибка в задержке "плюс лапоть" некритична. Например при выводе на индикатор.