DVyacheslavN

Работа С Картой Памяти В Режиме Spi (Использование Petit Fatfs)

60 сообщений в этой теме

Товарищи, прошу помощи , несколько недель мучаюсь с организацией совместной работы карты памяти ММС и микроконтроллера pic 16f877. излазил кучу форумов . Задача стоит такая надо разобраться в алгоритме работы с картой памяти (запись, чтение. и тд.), не надо подсовывать алгоритмы с разных сайтов если не знаете что там и где . С библиотекой Petit FatFs не совсем разобрался в файле diskio.c необходимо прописать низкоуровневую работу(пока туда не лез). Предлагаю вашему вниманию часть программы, программа компилируется и записывает только 512 байт (1 блок) , при записи нескольких блоков записывает пробелы . Проверял в Протеусе, схему не собирал.

1) вопрос как организовать запись нескольких блоков да и комарду CMD 23 (только для ММС) Распишите .

#include <pic.h>

#define _XTAL_FREQ 20e6

extern void SerString (const char *str);

extern char SPI (char d);

extern char Command (char befF,/*unsigned char AdrH,*/ unsigned char AdrL,char befH );

extern char bhf ;

char df=0;

void read ();

void write ( char x)

{

if (Command(24, 0, 0xff)!=0) {

SerString("Write Error");

}

SerString ("writing mmc");

//while (SPI(0xFF)!=0) ;

SPI (0xff);

SPI (0xff);

SPI (0xfe);

for (int g =0; g< 512; g++){

SPI ('f');

}

SPI (0xff);

SPI (0xff);

while ((SPI(0xff) | 0b00011111) == 0x05);

while (SPI(0xff) != 0xff);

//for (char i=0; i<100 ;i++);

SerString("writi complit");

}

void read (){

char i;

if (Command(0x51,512,0xFF) !=0) SerString("Lese_resp_Fehler ");

while(SPI(0xFF) != 0xFE); // Ожидание 0xFE – начала каждой передачи данных

for(i=0; i < 512; i++)

{

while(!TXIF); // Проверка, пуст ли регистр TXREG

TXREG =SPI(0xFF); // Передача байта данных

}

SPI(0xFF); // В конце два незначимых байта

SPI(0xFF);

}

Забыл добавить с кодом программы уже экспериментировал много так что он может немножко корявый.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

void write()

{

pwm_disable();

command(25, arg, 0xff);

while (readdata != 0) {

spi_read();

string("WRITE ERROR");

}

string("WRITING MMC");

while (1) {

spi_write(0xff);

spi_write(0xff);

spi_write(0b11111100);

for (int g = 0; g < 512; g++) {

char GO = 1;

while (GO);

spi_write(ADRESL);

PORTD = ~ADRESL;

}

spi_write(0xff);

spi_write(0xff);

spi_read();

while ((readdata | 0b00011111) != 0x05) {

spi_read();

}

while (readdata != 0xff) {

spi_read();

}

if (RE0 == 1) {

spi_write(0xff);

spi_write(0xff);

spi_write(0b11111101); //stop token

spi_read();

spi_read();

while (readdata != 0xff) {

spi_read();

}

break;

}

}

}

вобще код достаточно понятный писал похожий только вот при симуляции в протеусе в файл карты (с расширением ММС. записывает одни пробелы.) Может проблема в Протеусе,

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

крик души, помогите разобраться, уж больно интерестно .

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
__alexander    10

а вам не кажется, что тут программа зависает?

char GO = 1;

while (GO);

Изменено пользователем __alexander

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

не зависнит это регистр микроконтроллера который запускает процесс АЦП и сбрасывается в ноль после того как преобразование закончилось

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
__alexander    10

это обычная переменная, которая к ацп никакого отношения не имеет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

while(ADGO){} // Ждем когда GODONE АЦП вернет 0 - опрос закончен

buff[0] = ADRESL; // читаем младший байт с АЦП

buff[1] = ADRESH;

это тоже самое что и выше участок кода только место можно godone или же go смотря какие альтернативы подключены в файле инструкции к вашему контроллеру . Кроче говоря смысл понятен всем кто разбирается в программировании микроконтроллеров. Искать и устанавливать себе тот компилятор не собираюсь . Лучше по существу расскажите как правильно предавать инфу в карту памяти по интерфейсу SPI. для микроконтроллера.

