Перейти к содержанию
    

mungo

Участник
  • Постов

    63
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные mungo


  1. Суть проблемы. Свою плату сделали, макетную. LPC4078FET180. BGA сами понимаете не особенно гибкий в вариациях корпус, но для решения моей задачи подходит. Есть USB device port с обычным USB mini. По какой-то непонятной причине стандартные примеры, которые есть в инете, не хотят нормально работать. Кейлом сгенеренное все заточено именно под плату Embedded Artists LPC4088 Developer's Kit board. Вот и хотелось бы увидеть, что в схеме затупил, где различие.

    Наша схема взята из даташита на камень.

    Происходит что-то непонятное - то енумерации нет вообще, и прерывания при подключении не происходят, то при передаче данных размером больше эндпоинта (например, 80 байт) переходит в исключение "плл1 сдох".

    Покупать их плату за 99 евро, только чтобы схему увидеть (а иначе не дают) дороговато...

  2. ББ - Большой Брат. Комп то есть.

    Ок, я был не прав, дьявол кроется в деталях. Похоже, что хардварный калькулятор в ББ работает иначе, как впрочем и софтварный в IAR 7.5. То есть для данной точности в 4.40 он то, что считает слишком малым числом, оставляет хвостом, а остальные его отбрасывают. Поэтому получаем не ровно 1, а 1.[куча нолей]9. Вот оттуда и минус...

    Кто же знал про такие особенности...

  3. И что? Где проблема? Ожидаемая погрешность, если она отлична от нуля, будет гораздо больше. Следовательно, вот эти малые числа порядка 10^-16 следует считать строго нулём для ваших целей. Короче, ограничивайте точность при выводе результата, как вам и советовали выше.

    Чуть выше видно, что она есть. Более того, как объяснить, что с теми же данными по таким же формулам ББ считает верно?

  4. double x,x1;
    x=1092/1001; // Оба числа целые и результаты измерения входного сигнала
    x1=1/11; // Константы, указывающие на приращение по отношению измерения 1092
    x-=x1; // Исключаем из измерения результат приращения измерения, являющийся погрешностью
    sprintf(s,"%.14g",x-1.0); // здесь выводим абсолютную погрешность измерений, которая не должна быть больше 1 (-1)

    На каждую строку специально делал вывод значений, всё вычислялось верно. А вот когда делаю -1, то видим -1.11022е-16.

     

    Вроде куда уж подробнее...

  5. "%.14g"? Не помогает.

    Здесь идет вычисление погрешности измерений. Нужна точность, которая является никакой, если брать 2 знака.

  6. Приветствую, господа!

    Есть типа код:

    double x,x1;
    x=1.09; // На самом деле результат вычилений 1.[09]
    x1=.09; // аналогично, 0.[09]
    x-=x1; // ожидаемо, 1
    sprintf(s,"%g",x-1.0); // Вот и проблема! -1.11022е-16

    У кого есть идеи, как побороть? Пробовал в другом компилере, результат, ессно, 0. Более того, эти же данные (в сыром виде) передаются на комп, там по той же формуле из тех же данных идет вычисление, и получается 0.

     

    Компилер менять не тема - много переносить, и слишком много использовано особенностей данной версии.

     

    Исходные данные: IAR 4.40A (4.42A), AT91SAM7X256 (ARM7), CPP.

  7. Господа, ткните нуба в примерчик простой реализации USB Device HID. Те примеры, что идут от производителя, универсальные, и начинающему в данном случае ничего не понять...

    Задача пока простая - подлючить к компу плату, избежать установки специфических драйверов, принять байтик и выкинуть в ответ что-нибудь...

  8. Господа, никто не подскажет, что делать? Поставил новый IAR, он сказал, что прошивка в моем программаторе древняя, надо обновить. Ничтоже сумняшеся я согласился. Теперь программатор при включении загорается красным, думает, потом отваливается от шины, потом коннектится и видится в системе, как J-Link. Но! Не работает, то есть никак. И при каждом обращении к нему просит обновить прошивку.

    Пробовал через утилиту консольную, jlink.exe. Пишет "Replacing firmware: J-Link V9 compiled Oct 12 2012 BTL". И так бесконечно.

     

    Производитель признал, что это их проблема, но отправлять его в Киев из Минска - это жесть. Растаможка знаете-ли...

     

    Никто сам не смог вылечить подобное?

  9. Попала такая плата с целью изучить, как работает чудный камень LPC4088. В комплекте шел кабель для РС-232. Больше ничего.

    Слил с нета FlashMagic. Запустил по умолчанию, попробовал прошить одну из демок. И посыпалось - то ошибка Autobaud, то после этого нет обмена данными. Кабель естественно проверил.

    Вопрос: если кто имел дело с этой платой, то как её прошить кабелем?

    З.Ы.: с предшественником LPC2478 знаком, он прошивался без вопросов по РС.

  10. Так и сделал.

    Появился еще вопрос - можно как-то глобально выравнивание поменять, не выписывая везде прагму? А то 8 байт дофига, когда работаешь с епром на 8 кб, а подбирать всюду надоедает...

  11. __section_begin("CODE_ID")

    __section_end("CODE_ID")

     

    Разве вам не это надо ???

    Дело в том, что таких названий секциий нету, это раз, а два - код и данные разделились как я понял, поэтому нет точного адреса окончания прошивки.

  12. Чудесно, сегменты исчезли, появились секции, и они ни к чему не обязывают.... Здорово... Хоть возвращайся к старому компилеру...

    А по второму вопросу?

  13. Вот обновился и впал в ступор. Раньше была директива #pragma segment="CODE_ID" и по ней я мог вычислить, где начало/конец прошивки. Мне это нужно для проверки целостности было.

    Это первая проблема.

    Взял старт код из примеров. У меня AT91SAM7X256. Все конечно заработало. Но дальше стало совсем интересно. Решил добавить формирование CRC линкером. Но как оказалось происходит ремап из адреса 0 в 0x100000. И как результат линкер впадает в ступор - генерит прошивку размером более мегабайта, и, ессно, прошивальщик грит что прошивка не влезет.

     

    Кто знает, как найти конец прошивки и сформировать вменяемую прошивку с CRC?

     

  14. Частота по датешите 25,175, а делителем можно выставить только 24. Или 36, но это много и не работает. С выставлением всех вот проблемы - взято готовое, и не понимаю, как связать то, что в .пдф на ЖК с тем, что задается для LPC. В первом задано время, во втором - какие-то такты непонятно чего.

    Может вы просто пояните, что к чему в LPC (каюсь, до этого работал только с атмелами).

  15. Есть LPC2478, SDRAM Samsung K4S561632H, TFT AM-640480G2TNQW-T08H. Досталась самодельная платка. Схема как по даташитам, ничего особенного. Кварц 12 МГц, множитель 12 делитель 1, PLL 288 МГц. Частота проца 72, USB 48. То есть классика.

    Запуск SDRAM:

    SCS|=0x00000002;   // Reset EMC.
    EMCCONTROL=0x00000001; // Enable EMC and Disable Address mirror.
    PCONP|=0x00000800;   // Turn on EMC PCLK.
    PINSEL5=0x05050555; // CAS,RAS,CLKOUT0_1,DYCS0_1,CKEOUT0_1,DQMOUT0_1.
    PINSEL6=0x55555555; // D0-D15.
    PINSEL8=0x55555555; // A0-A15.
    PINSEL9=0x10555555; // A16-A23,OE,WE,BLS0_1,CS_0_.
    EMCDYNAMICRP  =2; // Command period: 3(n+1) clock cycles.
    EMCDYNAMICRAS =3; // RAS command period: 4(n+1) clock cycles.
    EMCDYNAMICSREX=7; // Self-refresh period: 8(n+1) clock cycles.
    EMCDYNAMICAPR =2; // Data out to active: 3(n+1) clock cycles.
    EMCDYNAMICDAL =5; // Data in to active: 5(n+1) clock cycles.
    EMCDYNAMICWR  =1;    // Write recovery: 2(n+1) clock cycles.
    EMCDYNAMICRC  =5;    // Active to Active cmd: 6(n+1) clock cycles.
    EMCDYNAMICRFC =5;    // Auto-refresh: 6(n+1) clock cycles.
    EMCDYNAMICXSR =7;    // Exit self-refresh: 8(n+1) clock cycles.
    EMCDYNAMICRRD =1;    // Active bank A->B: 2(n+1) clock cycles.
    EMCDYNAMICMRD =2;    // Load Mode to Active cmd: 3(n+1) clock cycles.
    EMCDINAMICRDCFG=1; // Command delayed strategy.
    EMCDYNAMICRASCAS0=0x00000303; //  Default setting, RAS latency 3 CCLKs, CAS latenty 3 CCLKs.
    EMCDYNAMICCFG0=0x00000680;  // 256MB, 16Mx16, 4 banks, row=13, column=9.
    delayMs(100); // 100 ms.            
    EMCDINAMICCTRL=0x00000183; // Mem clock enable, CLKOUT runs, send command: NOP.
    delayMs(200); // 200 ms.            
    EMCDINAMICCTRL=0x00000103; // Send command: PRECHARGE-ALL, shortest possible refresh period.
    EMCDINAMICRFR=2; // Set 32 CCLKs between SDRAM refresh cycles.
    for (int i=0; i<0x40; i++) asm("nop"); // Wait 128 AHB clock cycles.
    EMCDINAMICRFR=28; // Set 28 x 16CCLKs=448CCLK=7us between SDRAM refresh cycles.
    //To set mode register in SDRAM, enter mode by issue
    //MODE command, after finishing, bailout and back to NORMAL mode.
    EMCDINAMICCTRL=0x00000083; // Mem clock enable, CLKOUT runs, send command: MODE.
    dummy=*((volatile unsigned int*)(SDRAM_BASE|(0x33<<12))); // Set mode register in SDRAM.
    EMCDINAMICCTRL=0x00000000;    // Send command: NORMAL.
    EMCDYNAMICCFG0|=0x00080000; // Enable buffer.
    delayMs(1); // 1 ms.
    EMCSTATICWAITWEN0 =0x2; // Selects the delay from chip select 0 to write enable.
    EMCSTATICWAITOEN0 =0x2; // Selects the delay from chip select 0 or address change, whichever is later, to output enable.
    EMCSTATICWAITRD0  =0x1f; // Selects the delay from chip select 0 to a read access.
    EMCSTATICWAITPG0  =0x1f; // Selects the delay for asynchronous page mode sequential accesses for chip select 0.
    EMCSTATICWAITWR0  =0x1f; // Selects the delay from chip select 0 to a write access.
    EMCSTATICWAITTURN0=0xf; // Selects the number of bus turnaround cycles for chip select 0.
    EMCSTATICCNFG0    =0x00000081; // Selects the memory configuration for static chip select 0.

    LCD:

    PCONP|=0x00100000; // Power Control for CLCDC.
      // Assign pin:
    PINSEL0&=BIN32(11111111,11111111,11111111,11111111);
    PINSEL0|=BIN32(00000000,00000101,01010101,00000000); // P0.4(LCD0), P0.5(LCD1), P0.6(LCD8), P0.7(LCD9), P0.8(LCD16), P0.9(LCD17).
    PINMODE0&= BIN32(00000000,00000000,00000000,00000000);
    PINSEL3&=BIN32(11111111,11111111,11111111,11111111);
    PINSEL3|=BIN32(00000101,01010101,01010101,00000000); // P1.20(LCD10), P1.21(LCD11), P1.22(LCD12), P1.23(LCD13), P1.24(LCD14), P1.25(LCD15), P1.26(LCD20), P1.27(LCD21), P1.28(LCD22), P1.29(LCD23).
    PINMODE3&=BIN32(00000000,00000000,00000000,00000000);
    PINSEL4&=BIN32(11111111,11111111,11111111,11111111);
    PINSEL4|=BIN32(00000101,01001111,11111111,11111111); // P2.0(LCDPWR), P2.1(LCDLE), P2.2(LCDDCP), P2.3(LCDFP), P2.4(LCDENAB), P2.5(LCDLP), P2.6(LCD4), P2.7(LCD5), P2.8(LCD6), P2.9(LCD7), P2.12(LCD18), P2.13(LCD19).
    PINMODE4&=BIN32(00000000,00000000,00000000,00000000);
    PINSEL9&=BIN32(11111111,11111111,11111111,11111111);
    PINSEL9|=BIN32(00001010,00000000,00000000,00000000); // P4.28(LCD2), P4.29(LCD3).
    PINMODE9&=BIN32(00000000,00000000,00000000,00000000);
    PINSEL11&=BIN32(11111111,11111111,11111111,11111111);
    PINSEL11|=BIN32(00000000,00000000,00000000,00001101); // bit0=1 - LCD port is enabled.    bit1...3 = 110 TFT 16-bit. (1:5:5:5 mode)
    // ADJ_PH.
    PINSEL7_bit.P3_24=0x00;
    FIO3DIR_bit.P3_24=1;
    FIO3SET_bit.P3_24=1;
    // Pixel serializer.
    /* This block reads the 32-bit wide LCD data from the output port of the DMA FIFO and
         extracts 24, 16, 8, 4, 2, or 1 bpp data, depending on the current mode of operation. The
         LCD controller supports big-endian, little-endian, and Windows CE data formats. */
    // For HV Mode, DV Mode 16-bit
    LCD_CFG=2;
    LCD_TIMH=((131<<24)|(17<<16)|(11<<8)|(((640/16)-1)<<2));
    LCD_TIMV=((11<<24)|(32<<16)|(2<<10)|480);
    LCD_POL=((0<<27)|(1<<26)|(((640/1)-1)<<16)|(0<<14)|(0<<13)|(1<<12)|(1<<11)|(0<<6)|(0<<5)|(2<<0));
    LCD_CTRL=((0<<10)|(0<<9)|(0<<8)|(1<<5)|(4<<1)|(0<<0)); // 100 = 16 bpp, 1:5:5:5 mode. 101 = 24 bpp (TFT panel only). 110 = 16 bpp, 5:6:5 mode.
    LCD_UPBASE=SDRAM_BASE;
    LCD_LPBASE=SDRAM_BASE;
    for (int i=0;i<50000;i++);
    LCD_CTRL|=1;
    for (int i=0;i<50000;i++);
    LCD_CTRL|=1<<11;

     

    Код почищен, есть только запуск. Затем тупо записываем муар в видеопамять - чередование черный цвет/серый 50%. Видим: изображение дрожит, будто низкая частота кадров. При этом проц крутится в пустом цикле, ничего не делая.

    Если вставляем в пустой цикл запись любого значения в любой адрес SDRAM, картинка разваливается - выглядит, как помехи на телевизоре при отсутствии сигнала. При этом память значения держит, ничего не изменяется и не теряется. То есть очевидно, что контроллер дисплея тупит.

     

    Поэтому вопросы:

    1. Кто знает, что не так запущено? Как убрать мерцание муара?

    2. Какие могут быть особенности, чтобы контроллер LCD не обваливался при записи в SDRAM?

    3. Не к железу вопрос, а к софту. Как IARу объяснить, что SDRAM можно использовать под HEAP например? Ручками назначать указатели и писать свой менеджер памяти неохота...

    4. Хотел приделать работу с масштабируемыми шрифтами, но задача переделки freetype linux'ового под МК мне показалсь слишком сложной. Есть ли что попроще готовое?

     

    Буду крайне благодарен за любые советы.

  16. Проблема в чем: взял те, что дает атмел, но результат один - это работает "кое-как". Поясню: если отклоняемся от примера, то начинаются проблемы. Я пробовал передавать большие пакеты в 2-х направлениях, и получалось, что часть данных терялась навсегда. А данные, которые отправляет принимающая сторона, сваливаются в кучу с данными, которые приняты. Получается невообвазимая каша.

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

    Подскажите, пожалуйста...

  17. Недавно дали подержать на 2 минуты платку неизвестного китайского производителя. К сожалению, сфотографировать не удалось. Плата размером примерно 50 на 30 мм. На ней камень самсунг s3c??? (не запомнил), 32 Мб ОЗУ, флеш 32 параллельная и последовательная st25.

    Собственно вопрос: есть ли в природе такие мини платы разработки, чтобы их можно было купить? Хотелось бы сваять более-менее серьезный девайс, но самому разводить многослойную плату на 217 BGA корпус, а потом производить достаточно сложно. Тем более, когда нужен не слишком массовый девайс...

  18. Простите сразу. Ламер, тупило. Да. Не бейте сильно. Просто голова пухнет, не знаю, что и делать.

    Ситуация. Есть AT91SAM7X256. Большая тяжелая программа. Работает, как часы. Но вдруг, по абсолютно невнятным причинам в какой-то неопределенный момент времени есть зависания. Просто девайс перестает отвечать на запросы. Экран замирает, клавиатура не работает.

    Включен вачдог. Есть прерывание от таймера, которое срабатывает на частоте 1,5 кГц, которое сбрасывает вачдог. Если бы зависание было в коде, то вачдог бы работал конечно. Но есть косвенное подтверждение того, что он не работает. На этом же прерывании висит опрос клавиатуры 6х5. Соответственно постоянно прыгают уровни на ногах. Но когда попал на стол такой аппарат, то ничего не прыгало! При это должен бы по идее сработать вачдог, но нет! И согласно докам, это одноразовый регистр, то есть его можно включить, но нельзя выключить.

    Что подскажите? Хоть что-нибудь!

  19. Всё-таки не в моей кривости дело. Поставил 5.41.1, собрал, команда осталась на месте. Правда, как обычно, новые особенности. Переделали весь синтаксис асма, и как следствие, все процедуры запуска пришлось брать фирменные из примеров и под себя адаптировать. Да и вообще, если честно, хорошая среда разработки - ИАР. Но вот компилятор - ужас! Какие-то свои стандарты. Раньше пробовал кейл, тот правда не предупреждал о некоторых моих тупизмах (типа вызова из прерывания библиотек), но ему не надо было через одну переменную обозначать volatile. Странно это если честно - переменная и есть она, и кейвордить каждую утомительно.

  20. Листинг с глюком в студию.

    Я привел суть. Полный лист 100 кб прошивки - это знаете-ли много.

     

    Ах, да. Этот "х" является глобальной переменной, потому что еще прерывание таймера его обрабатывает (типа, если 1, то считывать АЦП).

  21. IAR ARM v4.40a.

    Недавно очень долго боролся с программкой, которая никак не работала. Определенно глюк компилера.

    volatile int x;
    
    void func1()
    {
    ... код какой-то
    // если отработал, х не меняем и выходим
    x=0;
    }
    
    int main()
    {
    x=1; func1();
    if (x) ...; else ...
    x=0; ....
    return 0;
    }

     

    Суть: потом допер, полез в дизасм. Если в последних строках убрать х=0, то все как-бы работает. Но переменная используется дальше, так что это как-бы и не выход. А в том виде, как оно выглядит, первое присваивание х=1 просто выкидывается. Чтобы он этого не делал, нужно выключать оптимизацию напрочь. Но это ведь не выход, ибо текущий объем прошивки уже за 100 кб вышел.

    Поборол косвенно - перестроив порядок команд. То есть искривив программу.

     

    Вопрос: сталкивался ли кто и есть ли смысл обновлять до версии 5? Всё ли там пучком с оптимизатором?

  22. 2 недели боролся. Оказалось, что, несмотря на документацию по карточке, команда для чтения блока берет не блок относительно сектора, а абсолютный блок по всей карточке.

    Западлисты, однако, китайцы. Хорошо, хоть сами в этом признались. Летом этой инфы на их сайте еще не было.

×
×
  • Создать...