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

[ Новые сообщенияПравила форумаRSS ] Текущая дата: Суббота, 18.01.2025, 21:30:45

  • Страница 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
Участники
Сообщений: 316
Для просмотра сообщения Вы должны быть Участником форума. Для этого Вам необходимо Зарегистрироваться и пройти Тест.
Статус: отсутствует
-->
sysShutDown Дата: Четверг, 02.08.2018, 12:56:50 | Сообщение # 5
Автор темы
Новичок
Сообщений: 5
Для просмотра сообщения Вы должны быть Участником форума. Для этого Вам необходимо Зарегистрироваться и пройти Тест.
Статус: отсутствует
-->
  • Страница 1 из 1
  • 1
Поиск:

Форма входа


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

ОФОРМИТЬ ЗАЯВКУ НА П...Раздел: Корзина

()

Куплю инвертор TV320...Раздел: Куплю

()

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

()

зарядние станции спе...Раздел: Флейм

()

ПММ Bosch ActiveWat...Раздел: Бытовая техника

()

Леново е550 nm-a221 ...Раздел: Компьютерная и оргтехника

()

Для поднятия настрое...Раздел: Флейм

()

Прошитые микроконтро...Раздел: Продаю

()

RT809H

(5303)

machenist

(постов: 11990)

semvictor

(постов: 9833)

ильшат

(постов: 8107)

terrarist

(постов: 6906)

Сантехник

(постов: 6484)

vini

(постов: 5344)

Otto

(постов: 5286)

Paganel

(постов: 5261)

Levon-sigma

(18.01.2025)

r-amateur

(18.01.2025)

bsbor

(18.01.2025)

tatarbalav2

(18.01.2025)

Akmor72

(18.01.2025)

adiladil1250

(18.01.2025)

GrayCat

(18.01.2025)

roma8765

(18.01.2025)

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

Epson_RESETTER_L1110

(0)

JVC PC-XT7

(0)

JVC PC-XT3

(0)

JVC PC-XC7BK

(0)

JVC PC-X55

(0)

JVC PC-X200

(0)

JVC PC-X130

(0)

JVC PC-X106

(0)

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

(309566)

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

(184)

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

(229)

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

(1492)

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

(6038)

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

bsbor

(18.01.2025)

GrayCat

(18.01.2025)

ecd

(18.01.2025)

Andrekt1

(18.01.2025)

rusland57

(18.01.2025)

Fullmetal2003

(18.01.2025)

dersu1

(18.01.2025)

terps7745

(18.01.2025)

FEDOR40

(18.01.2025)

_fenix46

(18.01.2025)