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

zheka

Участник
  • Публикаций

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

  • Посещение

Репутация

0 Обычный

Информация о zheka

  • Звание
    Гуру

Посетители профиля

5 197 просмотров профиля
  1. А LV4 оказывается всего-навсего соединял цифровую и аналоговую земли....
  2. Таки нет. Есть у китайцев похожая плата и она с закрытым бутлодером. И чип они лочат. И контроллеры запрограммированные даже не высылают. Причем непонятно почему - плата не лучше, а даже чуть хуже. Производитель один и тот же.
  3. Выпаял я чип - напряжение стало на место. К слову - наткнулся я на статью - http://3dtoday.ru/blogs/eta4ever/applied-necromancy-and-32bit-phoenix/ там ситуация один - в один - и так же как и у меня сгорела индуктивность LV4. Видать типовая неисправность. Но самое приятное, что я узнал - оказывается на этой плате бутлодер общедоступен и его можно скачать и залить.
  4. Внутри контроллера? Я как бы полагал о внешнем коротыше. Чип не поменяешь, прошивка хоть и открытая, но закрытый бутлодер.
  5. Есть китайская платка вот такая http://3dtoday.ru/upload/main/a86/a86b6689ed5c74601daf66d003c4448e.jpg В один прекрасный день она перестала работать, в центре ее, поклассике вспыхнул огонек и появился дымок. На плате контроллер LPC1768 Что выявил осмотр платы - "испарился" компонент LV4, он у левого верхнего угла микроконтроллера Визуальных повреждений по типу сгорания на остальных компонентах нет. При включении ужасно греется контроллер, палец не удержать. У меня не раз при экспериментах сгорали AVR, STM, я уже привык, что в большинстве случаев после сгорания они превращаются в печку и решил, что тут тоже накрылся контроллер. Однако обратил внимание что светодиоды, которые непосредственно подключены к пинам контроллера при включении моргают, так же как и раньше при загрузке, но очень тускло. ИЗмерил напряжение на всех цепях 3.3 вольт - оно просело до 2.1 вольт. Я понимаю, что никто не назовет мне неисправность по этой информации. Но я уже собрался было выкидывать плату (прошивка в контроллере закрытая, так что тут только покупка новой платы), как вдруг понял, что контроллер, очевидно жив - программа то выполняется.... МОжет кому интуиция что подскажет? Ваши предположения? Какая-то периферия подгорела, перегружает выход контроллера, за счет чего он греется и просаживает напряжение? Куда бы вы, при минимуме информации и сложностях прозвонки (плата покрыта черной маской и 4-слойная) стали копать дальше?
  6. я же писал, что это своего рода реверс-инжиниринг. Есть китайский индикатор, в нем устраивало, кроме ряда моментов, на которые в рамках этой темы отвлекаться нецелесообразно. Поэтому я не разрабатываю новое, а перепрошиваю старое. Из предыдущего абзаца думаю понятно. А на ней нет ничего непонятного. На ней из лишнего только светодиод питания и LDO на 3.3 вольт. Я их отпаял и получил то, что вы назвали пустой отладкой. ПОвторюсь, я взял пустую отладку, но по ней не скажешь, кто жрет лишнее на другом устройстве, на индикаторе, который я перепрошиваю. А эксперименты пустой отладкой лишь позволили понять, что проблема не в коде. Что мой код на голой отладке способен обеспечить 11 мкА - тот самый ток, который потреблял индикатор со старой китайской прошивкой. А значит остальные миллиамперы жрутся исключительно обвязкой контроллера на индикаторе. Я на Ваши вопросы ответил. Буду рад если Вы ответите на мои. В свете вышесказанного хочу на всякий случай обратить Ваше внимание, что тонкости режимов энергосбережения контроллера меня больше не интересуют - я добился того тока, который меня устраивает. Пусть бездумно, не изучив досконально предмет, но результат меня устраивает. И, как я уже сказал, от плясок с управлением режимами контроллера резуьтат не зависит. Пробема из цифровой плоскости переходит в аналоговую Моя просьба, если она не ясна из предыдущих постов заключается в том, чтобы кто-то выказал мнение, что на приведенной мной выше схеме может жрать? И предположить, как китайцы это побороли, ведь устройство с первоначальной прошивкой жрало как и контроллер - 11 мкА. Я уже отпаял транзисторный ключ подсветки и микросхему справа, к которой идут линии SPI от порта C контроллера. Не помогло.
  7. В общем я взял обычную китайскую отладочную плату, запитал ее не через имеющийся LDO, а непоредственно от разъема программирования. Сам LDO отпаял, потому как в этм случае ток куда-то в него уходит, потребляется то бишь. Простым вызовом halt() сразу после void main (void) { у меня получилось 35 мкА. манипуляции переводом в нужное состояние портов, выключений всего что нужно, удалось снизить потребление до 11 мкА. Иными словами, все пляски с бубнами, описанные даташиты, нужны там, где речь идет о борьбе за единицы микроампер. Возвращаемся к моей китайской плате - она в режиме Halt жрет 21 мА. Если же отключить ее от программатора - 50 мА. То есть проблема в схемотехнике. Но на плате ошибок нет, потому как, повторюсь, с исходной прошивкой она жрала те же 11 мкА. То есть китайская прошивка прежде чем перевести в halt, как то мотивирует обвязку контроллера на голодание. Господа не обессудьте, выкладываю то что набросал на листе бумаги. Понятно, что шлак, я не требую подсказать решение по этой схеме. Если дойдет до того, что в схеме дейтвительно кто-то "ворует электричество", а из-за ее качества непонятно, тогда нарисую в КАДе и выложу. А сейчас выкладываю этот шлак на случай, если косяк лежит на поверхности и его не оставит труда заметить даже на такой схеме Трехногая микруха слева - преоразователь питания на 3.3 вольт. Транзисторный ключ справа - управляет подсветкой. Неизвестный эемент вверху. левая нога которого идет к двум коненсаторам и земле - похожа на чип индуктивность. Микруха справа - драйвер дисплея. Питается с ноги PC4 14 пина (он отключен, если что). Нижняя кнопка - она-то и включает и выключает устройство. Может мне кто объяснит назначение МОСФЕТа внизу? Если вы обратите внимание, то с его истока проводник идет к LDO, питающему контроллер. То есть МОСФЕТ должен быть открыт. И открывается он внешним питанием, через резистор. Но видите ли, в этом случае эту функцию транзистора с успехом заменил бы обычный проводник. Но там еще два диода, развязывающие его от остальных частей схемы. Кстати, я дергал PD3 и в ноль и в плюс - управляя его затвором - эффекта не возымело. Будут мысли у кого-нибудь?
  8. Скачал полное руководство - RM0016 Описание halt занимает полстранички пункт 10.2.2, стр.103. Ценной информации там я не нашел, может покажете другой мануал? Формально заход в halt и выход из него по нажатию одной и той же кнопки я осилил. Теперь борюсь за потребление. Итак. Работающее устройство потребляет 55 мА (контроллер+подсветка, плюс драйвер LCD) Последовал совету, который гласил, что нужно переводить все болтающиеся ноги на вывод. Получил 200 мА )))) Почему? Питание драйвера LCD китайская схема осуществляет через PC4. Нет, эта ножка не включает какой-нибудь ключ, она просто питает микросхему. И когда я микросхему отключил - потребление парадоксально возросо до 200 мА. Причиной тому была утечка через DIO и SCK в микросхему скорее всего. Потому как перевод пинов, подающих команды, в режим входа с подтяжкой снизил общее потребление до 40 мА. Но, к сожалению, оно таким и остается. Я попробовал поставить halt сразу после void main(void) {.... получил 35 мА. Руки конечно потянулись, согласно советам в различных статьях, поиграться с тактовым генератором, но ведь у меня режим, в котором останавливается все.... Да... чтобы понять, к чему стремиться, прежде чем вытереть старую китайскую прошивку, я измерил, сколько потребляет устройство в спящем режиме - 12 мкА. Китайцы что-то знают, чего не знаю я. Скажите мне, если я вызываю halt() сразу же, в начале void main(void) - каков должен быть ток потребления? И нужно ли что-то отключать, если по умолчанию все уже выключено, а если и включено, то при остановленном тактовом генераторе, по идее не должно жрать.
  9. Н-да.. вы были правы. В IAR все работает. Продолжаю мучить контроллер. По нажатию одной из кнопок вхожу в режим halt. Другой кнопкой хочу выводить из этого режима. Настроено прерывание по спаду на эту кнопку. В принципе все работает - кнопку нажал, контроллер заснул. Нажал другую - контроллер пронулся и пошел дальше работать. Добавил я в цикл основную задачу - измерение напряжения и вывод его на экран. И вот тут-то пошли проблемы - контроллер по нажатию на вторую кнопку просыпается, но зависает в функции работы с АЦП в виделенной жирным строке: // ------------ ADC1 ------------------- uint16_t GetADCvalue(uint8_t ChanelNumb) { uint16_t tmphvalue; uint16_t tmplvalue; ADC1->CSR = ChanelNumb; // channel delay(10); ADC1->CR1 |= 0x61; while(!(ADC1->CSR & ADC1_CSR_EOC)){;} ADC1_ClearITPendingBit(ADC1_IT_EOC); tmplvalue = ADC1->DRL; tmphvalue = (uint16_t)ADC1->DRH << 8; tmphvalue = tmphvalue + tmplvalue; return (tmphvalue); } INTERRUPT_HANDLER(EXTI_PORTD_IRQHandler, 6) { /* In order to detect unexpected events during development, it is recommended to set a breakpoint on the following instruction. */ w=0; } void main(void) { CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1); CLK_SYSCLKConfig(CLK_PRESCALER_HSIDIV1); // set 16 MHz for CPU GPIO_DeInit(BACKLIGHT_PORT); GPIO_Init(BACKLIGHT_PORT, BACKLIGHT, GPIO_MODE_OUT_PP_LOW_FAST); GPIO_WriteHigh(BACKLIGHT_PORT, BACKLIGHT); GPIO_Init(PWR_BTN_PORT, PWR_BTN, GPIO_MODE_IN_PU_NO_IT); //EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOA, EXTI_SENSITIVITY_FALL_ONLY); GPIO_Init(MENU_BTN_PORT, MENU_BTN, GPIO_MODE_IN_PU_IT); EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOD, EXTI_SENSITIVITY_FALL_ONLY); GPIO_DeInit(IO_PORT); GPIO_Init(IO_PORT, STB|SCLK|DIO|TM1722_POWER, GPIO_MODE_OUT_PP_LOW_FAST); GPIO_WriteHigh(BACKLIGHT_PORT, BACKLIGHT); GPIO_WriteHigh(IO_PORT, TM1722_POWER); ADC1_Config(); enableInterrupts(); LCD_Clear(0); while(1) { adc=GetADCvalue(4); ADC_Voltage=adc*(5.0/1024)*20; LCD_Show_Voltage(ADC_Voltage); if (GPIO_ReadInputPin(GPIOA,GPIO_PIN_2)) { LCD_Show_Spark(0); } else { LCD_Show_Spark(1); halt(); } } Заметьте, я вхожу в halt аккуратно - не по прерыванию, а по чтению кнопки после того, как АЦП завершил работу. Сам АЦП инициализирован так / ------------ ADC1 ------------------- void ADC1_Config(void) { GPIO_Init(GPIOD,GPIO_PIN_3,GPIO_MODE_IN_FL_NO_IT); ADC1->CR1 = 0x61; // 0b01100001; // enable ADC ADC1->CR2 = 0x08; // 0b00001000; // right otygnment ADC1->CR3 = 0x00; // 0; // data bufer disable ADC1->TDRL = 0xC0; // 0b11000000; // disable Schmitt triggers for AIN7 & AIN6 } Я решил эту проблему просто - перед halt() выключаю АЦП, после просыпания тут же включаю. Но что-то мне это кажется полумерой. Почему присходит сбой, так и должно быть?
  10. Бесплатнее некуда Информация с сайта iar Но это не беда. Мне предложили на выбор 30 дневное ограничение либо 8кб ограничение по коду. Я выбрал второе.
  11. Не спорю. И это можно сделать. Но повторюсь, задача экономии передо мной не стояла, да и не стоит. Моя прошивка будет существенно меньше той, что была в оригинала (там было еще меню настроек). Мне нужно было побыстрее, пусть и топорно, сделать небольшой реверс-инжиниринг. Для себя, лишь бы работало. Что-то не получается у меня с внешними прерываниями: Из комментариев все ясно. Брейкпоинты почему-то в STVD не ставятся... Прерывание не срабатывает. Вместе с тем есть еще одна странность - даже если отключить режим прерывания у пина, если вообще убрать текст обработчика (и сам обработчик), то как только вызвать enableInterrupts(); экран перестает работать. Как будто какое-то прерывание постоянно вызывается, что нарушает логику обмена информацией контроллером дисплея.
  12. Ну если вы об этом... Они шлют разные команды, по разным адресам. Более того, значок процента для цифр в левой части экрана дисплей считает точкой (запятой) старшего разряда цифр, находящихся в правой части экрана. Управляя цифрами правой части экрана, нужно корректировать одну из цифр левой части, более того, нужно знать, что за параметр в данный момент в ней отображается (параметров 4, одновременно отображаемых - 2) Можно конечно выделить общее и написать универсальную функцию, но для этого должно до такой степени не хватать места, что трата времени на подобные хитрости себя оправдывает. Я же зная сколько места в контроллере, и имея опыт написания более объемных прошивок, полагал, что места хватит при самом небрежном отношении к коду. ДА его собственно и хватило, я поставил галку, как указал выше - все нормально. Эти 4 функции были написаны раздельно с целью упрощения рашифровки того, какой сегмент за что отвечает (даташита на дисплей нет). Есть функция LCD_Clear - там цикл уместен и я его использовал. А в остальных функциях.... А ну-ка, хорошо, вот Вам кусок кода, покажите, как бы Вы сделали из него цикл? Просто интересно. send_command(0x00); send_command(0x44); send_command(0xC7); if (int_num<10) send_data(0x00+percent_sign);else send_data(DIGITS[int_num/10]+percent_sign); send_command(0xCB); send_data(DIGITS[int_num%10]); send_command(0xCE); send_data(DIGITS[decimal_num]+1); send_command(0xCA); send_data(0x4); send_command(0x97); Но за критику в любом случае спасибо.
  13. Это где это у меня дублирование? Вообще не мое, в шаблоне было.
  14. Покупал я у другого продавца, с более бедным описанием. Приводя ссылку вчера, я в нее не вчитывался.