Karakter LCD Kütüphanesi (STM32 ve HAL Lib.)

Başlatan Cemre., 24 Ağustos 2016, 00:01:47

Cemre.

Herkese merhaba,

CubeMX ile proje oluşturduğunuzda projeye doğrudan dahil edebileceğiniz bir LCD kütüphanesi oluşturmak istedim.
CubeMX kullanmadan da gerekli tanımlamalar yapılarak kütüphane kullanılabilir.

Ayrıntılı bilgiyi blogumdaki yazımda bulabilirsiniz.
https://maviled.wordpress.com/2016/08/23/lcd-kutuphanesi-stm32-hal-lib/

Yine kütüphaneyi ve örnek projeyi buradan indirebilirsiniz.
https://mega.nz/#F!V99RgarS!fQ0aEnjrgvpobusgW1pKyA

İyi akşamlar.

ahmetbudak

iyi akşamlar CUBEMX  de proje oluşturduğumuz pin konfigirasyonunu  değiştirdiğimizde yeni halini KEIL de görüyoruz ancak sonsuz döngü içinde bir önce yazdığımız kodlar da siliniyor bu durumun önüne nasıl geçebiliriz ? cevaplarınız için şimdiden teşekkür ederim.

Cemre.

/* USER CODE

/* USER CODE etiketleri arasına yazarsanız silinmez kodlarınız. Gereken her alanda bu etiketler mevcuttur.

Zek_De

Merhaba,
STM32F407vg için değişiklik yapmak istersem BRR STM32F407VG için aynı göreve olmadığından aşağıdaki doğru olur mu?
        LCD_EN_GPIO_Port->BSRR  = (uint32_t)LCD_EN_Pin << 16;
   LCD_D4_GPIO_Port->BSRR  = (uint32_t)LCD_D4_Pin << 16;
   LCD_D5_GPIO_Port->BSRR  = (uint32_t)LCD_D5_Pin << 16;
   LCD_D6_GPIO_Port->BSRR  = (uint32_t)LCD_D6_Pin << 16;
   LCD_D7_GPIO_Port->BSRR  = (uint32_t)LCD_D7_Pin << 16;
ARM'a yeni başladığımdan sormam gerekli ,yukarıdaki satırlardan herhangi biri tam olarak nasıl çalışıyor kısaca açıklayabilirmisiniz? Misal LCD_EN_Pin dediğimiz bir pin gösteriyor nasıl oluyorda 16 kez kaydırıyoruz.

Cemre.

Fırsat bulduğumda açıklamaya çalışacağım ancak buradaki linkten indirmeyin. GitHub linkinde daha günceli mevcut.

Cemre.

#5
Alıntı yapılan: Zek_De - 29 Ocak 2017, 03:40:47
Merhaba,
STM32F407vg için değişiklik yapmak istersem BRR STM32F407VG için aynı göreve olmadığından aşağıdaki doğru olur mu?
        LCD_EN_GPIO_Port->BSRR  = (uint32_t)LCD_EN_Pin << 16;
   LCD_D4_GPIO_Port->BSRR  = (uint32_t)LCD_D4_Pin << 16;
   LCD_D5_GPIO_Port->BSRR  = (uint32_t)LCD_D5_Pin << 16;
   LCD_D6_GPIO_Port->BSRR  = (uint32_t)LCD_D6_Pin << 16;
   LCD_D7_GPIO_Port->BSRR  = (uint32_t)LCD_D7_Pin << 16;
ARM'a yeni başladığımdan sormam gerekli ,yukarıdaki satırlardan herhangi biri tam olarak nasıl çalışıyor kısaca açıklayabilirmisiniz? Misal LCD_EN_Pin dediğimiz bir pin gösteriyor nasıl oluyorda 16 kez kaydırıyoruz.

Evet BSRR register'ı ile bu bitleri RESET etmemiz gerekiyor. Yaklaşımınız doğru. LCD_EN_Pin tanımının misal

0b0000 0000 0000 0000    0000 0000 0000 0001 olduğunu varsayalım.

BSRR register'ını incelerseniz, eğer bir pini SET etmek isterseniz ilk 16 bit'i ile, RESET etmek isterseniz son 16 bit'i ile işlem yapmanız gerektiğini görürsünüz. Bu durumda SET edecekken LCD_EN_Pin tanımını doğrudan kullanıyoruz. RESET etmek için 16 kez sola kaydırıp son 16 bitlik kısma geçmesini sağlıyoruz. Mantık bu kadar basit.

Kütüphanenin yazımı çok verimli olmayabilir ancak, CubeMX ile LCD_EN LCD_Dx şeklinde tanımlama yapıldığında sorunsuz çalışabilmesi için bu şekilde yazıldı. Geliştirmeye açık bir kütüphane. Katkı sağlamak isteyen varsa buyursun...

Hatta şuan bir hata farkettim :D LCD_Delay fonksiyonu parametresiz olmasına rağmen parametre girmişim Init anında. İlahi ben.

-- Hatayı giderdim sanıyorum, ancak deneme fırsatım yok. İsterseniz kütüphaneyi örnek alarak kendiniz tekrar yazabilirsiniz, hem LCD çalışma mantığı da oturmuş olur. Tavsiye ederim..

Zek_De

#6
Tekrar merhaba yanıtlar için teşekkür ederim :) , aklıma takılan bir durum var ,gyro'dan veri aldığınızı tahmin ediyorum söyle,

while (1)
{ Δx = Δx + h * Rx * SCx);}  L3G4200D kullanıyorum ve PIC kullanırken datasheet'te yazıldığı üzere SCx katalog bilgisi ölçekleme faktörü dsp/LSB ve Rx ham veri olmak üzere h ODR'ye bağlı olarak eğer 100 ise 0.01 olacak fakat bu her döngüde kaybedilen zamanla ilişkili olduğundan cihazı 90 dereceye tutarak aldığım ham değerle hesap sonucu ortaya çıkıyor buda 0.01 olmasını engelliyor bu durumda cihaz çok hızlı olması gerek ki ikinci veriyi alana kadar 0.01 s'yi geçmesin bu durumda buna ARM müsaade edecektir ve gerçek zamanlı olarak bilgiyi alabileceğim tabi bu durumda eğer değerleri görmek istersem LCD kütüphanesinde bulunan gecikmeler yine buna engel olacaktır ve yine deltaT=0.01 değeri olmayacaktır. Örneğin 90 dereceye geldiğinde bir led yak diyerek programın doğru işlediğini anlayabilirim böylece  geciktirici etmenler ortadan kalkar ve tam hızıyla çalışır.Doğru düşünüyor muyum?Diğer bir sorum 5V LCD yi çalıştıramam mı  3.3V 1 kabul edilmiyor mu ? Bilmediğim bir simge oraya çıkıyor .(güncellemediğiniz kütüphane ile denemiştim) kötü bir soru olmuş olabilir :)

Zek_De

Düzeltme yapıyorum ,başka bir hatadan dolayı karakterleri göremiyor muşum. Şimdiki sorun resete bastığımda bazen ekran boş kalıyor(hafif silik kareler) bunun sebebi ne olabilir.

boreas

Kütüphaneyi kullandım eline sağlık.
Yalnız bende çok yavaş çalışıyor hatta her harf tek tek geliyor. 8 mhz. kristal takılı ve cubemx.de de bu tanımlı olmasına rağmen sıkıntı yaşıyorum.
Atladığım başka birşey olabilir mi ?


Tekrar eline sağlık.


boreas

Lcd_Delay prosedürlerini ms.den micro sn. çevirince sıkıntı kalmadı