Помогите совместить АЦП и 1-wire в ATMEGA

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
akulov
Открыл глаза
Сообщения: 42
Зарегистрирован: Пн июн 06, 2011 13:18:00

Помогите совместить АЦП и 1-wire в ATMEGA

Сообщение akulov »

Хочу сделать что-то типа метеостанции, что бы измерять давление, влажность и две температуры.
Написал програмку, но по ней у меня нормально измеряется или давление и влажность, или температуры,
а вместе показания не устойчивые. Подозреваю, что это как-то связано с прерываниями, но сообразить не могу.
Не хватает знаний. Может, кто-то посмотрит код и подскажет, как нужно правильно сделать?
Программа в CodeVisionAVR для ATMEGA8.
Исходный код в файле.
Вложения
meteo.rar
(2.18 КБ) 247 скачиваний
Реклама
borys
Держит паяльник хвостом
Сообщения: 927
Зарегистрирован: Вт сен 07, 2010 19:27:48
Откуда: Ташкент

Re: Помогите совместить АЦП и 1-wire в ATMEGA

Сообщение borys »

В РАДИО примерно в 2007-2008 году было описание метеостанции (на Меге16). Там есть ис-
ходники на CodeVision.
Реклама
akulov
Открыл глаза
Сообщения: 42
Зарегистрирован: Пн июн 06, 2011 13:18:00

Re: Помогите совместить АЦП и 1-wire в ATMEGA

Сообщение akulov »

borys писал(а):В РАДИО примерно в 2007-2008 году было описание метеостанции (на Меге16). Там есть ис-
ходники на CodeVision.
Там сильно "круто", мне в них не разобраться, надо что-нибудь попроще с указанными мною функциями. В интернете такого я не нашел.
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: Помогите совместить АЦП и 1-wire в ATMEGA

Сообщение pyzhman »

1-wire протокол четко ограничен по времянке. Если в момент обмена втиснется прерывание, то хана и каюк. Вы на время работы с 1-wire отключите прерывания:

Код: Выделить всё

#asm("cli");
снимаем температуру;
#asm("sei");
Docendo discimus
Реклама
Эиком - электронные компоненты и радиодетали
akulov
Открыл глаза
Сообщения: 42
Зарегистрирован: Пн июн 06, 2011 13:18:00

Re: Помогите совместить АЦП и 1-wire в ATMEGA

Сообщение akulov »

pyzhman писал(а):1-wire протокол четко ограничен по времянке. Если в момент обмена втиснется прерывание, то хана и каюк. Вы на время работы с 1-wire отключите прерывания:

Код: Выделить всё

#asm("cli");
снимаем температуру;
#asm("sei");
То же самое. Мне кажется, что ошибка при выводе на индикаторы, но где?
Реклама
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: Помогите совместить АЦП и 1-wire в ATMEGA

Сообщение Мастер Ломастер »

объясните мне, для чего вы впихнули измерение чего-то там и вывод на дисплей в обработчик прерывания таймера?! какой в этом смысл?! для чего вообще прерывания в вашем проекте?

хоть вы и не описали подробно, в чем именно проявляется ваша "неустойчивость показаний", но предположу, что на экране иной раз вывод температуры, например, или там давления вдруг оказывается не в том месте, где положено, или в середине одного текста оказывается другой и т.п. странные эффекты. так?
битва с дураками проиграна, победители торжествуют. слава победителям!
Реклама
Аватара пользователя
Garin
Потрогал лапой паяльник
Сообщения: 351
Зарегистрирован: Пн сен 12, 2011 12:13:46

Re: Помогите совместить АЦП и 1-wire в ATMEGA

Сообщение Garin »

akulov в к твоей теме поключилось уже два сильнейших экстрасенса. и то не могут сразу определить че ты там хочеш...
Да приложи ты проект полностью , мне например тоже влом создать твою схему в протеусе чтобы понять что не так, а табе там всего навсего нужно собрать весь вывод информации на ЖКИ в одно место в непрерывный цикл....
akulov
Открыл глаза
Сообщения: 42
Зарегистрирован: Пн июн 06, 2011 13:18:00

Re: Помогите совместить АЦП и 1-wire в ATMEGA

Сообщение akulov »

Мастер Ломастер писал(а):объясните мне, для чего вы впихнули измерение чего-то там и вывод на дисплей в обработчик прерывания таймера?! какой в этом смысл?! для чего вообще прерывания в вашем проекте?
хоть вы и не описали подробно, в чем именно проявляется ваша "неустойчивость показаний", но предположу, что на экране иной раз вывод температуры, например, или там давления вдруг оказывается не в том месте, где положено, или в середине одного текста оказывается другой и т.п. странные эффекты. так?
Попробую переписать проект без прерываний. Неустойчивость показаний в том, что показания или температуры, или влажности (давления) пропадают или выводятся не полностью, пропадают, но не перемещаются.
Выложил полный проект.
Вложения
meteo.rar
(26.43 КБ) 186 скачиваний
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: Помогите совместить АЦП и 1-wire в ATMEGA

Сообщение Мастер Ломастер »

как у большинства начинающих, у вас нет четкого представления алгоритма работы вашего устройства, потому что программу вы пишите "на лету" или "сходу" - как пришла на ум мысля, так и написали. частенько в ответ на просьбу рассказать, что же делает его программа, начинающий говорит что-то типа "ну, я запускаю АЦП в таком-то режиме, ставя такие-то биты в таких-то регистрах, а потом результат его вывожу на дисплей". налицо смешение в кучу низкоуровневых действий (режим АЦП и работа с ним) и высокоуровневых (вывод на дисплей). как известно, если все перемешано - это каша, соответственно и программа будет в виде каши, ни понять, ни найти ошибки - ничего хорошего.
так не пойдет: МК это не мозг человека, сопоставить логическую последовательность с реальностью он не может, он может тупейшим образом исполнять ваши команды. чтобы результат его деятельности совпал с желаемым вами, вам придется думать за него - много и тщательно.

я советую делать это по принципу "от общего к деталям". итак, вы хотите, чтобы ваш девайс измерял температуру, давление и скорость ветра (предположим). будем сразу считать, что он это уже делает при помощи функций
measure_temp();
measure_pressure();
measure_wind();
измеренные значения он должен выводить на LCD. снова считаем, что он уже умеет это делать, естественно, при помощи функции
lcd_output(temp, press, wind);

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

итак, измеряет и выводит - это все? скорее всего, нет: наверняка нужно реагировать на кнопки управления, делать это естественно при помощи двух функций:
get_key_pressed();
change_parameter(command);

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

на данном этапе мы не ломаем бошку над тем, какие там параметры, команды и прочие мелочи - просто принимаем, как данность, что они ЕСТЬ - пусть функция с ними и разбирается.

итак, все ли у нас имеется для работы девайса? практически да, не хватает только одной функции, которая настроит всю периферию девайса после включения питания. пусть это будет функция
init();

теперь все, можно написать программу:

Код: Выделить всё

int main(void){
   init();
   while(1){
      temperature = measure_temp();
      pressure = measure_pressure();
      wind_speed = measure_wind();
     
      lcd_output(temperature, pressure, wind_speed);

      change_parameters(get_key_pressed());
   }
}
похоже, что данный код на 100% выполняет поставленную задачу (и заметьте: алгоритм полностью понятен без единого комментария!): после инициализации в бесконечном цикле измеряет три параметра и выводит их на дисплей, затем изменяет параметры в зависимости от того, какая кнопка нажата.

раз "в общем и целом" программа готова, надо переходить к деталям, т.е. начинать делать РЕАЛИЗАЦИЮ тех функций, которые ранее мы считали УЖЕ ИМЕЮЩИМИСЯ. попутно надо описывать переменные, необходимые для работы этих функций, константы и т.п. штуки. делать это надо точно так же: ставим задачу, считая, что все необходимое уже есть, и рисуем код функции. разумеется, если на самом деле что-то уже есть (например, стандартная функция Си) - мы должны использовать ее, а если стандартного нет - позже сделаем самостоятельно.

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

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

желаю вам удачи!
битва с дураками проиграна, победители торжествуют. слава победителям!
akulov
Открыл глаза
Сообщения: 42
Зарегистрирован: Пн июн 06, 2011 13:18:00

Re: Помогите совместить АЦП и 1-wire в ATMEGA

Сообщение akulov »

Мастер Ломастер писал(а): ...желаю вам удачи!
Вопросов больше, чем ответов. Спасибо за начало, буду пробовать поэтапно. Может, что и получится.
Аватара пользователя
C@at
Вымогатель припоя
Сообщения: 652
Зарегистрирован: Вс ноя 13, 2011 16:42:05
Откуда: Украина

Re: Помогите совместить АЦП и 1-wire в ATMEGA

Сообщение C@at »

akulov не слушай, никого. Все в кучу накидал и наслаждаешся программой :)))
Это конечно шутка. если серьезно к твоему проекту подходить то неделю ухайдокаеш точно, поэтому серьезные люди тебе подсказывают ... только правильное направление, потому что на эти дела смотрят серьезно и относятся со всей ответственостью.....
Ну в общем, так как я не в курсе как правильно делается ,позволил себе потренировался, как бы я его место для цензуры...

Код: Выделить всё

/*****************************************************
http://c2.at.ua
Chip type           : ATmega8
Clock frequency     : 4,000000 MHz
*****************************************************/
#include <mega8.h>
// 1 Wire Bus functions
#asm
  .equ __w1_port=0x12; PORTD
  .equ __w1_bit=0 
#endasm
#include <1wire.h>
#include <ds18b20.h>                              //библиотека для работы с датчиком ds18b20
unsigned char rom_code[4][9];                     //масив с адресами найденых датчиков
#define MAX_DS18B20 8
#asm
  .equ __lcd_port=0x18 ;PORTB
#endasm
#include <lcd.h>
#include <stdio.h>
#include <delay.h>
unsigned char devices, k;                      //переменная 
unsigned char signs='\x25';                    // ………..
unsigned int vlazhnost,davlenie;              // ……………..
int temp1,temp2;                                    //………………
char lcd_text[16];
#define ADC_VREF_TYPE 0xE0
unsigned char read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0x7f);
delay_us(10);
ADCSRA|=0x40;
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCH;
}
void temperature(void) // функция по работе с термо-датчиком
{
   temp1 = ds18b20_temperature(&rom_code[0][0]);  // читаем температуру с выбранного датчика
         if ((temp1 < 130) & (temp1 > -60))       // установим границу диапазон 
        temp1= temp1;
        else { temp1 =0;  };                                // если выходит за границу тогда 0 
        
    temp2 = ds18b20_temperature( &rom_code[1][0] );//читаем температуру с выбранного датчика   
        if ((temp2 < 130) & (temp2 > -60))        // установим границу диапазон 
        temp2= temp2;
        else {  temp2 =0;  };                                // если выходит за границу тогда 0
 }
void main(void)
{
PORTB=0b00000000;                                 // «WzAVR «Port B initialization
 DDRB=0b00000000;                                  //
PORTC=0b10000000;                                 // «WzAVR «Port C initialization
 DDRC=0b00000000;
PORTD=0b00000000;                                 // «WzAVR «Port D initialization
 DDRD=0b00000000;
TCCR0=0x03;
TCNT0=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
MCUCR=0x00;
TIMSK=0x01;
ACSR=0x80;
SFIOR=0x00;
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x86;
devices=w1_search(DS18B20_SEARCH_ROM_CMD,rom_code);  //определим сколько устройств   подключено к шине 1-Wire 
ds18b20_init(0,-35,35,DS18B20_12BIT_RES);        // переключения термометра в 12 битный режим 
w1_init();                                                                             // Wire Bus initialization
lcd_init(16);
while (1)
      { 
       temperature(); // вызываем функцию температуры
      vlazhnost=0;
      davlenie=0;
      for (k=0;k<79;k++) 
         {        
         vlazhnost+=read_adc(0);    //Влажность 
         davlenie+=read_adc(1)/2;        //давление
         };
      vlazhnost/=200;   // 
      davlenie/=11;  //вычисляем среднее арифметическое измерения    
      sprintf(lcd_text, "%3u%c",vlazhnost,signs); 
      lcd_gotoxy(10,0);
      lcd_puts(lcd_text);    // выводим масив на LCD    
         
      sprintf(lcd_text, "%3umm",davlenie); 
      lcd_gotoxy(10,1);
      lcd_puts(lcd_text);    // выводим масив на LCD   
       
               sprintf(lcd_text,"%i.%u\xdfC   ",temp1,temp1%1);
                lcd_gotoxy(0,0);                              // указали место на дисплее
                lcd_puts(lcd_text);                       // выводим масив на LCD
               sprintf(lcd_text,"%i.%u\xdfC   ",temp2,temp2%1);  
                lcd_gotoxy(0,1);
                lcd_puts(lcd_text);                       // выводим масив на LCD           
      }; 
}
Проект работает и в протеусе и на отладочной платке...
meteoС2.rar
Протеус и прошивка
(20.73 КБ) 172 скачивания
Последний раз редактировалось C@at Пт янв 27, 2012 00:56:28, всего редактировалось 1 раз.
akulov
Открыл глаза
Сообщения: 42
Зарегистрирован: Пн июн 06, 2011 13:18:00

Re: Помогите совместить АЦП и 1-wire в ATMEGA

Сообщение akulov »

C@at , большое спасибо! Подправить коэффициенты преобразования давления и влажности и можно реализовывать.

Мастер Ломастер, по Вашему совету составил программу, пока только с измерением давления и влажности.
Все работает, только почему-то мигает знак % во влажности. Може подскажете, что не так?

Код: Выделить всё

 #include <mega8.h>
#include <stdio.h> 
#include <stdlib.h> 
#include <delay.h>


#asm
   .equ __lcd_port=0x18 ;PORTB
#endasm
#include <lcd.h>

float tmp;       
float vlagnost;
float pressure;
unsigned char LCD_vla[16]; //влажность
unsigned char LCD_dav[16]; //давление

#define ADCMUX_V 0
#define ADCMUX_D 1

#define ADC_VREF_TYPE 0x40

unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input|ADC_VREF_TYPE;
ADCSRA|=0x40;
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}

void init(void)
{
PORTB=0x00;
DDRB=0x00;
PORTC=0b10000000;
DDRC=0x00;
PORTD=0x00;
DDRD=0x00;
TCCR0=0x00;
TCNT0=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
MCUCR=0x00;
TIMSK=0x00;
ACSR=0x80;
SFIOR=0x00;
ADMUX=ADC_VREF_TYPE;
ADCSRA=0x86; 
}

float measure_vlagnost()
    {
       tmp= read_adc(ADCMUX_V);     // чтение с датчика влажности
       tmp = (tmp * 5000) / 1023;    // Вычисляем напряжение  милливольт. 
       tmp = (tmp - 958)/30.7;           // Значение влажности в %
       if (tmp > 100) {tmp = 100;} ;  
       return tmp;
    }
    
float measure_pressure()
    {
      tmp=read_adc(ADCMUX_D); 
      tmp = (tmp * 5000) / 1023;   // Вычисляем напряжение  милливольт.
      tmp = (tmp/5+95)/900000*750064;  // Значение в мм.рт.ст. //(мрс) K=7.50064 
      return tmp;
    }   

void lcd_output ()
    {
         //влажность
      ftoa(vlagnost, 1, LCD_vla);       // преобразование и вывод на LCD влажности
      lcd_gotoxy(10,0); 
      lcd_puts(LCD_vla);
      lcd_putsf("     ");
      lcd_gotoxy(15,0); 
      lcd_putsf("%");
     
    //давление
    ftoa(pressure, 0, LCD_dav);      // преобразование и вывод на LCD давления
    lcd_gotoxy(10,1);               
    lcd_puts(LCD_dav);
    lcd_gotoxy(14,1); 
    lcd_putsf("mm");
    
     } 
     
       
void main(void)
{
   init();

lcd_init(16);

   while(1)
    {
      vlagnost = measure_vlagnost();
      pressure = measure_pressure();
           
      lcd_output();

    }
}
Аватара пользователя
C@at
Вымогатель припоя
Сообщения: 652
Зарегистрирован: Вс ноя 13, 2011 16:42:05
Откуда: Украина

Re: Помогите совместить АЦП и 1-wire в ATMEGA

Сообщение C@at »

Причина здесь lcd_putsf(" ");

Код: Выделить всё

         //влажность
      ftoa(vlagnost, 1, LCD_vla);       // преобразование и вывод на LCD влажности
      lcd_gotoxy(10,0); 
      lcd_puts(LCD_vla);
             //      lcd_putsf("     ");
      lcd_gotoxy(15,0); 
      lcd_putsf("%");
Осталось мелочь? термометр.
akulov
Открыл глаза
Сообщения: 42
Зарегистрирован: Пн июн 06, 2011 13:18:00

Re: Помогите совместить АЦП и 1-wire в ATMEGA

Сообщение akulov »

C@at писал(а):Причина здесь lcd_putsf(" ");
А без него не убирается последняя цифра. Например, если перед этим было 100%, а потом 98.5, то отобразится 98.50. Т.е. 0 не убирается.
Зато не мигает знак %. Попробую функцию sprintf.
akulov
Открыл глаза
Сообщения: 42
Зарегистрирован: Пн июн 06, 2011 13:18:00

Re: Помогите совместить АЦП и 1-wire в ATMEGA

Сообщение akulov »

C@at , а не подскажете, как в sprintf вывести знак %? У меня не получается. Вывожу только через lcd_putsf, но тогда он не привязан к значению.
Аватара пользователя
C@at
Вымогатель припоя
Сообщения: 652
Зарегистрирован: Вс ноя 13, 2011 16:42:05
Откуда: Украина

Re: Помогите совместить АЦП и 1-wire в ATMEGA

Сообщение C@at »

В контроллерных программах решается все 1000 и 1 способ ( ой мало загнул... 1000 и 1 способ :)) где то так....)
akulov писал(а):C@at , а не подскажете, как в sprintf вывести знак %?
Смотрите в предыдущем коде который я выложил, (в протеусе то смотрели как оно смотрится?)

Код: Выделить всё

unsigned char signs='\x25'; 
//////////////......
//////////////......
sprintf(lcd_text, "%3u%c",vlazhnost,signs);
//////////////......
codenamehawk
Вымогатель припоя
Сообщения: 528
Зарегистрирован: Вт фев 09, 2010 17:52:26

Re: Помогите совместить АЦП и 1-wire в ATMEGA

Сообщение codenamehawk »

akulov писал(а):
C@at писал(а):Причина здесь lcd_putsf(" ");
А без него не убирается последняя цифра. Например, если перед этим было 100%, а потом 98.5, то отобразится 98.50. Т.е. 0 не убирается.
Зато не мигает знак %. Попробую функцию sprintf.
Для того, чтобы не было видно заключительного нуля выводите lcd_putsf(" "); где важно колличевство пробелов их должно быть не меньше чем символов которые выводились до этого.

нп. вы вывели

lcd_gotoxy(10,0);
lcd_putsf("123.45");

чтобы затереть необходимо переместить курсор на место знака "1"
lcd_gotoxy(10,0);
и напечатать шесть пробелов
lcd_putsf(" "); //шесть пробелов

перед выводом нового текста не забудьте
lcd_gotoxy(10,0);
akulov
Открыл глаза
Сообщения: 42
Зарегистрирован: Пн июн 06, 2011 13:18:00

Re: Помогите совместить АЦП и 1-wire в ATMEGA

Сообщение akulov »

codenamehawk писал(а): нп. вы вывели
lcd_gotoxy(10,0);
lcd_putsf("123.45");
чтобы затереть необходимо переместить курсор на место знака "1"
lcd_gotoxy(10,0);
и напечатать шесть пробелов
lcd_putsf(" "); //шесть пробелов
перед выводом нового текста не забудьте
lcd_gotoxy(10,0);"
Спасибо! Я не в том месте ставил lcd_putsf(" "); и после не ставил опять lcd_gotoxy(10,0);
C@at писал(а):Осталось мелочь? термометр.
Написал и термометры, но система получилась "тормозная", очень медленно набирает показания, во всяком случае в Proteus.
Завтра попробую на макетке.
Ваш проект более подходит, но пытался я изменить пересчет показаний влажности и давления, у меня ничего не получается.
Влажность рассчитывается по формуле: Влажность% = (Vout-SV)/KV где SV=смещение нуля (0.958), KV=наклон характеристики (0.0307).
Все значения в вольтах и в исходнике SV и KV нужно изменять под конкретный датчик.
Давление по формуле: Давление в мм = (Vout/5+0.095)/0.009*7.50064 (тоже все в вольтах).
И рекомендуют ADC_VREF_TYPE 0x40 (Vcc 5V).
Может, поможете, как пересчитать вывод этих показаний в Вашей программе?
Аватара пользователя
C@at
Вымогатель припоя
Сообщения: 652
Зарегистрирован: Вс ноя 13, 2011 16:42:05
Откуда: Украина

Re: Помогите совместить АЦП и 1-wire в ATMEGA

Сообщение C@at »

То что притормаживает, это номально, обсчет показаний температуры занимает приличный ресурс....
Мой кусок кода , это только один из вариантов вывода информации на дисплей. И все там для минимального понятия ... и все требует усовершествования. Те же термометры в пять строк , это только начало.... Дальше уже ваша математика измерений , опять же вариантов куча (мои методы вряд ли подойдут, для примера обучения), так что дальше, все на ваше усмотрение.....
akulov
Открыл глаза
Сообщения: 42
Зарегистрирован: Пн июн 06, 2011 13:18:00

Re: Помогите совместить АЦП и 1-wire в ATMEGA

Сообщение akulov »

C@at писал(а):То что притормаживает, это номально, обсчет показаний температуры занимает приличный ресурс....
Мой кусок кода , это только один из вариантов вывода информации на дисплей. И все там для минимального понятия ... и все требует усовершествования. Те же термометры в пять строк , это только начало.... Дальше уже ваша математика измерений , опять же вариантов куча (мои методы вряд ли подойдут, для примера обучения), так что дальше, все на ваше усмотрение.....
Спасибо, буду смотреть!
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»