Возникла проблема, собираю некое устройство где требуется счетчик циклов реализованный на основе такого дисплея -
http://www.melt.com.ru/docs/MT-10T11.pdf
На AVRке использую аппаратный TWI.
Подключал по такой схеме:
Код чисто пробный (без проверок статуса), протеус говорит что все фурычит как надо
- Код: Выделить всё • Развернуть
#include <mega8.h>
void I2C_Start (unsigned char d) {
unsigned char result = 0x0;
TWCR = 0xa4; //формируем событие старт
while (result != 0x80) {
result = TWCR & 0x80;
}
result = 0x0;
TWDR = d; //адрес приемника и бит направления передачи (0 - передача)
TWCR = 0x84; //шлем адрес
while (result != 0x80) {
result = TWCR & 0x80;
}
}
void I2C_SendByte (unsigned char d) {
unsigned char result = 0x0;
TWDR = d;
TWCR = 0x84; //шлем адрес
while (result != 0x80) {
result = TWCR & 0x80;
}
}
void I2C_Stop (void) {
TWCR = 0x94; //формируем событие стоп
}
void main(void)
{
unsigned char i = 0;
unsigned char Logo10[10]={0xC0,0xB3,0xA7,0x80,0xF9,0x80,0xB8,0x80,0xF8,0x40};
unsigned char Init [5]={0xCE,0xE0,0xF8,0xF0,0x00};
DDRB = 0xfe;
DDRC = 0x00;
PORTB = 0x0;
// скорость работы интерфейса
TWBR = 0xf;
TWSR = 0x0;
//while (1){
// if (PINB.0 == 1) {
I2C_Start (0xa0);
for (i=0; i<5; i++) {
I2C_SendByte(Init[i]); // Инициализация дисплея
}
for(i=0; i<10; i++) { //Цикл вывода байтов изображения
I2C_SendByte(Logo10[i]);//Вывод очередного байта в индикатор
}
I2C_Stop();
}
// }
//}
В коде использовал стандартные байты данных для настройки дисплея и в качестве изображения долен появится логотип "МЭЛТ"
Проблема вот в чем: Тыкал осциллографом - видно что линия SDA байты шлет, а вот SCL молчит (высокий уровень). Дорожки мерил и так и этак. На ум приходят 3 вещи:
1) отгорела нога контроллера
2) кривой код
3) кривое подключение (схемотехника)
Во всех областях новичок и самоучка. Осциллограф стащил с работы на время)