/* Alternate definitions for ADCON0 register */

volatile bit ADGO @ ((unsigned)&ADCON0*8)+2;

#endif

вот кусок из инструкции к моему контроллеру.

GO/-DONE: Бит статуса модуля АЦП

Если ADON=1

1 = модуль АЦП выполняет преобразование (установка бита вызывает начало преобразования)

0 = состояние ожидания (аппаратно сбрасывается по завершению преобразования)

вот выдержка из даташита

Изменено пользователем DVyacheslavN

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

многоблочная запись не работает (проверял в Proteus) если есть рабочие коды выложете и расскажите . может что в протеусе фиг знает

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
__alexander    10

на запись команда 25 (0x59).

шлете эту команду unsigned char cmd[] = {0x59,0x00,0x00,0x00,0x00,0xFF};

потом читаете ответ пока он не станет 0 сразу за этим пишем 0xFF, 0xFF, 0xFC (data token), потом 512 байт данных, потом 0xff, 0xff, потом читаем ответ, пока он не станет равным resp & 0x05 == 0x05, 5 - это данные картой захавались. потом снова проверка на ноль и по кругу, снова 0xff, 0xff, 0xFC.

завершаем запись 0xff, 0xff, 0xfd.

может что-то упустил.

Изменено пользователем __alexander

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

У меня выложена ссылка на один из материалов которым я пользовался и есть по нему вопросы , Вот к примеру функция отправки команды char Command(char befF,uns16 AdrH,uns16 AdrL,char befH ) .ее заголовок там он есть почему тут 4 переменные передаются в команду а в других примерах 3 а конкретно adrH и AdrL объединили .

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

// 512-байтовый режим записи

if (Command(0x58,0,512,0xFF) !=0) SerString("Schreib_resp_Fehler ");

SPI(0xFF);

SPI(0xFF);

SPI(0xFE);

вот сижу сравниваю ту последовательность действий которую вы написали и которая в материале У вас написано что после команды читать до тех пор пока не станет 0 тоесть (WHILE) а тут получется если (IF) не ноль топрограма выдаст сообщение и побежит дальше. не дожидаясь этого нуля.

правда и команда тут записи одного блока

data token нет где его взять

0xFC или это и есть дата токен

Изменено пользователем DVyacheslavN

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

void write ()

{

Command(25, 0, 0xff);

while (1) {

char Ig=0;

while ((SPI_W(0xFF) != 0) || Ig>200 ) {

Ig++;

}

if (Ig>=200) {

SerString("WRITE ERROR");

goto END_W;

}

SerString("WRITING MMC");

SPI_W(0xff);

SPI_W(0xff);

SPI_W(0xfc);

for (int g = 0; g < 512; g++) {

SPI_W('f');

}

SPI_W(0xff);

SPI_W(0xff);

while ((SPI_W(0xff) & 0x05) != 0x05)

{

}

if (1) {

SPI_W(0xff);

SPI_W(0xff);

SPI_W(0xfd); //stop token

while (SPI_W(0xff) != 0xff);

break;

}

}

END_W:;

}

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

А когда ставлю CMD 24 и меняю старт токен на 0xFE то один блок записывается нормально

Изменено пользователем DVyacheslavN

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
__alexander    10

всё правильно. для записи следующего сектора после

while ((SPI_W(0xff) & 0x05) != 0x05)

надо также подождать пока не станет равным 255.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

while (SPI_W(0xff) != 0xFF) {} Ну добавил я строчку все ровно при эмуляции в протеусе файл флешки остается пустым.

там флешка ММС.

Еще хотел спросить а как после записи одного блока cmd 24 перейти к следующему и записать его.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
__alexander    10

не знаю как протеус, я проверил на живой плате.

а записать один блок абсолютно точно также, только в команде меняется адрес.

т.е. дали команду, записали, потом два FF, потом проверка на 5, потом проверка на FF...снова команда только с новым адресом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Да я уже подозревал что скорее в протеусе чтото не так попробую собрать плату.

Вопрос еще вот какой, работали с библиотекой

Petit Fatfs туда надо прописать изкоуровнивые параметры записи чтения и инициализации кароче говоря тоже туже запись чтение ти т.д просто хотелось бы работать с файлами на флеш а не с блоками данных. Я пока буду собирать схему и проверять работу программы. И только потом займусь освоением библиотеки

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
fuckir    6

А почему не взяли микрочиповскую библиотеку , раз юзаете pic? Пробовал Чена и Джасио библиотеки, но только на 16 битках

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

я только учусь так что я даже не знал что есть библиотеки микрочипа. какие на слуху те и взял

если есть исходники программ то можете скинуть попробую разобраться .

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Товарищи помогите скинте простенький пример petty fatFS для pic а то скаченный у CHAN'a сложен для понимания. Не понятно все пишиут что надо подключить diskio. h ..... *.c и pff.h .... *.c . И потом править diskio.c но в примере еше добавлино прару файлов которые работают с библиотекой. Вобщем запутался.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    546

Не запустите Вы файловую систему на этом деревянном камне. Почитайте требования к любой готовой fs и подумайте, глядя на характеристики своего кирпича...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

)))). ну такто да.. я хочу понять работу библиотеки. допустим буду писать для камня с достаточной памятью.

охото разобраться с файлом diskio.c хотябы с минимальным набором необходимых функций.

а точнее инициализация , чтение, запись, 1 и несколько блоков.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

для инициализации нам необходима функция которая будет обрабатывать команду cmd

/*-----------------------------------------------------------------------*/
/* Send a command packet to MMC										  */
/*-----------------------------------------------------------------------*/
static
BYTE send_cmd (
BYTE cmd,  /* Command byte */
DWORD arg  /* Argument */
)
{
BYTE n, res;

if (cmd & 0x80) { /* ACMD<n> is the command sequense of CMD55-CMD<n> */
 cmd &= 0x7F;
 res = send_cmd(CMD55, 0);
 if (res > 1) return res;
}
/* Select the card and wait for ready except to stop multiple block read */
if (cmd != CMD12) {
 deselect();
 if (!select()) return 0xFF;
}
/* Send command packet */
xchg_spi(0x40 | cmd);   /* Start + Command index */
xchg_spi((BYTE)(arg >> 24)); /* Argument[31..24] */
xchg_spi((BYTE)(arg >> 16)); /* Argument[23..16] */
xchg_spi((BYTE)(arg >> 8));  /* Argument[15..8] */
xchg_spi((BYTE)arg);   /* Argument[7..0] */
n = 0x01;	  /* Dummy CRC + Stop */
if (cmd == CMD0) n = 0x95;  /* Valid CRC for CMD0(0) + Stop */
if (cmd == CMD8) n = 0x87;  /* Valid CRC for CMD8(0x1AA) + Stop */
xchg_spi(n);
/* Receive command response */
if (cmd == CMD12) xchg_spi(0xFF); /* Skip a stuff byte on stop to read */
n = 10;	   /* Wait for a valid response in timeout of 10 attempts */
do
 res = xchg_spi(0xFF);
while ((res & 0x80) && --n);
return res;   /* Return with the response value */
}

эта функция реализована в примере для pic 24 вот как я реализовывал ее для pic 16f

Command (char befF,unsigned char AdrH, unsigned char AdrL,char befH )
{ // Передача команды в MMC
SPI(0xFF);
SPI(0b01000000 | befF);
SPI((unsigned char) AdrH>>24);
SPI((unsigned char) AdrH>>16);
SPI((unsigned char) AdrL>>8);
SPI((unsigned char) AdrL);
SPI  (befH);
SPI(0xFF);
//return SPI(0xFF); // Возвращаем ответ
}
		 char MMC_Init ()
{  CS=1; // MMC отключена
char i; // Переменные
for(i=0; i < 10; i++)SPI(0xFF); // 10*8=80 тактовых импульсов
CS=0; // Включить MMC
// CMD0
Command(0,0,0,0x95);
if (SPI(0xFF) !=1) goto Fehler ; // Сброс
st: // Если MMC не существует, остаётся
// CMD1 // Здесь находится программа
Command(1,0,0,0xFF);
if (SPI(0xFF) !=0) goto st ;
return 1;
Fehler:
return 0;
}

