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

[ Новые сообщенияПравила форумаRSS ] Текущая дата: Пятница, 26.04.2024, 16:41:50

  • Страница 1 из 1
  • 1
Модератор форума: milcin68  
Форум » Приборы и программное обеспечение » Программное обеспечение » Драйвер для IIC LCD module. (Драйвер.)
Драйвер для 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
Участники
Сообщений: 232
Для просмотра сообщения Вы должны быть Участником форума. Для этого Вам необходимо Зарегистрироваться и пройти Тест.
Статус: отсутствует
-->
sysShutDown Дата: Четверг, 02.08.2018, 06:23:38 | Сообщение # 3
Автор темы
Новичок
Сообщений: 5
Для просмотра сообщения Вы должны быть Участником форума. Для этого Вам необходимо Зарегистрироваться и пройти Тест.
Статус: отсутствует
-->
deuterium Дата: Четверг, 02.08.2018, 09:23:08 | Сообщение # 4
Участники
Сообщений: 307
Для просмотра сообщения Вы должны быть Участником форума. Для этого Вам необходимо Зарегистрироваться и пройти Тест.
Статус: отсутствует
-->
sysShutDown Дата: Четверг, 02.08.2018, 12:56:50 | Сообщение # 5
Автор темы
Новичок
Сообщений: 5
Для просмотра сообщения Вы должны быть Участником форума. Для этого Вам необходимо Зарегистрироваться и пройти Тест.
Статус: отсутствует
-->
Форум » Приборы и программное обеспечение » Программное обеспечение » Драйвер для IIC LCD module. (Драйвер.)
  • Страница 1 из 1
  • 1
Поиск:

Форма входа
Логин:
Пароль:


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

Liberton 32AS1HDTA1 ...Раздел: Поиск и запрос прошивок телевизионной техники

()

Harman / Becker 7020Раздел: Ремонт CarAudio

()

Неисправности БП Wha...Раздел: Другая аппаратура

()

A1707 (820-00928-A) ...Раздел: Компьютерная и оргтехника

()

PIONEER VSX- 921KРаздел: Бытовая аудиоаппаратура

()

PHILIPS 55PFL7007T/1...Раздел: LCD (ЖК) телевизоры

()

Philips 48pus7600 (...Раздел: LCD (ЖК) телевизоры

()

Goldstar LT-28T600R,...Раздел: Поиск и запрос прошивок телевизионной техники

()

RT809H

(5205)

machenist

(постов: 10562)

semvictor

(постов: 9542)

ильшат

(постов: 7480)

terrarist

(постов: 6733)

Сантехник

(постов: 6485)

vini

(постов: 5241)

olegslavyansk

(постов: 5178)

Paganel

(постов: 5176)

vyatсh_77

(26.04.2024)

kalina32

(26.04.2024)

eclips

(26.04.2024)

Kuromaru

(26.04.2024)

OLEGvolVLAD

(26.04.2024)

Kuropge

(26.04.2024)

mlebd

(26.04.2024)

jerry126

(26.04.2024)

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

Tantos Walle V1.8

(0)

Numark Mixstream Pro NH08

(0)

PHILIPS TAX7207

(0)

Philips TAW8506 .

(0)

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

(601183)

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

(93)

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

(137)

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

(1042)

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

(5060)

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

jerry126

(26.04.2024)

tabom62243

(26.04.2024)

DRED1968

(26.04.2024)

nlimonovg

(26.04.2024)

Glav77

(26.04.2024)

Gora2600

(26.04.2024)

juanitto

(26.04.2024)

plamel3

(26.04.2024)

szimi

(26.04.2024)

mintal

(26.04.2024)