Список форумов Ремонт бытовой техники и електронники Ремонт бытовой техники и электроники
 
  Файло-обменникФайлы    ПрошивкиПрошивки   ПродажаПродажа   ЛитератураЛитература   СтатьиСтатьи 
Форум

[ Новые сообщенияПравила форумаRSS ] Текущая дата: Воскресенье, 24.11.2024, 07:42:20

  • Страница 1 из 1
  • 1
Модератор форума: milcin68  
Драйвер для IIC LCD module.
sysShutDown Дата: Среда, 01.08.2018, 08:57:06 | Сообщение # 1
Автор темы
Новичок
Сообщений: 5
Здравствуйте!
Это моё первое сообщение на данном форуме и прошу не бить, если что-то делаю не так.
Не так давно прикупил себе ЖКИ дисплей с модулем IIC на базе микросхемы PCF8574T.
Микросхема является байтовым (8-ми битный) расширителем портов управляемый по IIC шине и с возможностью задать собственный адрес путем подключения ножек к высокому или низкому уровню.
Первым делом я нашел схему данного модуля и уже по ней я начал писать драйвер.


По данной схеме написал не сложный драйвер для атмеги 8..
Код

#define F_CPU 8000000UL
#define SCL_CLOCK 100000L
#define time 100L

#include <avr/io.h>
#include <compat/twi.h>
#include <util/delay.h>

//Protutypes of TWI functions
void TWI_init ();
bool TWI_start (unsigned char address);
void TWI_start_wait (unsigned char address);
char TWI_rep_start (unsigned char address);
void TWI_stop ();
bool TWI_write (unsigned char data);
char TWI_readACK ();
char TWI_readNAK ();

//Prototupe of LCD functions
void LCD_send_command (uint8_t data);
void LCD_send_data (uint8_t data);
void LCD_init ();

int main(void){
    PORTD = 0xFF;
    DDRD = 0xFF;
    
    TWI_init();
    //Если не сможем подключиться к микросхеме, мигаем.
    if (TWI_start(0x4E)){
  while (true){
   PORTD = 0x00;
   _delay_ms(250);
   PORTD = 0xFF;
   _delay_ms(250);
  }
    }
    
    //Если не может записать байт, мигаем быстро быстро.
    if (TWI_write(0xFF)){
  while (true){
   PORTD = 0x00;
   _delay_ms(10);
   PORTD = 0xFF;
   _delay_ms(10);
  }
    }
    /*
    LCD_init();
    LCD_send_data('H');
    LCD_send_data('e');
    LCD_send_data('l');
    LCD_send_data('l');
    LCD_send_data('o');
    LCD_send_data(' ');
    LCD_send_data('W');
    LCD_send_data('O');
    LCD_send_data('R');
    LCD_send_data('L');
    LCD_send_data('D');
    */
    
    while (true){
  
    }
}

// TWI_atmega8
void TWI_init(){
    TWSR = 0x00;
    TWBR = ((F_CPU / SCL_CLOCK) - 16) / 2;
}

bool TWI_start (unsigned char address){
    uint8_t twst;
    
    TWCR |= (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);
    while (!(TWCR & (1 << TWINT)));
    
    twst = (TW_STATUS & 0xF8);
    if ((twst != TW_START) && (twst != TW_REP_START))
    return 1;

    TWDR = address;
    TWCR |= (1 << TWINT) | (1 << TWEN);
    while (!(TWCR & (1 << TWINT)));
    
    twst = (TW_STATUS & 0xF8);
    if ((twst != TW_MT_SLA_ACK) && (twst != TW_MR_SLA_ACK)){
  return true;
    } else {
  return false;
    }
}

void TWI_start_wait(unsigned char address){
    uint8_t   twst;
    while (true){
  // send START condition
  TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
  // wait until transmission completed
  while(!(TWCR & (1<<TWINT)));
  // check value of TWI Status Register. Mask prescaler bits.
  twst = TW_STATUS & 0xF8;
  if ( (twst != TW_START) && (twst != TW_REP_START)) continue;
  // send device address
  TWDR = address;
  TWCR = (1<<TWINT) | (1<<TWEN);
  // wail until transmission completed
  while(!(TWCR & (1<<TWINT)));
  // check value of TWI Status Register. Mask prescaler bits.
  twst = TW_STATUS & 0xF8;
  if ((twst == TW_MT_SLA_NACK )||(twst ==TW_MR_DATA_NACK)){
   /* device busy, send stop condition to terminate write operation */
   TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
   // wait until stop condition is executed and bus released
   while(TWCR & (1<<TWSTO));
   continue;
  }
  //if( twst != TW_MT_SLA_ACK) return 1;
  break;
    }
}

