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

esaulenka

Свой
  • Постов

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

  • Посещение

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

    2

Весь контент esaulenka


  1. Скачайте с segger.com софт J-Link. Там в комплекте неплохую документацию дают. Ключик для софта (если надо) буквально на днях искали здесь: http://electronix.ru/forum/index.php?showtopic=101535
  2. Господа, ну не путайте вы топикстартера... У него каша в голове только увеличиваться будет... :( IAP во всех LPC'шках есть, причём один и тот же - отличается от того же LPC214x буквально на чуть-чуть - другими адресами. Более того, добрые NXP прямо по этой просьбе сделали AppNote: http://www.nxp.com/documents/software/AN11...th_software.zip Там, правда, кейл, но на общую идею "как это работает" влиять не должно. Возможно, это решение слишком избыточно для десятка переменных, которые меняются раз в полгода и все вместе, но ТЗ нам никто не предоставил :) Да, и ещё: если ещё нет "МК без EEPROM (LPC1114)", а есть только планы, можно заложиться на LPC1114XL. Если верить документации, они ввели во флеше понятие "страница" - 256 байт, которые можно стереть за раз. По сравнению с предыдущими камнями, когда стирание шло блоками по 4 килобайта, это очень удобно для Вашей задачи.
  3. Я не знаю, что такое LPC2249, но... У него PCLK (PCLK0-1-2-3) и PCONP есть? Там битики нужные стоят?
  4. Тут бесполезно дистанционно советы давать. Начните с отключения всего, что только возможно, добейтесь работоспособности (мигания диодом, выдачи каких-то сообщений в UART), а потом прикручивайте (постепенно!) остальное. Несколько облегчить работу может JTAG.
  5. АЦП будет мерять предыдущее значение, "каких-то пауз" не предусмотрено. "Всё выключено" - это просто частный случай с N=0. Demeney, спасибо. Надо бы вывод всех значений организовать, посмотреть, что там с помехами. А то кажется мне, что если усреднять уже посчитанное Rвнутр, ошибок больно много будет... При небольших нагрузках оно даже отрицательным может получится - если помеха "перебьёт" просадку напряжения.
  6. Ну да, я слышал что-то :-) Проблема в том, что вся эта конструкция весьма заметно "шумит" - значение сопротивления каждый раз будет меняться. Вопрос, как его усреднять, с учётом того, что "известное сопротивление" у меня каждый раз будет разным.
  7. Есть система, представляющая собой нагрузку типа "N резисторов параллельно" с управлением от микроконтроллера. Питается оно от аккумуляторов (внутреннее сопротивление аккумуляторов и нагрузки, если N максимальное, сопоставимо). Количество одновременно включенных резисторов переменное (рулится контроллером, заранее предсказать сложно) от 0 до N. Также в контроллер заведено напряжение с аккумуляторов - на АЦП. Теперь самое интересное - необходимо обеспечить постоянство энергии, передаваемой в каждый из резисторов, изменяя время их включения. Пока напряжение было постоянным (от внешнего блока, там пульсаций немного было), всё было просто. Алгоритм следующий - померяли напряжение, (пропустили через усреднялку типа "скользящее среднее"), выставили N, включили. А теперь после "включили" напряжение-то и поменялось. Вариант "включить, померять k раз, усреднить, посчитать время выключения" не проходит, т.к. включать надо на единицы миллисекунд, и в промежутках ещё кучу всего делать. Величину нагрузки в каждый момент я знаю довольно точно (N резисторов + ещё потребление прочих элементов), а вот с внутренним сопротивлением аккумуляторов засада - завтра пользователь их поменяет, послезавтра производство другую партию закупит... Вопрос: что делать-то? Читать про Калмана? Вроде бы самое оно... Вот только не делал я никогда, даже "простейший одномерный случай без входного воздействия".
  8. Shivers, если получится, расскажите, пожалуйста, технологию. Вопрос рисования своих шрифтов довольно актуален. Да, размер, наверное, что-нибудь типа 10x16. Дробных (не кратных 8) размеров не стоит боятся - там не очень много арифметики выходит. У меня вывод сотни строк в секунду (полный вывод, с кучей дополнительных расчётов, а не только растеризация) отнимает около 15% времени у LPC1768. В принципе, можно заметно сократить это время. Но пока всё работает :-)) И с отдельным буфером дисплея, возможно, не нужно заморачиваться. На ARM9 делал вывод на экран 640*480 - просто складывал байты в область видеопамяти, не думая о переключении страниц. Работало довольно неплохо, но т.к. основная функция этой софтины была в отображении надписи "Loading WinCE", её не сильно оптимизировали :-)
  9. Некрасиво это. Как-то исторически сложилось, что настройка ног - в одном месте, а дальше её никто не меняет. И портировать драйвер на другие пины не так удобно будет... Но это единственное препятствие :)
  10. Угу. Например, мастер в лице нашего контроллера решил перезагрузиться в момент передачи от слейва. Ситуация такая вполне вероятна (более того, наши тестировщики умеют повторять её на одном из устройств; пользователи, правда, не жаловались - они не щелкают кнопкой включения десяток раз подряд). Методика лечения очень простая - 9 раз дёрнуть клок, не выдавая ACK. Но как это сделать, не перенастраивая ноги, я не знаю. Может, кстати, при ошибках обмена такое же делать?.. А то я сейчас просто стоп-старт шлю, если что-то не так. Так что +1 к вопросу. Только у меня LPC.
  11. LPC210x_ISP.exe

    у флешмэджика тоже есть командная строка, между прочим
  12. LPC1756+AT45DB081D

    Нет, ну не нравятся мне эти супер-библиотеки! Вся эта супер-портабельная фигня заменяется ОДНОЙ строкой. void GPIO_SetValue(uint8_t portNum, uint32_t bitValue) { LPC_GPIO_TypeDef *pGPIO = GPIO_GetPointer(portNum); if (pGPIO != NULL) { pGPIO->FIOSET = bitValue; } } static LPC_GPIO_TypeDef *GPIO_GetPointer(uint8_t portNum) { LPC_GPIO_TypeDef *pGPIO = NULL; switch (portNum) { case 0: pGPIO = LPC_GPIO0; break; case 1: pGPIO = LPC_GPIO1; break; case 2: pGPIO = LPC_GPIO2; break; case 3: pGPIO = LPC_GPIO3; break; case 4: pGPIO = LPC_GPIO4; break; default: break; } return pGPIO; } LPC_GPIO0->FIOSET = (1UL<<16); По делу: Описание того, что флеш и контроллер находятся на разных платах, я упустил... Осталось только проверить, что земли одинаковые, и хорошо связанные. О! И что ещё вспомнил!! Я ведь тоже м/с на "соплях" подвешивал! В даташите на эту флеш указано макс. время фронтов клока. Оно там не просто так указано, при превышении этого значения начинаются разные странные вещи.
  13. LPC1756+AT45DB081D

    Ну работает же у меня! :-) Проверил ещё раз: на 0xD7 возвращается 0xAC на 0x9F возвращается 0x1F,0x26 (у меня объем памяти другой) Единственное, что Вы не указали - реализация CS(HI) / CS(LOW). Может, тут ошибка? Также, в теории, возможна дохлая микросхема. Проверяли на другой?
  14. Ситуация следующая: На плате есть два питания - нестабильное (батарейное, с "толстым" потребителем) 7..9 вольт и стабильное 3.3 вольта (stepdown из первого). Дополнительные пять вольт делать не хочется. Надо соорудить интерфейс RS-232 наружу. Если просто взять ADM3202, получаем, что напряжение на выходе - +/- 4 вольта (под нагрузкой в виде ПК). Хочется побольше... Можно ли отключить умножитель напряжения (выкинуть конденсатор), и подать на V+ непосредственно батарейное питание? Рекомендаций я ни одной не видел, но вроде б ничего страшного случиться не должно :) Другие м/с можно предлагать, но а) должна быть защита от статики по входам (а то клиенты в шерстяных свитерах и шубах придут морду бить) б) подешевле бы
  15. Угу, по 33 Ома. Конденсаторы тоже есть - всего 22 пФ, но параллельно им стоит защитный диод, у него своей паразитной емкости много (до 150 пФ по даташиту). К тому же конденсаторы по спецификации USB не нужны - оговорена максимальная емкость (150 пФ) на линиях D+/D-, а не минимальная. Подозреваю, что с учётом разъема, дорожек и проч. я её несколько превышаю :) Собственно, вопрос больше софтовый: аппаратно мы проблему победили; после корректного заземления всего и вся вероятность сбоя снизилась на порядок. Интересно, как бороться с этим программно. Совершенно случайно обнаружил свою ошибку: на входе VBus (используется именно как VBus) включен pull-down. На эту ногу заведено питание с USB через RC-цепочку 3.3 кОм - 0.1 мкФ. Если убрать подтяжку, жить становится заметно веселей - в суспенд мы уходим реже, и корректно оттуда восстанавливаемся (передёргивая Connect, ничего лучше не придумал). Теперь вопросов два: - почему подтяжка влияет на состояние connect и где об этом написано в документации? - (исходный вопрос) как корректно выйти из suspend ?
  16. LPC17xx, USB device отваливается

    У нас в устройстве на LPC1768 реализован USB CDC интерфейс - для совместимости со старыми решениями, работающими через COM-порт. Со стороны ПК ставим стандартный usbser.sys от майкрософта. Столкнулись со следующей проблемой: периодически (из-за проблем со статикой) устройство решает, что ему надо уйти в Suspend. Команда Get Device Status при этом возвращает 0x0C - suspend + suspend change, connect = 0. Устройство ПК видит, но на запросы оно отвечать перестаёт. Пробовал "дёргать" подтяжкой D+ (висит на GPIO), результат отрицательный: ПК видит, что устройство пропало, а потом появляется новое устройство, но до запроса дескрипторов дело доходит с вероятностью около 50% - оно или остаётся в suspend, или всё-таки начинает работать. Передёргивание шнурка руками также работает аналогично. Собственно, вопрос: как бы из этой ситуации выбраться?
  17. Врёт, не краснея. Через короткий проводничок "кондюк" подключать правильнее. Но если нет других возможностей (снаружи ещё три ряда шариков BGA, и проводник получается длинный и узкий), надо ставить переход на противоположную сторону. Работает... Идеальная картинка у Вас тоже неправильная, на мой взгляд. Земляной провод я бы сделал (и делаю) по аналогии с питанием. Книжку Джонсона и Грехема всячески рекомендую - это куча практических советов. Разве что переводчик мог бы взять калькулятор и избавить нас от половины дюймовых размеров. Ну, если схемотехник придумал очередного идеального сферического коня, который в текущих условиях ну никак не реализуется... Все мы человеки, даже трижды ведущие дважды главные схемотехники.
  18. А я вижу странным для устройства с N функциями использовать N+5 микросхем (по одной на каждую функцию, плюс нечто, чтоб оно всё вместе заработало) вместо 3 универсальных. Универсальное решение компактнее, зачастую дешевле и гораздо гибче. Но да, когда есть волшебный чёрный ящик - в него пихаешь битики с MP3, а он тебе музыку сам играет - это очень удобно. Думать сильно меньше надо...
  19. vmware ;) Я игрался много лет назад. Специально купил первопентиум (на стипендию как раз получилось :) ), потыкал его месяц и забросил. Для обучения линуксам надо что-то более юзер-френдли, чем голая консоль, имхо.
  20. Он не должен загораться, он должен мигать с частотой 1 раз в секунду. Если это не работает (просто загорается диод) надо разбираться, что происходит в SysTick_Config и, наверное, delay_ms.
  21. У нас когда-то была плата с ARM9 и неким видео-ЦАП от AnalogDevices. Вся эта конструкция бодро показывала WinCE на самом обычном мониторе. Документации нет (на следующей версии прикрутили параллельный интерфейс к обычной ЖК-матрице), но сама железка где-то в хламе лежит. Если интересно, могу посмотреть модель ЦАПа. Только он устарел уже за прошедшие 6 лет... Но если нет "толстого" контроллера, в 5 баксов это решение тоже не уложится.
  22. LPC1756+AT45DB081D

    Ну вот честное слово, лениво продираться через высосанные из пальца дефайны. Имхо, периферия на NXP документирована достаточно хорошо, чтобы не использовать ещё какие-то дополнительные библиотеки. Например, неочевидно мне, что тут пишут в CR1. Надо прочитать Ваш исходник, заголовок драйвера и сам драйвер, и только потом смотреть в даташит. tmp = SSP_ConfigStruct->Mode & SSP_CR1_BITMASK; // Write back to CR1 SSPx->CR1 = tmp; Рабочий код обмена с SPI: #define SPI_REG(reg) SSP1->reg #define SPI_WAIT_READY() while (SPI_REG(SR) & SPI_SR_BUSY) // Процедура инициализации (возвращает код ошибки) dword SPI_Init(void) { // устанавливается в стартапе: SSP1 on, PCLK = CCLK //PCONP |= BIT(10); //CLKSEL (PCLKSEL0, 1, 20); SPI_DISABLE_ALL_CHIP(); SPI_REG(CPSR) = 6; SPI_REG(CR0) = 0x0007; SPI_REG(IMSC) = 0x0; SPI_REG(DMACR) = 0x0; SPI_REG(CR1) = 0x2; while (SPI_REG(SR) & SPI_SR_RNE) SPI_REG(DR); return 0; } // Процедура запуска одного цикла работы dword SPI_Run (dword aSendByte) { SPI_REG(DR) = aSendByte; SPI_WAIT_READY(); return SPI_REG(DR); } ChipSelect сконфигурирован как GPIO, остальные ноги - как SSP (в другом модуле, здесь не видно). После перехода CS low->high рекомендую добавить несколько (я сделал десяток) nop'ов - у контроллера ноги весьма быстрые, память может не "почуствовать" деактивации. Хотя, как я вижу, уже есть delay_ms(1) - это слегка избыточно, но для проверки сойдёт.
  23. LPC1756+AT45DB081D

    Вы бы написали, что эта чудо-библиотека делает в SSP_ConfigStructInit и SSP_Init. И это... у меня всё работает :-) LPC1768, AT45DB161D.
  24. Проверил в кейловском симуляторе. Всё нормально работает даже при переходе через 0xffffffff. Как переделать на 16 бит, подумаю. Дизассемблер "проекта" прикладываю. Исходный код (все 10 строчек) легко восстановить. ; generated by ARM C/C++ Compiler with , RVCT4.0 [build 524] for uVision ; commandline ArmCC [--debug -c --asm --interleave -omain.o --depend=main.d --device=DARMP1 --apcs=interwork -O3 -IC:\Keil\ARM\INC\NXP --omf_browse=main.crf main.c] THUMB AREA ||.text||, CODE, READONLY, ALIGN=2 main PROC ;;;31 ;;;32 int main (void) 000000 b530 PUSH {r4,r5,lr} ;;;33 { ;;;34 ;;;35 TIM0->CTCR = 0x00; 000002 2000 MOVS r0,#0 000004 f04f2240 MOV r2,#0x40004000 000008 6710 STR r0,[r2,#0x70] ;;;36 TIM0->TCR = 0x02; 00000a 2102 MOVS r1,#2 00000c 6051 STR r1,[r2,#4] ;;;37 TIM0->PR = 0; 00000e 60d0 STR r0,[r2,#0xc] ;;;38 TIM0->TCR = 0x01; 000010 2001 MOVS r0,#1 000012 6050 STR r0,[r2,#4] ;;;39 ;;;40 ;;;41 GPIO0->FIODIR ^= 0x01; 000014 4c08 LDR r4,|L1.56| 000016 6820 LDR r0,[r4,#0] 000018 f0800001 EOR r0,r0,#1 00001c 6020 STR r0,[r4,#0] 00001e f2427510 MOV r5,#0x2710 |L1.34| 000022 6891 LDR r1,[r2,#8] 000024 462b MOV r3,r5 |L1.38| 000026 6890 LDR r0,[r2,#8] 000028 1a40 SUBS r0,r0,r1 00002a 4298 CMP r0,r3 00002c d3fb BCC |L1.38| ;;;42 ;;;43 while (1) ;;;44 { ;;;45 delay_ms (10); ;;;46 ;;;47 GPIO0->FIOPIN ^= 0x01; 00002e 6960 LDR r0,[r4,#0x14] 000030 f0800001 EOR r0,r0,#1 000034 6160 STR r0,[r4,#0x14] 000036 e7f4 B |L1.34| ;;;48 } ;;;49 ;;;50 ; ;;;51 } ENDP |L1.56| DCD 0x2009c000 __ARM_use_no_argv EQU 0 таймер настраивался в режиме "лишь бы тикал"
  25. Имхо: - добавить фильтр. Частота импульсов... 1000 об/мин, 2 оборота на импульс - итого десяток герц. Длительность представляю себе с трудом, но пусть будет фильтр на 300-500 Гц, максимум 1 кГц. - схему питания, имхо, можно упростить. И, кстати, что будет с электролитами слева при переполюсовке? А если этой переполюсовки не будет, зачем столько компонентов? :) - мосфет на изначальной схеме взят с каким-то нереальным запасом. И управлять его затвором можно сразу несколькими ногами тиньки. От десятка миллиампер?
×
×
  • Создать...