и так зачем CMD 8 если spi (в описалове "Зарезервированно системой") 2, зачем arg такой большой.

ну работу этой функции command (в примере анологично сделано) понимаю при инициализации записи или чтении отправляем туда соответствующую комннду.

CMD 12 допустим мне тоже не понадобится (будем ждать пока обработается комманда) Вопрос хватит ли мне только функции command

Про инициализацию . Вот пример для pic 24

/*-----------------------------------------------------------------------*/
/* Initialize Disk Drive												 */
/*-----------------------------------------------------------------------*/
DSTATUS disk_initialize (
BYTE pdrv  /* Physical drive nmuber (0) */
)
{
BYTE n, cmd, ty, ocr[4];

if (pdrv != 0) return STA_NOINIT; /* Supports only single drive */
if (Stat & STA_NODISK) return Stat; /* No card in the socket */
power_on();	   /* Initialize memory card interface */
FCLK_SLOW();
for (n = 10; n; n--) xchg_spi(0xFF); /* 80 dummy clocks */
ty = 0;
if (send_cmd(CMD0, 0) == 1) {   /* Enter Idle state */
 Timer1 = 1000;	  /* Initialization timeout of 1000 msec */
 if (send_cmd(CMD8, 0x1AA) == 1) { /* SDv2? */
  for (n = 0; n < 4; n++) ocr[n] = xchg_spi(0xFF);   /* Get trailing return value of R7 resp */
  if (ocr[2] == 0x01 && ocr[3] == 0xAA) {    /* The card can work at vdd range of 2.7-3.6V */
   while (Timer1 && send_cmd(ACMD41, 0x40000000)); /* Wait for leaving idle state (ACMD41 with HCS bit) */
   if (Timer1 && send_cmd(CMD58, 0) == 0) {   /* Check CCS bit in the OCR */
 for (n = 0; n < 4; n++) ocr[n] = xchg_spi(0xFF);
 ty = (ocr[0] & 0x40) ? CT_SD2|CT_BLOCK : CT_SD2; /* SDv2 */
   }
  }
 } else {	   /* SDv1 or MMCv3 */
  if (send_cmd(ACMD41, 0) <= 1)  {
   ty = CT_SD1; cmd = ACMD41; /* SDv1 */
  } else {
   ty = CT_MMC; cmd = CMD1; /* MMCv3 */
  }
  while (Timer1 && send_cmd(cmd, 0));  /* Wait for leaving idle state */
  if (!Timer1 || send_cmd(CMD16, 512) != 0) /* Set read/write block length to 512 */
   ty = 0;
 }
}
CardType = ty;
deselect();
if (ty) {  /* Function succeded */
 Stat &= ~STA_NOINIT; /* Clear STA_NOINIT */
 FCLK_FAST();
} else {  /* Function failed */
 power_off(); /* Deinitialize interface */
}
return Stat;
}

свою инициализацию я уже выложел выше.

понятно что инициализация для 2 х типов карт у меня допустим для одного типа будет. хватит ли MMC_Init да и вот еще вопрос

DSTATUS disk_initialize (void)
{
DSTATUS stat;
// Put your code here
return stat;
}

пустышка от Chan'a stat как я понял по умолчанию 1 и если все нормлаьно то оставить его 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
fuckir    6

