kostya_unix

Инициализация DS18B20

43 posts in this topic

ARV    762
4 часа назад, Starichok сказал:

если без массива, то куда будут помещены прочитанные 9 байт? в чем тут экономия?

Фактически нужны 2 первых байта с температурой, их считываем в соответствующую переменную, а все остальные байты считываем во временную переменную с одновременным подсчётом CRC,  и более нигде их не храним. В итоге массива нет, лишних переменных тоже нет.

Экономия смешная, я не спорю. Просто указал возможность и такого варианта.

2 часа назад, kostya_unix сказал:

В даташит_е есть такие строки

В даташите НЕТ таких строк, вы процитировали кривой, вводящий в заблуждение перевод даташита! На линии DQ во время преобразования будет лог.1, а вовсе не 0.

Зато любой тайм-слот чтения будет возвращать 0, пока преобразование не завершено. Чувствует разницу? 

То есть вы можете обойтись без паузы в 750 мс или более, если, например, каждые 50 мс будете считывать БИТ из датчика, и, как только считаете 1, это и будет сигналом о конце преобразования.

Однако, по геморройности этот вариант намного хуже простого ожидания...

Share this post


Link to post
Share on other sites
kostya_unix    1
13 часа назад, ARV сказал:

Фактически нужны 2 первых байта с температурой, их считываем в соответствующую переменную, а все остальные байты считываем во временную переменную с одновременным подсчётом CRC,  и более нигде их не храним. В итоге массива нет, лишних переменных тоже нет.

Экономия смешная, я не спорю. Просто указал возможность и такого варианта.

В даташите НЕТ таких строк, вы процитировали кривой, вводящий в заблуждение перевод даташита! На линии DQ во время преобразования будет лог.1, а вовсе не 0.

Зато любой тайм-слот чтения будет возвращать 0, пока преобразование не завершено. Чувствует разницу? 

То есть вы можете обойтись без паузы в 750 мс или более, если, например, каждые 50 мс будете считывать БИТ из датчика, и, как только считаете 1, это и будет сигналом о конце преобразования.

Однако, по геморройности этот вариант намного хуже простого ожидания...

Да. Перевод вольный, согласен. 

Share this post


Link to post
Share on other sites
kostya_unix    1
16 часов назад, Starichok сказал:

дело в том, что при отработке паузы с помощью _delay_ms(750) МК больше НИЧЕГО в это время делать не может. это пустая трата процессорного времени.

точнее, МК во время отработки паузы может обрабатывать прерывания.

можно делать такую проверку. а можно и не делать.

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

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

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

вариантов тут несколько.

1. тупо делать задержку с помощью delay.

2. тупо сидеть в цикле и по кругу проверять на завершение конвертации. этот вариант потребует те же самые 700-750 мс бесполезной потери времени.

3. делать, как я - 1 раз в секунду без проверки считывать новую температуру и запускать новую конвертацию.

может, чья-то фантазия придумает еще другие способы...

 

Понятно. Такие операции, наверное лучше всего выполнять через таймеры (освоим и это).

Уважаемый  @Starichok  подскажите пожалуйста алгоритм работы таймер/счетчиков, в частности обработка прерываний.

Пишется, что при срабатывании прерываний по какому нибудь событию, нормальное выполнение программы прерывается и выполняется обработка прерывания.

Собственно вопрос: - когда происходит обработка прерывания , основной цикл программы ожидает пока не завершится обработка прерывания ?

                                        - или цикл основной программы продолжается параллельно с выполнением обработки прерывания ?

Собственно как то так. Прошу прощения, если изложил свой вопрос не грамотно.

Share this post


Link to post
Share on other sites

Приглашаем на вебинар «Создание беспроводных устройств на системах-на-кристалле семейства SimpleLink компании TI»

Компания Компэл, совместно с Texas Instruments приглашают 26 июня принять участие в вебинаре, где инженер по применению беспроводных технологий компании TI расскажет, как на новых беспроводных системах можно реализовать несколько полезнейших в повседневной жизни функций для ваших устройств. С развитием элементной базы TI становится возможной реализация более удобных, функциональных и безопасных систем, недоступных ранее. Вебинар проводит инженер по применению беспроводных технологий в TI Мари Хернес(будет дублированный перевод).

