Donker 0 5 октября, 2018 Опубликовано 5 октября, 2018 (изменено) · Жалоба Купил такой дисплей () тут: http://ali.onl/16Oi Хочу подключить его к ATmega48PA, нашёл пример работы на этом же сайте https://www.radiokot.ru/articles/77/ Там пример методом ногодрыга, что меня вполне устраивает, впрочем физически он подключен у меня на макетке на выход аппаратной шины I2C так что я могу использовать оба варианта. Выкладываю проект (https://radiokot.ru/forum/download/file.php?id=315825), сделан Atmel Studio 7 + схема Proteus 8.7 Для начала, почему он не хочет работать даже в Протеусе? Подходящая ли протеуская модель? Правильно ли подключены выводы в модели экрана, особенно к шине? Схема из Протеуса (на осциллографе самое начало передачи на экран ): Листинг кода из примера: #define F_CPU 8000000UL #include <avr/io.h> #include <avr/pgmspace.h> #include <util/delay.h> #define CL_HI DDRA&=~(1<<0) //PORTA.0 = SCL = SCK #define CL_LOW DDRA|=(1<<0) //PORTA.0 #define DA_HI DDRA&=~(1<<1) //PORTA.1 = SDA #define DA_LOW DDRA|=(1<<1) //PORTA.1 #define LED_ON PORTD|=(1<<6) //для отладки #define LED_OFF PORTD&=~(1<<6) //для отладки #define NAME 0b01111000 //АДРЕС УСТРОЙСТВА НА ШИНЕ #define DATS 0b01000000 //ПЕРЕДАЧА НЕСКОЛЬКИХ БАЙТ ДАННЫХ #define DAT 0b11000000 //ПЕРЕДАЧА ОДНОГО БАЙТа ДАННЫХ #define COM 0b10000000 //ПЕРЕДАЧА ОДНОГО БАЙТа КОМАНДЫ //МАССИВ ДЛЯ ИНИЦИАЛИЗАЦИИ //A0 - начало в правом углу; A1 - начало в левом углу //C0 - начало снизу экрана; C8 - начало сверху экрана //12 - прямая линия, 02, 22 - линия через строчку //7F - яркость (максимум 0xFF) unsigned char PROGMEM init[18]= { 0xA8,0x3F,0xD3,0x00,0x40,0xA1,0xC8,0xDA,0x12, 0x81,0x7F,0xA4,0xA6,0xD5,0x80,0x8D,0x14,0xAF, }; //НАДПИСЬ RADIOKOT.RU и РИСУНОК КОТА unsigned char PROGMEM screen_1[1024]= { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xE0, 0x60, 0x60, 0x60, 0xE0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xE0, 0xE0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xE0, 0x60, 0x60, 0x60, 0x60, 0xC0, 0x80, 0x00, 0x00, 0xE0, 0xE0, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0x60, 0x60, 0x60, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0xE0, 0xE0, 0x00, 0x00, 0x80, 0xE0, 0x60, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0x60, 0x60, 0x60, 0xE0, 0xC0, 0x80, 0x00, 0x60, 0x60, 0x60, 0xE0, 0xE0, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xE0, 0x60, 0x60, 0x60, 0xE0, 0xC0, 0x00, 0x00, 0xE0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x06, 0x06, 0x1E, 0x7B, 0x73, 0x40, 0x00, 0x78, 0x7F, 0x1F, 0x18, 0x18, 0x1F, 0x7E, 0x70, 0x00, 0x00, 0x7F, 0x7F, 0x60, 0x60, 0x60, 0x70, 0x3F, 0x1F, 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x00, 0x1F, 0x3F, 0x70, 0x60, 0x60, 0x60, 0x70, 0x3F, 0x1F, 0x00, 0x00, 0x7F, 0x7F, 0x06, 0x07, 0x1F, 0x78, 0x60, 0x40, 0x00, 0x1F, 0x3F, 0x70, 0x60, 0x60, 0x60, 0x70, 0x3F, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x7F, 0x7F, 0x06, 0x06, 0x0E, 0x3F, 0x71, 0x40, 0x00, 0x1F, 0x3F, 0x70, 0x60, 0x60, 0x70, 0x3F, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0xC0, 0xC0, 0xC0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xF0, 0xE0, 0xE0, 0xF0, 0x70, 0x70, 0xB0, 0xF0, 0xB0, 0xE0, 0x20, 0xE0, 0x60, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xC0, 0xF0, 0xF0, 0xF8, 0xF8, 0xFC, 0xFC, 0xFE, 0xFE, 0xFF, 0xFF, 0x7F, 0xFF, 0xBF, 0xBF, 0xDF, 0xFF, 0xEF, 0xF7, 0xFB, 0xFF, 0xFB, 0xFD, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFD, 0xF7, 0xAF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFE, 0xFC, 0xFC, 0xF8, 0xF8, 0xF0, 0xE0, 0xE0, 0xC0, 0xC0, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xE0, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xBF, 0xFF, 0xCF, 0xF7, 0xFB, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x7F, 0x9F, 0xCF, 0xF2, 0xFF, 0xE7, 0xDF, 0x97, 0x37, 0x77, 0xFF, 0xF7, 0xEF, 0xEF, 0xEF, 0xFF, 0xF7, 0xF7, 0xF7, 0xF7, 0xFB, 0xFB, 0xFB, 0xFB, 0xFB, 0xFB, 0xFB, 0xFB, 0xFA, 0xF8, 0xF4, 0xF4, 0xFC, 0xE0, 0xE0, 0xE0, 0xF0, 0xF0, 0x78, 0x38, 0x98, 0x38, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xDF, 0xFB, 0xFC, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xDF, 0xFF, 0xF7, 0xFF, 0xFF, 0xFD, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0x7F, 0xDC, 0x5A, 0x54, 0x7F, 0x5F, 0x5F, 0x5F, 0x7F, 0x5F, 0x3F, 0xFF, 0xB3, 0xF9, 0xF3, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xF3, 0xF9, 0xB3, 0x7F, 0x3F, 0x7F, 0x5F, 0x7F, 0x5F, 0x5F, 0x7C, 0x54, 0x91, 0x90, 0xA0, 0x00, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xEF, 0xF7, 0xFD, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFD, 0xFD, 0xF7, 0xFE, 0xDF, 0xBE, 0xFF, 0x7E, 0x7F, 0x7E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0x7E, 0x7F, 0xBE, 0x1F, 0x6E, 0x43, 0xC1, 0x80, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x0F, 0x1F, 0x3F, 0x3F, 0x3F, 0x7F, 0x3F, 0x7F, 0x7F, 0x7F, 0x3F, 0x7F, 0x7F, 0x7F, 0x7F, 0x3F, 0x7F, 0x3F, 0x1F, 0x1F, 0x0F, 0x0F, 0x17, 0x1B, 0x1E, 0x1F, 0x0F, 0x0F, 0x0F, 0x1F, 0x0F, 0x0F, 0x0F, 0x0F, 0x1F, 0x0F, 0x0F, 0x0F, 0x1F, 0x0F, 0x0F, 0x0F, 0x1F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1E, 0x1E, 0x1E, 0x14, 0x30, 0x20, 0x20, 0x30, 0x1A, 0x0E, 0x0E, 0x0E, 0x0F, 0x1F, 0x17, 0x13, 0x18, 0x18, 0x08, 0x09, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; //ЦИФРЫ unsigned char PROGMEM DIGIT[5][24]= { { 0x00, 0x00, 0x00, 0x30, 0x30, 0xF8, 0xF8, 0x00, //1 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x1F, 0x1F, 0x18, 0x18, 0x00, 0x00, 0x00, }, { 0x00, 0x00, 0x30, 0x18, 0x18, 0x18, 0x98, 0xF8, //2 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x1C, 0x1E, 0x1B, 0x19, 0x18, 0x18, 0x00, 0x00, 0x00, }, { 0x00, 0x00, 0x30, 0x98, 0x98, 0x98, 0x98, 0xF8, //3 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x19, 0x19, 0x19, 0x19, 0x1F, 0x0F, 0x00, 0x00, 0x00, }, { 0x00, 0x00, 0x00, 0xC0, 0xF0, 0x38, 0xF8, 0xF8, //4 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x06, 0x06, 0x1F, 0x1F, 0x06, 0x00, 0x00, 0x00, }, { 0x00, 0x00, 0xF8, 0xF8, 0x98, 0x98, 0x98, 0x98, //5 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x19, 0x19, 0x19, 0x19, 0x1F, 0x0F, 0x00, 0x00, 0x00, }, }; //СТАРТ void START (void) { DA_HI; CL_HI; DA_LOW; CL_LOW; } //СТОП void STOP (void) { DA_LOW; CL_HI; DA_HI; } //ПЕРЕДАЧА БАЙТА и АСК void SEND (unsigned char data) { unsigned char k; for(k=8;k>0;k--) { if(data&(1<<(k-1))) { CL_LOW; DA_HI; CL_HI; CL_LOW; } else { CL_LOW; DA_LOW; CL_HI; CL_LOW; } } //ACK DA_HI; CL_HI; if(!(PINA&(1<<1))) CL_LOW; } //ИНИЦИАЛИЗАЦИЯ ДИСПЛЕЯ void OLED_INIT (void) { unsigned char k; START(); SEND(NAME); for(k=0;k<18;k++) { SEND(COM); SEND(pgm_read_byte(init+k)); } STOP(); } //ОЧИСТКА ЭКРАНА ДИСПЛЕЯ void CLR_SCR (void) { unsigned char k, kk; START(); SEND(NAME); //выбираем Horizontal Addressing Mode (заполнение экрана по типу того как читаем книгу) SEND(COM); SEND(0x20); SEND(COM); SEND(0x00); //заполняем строку слева направо SEND(DATS); for(kk=0;kk<8;kk++) { for(k=0;k<128;k++) SEND(0x00); //LSB вверху, MSB снизу } STOP(); } int main (void) { unsigned int k; unsigned char kk; CLKPR=0x80; CLKPR=0x00; //предделитель отключён, рабочая частота 8 MHz PORTA=0x00; //РА0 будет SCK, РА1 будет SDA DDRA =0x00; PORTD=0b00100000; //настройки СИДА для отладки, так можно обнулять DDRD =0b01000000; //настройки СИДА для отладки, так можно обнулять PORTB=0x00; //на всякий случай DDRB =0x00; //на всякий случай ACSR=0x80; //отключение компаратора для уменьшения потребления тока _delay_ms(500); //пауза перед инициализацией - у меня очень нестабильное включение питания OLED_INIT(); //инициализация дисплея CLR_SCR(); //очистка экрана дисплея while(1) { //рисуем кота START(); SEND(NAME); //посыл адреса+0 SEND(DATS); for(k=0;k<1024;k++) SEND(pgm_read_byte(screen_1+k)); STOP(); _delay_ms(2000); //последовательно выводим цифры от 1-го до 5-ти while(1) { for(kk=0;kk<5;kk++) { START(); SEND(NAME); SEND(COM); SEND(0x21); //Set Column Address (21h) SEND(COM); SEND(115); //будем выводить между 115... SEND(COM); SEND(126); //...и 126 колонками SEND(COM); SEND(0x22); //Set Page Address (22h) SEND(COM); SEND(6); //Будем крутиться между 6-ой... SEND(COM); SEND(7); //...и 7-ой страницами (строчками) SEND(DATS); for(k=0;k<12;k++) SEND(pgm_read_byte(DIGIT[kk]+k)); //рисуем верхнюю часть цифры for(k=12;k<24;k++) SEND(pgm_read_byte(DIGIT[kk]+k)); //рисуем нижнюю часть цифры STOP(); _delay_ms(1000); } } } return 0; } Изменено 5 октября, 2018 пользователем Donker Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Donker 0 6 октября, 2018 Опубликовано 6 октября, 2018 (изменено) · Жалоба Заработало с адресом 0b01111000 но глючно см. скрин ( Выкладываю подправленный проект с которого сделан скрин ( https://radiokot.ru/forum/download/file.php?id=315919 ) Каждый раз полоски в другом месте, один раз кот нарисовался нормально, почему так? Цифры не выводятся вообще, почему? Снижение частоты ,например, до 8мГц и 4мГц глюки не убирает. Откуда на линии стробирования SCL берётся такая неравномерность битов (промежутки плавно сокращаются в каждом байте, см. осциллограф на скрине) это нормально ? В железе ничего не работает, хотя если туда прошить другой проект, начинает нормально работать такой экран:http://ali.onl/16RD (в режиме аппаратного I2C) В на плате OLED экрана стоит стабилизатор на 3,3v и линии SCL SDA подтянуты к 3,3v резисторами по 10к. Контроллер ATmega48PA питается от 5v, но должно же работать ? Изменено 6 октября, 2018 пользователем Donker Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Jury093 2 6 октября, 2018 Опубликовано 6 октября, 2018 · Жалоба 1 час назад, Donker сказал: В на плате OLED экрана стоит стабилизатор на 3,3v и линии SCL SDA подтянуты к 3,3v резисторами по 10к. Контроллер ATmega48PA питается от 5v, но должно же работать ? версий две: 1. на схеме показаны i2c на PC4/5, а в исходниках #define CL_HI DDRA&=~(1<<0) //PORTA.0 = SCL = SCK #define DA_HI DDRA&=~(1<<1) //PORTA.1 = SDA 2. первый экран (oled) мог успешно сгореть по sda/scl, т.к. у ssd1306 максималка на этих пинах 3в3 - для развязки 3в3 и 5в (и подобных комбинаций) ставят т.н. левелшифтеры, на дискретах или чипах.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Donker 0 7 октября, 2018 Опубликовано 7 октября, 2018 · Жалоба В Протеусе упрощение, подтягивающие резисторы уже стоят на плате экрана и питаются от бортового стабилизатора экрана на +3,3v, а экран и ATmega48PA работают в режиме "открытого коллектора" и только притягивают линии к земле, главное что б ATmega48PA хватило +3,3v для высокого уровня. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Donker 0 7 октября, 2018 Опубликовано 7 октября, 2018 · Жалоба Добавил задержки, глюки без изменений. Выкладываю новую версию проекта с задержками ( https://radiokot.ru/forum/download/file.php?id=315936 ) Вроде тайминги I2C не где не нарушены, подозрительное место - ответ экрана, девятый строб в датаграмме в конце посылки каждого байта. (надо скачивать проект и смотреть в Протеусе) Листинг кода этого проекта: #ifndef MAIN_H_ #define MAIN_H_ #define F_CPU 20000000UL #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #include <stdio.h> #include <stdlib.h> //---------------------------------------------------------------- #include <avr/pgmspace.h> #define CL_HI DDRC&=~(1<<5) //PORTC.5 = SCL = SCK #define CL_LOW DDRC|=(1<<5) //PORTC.5 #define DA_HI DDRC&=~(1<<4) //PORTC.4 = SDA #define DA_LOW DDRC|=(1<<4) //PORTC.4 #define NAME 0b01111000 //АДРЕС УСТРОЙСТВА НА ШИНЕ #define DATS 0b01000000 //ПЕРЕДАЧА НЕСКОЛЬКИХ БАЙТ ДАННЫХ #define DAT 0b11000000 //ПЕРЕДАЧА ОДНОГО БАЙТа ДАННЫХ #define COM 0b10000000 //ПЕРЕДАЧА ОДНОГО БАЙТа КОМАНДЫ //МАССИВ ДЛЯ ИНИЦИАЛИЗАЦИИ //A0 - начало в правом углу; A1 - начало в левом углу //C0 - начало снизу экрана; C8 - начало сверху экрана //12 - прямая линия, 02, 22 - линия через строчку //7F - яркость (максимум 0xFF) const unsigned char PROGMEM init[18]= { 0xA8,0x3F,0xD3,0x00,0x40,0xA1,0xC8,0xDA,0x12, 0x81,0x7F,0xA4,0xA6,0xD5,0x80,0x8D,0x14,0xAF, }; //НАДПИСЬ RADIOKOT.RU и РИСУНОК КОТА const unsigned char PROGMEM screen_1[1024]= { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xE0, 0x60, 0x60, 0x60, 0xE0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xE0, 0xE0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xE0, 0x60, 0x60, 0x60, 0x60, 0xC0, 0x80, 0x00, 0x00, 0xE0, 0xE0, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0x60, 0x60, 0x60, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0xE0, 0xE0, 0x00, 0x00, 0x80, 0xE0, 0x60, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0x60, 0x60, 0x60, 0xE0, 0xC0, 0x80, 0x00, 0x60, 0x60, 0x60, 0xE0, 0xE0, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xE0, 0x60, 0x60, 0x60, 0xE0, 0xC0, 0x00, 0x00, 0xE0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x06, 0x06, 0x1E, 0x7B, 0x73, 0x40, 0x00, 0x78, 0x7F, 0x1F, 0x18, 0x18, 0x1F, 0x7E, 0x70, 0x00, 0x00, 0x7F, 0x7F, 0x60, 0x60, 0x60, 0x70, 0x3F, 0x1F, 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x00, 0x1F, 0x3F, 0x70, 0x60, 0x60, 0x60, 0x70, 0x3F, 0x1F, 0x00, 0x00, 0x7F, 0x7F, 0x06, 0x07, 0x1F, 0x78, 0x60, 0x40, 0x00, 0x1F, 0x3F, 0x70, 0x60, 0x60, 0x60, 0x70, 0x3F, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x7F, 0x7F, 0x06, 0x06, 0x0E, 0x3F, 0x71, 0x40, 0x00, 0x1F, 0x3F, 0x70, 0x60, 0x60, 0x70, 0x3F, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0xC0, 0xC0, 0xC0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xF0, 0xE0, 0xE0, 0xF0, 0x70, 0x70, 0xB0, 0xF0, 0xB0, 0xE0, 0x20, 0xE0, 0x60, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xC0, 0xF0, 0xF0, 0xF8, 0xF8, 0xFC, 0xFC, 0xFE, 0xFE, 0xFF, 0xFF, 0x7F, 0xFF, 0xBF, 0xBF, 0xDF, 0xFF, 0xEF, 0xF7, 0xFB, 0xFF, 0xFB, 0xFD, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFD, 0xF7, 0xAF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFE, 0xFC, 0xFC, 0xF8, 0xF8, 0xF0, 0xE0, 0xE0, 0xC0, 0xC0, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xE0, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xBF, 0xFF, 0xCF, 0xF7, 0xFB, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x7F, 0x9F, 0xCF, 0xF2, 0xFF, 0xE7, 0xDF, 0x97, 0x37, 0x77, 0xFF, 0xF7, 0xEF, 0xEF, 0xEF, 0xFF, 0xF7, 0xF7, 0xF7, 0xF7, 0xFB, 0xFB, 0xFB, 0xFB, 0xFB, 0xFB, 0xFB, 0xFB, 0xFA, 0xF8, 0xF4, 0xF4, 0xFC, 0xE0, 0xE0, 0xE0, 0xF0, 0xF0, 0x78, 0x38, 0x98, 0x38, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xDF, 0xFB, 0xFC, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xDF, 0xFF, 0xF7, 0xFF, 0xFF, 0xFD, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0x7F, 0xDC, 0x5A, 0x54, 0x7F, 0x5F, 0x5F, 0x5F, 0x7F, 0x5F, 0x3F, 0xFF, 0xB3, 0xF9, 0xF3, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xF3, 0xF9, 0xB3, 0x7F, 0x3F, 0x7F, 0x5F, 0x7F, 0x5F, 0x5F, 0x7C, 0x54, 0x91, 0x90, 0xA0, 0x00, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xEF, 0xF7, 0xFD, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFD, 0xFD, 0xF7, 0xFE, 0xDF, 0xBE, 0xFF, 0x7E, 0x7F, 0x7E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0x7E, 0x7F, 0xBE, 0x1F, 0x6E, 0x43, 0xC1, 0x80, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x0F, 0x1F, 0x3F, 0x3F, 0x3F, 0x7F, 0x3F, 0x7F, 0x7F, 0x7F, 0x3F, 0x7F, 0x7F, 0x7F, 0x7F, 0x3F, 0x7F, 0x3F, 0x1F, 0x1F, 0x0F, 0x0F, 0x17, 0x1B, 0x1E, 0x1F, 0x0F, 0x0F, 0x0F, 0x1F, 0x0F, 0x0F, 0x0F, 0x0F, 0x1F, 0x0F, 0x0F, 0x0F, 0x1F, 0x0F, 0x0F, 0x0F, 0x1F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1E, 0x1E, 0x1E, 0x14, 0x30, 0x20, 0x20, 0x30, 0x1A, 0x0E, 0x0E, 0x0E, 0x0F, 0x1F, 0x17, 0x13, 0x18, 0x18, 0x08, 0x09, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; //ЦИФРЫ const unsigned char PROGMEM DIGIT[5][24]= { { 0x00, 0x00, 0x00, 0x30, 0x30, 0xF8, 0xF8, 0x00, //1 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x1F, 0x1F, 0x18, 0x18, 0x00, 0x00, 0x00, }, { 0x00, 0x00, 0x30, 0x18, 0x18, 0x18, 0x98, 0xF8, //2 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x1C, 0x1E, 0x1B, 0x19, 0x18, 0x18, 0x00, 0x00, 0x00, }, { 0x00, 0x00, 0x30, 0x98, 0x98, 0x98, 0x98, 0xF8, //3 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x19, 0x19, 0x19, 0x19, 0x1F, 0x0F, 0x00, 0x00, 0x00, }, { 0x00, 0x00, 0x00, 0xC0, 0xF0, 0x38, 0xF8, 0xF8, //4 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x06, 0x06, 0x1F, 0x1F, 0x06, 0x00, 0x00, 0x00, }, { 0x00, 0x00, 0xF8, 0xF8, 0x98, 0x98, 0x98, 0x98, //5 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x19, 0x19, 0x19, 0x19, 0x1F, 0x0F, 0x00, 0x00, 0x00, }, }; //---------------------------------------------------------------- #endif /* MAIN_H_ */ //================================================================= #include "main.h" //================================================================= void START (void) //СТАРТ { DA_HI; CL_HI; DA_LOW; _delay_us(1); //подобрать CL_LOW; } void STOP (void) //СТОП { DA_LOW; CL_HI; _delay_us(1); //подобрать DA_HI; } void SEND (unsigned char data) //ПЕРЕДАЧА БАЙТА и АСК { unsigned char k; for(k=8;k>0;k--) { if(data&(1<<(k-1))) { CL_LOW; DA_HI; _delay_us(1); //подобрать CL_HI; _delay_us(1); //подобрать CL_LOW; } else { CL_LOW; DA_LOW; _delay_us(1); //подобрать CL_HI; _delay_us(1); //подобрать CL_LOW; } } _delay_us(1); //подобрать //ACK DA_HI; _delay_us(1); //подобрать CL_HI; _delay_us(1); //подобрать if(!(PINC&(1<<4))) CL_LOW; _delay_us(3); //подобрать } void OLED_INIT (void) //ИНИЦИАЛИЗАЦИЯ ДИСПЛЕЯ { unsigned char k; START(); SEND(NAME); for(k=0;k<18;k++) { SEND(COM); SEND(pgm_read_byte(init+k)); } STOP(); } void CLR_SCR (void) //ОЧИСТКА ЭКРАНА ДИСПЛЕЯ { unsigned char k, kk; START(); SEND(NAME); //выбираем Horizontal Addressing Mode (заполнение экрана по типу того как читаем книгу) SEND(COM); SEND(0x20); SEND(COM); SEND(0x00); //заполняем строку слева направо SEND(DATS); for(kk=0;kk<8;kk++) { for(k=0;k<128;k++) SEND(0x00); //LSB вверху, MSB снизу } STOP(); } void migalka (void) { for (unsigned int i =0; i<3; i++) { PORTB |= (1<<i); _delay_ms(500); PORTB &= ~(1<<i); } } int main(void) { DDRB = 0b00000111; PORTB = 0b00000000; migalka(); //однократно мигаем тремя светодиодами по очереди while(1) { unsigned int k; unsigned char kk; // CLKPR=0x80; // CLKPR=0x00; //предделитель отключён, рабочая частота 8 MHz PORTC=0x00; //РC5 будет SCK, РC4 будет SDA DDRC =0x00; // PORTD=0b00100000; //настройки СИДА для отладки, так можно обнулять // DDRD =0b01000000; //настройки СИДА для отладки, так можно обнулять // // PORTB=0x00; //на всякий случай // DDRB =0x00; //на всякий случай // // ACSR=0x80; //отключение компаратора для уменьшения потребления тока _delay_ms(500); //пауза перед инициализацией - у меня очень нестабильное включение питания OLED_INIT(); //инициализация дисплея CLR_SCR(); //очистка экрана дисплея //рисуем кота START(); SEND(NAME); //посыл адреса+0 SEND(DATS); for(k=0;k<1024;k++) SEND(pgm_read_byte(screen_1+k)); STOP(); _delay_ms(2000); while(1) { //------------------------------------------------------------------------- PORTB |= (1<<0); // Мигает светодиодом на PB0 перед каждой цифрой _delay_ms(500); PORTB &= ~(1<<0); _delay_ms(500); //-------------------------------------------------------------------------- for(kk=0;kk<5;kk++) { START(); SEND(NAME); SEND(COM); SEND(0x21); //Set Column Address (21h) SEND(COM); SEND(115); //будем выводить между 115... SEND(COM); SEND(126); //...и 126 колонками SEND(COM); SEND(0x22); //Set Page Address (22h) SEND(COM); SEND(6); //Будем крутиться между 6-ой... SEND(COM); SEND(7); //...и 7-ой страницами (строчками) SEND(DATS); for(k=0;k<12;k++) SEND(pgm_read_byte(DIGIT[kk]+k)); //рисуем верхнюю часть цифры for(k=12;k<24;k++) SEND(pgm_read_byte(DIGIT[kk]+k)); //рисуем нижнюю часть цифры STOP(); _delay_ms(1000); } } //-------------------------------------------------------------- } } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ikm 0 7 октября, 2018 Опубликовано 7 октября, 2018 · Жалоба Используйте в протеусе i2c дебагер. И начните разбираться с собственных картинок. Например с полностью закрашеного дисплея, и затем добавляя разные строки и столбцы по ширине и высоте поймете где плывет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Donker 0 7 октября, 2018 Опубликовано 7 октября, 2018 (изменено) · Жалоба Оказывается проект ATmega48P + SSD1306 (3).zip работает на реальном железе: Видимо после увеличения таймингов заработал. Кто будет использовать код, задержки там избыточны, лучше написать свою функцию задержки на основе количества пропуска циклов и подобрать ориентируясь на осциллограф в Протеусе, а лучше аппаратный, если есть. Видимо, глюк Протеуса, такое уже было с другим экраном http://kazus.ru/forums/showthread.php?p ... ost1218538 Изменено 7 октября, 2018 пользователем Donker Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Donker 0 11 октября, 2018 Опубликовано 11 октября, 2018 · Жалоба Оказывается проект ATmega48P + SSD1306 (3).zip работает на реальном железе: Спасибо Albert_V, видимо после увеличения таймингов заработал. Кто будет использовать код, задержки там избыточны, лучше написать свою функцию задержки на основе количества пропуска циклов и подобрать ориентируясь на осциллограф в Протеусе, а лучше аппаратный, если есть. Видимо, глюк Протеуса, такое уже было с другим экраном http://kazus.ru/forums/showthread.php?p ... ost1218538 Dидимо после увеличения таймингов заработал. Кто будет использовать код, задержки там избыточны, лучше написать свою функцию задержки на основе количества пропуска циклов и подобрать ориентируясь на осциллограф в Протеусе, а лучше аппаратный, если есть. Видимо, глюк Протеуса, такое уже было с другим экраном http://kazus.ru/forums/showthread.php?p ... ost1218538 =============================================================================================== Начал писать вариант проекта с использованием уже аппаратной шины I2C (TWI), и столкнулся с проблемой: https://radiokot.ru/forum/download/file.php?id=316085 монитор вдруг утерял способность нормально прижимать линию SDA к земле! Почему так происходит, ногодрыгом ведь работало нормально? Выкладываю весь проект:https://radiokot.ru/forum/download/file.php?id=316086 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Donker 0 11 октября, 2018 Опубликовано 11 октября, 2018 · Жалоба 11 hours ago, Donker said: Новая версия проекта c аппаратным I2C: https://radiokot.ru/forum/download/file.php?id=316127 В Протеусе глючит так же как и версия с ногодрыгом. В железе работает, но вывод цифр зависает в среднем после 10 циклов, скорее всего не получает сигнал ACK. У кого какие идеи? Кстати, дисплей заметно мерцает, на фото выше видно тёмную полосу, она движется заметно глазу с циклом около 30 гц. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Donker 0 13 октября, 2018 Опубликовано 13 октября, 2018 · Жалоба На плате экрана стоит линейный стабилизатор на +3,3v серии XC6206 в корпусе SOT-23, по датащиту на входе и выходе у него должны стоять керамические конденсаторы не менее 1мкФ, на самом деле, на входе не было никакого конденсатора, я отпаял от сломанной материнки два конденсатора 0608 по 4,7мкФ неизвестного типа, сначала припаял один на вход, ничего не изменилось, потом второй на выход, исчезло вышеописанное мерцание, и вот уже 60 минут проект с аппаратным I2C работает без зависания. Осталось только разобраться с глюками Протеуса, или зафиксировать наличие в природе минимум двух разных версий контроллера с разной системой команд. В Протеусе резисторы менял от 1к до 10к ничего не изменилось. Вопрос: что такое надо сделать в Протеусе что бы в данной схеме увидеть размах сигнала I2C в осциллографе 3,3 вольта? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kovigor 5 14 октября, 2018 Опубликовано 14 октября, 2018 · Жалоба 22 hours ago, Donker said: ... потом второй на выход, исчезло вышеописанное мерцание, и вот уже 60 минут проект с аппаратным I2C работает без зависания Ага, эти стабилизаторы склонны к самовозбуждению без небольшого керамического конденсатора на выходе. То же относится к 7805, и не только к ним. Конечно, самовозбуждение возникает далеко не всегда, но если возникает - тут уж возможны труднообъяснимые 'чудеса', которые перестают быть таковыми, если вооружиться осциллографом :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться