2x16 LCD (1602) STM32 I2C modüllü çöp data problemi

Başlatan catalyst, 07 Haziran 2021, 13:49:56

catalyst

Arkadaşlar merhaba,

STM32 için 2x16 LCD çalıştırmaya ihtiyacım var. Linkini göndermiş olduğum kütüphaneyi kullandım.

https://controllerstech.com/i2c-lcd-in-stm32/

Burada şöyle bir problem yaşamaktayım. LCD'yi her init ettiğimde, yani gücü açtığımda, bazen çöp data görüyorum. Bazen de gayet düzgün çalışıyor.

Neleri denedim çözmek için?

LCD power line a capacitor attım 10uF, işe yaramadı.
STM32'nin internal I2C pull-up'ları aktifti, deaktif ettim. Çünkü zaten hardware pull-uplar aktifti.
LCD başlatma işlemini güç sağlandıktan 5 saniye sonra yaptım, belki de besleme gerilimi belirli seviyenin üzerine çıkması gerekiyordur diye, işe yaramadı.
Clear işlemi çok vakit alıyor diye 16 karaktere de boşluk yazmayı denedim, yine işe yaramadı.
Bazı forumlarda kablolar temas etmiyor olabilir yazıyordu, lehim yaptım yine işe yaramadı.
I2C speed'i sabit tutmak zorundayım 100kbps olarak çünkü I/O expander PCF8574.

Kütüphaneyi kullanıp da bu problemi yaşayan kimseyle karşılaşmadım.

Donanım bilgisi de şu şekilde, STM32F407 nucleo board var elimde, 5V'undan direkt besliyorum. Hatta 5V çıkışındaki diyodu kaldırdım, 4.7V'a düşürüyordu 5V yaptım tam olarak. I2C3 çevrebirimini kullanmaktayım.

Linkini gönderdiğim yerdeki init fonksiyonunu aynen main'in başında kullanıyorum.

Sebepleri ne olabilir? 2 haftadır çözemedim ya. Teşekkür ederim desteğiniz için şimdiden.

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_ADC1_Init();
  MX_USART6_UART_Init();
  MX_I2C3_Init();
  /* USER CODE BEGIN 2 */

  HAL_ADC_Start_DMA(&hadc1, adcBufferValue, 2);

  READY_TO_RECEIVE_DATA;
  __HAL_UART_ENABLE_IT(&huart6, UART_IT_IDLE);  // Enable serial port idle interrupt
  HAL_UART_Receive_DMA(&huart6, (uint8_t *)tempRxBuffer, RX_BUFFER_SIZE);

  lcd_init();
  lcd_put_cur(0,0);
  lcd_send_string("TEST ICIN BUTONA");
  lcd_put_cur(1,4);
  lcd_send_string("BASINIZ");

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
      .................

mehmet

Lcd_init içerisindeki "delay" sürelerini
uzatmayı deneyin.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"

catalyst

Alıntı yapılan: mehmet - 07 Haziran 2021, 14:29:58Lcd_init içerisindeki "delay" sürelerini
uzatmayı deneyin.

Hocam merhaba, hepsini denedim ama yine de düzelmedi

mg1980

main void() hemen başlangıcına  500 ms kadar delay koyup lcd init()'i bundan sonra koyup deneseniz...

catalyst

Hocam o zaman I2C init edilmemiş oluyor. LCD Init fonksiyonunun içinde I2C ile data aktarım fonksiyonunu kullanıyorum HAL'ın.

mg1980

Aynı işlemi I2c init'ten sonra yapabilir miyiz..
Bir de hızı(frekans) düşürüp denemek nasıl olur..

ziyaretci

#6
I2C dönüştürücü modülde meydana gelen donanımsal problemden kaynaklı bir sorun gibi.

Modüldeki RS, Read/Write ya da Enable pinlerini izleyin.

İlk açılışta, ortamdaki elektromanyetik girişimden ya da kararsız bölgeden(besleme) dolayı belirttiğim pinler(RS, Enable ya da R/W) kısa süreli olarak  çöküyor olabilir. Bu durum fake  haberleşmeye(Modül-Lcd) neden olur. 
Belirttiğim pinlerin varsayılan(Haberleşme yokken[I2C modül-LCD]) lojik değerlerini korumaya çalışın.

Hatta test etmek için lcd'nin enable pinini "elle(manual)", besleme kararlı hale geçinceye kadar pasif olarak bekletin, sonra modüldeki bağlantısına tekrar bağlayın.

Haberleşmeyi başlatan RS piniydi diye hatırlıyorum. Bu pine dikkat etmek gerek. Ben hep paralel sürdüm, bu tür problemleri gözlemlemiştim ilk çalışmalarımda.

I2C haberleşmesinden kaynaklı çöp data oluşacağını düşünmüyorum.


catalyst

LCD'yi 4 bit yerine 8 bit kullandığımda düzeldi arkadaşlar sorun.

yas

Alıntı yapılan: catalyst - 13 Haziran 2021, 20:12:24LCD'yi 4 bit yerine 8 bit kullandığımda düzeldi arkadaşlar sorun.
O zaman 4 bit kullanıp boştaki data pinlerini gnd ye çekmek sorunu çözebilir.

catalyst

Alıntı yapılan: yas - 14 Haziran 2021, 10:57:35O zaman 4 bit kullanıp boştaki data pinlerini gnd ye çekmek sorunu çözebilir.

Hocam onu da denedim ben 4 bit kullanırken, sorunu çözmüyor. Anladığım kadarıyla 4 bit kullanıldığında bir data paketini EN pinini 2 kez high -> low yaparak gönderdiğimizde yanlış data aktarımına sebep oluyor. Tek çözümü 8 bit kullanmak LCD'yi.