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

esaulenka

Свой
  • Постов

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

  • Посещение

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

    2

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


  1. Господа, ну не путайте вы топикстартера... У него каша в голове только увеличиваться будет... :(

     

    IAP во всех LPC'шках есть, причём один и тот же - отличается от того же LPC214x буквально на чуть-чуть - другими адресами.

     

    Более того, добрые NXP прямо по этой просьбе сделали AppNote: http://www.nxp.com/documents/software/AN11...th_software.zip

    Там, правда, кейл, но на общую идею "как это работает" влиять не должно.

     

    Возможно, это решение слишком избыточно для десятка переменных, которые меняются раз в полгода и все вместе, но ТЗ нам никто не предоставил :)

     

    Да, и ещё: если ещё нет "МК без EEPROM (LPC1114)", а есть только планы, можно заложиться на LPC1114XL. Если верить документации, они ввели во флеше понятие "страница" - 256 байт, которые можно стереть за раз. По сравнению с предыдущими камнями, когда стирание шло блоками по 4 килобайта, это очень удобно для Вашей задачи.

  2. Тут бесполезно дистанционно советы давать.

     

    Начните с отключения всего, что только возможно, добейтесь работоспособности (мигания диодом, выдачи каких-то сообщений в UART), а потом прикручивайте (постепенно!) остальное.

     

    Несколько облегчить работу может JTAG.

  3. АЦП будет мерять предыдущее значение, "каких-то пауз" не предусмотрено. "Всё выключено" - это просто частный случай с N=0.

     

    Demeney, спасибо. Надо бы вывод всех значений организовать, посмотреть, что там с помехами. А то кажется мне, что если усреднять уже посчитанное Rвнутр, ошибок больно много будет... При небольших нагрузках оно даже отрицательным может получится - если помеха "перебьёт" просадку напряжения.

  4. Ну да, я слышал что-то :-)

    Проблема в том, что вся эта конструкция весьма заметно "шумит" - значение сопротивления каждый раз будет меняться. Вопрос, как его усреднять, с учётом того, что "известное сопротивление" у меня каждый раз будет разным.

  5. Есть система, представляющая собой нагрузку типа "N резисторов параллельно" с управлением от микроконтроллера. Питается оно от аккумуляторов (внутреннее сопротивление аккумуляторов и нагрузки, если N максимальное, сопоставимо).

    Количество одновременно включенных резисторов переменное (рулится контроллером, заранее предсказать сложно) от 0 до N. Также в контроллер заведено напряжение с аккумуляторов - на АЦП.

     

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

    Пока напряжение было постоянным (от внешнего блока, там пульсаций немного было), всё было просто.

    Алгоритм следующий - померяли напряжение, (пропустили через усреднялку типа "скользящее среднее"), выставили N, включили.

    А теперь после "включили" напряжение-то и поменялось.

     

    Вариант "включить, померять k раз, усреднить, посчитать время выключения" не проходит, т.к. включать надо на единицы миллисекунд, и в промежутках ещё кучу всего делать.

     

    Величину нагрузки в каждый момент я знаю довольно точно (N резисторов + ещё потребление прочих элементов), а вот с внутренним сопротивлением аккумуляторов засада - завтра пользователь их поменяет, послезавтра производство другую партию закупит...

     

    Вопрос: что делать-то? Читать про Калмана? Вроде бы самое оно...

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

  6. Shivers, если получится, расскажите, пожалуйста, технологию.

    Вопрос рисования своих шрифтов довольно актуален.

     

    Да, размер, наверное, что-нибудь типа 10x16. Дробных (не кратных 8) размеров не стоит боятся - там не очень много арифметики выходит. У меня вывод сотни строк в секунду (полный вывод, с кучей дополнительных расчётов, а не только растеризация) отнимает около 15% времени у LPC1768. В принципе, можно заметно сократить это время. Но пока всё работает :-))

     

    И с отдельным буфером дисплея, возможно, не нужно заморачиваться. На ARM9 делал вывод на экран 640*480 - просто складывал байты в область видеопамяти, не думая о переключении страниц.

    Работало довольно неплохо, но т.к. основная функция этой софтины была в отображении надписи "Loading WinCE", её не сильно оптимизировали :-)

  7. Похоже нарушен протокол I2C.

    Угу. Например, мастер в лице нашего контроллера решил перезагрузиться в момент передачи от слейва.

    Ситуация такая вполне вероятна (более того, наши тестировщики умеют повторять её на одном из устройств; пользователи, правда, не жаловались - они не щелкают кнопкой включения десяток раз подряд).

     

    Методика лечения очень простая - 9 раз дёрнуть клок, не выдавая ACK. Но как это сделать, не перенастраивая ноги, я не знаю.

    Может, кстати, при ошибках обмена такое же делать?.. А то я сейчас просто стоп-старт шлю, если что-то не так.

     

    Так что +1 к вопросу. Только у меня LPC.

  8. Нет, ну не нравятся мне эти супер-библиотеки!

    Вся эта супер-портабельная фигня заменяется ОДНОЙ строкой.

    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);

     

    По делу:

    Описание того, что флеш и контроллер находятся на разных платах, я упустил...

    Осталось только проверить, что земли одинаковые, и хорошо связанные.

     

    О! И что ещё вспомнил!! Я ведь тоже м/с на "соплях" подвешивал! В даташите на эту флеш указано макс. время фронтов клока. Оно там не просто так указано, при превышении этого значения начинаются разные странные вещи.

  9. Ну работает же у меня! :-) Проверил ещё раз:

    на 0xD7 возвращается 0xAC

    на 0x9F возвращается 0x1F,0x26 (у меня объем памяти другой)

     

    Единственное, что Вы не указали - реализация CS(HI) / CS(LOW). Может, тут ошибка?

     

    Также, в теории, возможна дохлая микросхема. Проверяли на другой?

  10. Ситуация следующая:

    На плате есть два питания - нестабильное (батарейное, с "толстым" потребителем) 7..9 вольт и стабильное 3.3 вольта (stepdown из первого). Дополнительные пять вольт делать не хочется.

     

    Надо соорудить интерфейс RS-232 наружу. Если просто взять ADM3202, получаем, что напряжение на выходе - +/- 4 вольта (под нагрузкой в виде ПК). Хочется побольше...

    Можно ли отключить умножитель напряжения (выкинуть конденсатор), и подать на V+ непосредственно батарейное питание?

     

    Рекомендаций я ни одной не видел, но вроде б ничего страшного случиться не должно :)

     

    Другие м/с можно предлагать, но

    а) должна быть защита от статики по входам (а то клиенты в шерстяных свитерах и шубах придут морду бить)

    б) подешевле бы

  11. Сопротивления на нескольку десятков Ом последовательно в линиях D+ и D- имеются ?

    Угу, по 33 Ома. Конденсаторы тоже есть - всего 22 пФ, но параллельно им стоит защитный диод, у него своей паразитной емкости много (до 150 пФ по даташиту).

    К тому же конденсаторы по спецификации USB не нужны - оговорена максимальная емкость (150 пФ) на линиях D+/D-, а не минимальная. Подозреваю, что с учётом разъема, дорожек и проч. я её несколько превышаю :)

     

    Собственно, вопрос больше софтовый: аппаратно мы проблему победили; после корректного заземления всего и вся вероятность сбоя снизилась на порядок. Интересно, как бороться с этим программно.

     

    Совершенно случайно обнаружил свою ошибку: на входе VBus (используется именно как VBus) включен pull-down. На эту ногу заведено питание с USB через RC-цепочку 3.3 кОм - 0.1 мкФ.

    Если убрать подтяжку, жить становится заметно веселей - в суспенд мы уходим реже, и корректно оттуда восстанавливаемся (передёргивая Connect, ничего лучше не придумал).

     

    Теперь вопросов два:

    - почему подтяжка влияет на состояние connect и где об этом написано в документации?

    - (исходный вопрос) как корректно выйти из suspend ?

  12. У нас в устройстве на LPC1768 реализован USB CDC интерфейс - для совместимости со старыми решениями, работающими через COM-порт.

    Со стороны ПК ставим стандартный usbser.sys от майкрософта.

     

    Столкнулись со следующей проблемой: периодически (из-за проблем со статикой) устройство решает, что ему надо уйти в Suspend.

     

    Команда Get Device Status при этом возвращает 0x0C - suspend + suspend change, connect = 0. Устройство ПК видит, но на запросы оно отвечать перестаёт.

    Пробовал "дёргать" подтяжкой D+ (висит на GPIO), результат отрицательный: ПК видит, что устройство пропало, а потом появляется новое устройство, но до запроса дескрипторов дело доходит с вероятностью около 50% - оно или остаётся в suspend, или всё-таки начинает работать.

    Передёргивание шнурка руками также работает аналогично.

     

    Собственно, вопрос: как бы из этой ситуации выбраться?

  13. Разработчик утверждает, что через переходное отверстие (ПО) обвязка работать не будет

    Врёт, не краснея. Через короткий проводничок "кондюк" подключать правильнее. Но если нет других возможностей (снаружи ещё три ряда шариков BGA, и проводник получается длинный и узкий), надо ставить переход на противоположную сторону. Работает...

     

    Идеальная картинка у Вас тоже неправильная, на мой взгляд. Земляной провод я бы сделал (и делаю) по аналогии с питанием.

     

     

    Книжку Джонсона и Грехема всячески рекомендую - это куча практических советов. Разве что переводчик мог бы взять калькулятор и избавить нас от половины дюймовых размеров.

     

     

    Попробовал бы мне конструктор поставить под сомнение топологические требования схемотехника

    Ну, если схемотехник придумал очередного идеального сферического коня, который в текущих условиях ну никак не реализуется... Все мы человеки, даже трижды ведущие дважды главные схемотехники.

  14. А я вижу странным для устройства с N функциями использовать N+5 микросхем (по одной на каждую функцию, плюс нечто, чтоб оно всё вместе заработало) вместо 3 универсальных. Универсальное решение компактнее, зачастую дешевле и гораздо гибче.

     

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

  15. vmware ;)

     

    Я игрался много лет назад. Специально купил первопентиум (на стипендию как раз получилось :) ), потыкал его месяц и забросил.

    Для обучения линуксам надо что-то более юзер-френдли, чем голая консоль, имхо.

  16. У нас когда-то была плата с ARM9 и неким видео-ЦАП от AnalogDevices.

    Вся эта конструкция бодро показывала WinCE на самом обычном мониторе.

     

    Документации нет (на следующей версии прикрутили параллельный интерфейс к обычной ЖК-матрице), но сама железка где-то в хламе лежит. Если интересно, могу посмотреть модель ЦАПа. Только он устарел уже за прошедшие 6 лет...

     

    Но если нет "толстого" контроллера, в 5 баксов это решение тоже не уложится.

  17. Ну вот честное слово, лениво продираться через высосанные из пальца дефайны. Имхо, периферия на 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) - это слегка избыточно, но для проверки сойдёт.

  18. Проверил в кейловском симуляторе. Всё нормально работает даже при переходе через 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
    
    

     

    таймер настраивался в режиме "лишь бы тикал"

  19. Имхо:

     

    - добавить фильтр. Частота импульсов... 1000 об/мин, 2 оборота на импульс - итого десяток герц. Длительность представляю себе с трудом, но пусть будет фильтр на 300-500 Гц, максимум 1 кГц.

     

    - схему питания, имхо, можно упростить. И, кстати, что будет с электролитами слева при переполюсовке? А если этой переполюсовки не будет, зачем столько компонентов? :)

     

    - мосфет на изначальной схеме взят с каким-то нереальным запасом. И управлять его затвором можно сразу несколькими ногами тиньки.

     

     

    Стабилизатор будет перегреваться

    От десятка миллиампер?

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