есть собраный Чан под 24-й пик. Могу скинуть

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Похожие публикации

    • Автор: User_1
      Доброго времени суток!
      Вкратце: нужно после того, как я записал байт данных в SPI1->DR, отменить передачу этого байта и вместо него отправить 0х00
      Подробно: Смысл вот в чём: некий контроллер, с которым я пытаюсь наладить общение по SPI, запрашивает произвольный участок массива байт и считывает их сплошным потоком. Ну примерно как считывается микросхема EEPROM: задаёшь начальный адрес, а потом просто шлёшь сплошные 0xFF, а она сама инкрементирует адрес и прямо непрерывным потоком байт выдаёт содержимое памяти. Только тут в роли этой микросхемы мой stm32f030 и мне нужно следующий байт отправлять в SPI1->DR сразу после отправки предыдущего. Но когда поток заканчивается (а он каждый раз разной длины и длина эта заранее неизвестна), один байт остаётся не переданным и отправится первым при следующем запросе. А мне нужно, чтобы первым байтом всегда отправлялся 0х00
      Пином (ну то есть битом) NSS управляю программно, его выставление в единичку и снова в ноль, очевидно, не помогает вообще никак. Пока решил проблему так: деинициализирую модуль SPI и выключаю его тактирование, затем включаю тактирование и снова инициализирую. Работает, скорости хватает. Но должно же быть менее костыльное решение?)
      Может кто сталкивался с такой проблемой?
      Курение даташита, reference manual и результатов поиска в гугле, не особо помогло.
    • Автор: Михаил Савин
      Добрый день. Подскажите есть устройство на плате для регулирования дроссельной заслонки от Калины. Довольно специфическое, индивидуальная разработка, аналогов не купить. Основывается на микроконтроллере ATXMEGA128A3U AU 1651. Возможно ли скопировать залитый в него код что бы изготовить данное устройство ? Или это невозможно в принципе ?
    • Автор: ficus216
      Здравствуйте всем. Такая проблема. Дорожка работала, при беге в максим. 10км/ч резко прибавила скорость до 12 наверное ( хотя только до 10 максимум она разгоняется)
      попытался убавить скорость но ничего не срабатывало, можно только переключать между табло "каллории" "скорость" "расстояние""время" ничего убавить нельзя. Дальше вытаскиваю магнит (обычно дорожка автоматически выключается после этого) в этом случае нет, она дальше работала на полной скорости.
      Снизу находится общий включатель, раньше если его вкл то пока старт не нажмешь ничего не будет. а сейчас нажимаю этот вкл снизу и сразу на 12шке херачит.
      Тестором все прозвонил, сгорел микропроцессор я так понимаю. В магзиине мне сказали. что только если на али заказать. Название сгоревшего sonyx sn8p2624kb на али нет в точности с таким названием. прилагаю ссылку
      можно ли заказать этот или любой другой с другим названием ? что делать дальше ? не нужно потом это все прошивать ? и как ?https://clck.ru/DQhDh



    • Автор: Сибирский кот
      Здравствуйте! Мой знакомый отдал мне по ненадобности пульты для заправочной станции модели "Сапсан". В одном пульте стоял микроконтроллер ATMEL AT89S51-24PU и в другом-AT89C51-24PU. Искал схемы в интернете,но ничего не нашел,кроме даташиты. Не знаю,что делать с этими микроконтроллерами-пустить в дело или в утиль. Сможете подсказать?
    • Автор: Sattva
      Тема: Реверс-инжиниринг: необходимо декодировать протокол связи контроллера пром. насоса и дисплея
      Общая цель: сделать управление кондиционером, вести мониторинг его работы.
      Время на работу: около 12 часов (2 дня).
      Задание для исполнителя:
      1. Выполнить обратное декодирование протокола связи контроллера промышленного
      кондиционера и его дисплея с сенсорными кнопками.
      2. Запаять ATMega 328P или ATMega 2560. Вероятно, придется резать дорожки,
      допаять резисторы в разрыв.
      3. Совместно с заказчиком написать короткий код ввода/вывода данных для Arduino (C++).
      Могут понадобиться функции передачи данных на второй контроллер ATMega 2560 по UART.
      4. Совместно с заказчиком составить простое описание.
      5. Работа дисплея, состояние контроллера кондиционера и мониторинг на Arduino
      должны быть синхронны.
      Программировать микроконтроллер и отправлять данные на вебсервер по
      Ethernet (W5500) умею. Паять умею. Работать с микроконтроллером на уровне
      регистров процессора не умею, потому и ставлю задание.

      Протокол: неизвестен
      Шина: неизвестна
      Чип дисплея: Holtek HT1621B
      Контроллер "пульта управления": Holtek BS84B08A-3
      Фото прилагается.
      Вероятно, применяется шина SPI или I2C, что должно облегчить задачу.

      Имеется пример подобного дисплея 2009 года с выполненной
      работой. У предыдущего исполнителя ушло около 2 часов на разбор
      команд и еще столько же на написание кода, *когда поняли, как
      разбирать команды*.

      Фото с реализацией задания прилагается, но на дисплее другого типа.



      Метод выполненной работы в прошлый раз:
      1. Для получения данных с Holtek-HT46F49E по 8-ми битной шине данных использован Arduino Pro Mini 328P.
      2. Подключение: 5 дорожек перерезано и допаяно 5 резисторов по 1 кОм. Так же использовано еще 3 линии (reset и данные).
      3. Для удаленного управления использована Arduino Mega 2560 + Ethernet Shield W5100.
      4. Общение между 328P и 2560 идет по UART.
       
      Наилучший вариант, если кто-то откликнется из Киева, чтобы можно было вместе
      встретиться и поработать. Но если в Киеве никого нет, то куплю недорогой логический
      анализатор уровней и будем общаться удаленно. Готов к любому варианту.
  • Сообщения

    • Там ломаться не чему. Вы точно определились что индикатор. Если нет внутри ваккума, то можно и спеца поискать чтобы он там был (стеклодув). В лабораториях по пробиркам они там есть.
    • можно попробовать только отслеживать состояние буфере по счетчику и отправлять байт только если счетчик нулевой и регистр данных пуст. Тогда гарантированно отправится только один байт. Но могут быть перерывы в передаче, а SPI шина жесткая. Поэтому и буферизированная И вообще она не очень подходит для обмена данными между контроллерами, да еще и с неопределенным протоколом. Там все должно быть четко и по правилам. Если так не получается, то используются другие шины.
    • Для того чтоб я меньше  сидел за пояльником и не тратил время в пустую. Купили мне родители  муз-центр LG DM5360K  вот как здесь https://www.dns-shop.ru/product/557a29f35aa43330/domasnaa-audiosistema-lg-dm5360k/ Приподнял я сам муз-центр и он оказался легкий . Ну мне конечно интересно стало что внутри. Вскрыл крышку и смотрю ИИП однотактник с стабилизированным однополярным 27вольт . Под ИИПом экран металлический ,и под экраном УНЧ класса-д построен  на каких то чипах, радиатор снимать не стал. В общем там два мостовых класса-д питаются стабилизированным однополярным 27вольт. Есть Bluetooth и USB для флешки ,  удобно В тех-характеристиках не указано какой там класс унч. Я думаю полную мощность 2х90ватт смело отдает, очень мощно даже пьяному. Акустика 4ом Кстати мне уже не первый муз-центр поподаеться LG основаны на классах-д с ИИП однотактниками. Это я к тому , то что не где не чего не известно из чего реализованы эти центры  
    • Так я и не понял, как лучше поставить для стабилизации режима работы светодиодов. Что поставить лучше? L7812CV L7812 KA7812 MC7812 Напряжение регулятор 12 В 1.5A,  или MP1584EN 3A Регулируемый понижающий. Светодиод будет для салона прилагается, поясните "темному"
    • тут такое дело, что если бы подготовился лучше перед покупкой, то разница в цене вообще ничего не играет. про усиление дорожки встречал инфу. после выходных займусь. так это готовое решение или надо реализовывать самому, имея атмегу+обвязку?
    • Я уже скинул 2 ссылки. Там полно математики и физики. На форум могу скинуть, но лучше создать новую тему. Что я там перевернул? Сразу пишите конкретно: что именно. Тогда будет понятно. Кеша не тупой. Он подкованный технарь, плюс изобретатель. В соционике -  Дон Кихот. Это определённый (довольно не глупый )  тип людей, которые генерируют идеи. Так, Эйнштейн тоже относился к Дон Кихотам. Я в соционике - Де Карт,  или Робеспьер. То есть, "учёный", а не изобретатель. Но к изобретателям отношусь благосклонно, потому как понимаю их роль в обществе.
    • С 10 000 мкф сильно не разбирался, измерение вниз падает, но это и понятно, заранее ждал. Нормально, там 1 Ом резистора разряда на этом конденсаторе, как 10 Ом на 1000 мкф, примерно одинаково, что как бы намекает.