char TWI_rep_start(unsigned char address){
    return TWI_start(address);
}

bool TWI_write (unsigned char data){
    uint8_t twst;
    TWDR = data;
    TWCR |= (1 << TWINT) | (1 << TWEN);
    while (!(TWCR & (1 << TWINT)));
    
    twst = TW_STATUS & 0xF8;
    if (twst != TW_MT_DATA_ACK){
  return 1;
    } else {
  return 0;
    }
}

void TWI_stop (){
    TWCR |= (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);
    while (TWCR & (1 << TWSTO));
}


Подключается успешно, байт отправляет успешно. Но когда мерю уровень напряжения на выводах (К сожалею тестера сейчас нет, мерю обычным светодиодом, один провод которого представляет из себя щуп, второй на земле) и напряжения просто нет.
Не могу понять саму причину.
1) Либо у меня нарушено тактирование микроконтроллера.
2) Либо сам ЖКИ + модуль убиты. На ЖКИ 1602 высвечивается вторая полоса заполненая кубиками.
3) Либо есть третья, неведомая мне, причина.
Статус: отсутствует
-->
melan74 Дата: Среда, 01.08.2018, 18:34:56 | Сообщение # 2
Участники
Сообщений: 240
Для просмотра сообщения Вы должны быть Участником форума. Для этого Вам необходимо Зарегистрироваться и пройти Тест.
Статус: отсутствует
-->
sysShutDown Дата: Четверг, 02.08.2018, 06:23:38 | Сообщение # 3
Автор темы
Новичок
Сообщений: 5
Для просмотра сообщения Вы должны быть Участником форума. Для этого Вам необходимо Зарегистрироваться и пройти Тест.
Статус: отсутствует
-->
deuterium Дата: Четверг, 02.08.2018, 09:23:08 | Сообщение # 4
Участники
Сообщений: 313
Для просмотра сообщения Вы должны быть Участником форума. Для этого Вам необходимо Зарегистрироваться и пройти Тест.
Статус: отсутствует
-->
sysShutDown Дата: Четверг, 02.08.2018, 12:56:50 | Сообщение # 5
Автор темы
Новичок
Сообщений: 5
Для просмотра сообщения Вы должны быть Участником форума. Для этого Вам необходимо Зарегистрироваться и пройти Тест.
Статус: отсутствует
-->
  • Страница 1 из 1
  • 1
Поиск:

Форма входа


Статистика сайта
Последние темы Читаемые темы Лучшие пользователи Новые пользователи

LC320EUD(SD)(A1)Раздел: Технофлейм телевизионной техники

()

samsung CS-29Z40QQ з...Раздел: Технофлейм телевизионной техники

()

SBER SDX-32H2012B (ш...Раздел: LCD (ЖК) телевизоры

()

MONTARBOРаздел: Поиск схем и прошивок для профессионального оборудования

()

YAMAHA RX-V620Раздел: Бытовая аудиоаппаратура

()

Портативная колонка ...Раздел: Радиодетали и электронные компоненты (опознать,подобрать аналог,найти Datashee)

()

Toshiba 32A3000PR (ш...Раздел: LCD (ЖК) телевизоры

()

Apocalypse AAB-4900...Раздел: Ремонт CarAudio

()

RT809H

(5277)

machenist

(постов: 11678)

semvictor

(постов: 9760)

ильшат

(постов: 7849)

terrarist

(постов: 6906)

Сантехник

(постов: 6485)

vini

(постов: 5320)

Otto

(постов: 5268)

Paganel

(постов: 5243)

Arslan121

(24.11.2024)

Straik219

(24.11.2024)

mar_aleksey

(24.11.2024)

Seriv

(24.11.2024)

Artur19

(24.11.2024)

nikew

(24.11.2024)

artel2024

(24.11.2024)

Мурзик4506

(24.11.2024)

Новые Файлы Новые Прошивки Новые Статьи, Блоги Счетчики для пользователей

Цифрал

(0)

PANASONIC KX-TCA185RU

(0)

Комета 201

(0)

Зарегистрировано всего

(298806)

Зарегистрировано сегодня

(27)

Зарегистрировано вчера

(164)

Зарегистрировано за 7 дней

(1234)

Зарегистрировано за 30 дней

(5489)

Новые сайты Новые Мастера в Вашем городе Последние Новости Участники прошедшие тест

SkazynIch

(24.11.2024)

ivoaudi

(24.11.2024)

Electricmen

(23.11.2024)

Alexan4er

(23.11.2024)

Artur5

(23.11.2024)

ArhangelDJN

(23.11.2024)

tsvi1949

(23.11.2024)

rkh

(23.11.2024)

flux130382

(23.11.2024)

sckrop2028

(23.11.2024)