-
Постов
1 462 -
Зарегистрирован
-
Посещение
-
Победитель дней
2
Сообщения, опубликованные esaulenka
-
-
Господа, ну не путайте вы топикстартера... У него каша в голове только увеличиваться будет... :(
IAP во всех LPC'шках есть, причём один и тот же - отличается от того же LPC214x буквально на чуть-чуть - другими адресами.
Более того, добрые NXP прямо по этой просьбе сделали AppNote: http://www.nxp.com/documents/software/AN11...th_software.zip
Там, правда, кейл, но на общую идею "как это работает" влиять не должно.
Возможно, это решение слишком избыточно для десятка переменных, которые меняются раз в полгода и все вместе, но ТЗ нам никто не предоставил :)
Да, и ещё: если ещё нет "МК без EEPROM (LPC1114)", а есть только планы, можно заложиться на LPC1114XL. Если верить документации, они ввели во флеше понятие "страница" - 256 байт, которые можно стереть за раз. По сравнению с предыдущими камнями, когда стирание шло блоками по 4 килобайта, это очень удобно для Вашей задачи.
-
Я не знаю, что такое LPC2249, но...
У него PCLK (PCLK0-1-2-3) и PCONP есть? Там битики нужные стоят?
-
Тут бесполезно дистанционно советы давать.
Начните с отключения всего, что только возможно, добейтесь работоспособности (мигания диодом, выдачи каких-то сообщений в UART), а потом прикручивайте (постепенно!) остальное.
Несколько облегчить работу может JTAG.
-
АЦП будет мерять предыдущее значение, "каких-то пауз" не предусмотрено. "Всё выключено" - это просто частный случай с N=0.
Demeney, спасибо. Надо бы вывод всех значений организовать, посмотреть, что там с помехами. А то кажется мне, что если усреднять уже посчитанное Rвнутр, ошибок больно много будет... При небольших нагрузках оно даже отрицательным может получится - если помеха "перебьёт" просадку напряжения.
-
Ну да, я слышал что-то :-)
Проблема в том, что вся эта конструкция весьма заметно "шумит" - значение сопротивления каждый раз будет меняться. Вопрос, как его усреднять, с учётом того, что "известное сопротивление" у меня каждый раз будет разным.
-
Есть система, представляющая собой нагрузку типа "N резисторов параллельно" с управлением от микроконтроллера. Питается оно от аккумуляторов (внутреннее сопротивление аккумуляторов и нагрузки, если N максимальное, сопоставимо).
Количество одновременно включенных резисторов переменное (рулится контроллером, заранее предсказать сложно) от 0 до N. Также в контроллер заведено напряжение с аккумуляторов - на АЦП.
Теперь самое интересное - необходимо обеспечить постоянство энергии, передаваемой в каждый из резисторов, изменяя время их включения.
Пока напряжение было постоянным (от внешнего блока, там пульсаций немного было), всё было просто.
Алгоритм следующий - померяли напряжение, (пропустили через усреднялку типа "скользящее среднее"), выставили N, включили.
А теперь после "включили" напряжение-то и поменялось.
Вариант "включить, померять k раз, усреднить, посчитать время выключения" не проходит, т.к. включать надо на единицы миллисекунд, и в промежутках ещё кучу всего делать.
Величину нагрузки в каждый момент я знаю довольно точно (N резисторов + ещё потребление прочих элементов), а вот с внутренним сопротивлением аккумуляторов засада - завтра пользователь их поменяет, послезавтра производство другую партию закупит...
Вопрос: что делать-то? Читать про Калмана? Вроде бы самое оно...
Вот только не делал я никогда, даже "простейший одномерный случай без входного воздействия".
-
Shivers, если получится, расскажите, пожалуйста, технологию.
Вопрос рисования своих шрифтов довольно актуален.
Да, размер, наверное, что-нибудь типа 10x16. Дробных (не кратных 8) размеров не стоит боятся - там не очень много арифметики выходит. У меня вывод сотни строк в секунду (полный вывод, с кучей дополнительных расчётов, а не только растеризация) отнимает около 15% времени у LPC1768. В принципе, можно заметно сократить это время. Но пока всё работает :-))
И с отдельным буфером дисплея, возможно, не нужно заморачиваться. На ARM9 делал вывод на экран 640*480 - просто складывал байты в область видеопамяти, не думая о переключении страниц.
Работало довольно неплохо, но т.к. основная функция этой софтины была в отображении надписи "Loading WinCE", её не сильно оптимизировали :-)
-
Некрасиво это. Как-то исторически сложилось, что настройка ног - в одном месте, а дальше её никто не меняет. И портировать драйвер на другие пины не так удобно будет...
Но это единственное препятствие :)
-
Похоже нарушен протокол I2C.
Угу. Например, мастер в лице нашего контроллера решил перезагрузиться в момент передачи от слейва.
Ситуация такая вполне вероятна (более того, наши тестировщики умеют повторять её на одном из устройств; пользователи, правда, не жаловались - они не щелкают кнопкой включения десяток раз подряд).
Методика лечения очень простая - 9 раз дёрнуть клок, не выдавая ACK. Но как это сделать, не перенастраивая ноги, я не знаю.
Может, кстати, при ошибках обмена такое же делать?.. А то я сейчас просто стоп-старт шлю, если что-то не так.
Так что +1 к вопросу. Только у меня LPC.
-
у флешмэджика тоже есть командная строка, между прочим
-
Нет, ну не нравятся мне эти супер-библиотеки!
Вся эта супер-портабельная фигня заменяется ОДНОЙ строкой.
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);
По делу:
Описание того, что флеш и контроллер находятся на разных платах, я упустил...
Осталось только проверить, что земли одинаковые, и хорошо связанные.
О! И что ещё вспомнил!! Я ведь тоже м/с на "соплях" подвешивал! В даташите на эту флеш указано макс. время фронтов клока. Оно там не просто так указано, при превышении этого значения начинаются разные странные вещи.
-
Ну работает же у меня! :-) Проверил ещё раз:
на 0xD7 возвращается 0xAC
на 0x9F возвращается 0x1F,0x26 (у меня объем памяти другой)
Единственное, что Вы не указали - реализация CS(HI) / CS(LOW). Может, тут ошибка?
Также, в теории, возможна дохлая микросхема. Проверяли на другой?
-
Ситуация следующая:
На плате есть два питания - нестабильное (батарейное, с "толстым" потребителем) 7..9 вольт и стабильное 3.3 вольта (stepdown из первого). Дополнительные пять вольт делать не хочется.
Надо соорудить интерфейс RS-232 наружу. Если просто взять ADM3202, получаем, что напряжение на выходе - +/- 4 вольта (под нагрузкой в виде ПК). Хочется побольше...
Можно ли отключить умножитель напряжения (выкинуть конденсатор), и подать на V+ непосредственно батарейное питание?
Рекомендаций я ни одной не видел, но вроде б ничего страшного случиться не должно :)
Другие м/с можно предлагать, но
а) должна быть защита от статики по входам (а то клиенты в шерстяных свитерах и шубах придут морду бить)
б) подешевле бы
-
Сопротивления на нескольку десятков Ом последовательно в линиях D+ и D- имеются ?
Угу, по 33 Ома. Конденсаторы тоже есть - всего 22 пФ, но параллельно им стоит защитный диод, у него своей паразитной емкости много (до 150 пФ по даташиту).
К тому же конденсаторы по спецификации USB не нужны - оговорена максимальная емкость (150 пФ) на линиях D+/D-, а не минимальная. Подозреваю, что с учётом разъема, дорожек и проч. я её несколько превышаю :)
Собственно, вопрос больше софтовый: аппаратно мы проблему победили; после корректного заземления всего и вся вероятность сбоя снизилась на порядок. Интересно, как бороться с этим программно.
Совершенно случайно обнаружил свою ошибку: на входе VBus (используется именно как VBus) включен pull-down. На эту ногу заведено питание с USB через RC-цепочку 3.3 кОм - 0.1 мкФ.
Если убрать подтяжку, жить становится заметно веселей - в суспенд мы уходим реже, и корректно оттуда восстанавливаемся (передёргивая Connect, ничего лучше не придумал).
Теперь вопросов два:
- почему подтяжка влияет на состояние connect и где об этом написано в документации?
- (исходный вопрос) как корректно выйти из suspend ?
-
У нас в устройстве на LPC1768 реализован USB CDC интерфейс - для совместимости со старыми решениями, работающими через COM-порт.
Со стороны ПК ставим стандартный usbser.sys от майкрософта.
Столкнулись со следующей проблемой: периодически (из-за проблем со статикой) устройство решает, что ему надо уйти в Suspend.
Команда Get Device Status при этом возвращает 0x0C - suspend + suspend change, connect = 0. Устройство ПК видит, но на запросы оно отвечать перестаёт.
Пробовал "дёргать" подтяжкой D+ (висит на GPIO), результат отрицательный: ПК видит, что устройство пропало, а потом появляется новое устройство, но до запроса дескрипторов дело доходит с вероятностью около 50% - оно или остаётся в suspend, или всё-таки начинает работать.
Передёргивание шнурка руками также работает аналогично.
Собственно, вопрос: как бы из этой ситуации выбраться?
-
Разработчик утверждает, что через переходное отверстие (ПО) обвязка работать не будет
Врёт, не краснея. Через короткий проводничок "кондюк" подключать правильнее. Но если нет других возможностей (снаружи ещё три ряда шариков BGA, и проводник получается длинный и узкий), надо ставить переход на противоположную сторону. Работает...
Идеальная картинка у Вас тоже неправильная, на мой взгляд. Земляной провод я бы сделал (и делаю) по аналогии с питанием.
Книжку Джонсона и Грехема всячески рекомендую - это куча практических советов. Разве что переводчик мог бы взять калькулятор и избавить нас от половины дюймовых размеров.
Попробовал бы мне конструктор поставить под сомнение топологические требования схемотехникаНу, если схемотехник придумал очередного идеального сферического коня, который в текущих условиях ну никак не реализуется... Все мы человеки, даже трижды ведущие дважды главные схемотехники.
-
А я вижу странным для устройства с N функциями использовать N+5 микросхем (по одной на каждую функцию, плюс нечто, чтоб оно всё вместе заработало) вместо 3 универсальных. Универсальное решение компактнее, зачастую дешевле и гораздо гибче.
Но да, когда есть волшебный чёрный ящик - в него пихаешь битики с MP3, а он тебе музыку сам играет - это очень удобно. Думать сильно меньше надо...
-
vmware ;)
Я игрался много лет назад. Специально купил первопентиум (на стипендию как раз получилось :) ), потыкал его месяц и забросил.
Для обучения линуксам надо что-то более юзер-френдли, чем голая консоль, имхо.
-
Диод на плате загорается
Он не должен загораться, он должен мигать с частотой 1 раз в секунду.
Если это не работает (просто загорается диод) надо разбираться, что происходит в SysTick_Config и, наверное, delay_ms.
-
У нас когда-то была плата с ARM9 и неким видео-ЦАП от AnalogDevices.
Вся эта конструкция бодро показывала WinCE на самом обычном мониторе.
Документации нет (на следующей версии прикрутили параллельный интерфейс к обычной ЖК-матрице), но сама железка где-то в хламе лежит. Если интересно, могу посмотреть модель ЦАПа. Только он устарел уже за прошедшие 6 лет...
Но если нет "толстого" контроллера, в 5 баксов это решение тоже не уложится.
-
Ну вот честное слово, лениво продираться через высосанные из пальца дефайны. Имхо, периферия на 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) - это слегка избыточно, но для проверки сойдёт.
-
Вы бы написали, что эта чудо-библиотека делает в SSP_ConfigStructInit и SSP_Init.
И это... у меня всё работает :-) LPC1768, AT45DB161D.
-
Проверил в кейловском симуляторе. Всё нормально работает даже при переходе через 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
таймер настраивался в режиме "лишь бы тикал"
-
Имхо:
- добавить фильтр. Частота импульсов... 1000 об/мин, 2 оборота на импульс - итого десяток герц. Длительность представляю себе с трудом, но пусть будет фильтр на 300-500 Гц, максимум 1 кГц.
- схему питания, имхо, можно упростить. И, кстати, что будет с электролитами слева при переполюсовке? А если этой переполюсовки не будет, зачем столько компонентов? :)
- мосфет на изначальной схеме взят с каким-то нереальным запасом. И управлять его затвором можно сразу несколькими ногами тиньки.
Стабилизатор будет перегреватьсяОт десятка миллиампер?
MT-Link и LPC1225
в Программирование
Опубликовано · Пожаловаться
Скачайте с segger.com софт J-Link. Там в комплекте неплохую документацию дают. Ключик для софта (если надо) буквально на днях искали здесь: http://electronix.ru/forum/index.php?showtopic=101535