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

Сергей Борщ

Модератор
  • Постов

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

  • Посещение

  • Победитель дней

    31

Весь контент Сергей Борщ


  1. Однозначно первый вариант. Второй и третий ломаются элементарно - пишется прошивка которая тупо сливает по любому доступному интерфейсу содержимое "неизменной" части прошивки. В отличие от AVR атмел не догадался вставить в ARM возможность защитить одну область кода от чтения из второй области. На AVR второй и третий вариант проходят замечательно. Причем сэкономленное на дешифровке место в программной памяти можно использовать для необновляемых (и тоже защищенных от чтения) низкоуровневых функций управления окружающим железом.
  2. Еще можно посмотреть проект Ethernut http://www.ethernut.de/
  3. IAR+SAM7X256+MT-link

    Придумал. Reset() { __writeMemory32(0xA5000004, 0xFFFFFD00, "Memory"); // reset the peripherals if( __driverType("jlink") ) { __sleep(1000000); // wait __emulatorSpeed(32000); // set JTAG speed ~ slow clock } __writeMemory32(0x00000001, 0xFFFFFC20,"Memory"); // OSC enable, no timeout while (! (__readMemory32(0xFFFFFC68, "Memory") & (1 << 0)) ); // wait until MOSCS __writeMemory32(0x00190605, 0xFFFFFC2C,"Memory"); // *26/5 set LOCK after 6 SCLK __writeMemory32(0x00000004, 0xFFFFFC30,"Memory"); // PRES = 2 while (! (__readMemory32(0xFFFFFC68, "Memory") & (1 << 3)) ); // wait untli MCKRDY __writeMemory32(0x00000007, 0xFFFFFC30,"Memory"); // MCK = PLLCK / 2 while (! (__readMemory32(0xFFFFFC68, "Memory") & (1 << 3)) ); // wait untli MCKRDY if( __driverType("jlink") ) { __emulatorSpeed(0); // auto-detect new JTAG speed __sleep(1000000); // wait } __message " MCK ready "; }
  4. IAR+SAM7X256+MT-link

    Да, виноват. Работает. Поставил JTAG speed Fixed 32 KHz все работает. Но медленно :-( Это не красиво. Мне скажем вообще не надо run to main. Надо подумать как заставить его из .maс "прийти в себя"
  5. IAR+SAM7X256+MT-link

    Не работает. Во всяком случае с IAR4.30A - "Memory access timed out @ 0x00000010 -> JTAG speed too high?" Правда пользую MT-Link без RDI. Какая у вас версия IAR?
  6. Неизвестно. Не должно. Как именно объявляешь? Да.__root __eeprom volatile const unsigned char params[2] @DATA_ADDR = {1, 2}; __root __eeprom volatile const unsigned char crc[1] @CRC_ADDR = {0x12}; Но зачем хранить данные которые не используются?
  7. Что-то у меня в памяти крутится что примерно год назад на каком-то из форумов обсуждался похожий вылет какой-то программы после установки какого-то Firewall. Вроде Outpost. Уж не про ИАР ли тогда писали? Поскольку я тем файрволом не пользовался и не собирался, все забыл. Т.е. конкретно помню только что какая-то программа вылетала из-за файрвола и замена файрвола на другой все лечила. Не ваш случай? Файрвол не ставили недавно?
  8. В том то и дело что все читал. Но уже не найти где именно. Если не сложно в двух словах повторите... В той же ветке, на которую дал ссылку zltigo мое понимание ситуации. На данный момент это вылилось в такую добавку к .maс: execUserReset() { ............... Reset_AIC(); __message "-------------------------------Set PC Reset ----------------------------------"; __writeMemory32(0x00000000,0xB4,"Register"); } var i; Reset_AIC() { // AIC __writeMemory32(FFFFFFFF, 0xFFFFF124,"Memory"); // IDCR, disable ints for (i = 0; i < 32; i++) { __writeMemory32(0, 0xFFFFF000 + * 4,"Memory"); // SMR[0..31] __writeMemory32(0, 0xFFFFF080 + * 4,"Memory"); // SVR[0..31] } for (i = 0; i < 8; i++) { __readMemory32(0xFFFFF100,"Memory"); // IVR, __writeMemory32(0, 0xFFFFF130,"Memory"); // EOICR, reset priority controller logic } } не скажу, что работает идеально, но существенно помогает. и конечно AT91C_BASE_AIC->AIC_EOICR = 0 в __low_level_init(); после инициализации контроллера (шаманство, но помогает).
  9. У ИАРа для ARM есть __intrinsic int __segment_size(segment). В стоящем у меня ИАРе для AVR такой функции нет. К тому же почти уверен, что компилятор не допустит вызова функции при инициализации глобальной переменной. Могу предложить заход "из-за угла". extern void ee_size(); uint32_t __eeprom eAdrProgEnd = (uint32_t)&ee_size; trick.s90: PUBLIC ee_size RSEG EEPROM_I ee_size EQU SIZEOF(EEPROM_I) END Т.е. передавать константу из ассемблера (где можно ей присвоить размер сегмента) как адрес фиктивной функции. Это конечно нечестно, но другого способа придумать не могу :-(
  10. Поверьте, разберется, я же разобрался хотя меня это очень мало интересовало в застенках ВТУЗа :) . Я почти неспособен (из-за какого то внутреннего протеста, что ли) усваивать знания практическое применение которых я не нахожу или не понимаю, но только я пойму для чего это надо, и это уже совсем другой я :) . Эдакий эгоизм в познании, если угодно... Это все мне знакомо, однако есть у меня и противоположный опыт - в школе математика давалась на "ура" в ВУЗе вышка не пошла вообще - трояк с натягом, сейчас она мне очень нужна, и книжки читаю, а все равно "не доходит". Приходится методом тыка. Рискну предложить-приложить МГУ, К.Ю.Богачев, ОСРВ предварительные материалы лекций. Судя по оглавлению толковая книжка. P.S. Если кто желает - киньте в ваши закрома на фтп. rtos.part1.rar rtos.part2.rar
  11. Вот таких тонкостей не знаю. Все что попадались, от самых разных производителей, все имели именно такую конфигурацию, ограниченную контроллером-прототипом HD44780 Физически вытекает из архитектуры контроллера. В противном случае требуется дополнительный драйвер столбцов (дисплеи 16*2 имеют уже две "капли")
  12. Дело в программе и невнимательном чтении документации. ЖКИ дисплеи 1 строка*16 символов с точки зрения общения с ними представляют из себя дисплеи 2 строки*8 символов у которых строки "склеены" в одну. Поэтому первое знакоместо имеет адрес 0x00, восьмое - 0x07, девятое - 0x40 и шестнадцатое - 0x47. Так что ваша программа должна сама отслеживать желаемое положение курсора и корректировать его.
  13. как сказал vmp, читать иструкцию: #include <inarm.h> TStatusReg StatusReg; StatusReg = __get_CPSR(); do { __set_CPSR(StatusReg | (1<<7)); } while (!(__get_CPSR() & (1<<7))); // disable IRQ
  14. На самом деле если ваши функции умещаются в 2К вместе с загрузчиком - прошивальщиком, то вполне можно воспользоваться для них областью загрузчика в флеши АВРа. При одной из комбинаций фузов эта область заблокирована для чтения из остальной флеши. Отдаете заказчику прошитый кристалл, он дописывает свою часть в application - секцию. Выпускаем устройство таким методом - все функции управления железом скрыты, заказчик имеет доступ к ним через API.
  15. Извечный спор откуда начинать - с практики или теории. Поскольку не верю в "Нужно будет, человек и с математикой этого разберется", то дальше обсуждать не буду.
  16. 4. Для первого - поверхностное знание теории (неучет причин по которым дохнут аппараты), для второго - получение результата методом тыка свидетельствует о недостаточной подготовке, т.е. непровессионализме.
  17. В вашем ответе изначальное предположение о том, что хотя бы один из них является профессионалом может быть ложным. Скажем так.
  18. Отлаживаете через JTAG? Учитываете, что кнопка "сброс" в оболочке сбрасывает только ядро, но не периферию, т.е. если перед нажатием кнопки "сброс" таймер был включен, то он продолжает тикать? Учитываете, что если открыто окно с регистрами периферии, это вызывает их чтение и сброс некоторых флагов (и другие действия по чтению некоторых регистров)?
  19. Спорить не буду. (но останусь при своем мнении). А чего тут спорить? У производителя в соответствующем разделе находим: http://www.powertip.com.tw/technical/techn...ey=Technical#a6 Precautions For Using Of LCDs Do not apply DC voltage http://www.darisus.com/data/Display_EL/DE158-RS-20_84.pdf Voltage mode - static Driving frequency, min 30 typ 32 max 100 Hz Опа... вот тут я всех обманул в посте выше. Нормальная частота оказывается не 32КГц, а 32 Гц. Да и у уважаемых производителей (Atmel) находим (AVR063: LCD Driver for the STK504): The LCD must be driving by alternating current (AC). Direct current (DC) will cause electrophoresis effects in the liquid crystal and will degrade the display. There are two AC driving method: the static driving methods and the multiplex driving method. In the static driving method, the LCD is driven with two square waveforms. Вот еще до кучи ссылка: http://www.pacificdisplay.com/lcd_static_drive.htm
  20. Согласен. Но вопрос задан конкретно. Кто профессионал? Варианты ответов: 1 и 2. Вопрос хоть и конкретный, но некорректный. Вот я вам задам аналогичный вопрос: "Вы уже перестали бить свою жену по ночам?" Вариантов ответа даю вам два - "Да" и "Нет". Выбирайте.
  21. Статик драйвер вовсе не означает допустимость постоянного напряжения. Это означает лишь наличие одной подложки на все сегменты, т.е. отсутствие мультиплицирования. Точно такой же тип как и у исходного E0803. Для управления такими индикаторами на подложку подается меандр частотой около 32КГц, а на сегменты такой же меандр - на зажигаемые противофазно подложке (к ЖК между подложной и сегментом оказывается приложено напряжение +-Uп), на погашеные - синфазно (напряжение на ЖК = 0). В качестве примера можно посмотреть даташит на микрочиповский драйвер AY0438. Подробно про управление дисплеями с разным мультиплицированием можно почитать в даташитах на контроллеры с встроенным драйвером ЖКИ, например очень подробно с диаграммами расписано в User Guide на msp430x3xx.
  22. Пожалуй я тоже вставлю слова, т.к. вложенные прерывания использовал, и как решить ту задачу без них не представляю (при помощи ШИМ генерится огибающая аналогового сигнала, при периоде ШИМ 128 тактов процессора его обработчик прерывания выполняется за 105...120 тактов, а в оставшиеся такты надо за 40 периодов ШИМ подготовить данные для следующих 40 периодов без участия основной программы, т.е. в обработчике другого прерывания). Решается довольно просто: void Timer1_compA_handler() { TIMSK &= ~(1<< OCIE1A); //запрещаем это прерывание __enable_interrupts(); // разрешаем вложенные собственно обработчик, вложенные прерывания разрешены __disable_interrupts(); // запрещаем вложенные TIMSK |= (1<< OCIE1A); разрешаем это прерывание } Резюме - панически бояться вложенных прерываний не нужно. Но тщательно обдумывать любое решение необходимо.
  23. Глюк. Часто происходит если "внутри" одного полигона оказывается другой. Помогает разбивка полигона на два, меньшего размера.
×
×
  • Создать...