Ongelmia HD44780 näytön kanssa

Olen yrittänyt saada toimimaan Peter Fleuryn LCD kirjastoa AVR Atmega 8:n kanssa. Ongelma on että kun yritän tulostaa esimerkin mukaan näytölle esim: lcd_puts(“ABCDEFG123456789”);
on lopputulos tälläistä:

Ilmeisesti yhteys näyttöön siis jotenkin toimii kun näytölle kerran ilmestyy aakkosten kohdalle nollaa ja numeroiden kohdalle kysymysmerkkiä eikä pelkkiä neliöitä kuten jos kytkee ainoastaan virrat näyttöön?

Olen kytkenyt näytön kontrolleriin seuraavasti:
LCD RS → PC0
LCD RW → PC1
LCD E → PC2
LCD DATA 0 → PC3
LCD DATA 1 → PC4
LCD DATA 2 → PC5
LCD DATA 3 → PB0

Koska PC6 pinni on reset pinni, olen siis kytkenyt tuon lcd neljännen data pinnin kokonaan eri porttiin. Voiko tämä aiheuttaa ongelmia? Lcd.h tiedostoon on kuitenkin muutettu asetukset oikeiksi.

main.c
lcd.h

Ainakaan C:n puolesta tuossa ei ole mitään ongelmaa. Ainoastaan mapataan porttien ja pinnien osoitteet oikeiksi niinkuin oletettavasti ymmärrätkin :slight_smile: En usko että ongelma on siinä.

Oletko varma että liitännät ovat oikein? Kaikki menee taatusti oikeisiin paikkoihin eikä kylmiä juotoksia ole? Onko noihin kirjastoihin tehty muita muutoksia, vahingossa vaikka? Kokeile ottaa uudet “puhtaat” kirjastot netistä.

Tarkistin kaikki johdot ja niiden kyllä pitäisi olla kunnossa…
Yritin myös ohjata tuota näyttöä nyt ihan täysin omalla koodillani, mutta lopputulos on oikeastaan sama. Olenkohan nyt edes ymmärtänyt näytön ohjauksen ihan oikein… Eli teen seuraavan:

  1. Enable pinni HIGH
  2. RS pinni HIGH tai LOW sen mukaan annetaanko näytölle käsky vai data
  3. R/W pinni LOW
  4. D7, D6, D5, D4 HIGH tai LOW (ensimmäiset 4-bittiä)
  5. Enable pinni LOW
  6. viive 5ms
  7. Enable pinni HIGH
  8. D3, D3, D1, D0 HIGH tai LOW (viimeiset 4-bittiä)
  9. Enable pinni LOW
  10. viive 5ms
  11. Enable pinni HIGH

Ongelmana nyt on että vain nuo 4 ensimmäistä bittiä näyttäisi menevän perille, eli jos sinne yritän syöttää vaikka 0011 0001, ovatkin nuo 4 viimeistä bittiä kaikki 1, eli alimmaiselta riviltä näytölle saadaankin ? merkki (tämän takia kai numerot näkyvät ? ja kirjaimet O).

Mitä nyt itse pikaisesti vilkaisin itse käyttämästäni LCD-kirjastosta, niin siinä homma näyttäisi toimivan niin, että ensin asetetaan dataväylälle tavara, sitten asetetaan RS-pinnin arvo joko komennolle tai datalle (näiden järjestyksellä ei vielä liene väliä) ja vasta lopuksi strobataan E-pinni ylös ja sitten takaisin alas. Eli E-pinni toimisi kellosignaalin tapaan. Ja joissain projekteissa on tullut vastaan että noiden välillä pitää olla riittävästi delayta ettei homma kuse. eli jotain 20µs näin hattuvakiolla luulisi riittävän esim dataväylän asetuksen ja e-pinnin strobetuksen välillä. Ja sitten tuo itse e-pinnin high-tilan kesto myös vaikka 10 tai 20µs.

Ja lisäksi power-upin jälkeen ennen kuin näyttöä aletaan alustaa pitäisi olla joku 12+ms viive ennen ensimmäisiä kirjoitusoperaatioita. Toivottavasti pääset eteenpäin…

http://www.adafruit.com/datasheets/HD44780.pdf
Sivu 58 pitänee sisällään ajoituskaavioin.

Eipä ole tuon ohjaukseen tarvinnut aikaisemmin tutustua tarkemmin… Fleuryn kirjasto on aina toiminut moitteetta :slight_smile: Josko tuohon ehtisi nyt perehtymään!

Tuli vain yhtäkkiä mieleen että kumminkos yrität nyt tuota oikein ohjata, neljä- vai kahdeksan -bittisenä? Simppelisti kehiteltynä:

8-bitin kirjoitus

  • EN = 0
  • R/S = 0 komennoille ja = 1 datalle
  • Data tai komento nastoihin D7 - D0
  • EN = 1
  • Viive 500ns
  • EN = 0
  • VIive 500ns

4-bitin kirjoitus

  • EN = 0
  • R/S = 0 komennoille, = 1 datalle
  • Datan/komennon yläosa nastoihin D7-D4
  • EN = 1
  • Viive 500ns
  • EN = 0
  • Viive 500ns
  • Alaosa nastoihin D7-D4
  • Viive 500ns
  • EN = 0
  • Viive 500ns

Siis huomioiden tämä datalinjojen järjestys. Jos käytetään kahdeksaa bittiä datalle niin lähetetään koko roina kerralla. Ja jos taas vain neljää niin data paloitellaan kahteen sarjaan ja lähetetään molemmat sarjat yläpään nastoihin, ei alas. Ja R/W-linja siis suoraan maihin, mitä sitä lukemaan jos kirjoittaminen onnistuu :slight_smile:

Edit: Ja tuo käynnistyksen delay jo mainittuna vähintään se 15ms // Vcc 4.5V Entä jos heität koko kirjaston pois ja kirjoitat ihan simppelin koodin yhden merkin tulostamista varten. Alustuksiin löytyy selkeät step-by-step -ohjeet datalehdest.

Edit 2: Niin ja jos tälle tasolle koodi viedään, siis ilman tuota kirjastoa toteutettuna, niin nuo alustukseen liittyvät rutiinit tulee suorittaa luonnollisesti ennen kun näyttö on valmis käyttöön… Mutta. Vanhaa jankuttaakseni; oletko varma että liitännät ovat oikein ja jos ovat niin minkä mukaan oikein :slight_smile:

Erittäin yleinen virhe on tuo, että 4 bittikseksi käskeminen tehdään 4 bit komennoilla, jolloin datan sisäänotto menee pois synkasta.

Toi 4 bit moodiin käsky tehdään 8 bit moodissa.
Tosiaan tuon mokan kanssa moni on tapellu päiviä. Vaihtari ryhmä meinas hyppiä seinille, kun kerroin tosta niille. Tappelivat muutaman päivän ton takia ja ihmettelivät miks ei tuu merkit oikein :slight_smile: