Хочу подключить его к ATmega48PA, нашёл пример работы на этом же сайте https://www.radiokot.ru/articles/77/
Там пример методом ногодрыга, что меня вполне устраивает, впрочем физически он подключен у меня на макетке на выход
аппаратной шины I2C так что я могу использовать оба варианта.
Выкладываю проект (см. ATmega48P + SSD1306.zip), сделан Atmel Studio 7 + схема Proteus 8.7
Для начала, почему он не хочет работать даже в Протеусе?
Подходящая ли протеуская модель?
Правильно ли подключены выводы в модели экрана, особенно к шине?
Если надо выложить дополнительно скрины пишите, выложу.
#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,
};
Полезно знать как работать с устройством обоими способами, на случай если у вас много I2C устройств а шина одна,
и они между собой начинают глючить или адреса одинаковые, тогда некоторые можно повесить на другие выводы микроконтроллера.
Заработало с адресом 0b01111000 но глючно см. скрин (Глючный кот.png)
Выкладываю подправленный проект с которого сделан скрин (ATmega48P + SSD1306 (2).zip)
Каждый раз полоски в другом месте, один раз кот нарисовался нормально, почему так?
Цифры не выводятся вообще, почему?
Снижение частоты ,например, до 8мГц и 4мГц глюки не убирает.
Откуда на линии стробирования SCL берётся такая неравномерность битов
(промежутки плавно сокращаются в каждом байте, см. осциллограф на скрине)
это нормально ?
В железе ничего не работает, хотя если туда прошить другой проект, начинает нормально работать такой экран: http://ali.onl/16RD (в режиме аппаратного I2C)
В на плате OLED экрана стоит стабилизатор на 3,3v и линии SCL SDA подтянуты к 3,3v резисторами по 10к.
Контроллер ATmega48PA питается от 5v, но должно же работать ?
Странно, как он у автора примера заработало, в коде задержек вообще нет, наверно Atiny2313 более тормозная.
Кстати, у меня подтягивающие резисторы шины I2C питаются шины +5v, а в реальном железе от +3,3V (они расположена на плате монитора, по 10к , там на входе стабилизатор на 3,3v т.к. реально монитор работает на 3,3v).
Если контроллер работает без сбоев(не включится на выход с высоким уровнем), то напряжение на линиях не превысит 3,3 вольта.
Последний раз редактировалось DENIS451 Вс окт 07, 2018 00:12:38, всего редактировалось 2 раза.
DENIS451 писал(а):Странно, как он у автора примера заработало, в коде задержек вообще нет, наверно Atiny2313 более тормозная.
А ты фьюзы в той статье смотрел? Там же (дефолтно) стоит CKDIV8, т.е. CPU работает на 1/8 от частоты встроенного генератора, т.е. на 1 МГц. А так, та тинька, как и твоя 48-я Мега штатно может работать до 20 МГц,ничуть они не тормозные.
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
Добавил задержки, глюки без изменений.
Выкладываю новую версию проекта с задержками (см. ATmega48P + SSD1306 (3).zip)
Вроде тайминги I2C не где не нарушены, подозрительное место - ответ экрана, девятый строб в датаграмме
в конце посылки каждого байта. (надо скачивать проект и смотреть в Протеусе)
Листинг кода этого проекта: Спойлер#ifndef MAIN_H_
#define MAIN_H_
#define NAME 0b01111000 //АДРЕС УСТРОЙСТВА НА ШИНЕ
#define DATS 0b01000000 //ПЕРЕДАЧА НЕСКОЛЬКИХ БАЙТ ДАННЫХ
#define DAT 0b11000000 //ПЕРЕДАЧА ОДНОГО БАЙТа ДАННЫХ
#define COM 0b10000000 //ПЕРЕДАЧА ОДНОГО БАЙТа КОМАНДЫ
//МАССИВ ДЛЯ ИНИЦИАЛИЗАЦИИ
//A0 - начало в правом углу; A1 - начало в левом углу
//C0 - начало снизу экрана; C8 - начало сверху экрана
//12 - прямая линия, 02, 22 - линия через строчку
//7F - яркость (максимум 0xFF)
PORTC=0x00; //РC5 будет SCK, РC4 будет SDA
DDRC =0x00;
// PORTD=0b00100000; //настройки СИДА для отладки, так можно обнулять
// DDRD =0b01000000; //настройки СИДА для отладки, так можно обнулять
//
// PORTB=0x00; //на всякий случай
// DDRB =0x00; //на всякий случай
//
// ACSR=0x80; //отключение компаратора для уменьшения потребления тока
_delay_ms(500); //пауза перед инициализацией - у меня очень нестабильное включение питания
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);
}
}
//--------------------------------------------------------------
}
}Добавлено after 2 hours 1 minute 52 seconds: Re: Не работает экран OLED 128X64 I2C на SSD1306, что не так?
Оказывается проект ATmega48P + SSD1306 (3).zip работает на реальном железе:
Спасибо Albert_V, видимо после увеличения таймингов заработал.
Кто будет использовать код, задержки там избыточны, лучше написать свою функцию задержки на основе количества
пропуска циклов и подобрать ориентируясь на осциллограф в Протеусе, а лучше аппаратный, если есть.
Даю универсальный алгоритм, чтобы запустить управление любой хренью от любой хрени.
1. Качаем даташит на управляемую хрень. Изучаем интерфейс и протокол управления.
2. Качаем даташит на управляющую хрень. Изучаем доступные интерфейсы для подключения.
3. Подключаем одну хрень к другой хрени.
4. Реализуем протокол управления по даташитам.
5. Если не работает, подключаем логический анализатор или осциллограф и переходим к пункту 4.
6. Радуемся.
[uquote="DENIS451",url="/forum/viewtopic.php?p=3473635#p3473635"]Мне показалось, что так будет проще.[/uquote]
ну как же это может быть проще, если ты программно выполняешь то, что можно делать аппаратно?
Начал писать вариант проекта с использованием уже аппаратной шины I2C (TWI), и столкнулся с проблемой,
( см. скрин I2C ступенька.png) монитор вдруг утерял способность нормально прижимать линию SDA к земле!
Почему так происходит, ногодрыгом ведь работало нормально?
Выкладываю весь проект: ATmega48P + SSD1306 (ap.).zip