Подробнее...

ARV    762
4 часа назад, kostya_unix сказал:

когда происходит обработка прерывания , основной цикл программы ожидает пока не завершится обработка прерывания ?

Ожидает.

Share this post


Link to post
Share on other sites
Starichok    1423

процессор не может выполнять две работы одновременно.

прерывание потому и называется прерыванием, что оно прерывает основной процесс. и процесс ждет, когда закончится прерывание.

работу таймеров нужно изучить по даташиту на конкретный МК. в рамках этой темы нет возможности проводить ликбез по таймерам.

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

обычно у меня один таймер работает по совпадению и отрабатывает промежуток времени в 2 миллисекунды. а 2 мс потому, что такой промежуток вполне подходит для обработки энкодера.

то есть, таймер заходит в свое прерывание каждые 2 мс.

но тут дело "вкуса" каждого человека. можно настроить таймер и 1 мс, или на любое другое желаемое время.

затем у меня в программе есть два счетчика (размещены в двух регистрах).

первый счетчик считает число прерываний таймера. когда первый счетчик насчитает до 5 ( получается интервал 10 мс), инкрементируется второй счетчик, а первый сбрасывается в ноль.

второй счетчик считает до 100 - это получается 1 секунда.

по первому счетчику у меня делается короткий программный цикл - там фактически только обрабатывается связь с компьютером.

когда второй счетчик досчитает до 100, он сбрасывается в ноль, и делается длинный программный цикл.

в этом длинном цикле я обрабатываю измерения - напряжение и ток, температуру. и вывожу измеренные величины на экран.

почему два счетчика? при 2 мс на 1 секунду приходится 500 прерываний, и одним регистром (одним байтом) до 500 не сосчитать.

но можно сделать прерывание таймера, например, по 4 мс. тогда для 1 секунды хватит 1 регистра (250 прерываний).

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

есть у меня еще и средний программный цикл.

я делю 1 секунду на 3 части (когда второй счетчик равен 0 или 33 или 66).

в этом среднем цикле у меня обрабатываются кнопки и энкодер, примерно через 1/3 секунды. также делается вывод на экран текущего состояния в соответствии с действиями над кнопками и энкодером.

а внутри прерывания таймера делает инкремент первого счетчика (который считает у меня до 5) и проверяется энкодер.

для начала тебе пока хватит и этой информации по работе с таймером и по разной организации программных циклов.

 

Share this post


Link to post
Share on other sites

Видео вебинара «Уникальный подход MORNSUN к разработке DC/DC-преобразователей. Что на выходе?»

На сайте КОМПЭЛ доступны материалы вебинара, посвященные последнему поколению DC/DC преобразователей с фиксированным входом R3 от MORNSUN. Вы можете посмотреть видеозапись, ознакомиться с презентацией и ответами на вопросы.

Подробнее...

kostya_unix    1
В 10.06.2019 в 15:06, ARV сказал:

Ожидает.

Спасибо. 

Всех с наступающим дополнительным выходным!!!!

Share this post


Link to post
Share on other sites
kostya_unix    1

Всем участникам, всем оказывающим посильную помощь в изучении мной датчика DS18B20 здравствуйте.

После вопроса  уважаемого @ARV по подсчету контрольной суммы полученного значения 9 байтов scratchpad - ОЗУ прошло ровно две недели. Все это время я старался изучить (более или менее вдумчиво) этот вопрос, найти способ расчета контрольной суммы. Так как учится, изучать приходится самостоятельно ( в моем профессиональном окружении нет любителей микроконтроллеров ( и язык C так же осваиваю самостоятельно)), то время уходит много. Так же информации в интернете мнОго по этому вопросу, но понятной для меня, оказалось очень не много.

Но по истечению полутора недель изучения вопроса постепенно начал вникать в суть решения этого вопроса. В итоге решение оказалось не таким и сложным как казалось вначале (но это было чуть позже ). Дорога привела меня к стандартной библиотеки <util/crc16.h> в описании которой и лежит алгоритм расчета контрольных сумм. Ссылка на описание этой библиотеки http://avr-libc.narod.ru/group__util__crc.html#g37b2f691ebbd917e36e40b096f78d996

 

Уважаемые @ARV , @Starichok (и все кто может внести конструктивную критику) прошу Вас поправить меня и указать на ошибки.

Вот код подсчета CRC:

#include <util/crc16.h> 

uint8_t term_code[8] = {0,0,0,0,0,0,0,0};       // массив для полученного кода значения температуры(без CRC_кода)
uint8_t crcCode = 0;                                        // переменная для хранения полученного CRC_кода

uint8_t c = 0;                                                   // переменная для отображения ошибок несоответствия контрольных сумм

int checkcrc()                                                 // функция подсчета значения контрольной суммы
{
    uint8_t crc =0;
       for (uint8_t i=0; i<sizeof term_code / sizeof term_code[0]; i++)
    {
        crc = _crc_ibutton_update(crc, term_code[i]);
    }

        return crc;
}

 

Так же создал функцию, которая сравнивает полученное значение CRC и расчетное для отображения на LCD_дисплее ( для контроля ошибок) :

void error_crc()
{
    if (checkcrc() != crcCode)
    {
        c=c+1;  // c определена глобально
    }
    
}

 

 Код функции _crc_ibuttin_update(): из стандартной библиотеки <util/crc16.h>

   uint8_t _crc_ibutton_update(uint8_t crc, uint8_t data)
    {
        uint8_t i;

        crc = crc ^ data;
        for (i = 0; i < 8; i++)
        {
            if (crc & 0x01)
                crc = (crc >> 1) ^ 0x8C;
            else
                crc >>= 1;
        }
        return crc;
    }

Способ считывания значения scratchpad ОЗУ стандартный. Описан на многих сайтах. Ссылка на один из них : http://narodstream.ru/avr-urok-20-podklyuchaem-datchik-temperatury-ds18b20-chast-1/

 

Еще раз всем спасибо.

Share this post


Link to post
Share on other sites
ARV    762

Параметр sizeof должен быть в скобках. Считать CRC удобнее не для 8, а для всех 9 байтов, т.е. включая CRC, т.к. в этом случае при совпадении подсчитанной и переданной контрольных сумм результат будет равен нулю, а при несовпадении - не равен. Проверять проще.

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

Share this post


Link to post
Share on other sites
kostya_unix    1
В 21.06.2019 в 17:26, ARV сказал:

Параметр sizeof должен быть в скобках.

@ARV  спасибо бОльшое за ценные советы. 

Исправил.

В 21.06.2019 в 17:26, ARV сказал:

Считать CRC удобнее не для 8, а для всех 9 байтов, т.е. включая CRC, т.к. в этом случае при совпадении подсчитанной и переданной контрольных сумм результат будет равен нулю, а при несовпадении - не равен. Проверять проще.

Опять же спасибо большое.

Сейчас на работе проверил - все именно так. У меня у Вам небольшой вопрос (уточнение): возвращает в случке ошибки не ноль, а от чего зависит значение возвращаемого числа в случае ошибки ( не совпадения)? У меня выводится число 99 в десятичной системе ( вывожу на Ж.К. дисплей для контроля):

 

lcd_dat(((checkcrc()/100)%10)+48);
lcd_dat(((checkcrc()/10)%10)+48);
lcd_dat((checkcrc()%10)+48);

 

Share this post


Link to post
Share on other sites
Starichok    1423

вот, ты нашел алгоритм вычисления CRC.

ты должен был понять, что при вычислении обрабатывается КАЖДЫЙ бит всей последовательности плюс участвует КАЖДЫЙ байт последовательности.

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

Share this post


Link to post
Share on other sites
ARV    762
4 часа назад, kostya_unix сказал:

У меня выводится число 99


lcd_dat(((checkcrc()/100)%10)+48);
lcd_dat(((checkcrc()/10)%10)+48);
lcd_dat((checkcrc()%10)+48);

 

Это же ужас какой-то! Вы трижды обращаетесь к функции подсчета CRC, хотя логично предполагать, что она должна вызываться один раз:

uint8_t crc = checkcrc();
lcd_dat(((crc/100)%10)+48);
lcd_dat(((crc/10)%10)+48);
lcd_dat((crc%10)+48);

 

Share this post


Link to post
Share on other sites
kostya_unix    1

Уважаемый @ARV простите меня за этот код:

lcd_dat(((checkcrc()/100)%10)+48);
lcd_dat(((checkcrc()/10)%10)+48);
lcd_dat((checkcrc()%10)+48);

Хочется что-то сказать в свое оправдание.... Но на ум ничего не приходит.По всей видимости торопился, когда писал ответ на форум и скорей всего от незнания.

Если я правильно понимаю, то возвращаемое значение функции должно быть присвоено глобальной переменной? 

uint8_t crc_2; // объявлена глобально

int checkcrc()  // функция посчета значения контрольной суммы
		{
			uint8_t crc =0;
			
			for (uint8_t i=0; i<(sizeof term_code / sizeof term_code[0]); i++)
			//for (uint8_t i=0; i<8; i++)
			{
				crc = _crc_ibutton_update(crc, term_code[i]);
				
			}
			
			return crc_2=crc;
		}

 

Или есть другой способ отобразить, в данном случае, возвращаемые данные на LCD_дисплее?


lcd_dat('R');
lcd_dat('C');
lcd_dat('_');
lcd_dat('2');
lcd_dat('=');
lcd_dat(((crc_2/100)%10)+48);
lcd_dat(((crc_2/10)%10)+48);
lcd_dat((crc_2%10)+48);

Подскажите пожалуйста.

22 часа назад, Starichok сказал:

вот, ты нашел алгоритм вычисления CRC.

ты должен был понять, что при вычислении обрабатывается КАЖДЫЙ бит всей последовательности плюс участвует КАЖДЫЙ байт последовательности.

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

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

 Если не получится самостоятельно разобраться, пойду в институт к своему преподавателю по математики, попрошу ее растолковать мне эту методику.

Она нам всегда говорила, что красивей математики может быть только музыка.

Share this post


Link to post
Share on other sites
ARV    762
1 час назад, kostya_unix сказал:

возвращаемое значение функции должно быть присвоено глобальной переменной?

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

1 час назад, kostya_unix сказал:

Или есть другой способ отобразить, в данном случае, возвращаемые данные на LCD_дисплее?

Конечно есть. Просто следуйте простому правилу: если что-то делается несколько раз с разными данными, это должно быть функцией.

У вас есть функция вывода символа на дисплей. Чем отличается вывод строки символов от вывода одного символа? Тем, что повторяется несколько раз. Чем отличается вывод строки "Вася" от строки "123"? Ничем. Следовательно, вывод строки должен быть функцией. Как вывести число? Можно так, как вы, а можно иначе: превратить число в его строковое (т.е. сивольное) представление и вывести эту строку.

А для превращения числа в строку применить библиотечную функцию itoa - её именно для того и придумали, чего ж добру пропадать? 

И ваш код из предыдущего поста превратится в что-то такое:

/* забудем это, как страшный сон
lcd_dat('R');
lcd_dat('C');
lcd_dat('_');
lcd_dat('2');
lcd_dat('=');
lcd_dat(((crc_2/100)%10)+48);
lcd_dat(((crc_2/10)%10)+48);
lcd_dat((crc_2%10)+48);
*/

// сделаем функцию вывода строки на ЖКИ
void lcd_put_str(char *s){
   while(*s) lcd_dat(*s++);
}

// сделаем функцию вывода числа
void lcd_put_int(int i){
   char tmp[10];
   itoa(i, tmp, 10);
   lcd_put_str(tmp);
}

lcd_put_str("RC_2=");	// выведем информационный текст
lcd_put_int(crc_2);	// и выведем переменную

 

1 час назад, kostya_unix сказал:

return crc_2=crc;

Зачем?! Просто return crc; и тогда можно даже так

lcd_put_int(checkcrc());

 

1 час назад, kostya_unix сказал:

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

Совершенно бесполезная трата времени для прикладных целей! Если вы не решили посвятить себя теории программирования, то вам эти знания не будут полезны от слова совсем. Тем более что CRC8 не позволяет однозначно выделить искаженный бит, даже если он один, а если несколько - и подавно.

Share this post


Link to post
Share on other sites
Starichok    1423

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

думаю, и тебе такие тонкости не нужны.

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

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

Share this post


Link to post
Share on other sites
kostya_unix    1

@ARV  и @Starichok  спасибо Вам бОльшое за участи в моем "гиблом" деле :) Я прям увереннее стал чувствовать себя, спасибо.

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

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

Учится мне еще и учится. 

 

Share this post


Link to post
Share on other sites
ARV    762
Только что, Starichok сказал:

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

Очень зря.

Share this post


Link to post
Share on other sites
Starichok    1423

тем, кто считает, что я это делаю зря, напомню:

8 часов назад, Starichok сказал:

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

на плохой линии связи ошибки могут быть в ОБЕ стороны.

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

а на моих 20 см просто не может быть плохой связи...

Share this post


Link to post
Share on other sites
ARV    762
13 часа назад, Starichok сказал:

а на моих 20 см просто не может быть плохой связи...

Теоретически - да. А на практике место пайки датчика может окислиться и контачить через раз от всякого дуновения ветра. И вы будете в полной уверенности заходить в парную, думая, что там 90 градусов, а там всего 50. Или 150. Приятная неожиданность.

13 часа назад, Starichok сказал:

на плохой линии связи ошибки могут быть в ОБЕ стороны

Правильно, так и есть. Но на приеме датчик просто проигнорирует то, что не понял, и, соответственно, при последующем запросе ответит "не так", как ожидалось.

13 часа назад, Starichok сказал:

чем делать кучу попыток чтения, пока не совпадет контрольной число

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

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


  • Сообщения

    • Всем здравствуйте!!! Итак начнем. Основа усилителя - схема В.Шушурина из радио №6 1978, путем многих модернизаций и переходе на новую элементную базу  схема приняла вид неузнаваемости поэтому переехала сюда. Итак УМЗЧ с выходной 100Вт/4Ом рекомендуемый диапазон питающих напряжений +/-28...+/-38В Схема, вид собранной платы, предварительный спектр 
    • Как итог: было 2 пробитых полевика в 2х каналах, так же в третьем канале был сгоревший "ОУ", после выпаивания этих деталей, остальные каналы заработали в штатном режиме.  хотел сказать отдельное спасибо @KRAB, за то что пинал в нужном направлении. Буду теперь искать чем заменить сгоревшие детали.
    • немного отредактировал схему  - убрал разрядный диод -поставил резистор для кондея С6 ,добавил нагрузочный R12 на всяких пожарный) увеличил R4-5 -вроде получше будет для 740 транзистора ,подтянул С6 насколько было возможность - убирать не хочу -может убавит пулсации на выходе,имхо,добавил еще один разрядный резистор на емкость 100 мкф ,печатку тоже немного поправил - есть замечание? 
    • Фокус почти удался
    • Нет, оно не так работает. Там стоит мелкий конденсатор, который поддерживает открытым транзистор. А транзистор держит включенным реле. Магнитолу питать он не будет. Так что либо ставить нормальный АКБ, либо вешать конденсаторы на магнитолу. Либо, как вариант, можешь протянуть провод прямо от клеммы АКБ. Там просадка напряжения будет меньше, чем в проводке машины.
    • В принципе, хоть ранее я и не заострял на этом внимание, твои слова вполне укладываются в мои выводы о том, что общество не созрело. Ведь как получается: такие вот идеальные ангелы земные не хотят идти туда, где можно наводить порядок, а те, которые хотят - исчадия ада   Дурилка ты картонная... Как ты не понимаешь, что у дерева есть ствол, крона и корни... И каждый из элементов важен и состоит из других частей. Но целиком - это дерево. Есть явление, которое НЕИЗБЕЖНО вызывает конфликты, состоит оно из "невинного" национализма, нехорошего "нацизма" и плохого "фашизма", в каждом течении есть "радикальные", "умеренные" и еще какие-то течения-учения... Но все это надо назвать каким-то одним словом, чисто для удобства. И я готов принять любое для обозначения явления, которое всегда начинается с выделения по "праву рождения" какого-то критерия, а кончается уничтожением всех, кто не соответствует этому критерию. Как ты предлагаешь это назвать? Национализм - это фашизм в детстве.  И не игнорируй мои пояснения, как будто они не верны. Академические формулировки - вещь, безусловно, хорошая. Но хорошая для академических споров. Наука и говно изучает и разделяет его на массу видов, подвидов и категорий. Но обычным людям вполне достаточно общего термина - говно. Можно дискутировать об истоках термина "национализм", о том, как его искажают или извращают, но останется это тем же говном, что и было. Кстати, а почему никто про Грузию не говорит? Мы с женой собирались съездить в отпуске (который уже прошел, есличо), но передумали - по цене ничем не лучше других мест, а смотреть на горы - я их и в Абхазии насмотрелся. А теперь даже рад, что не поехал. И не поеду никогда. Как и на украину. 
    • Список : наименование - кол-во - цена ICL7107CPL(Кр572ПВ2А) 6 50
      IL311ANM(К554СА3) 12 8
      КА7806 20 8
      KIA7805 80 7
      MC78L05ACD (MC78L05ACDR2G) 100 5
      NCP1117DT33G 25 10
      LP2992AIM5-1.8 15 25

      L7809AC21DC 48 10
      LM2575T-5,0 15 35
      LM393D 4 8
      LP2950ACZ 50 15
      NE555P(Кр1006ВИ1) 90 7
      PC817(DIP4) 30 4
      PIC18F4520-I/P (DIP40) 40 60
      PSD-0505SL 5 50
      TL071C (SOIC8) 45 8
      МОС3083 150 8
      DS18S20+ 10 35
      J1121AS12VDC 40 35
      SW-338 DC-2.5 Ghz, GAAS SPDT 15 50
      SW-419 10 70
      HMC545ETR SOT-26
      LM2673S-ADJ 12 100
      UMZ-198-D16-G
      PTH05060WAH, 30WAH 3 600
      USBN9604-28M/NOPB 5 100
      DF08S, 85 10
      MAX202ECSE+ 18 40
      XC9572XL-5TQ100C 5 300

      PCA9515D 90 15
      МС33161D 50 20
      MM74HC126N 50 4
      MM74HC14 20 4
      MC14053 SO-16 40 8
      HEF4053BT SO-16 20 5
      HEF4066BT SO 30 4
      CD4013BPWR 25 6
      CD4520BPW 30 15
      SN74LVC2G06DBVR 30 4
      SN74LVC1G57DBVR 7 4
      SN74LVC2G17DBVR 9 7
      IR2113S 4 80
      UC2875DWP 3 300
      LTV357T 6 20
      ICM7555IBA 20 10
      DG406DN 2 100
      L4981AD ST 2 100
      TDA9820 25 20
      ADR130AUJZ-REEL7CT 5 80
      HMC539LP3 8 100

      TS922ID 6 40
      CYP15G0101DXB-BBC 1 1000
      LTM4619 6 80
      LM833M 30 15
      IN74AC14N 20 8
      LMX2315TMD 15 90

      MC33262 3 15
      HMC241G16 6 100
      SR3.3TST 5 15
      NGA-686 3


      полевой МLP1N06CL 75 40
      2SK1462 2 70
      3А627А 2 100
      BCP68 20 4
      BSR-135 140 1,5
      BCR158 80 1,5
      BCR185 80 1,5
      BCR191 150 1,5
      MBR745 7 10
      BCW66H 180 5
      BCW68H 180 6
      симистор ВТА26600BW 150 25 пары AD161 и AD162 = 16 пар 900 руб за пару
      ASZ 15 = 12 шт 400 руб
      германиевые SFT 306(Болгария) 20 шт  80руб-шт
       германиевые ГТ2308(Болгария) 50 шт 80 руб-шт
       германиевые ГТ905А 15 шт 20 руб - шт
       ГТ404В -7 шт 20руб-шт
      ГТ 404Г - 5шт 20руб-шт При опте возможны скидки.
      По всем вопросам обращаться в личку.

      Самовывоз из С-Петербурга, заказ от 500р.
      Возможна отправка за Ваш счёт Почтой России, ТК, заказ от 300р.
      Оплата на карту Сбера или наличкой при самовывозе.
      Список будет пополняться.