připojení LCD EL1602A-FL-YBS k ATMega8

Dobrý den,
už několik dní se trápím s připojením 2x16 alfanumerického displeje k ATMega8. Displej je funkční protože u Dev. sady s Charon II od HW-Group mi funguje(použivají svoji knihovnu pro ATMega128 - nepodařilo se ji přepsat na ATMega8). V manuálu píší že řadič je HD44780 našel jsem si jak datasheet tak český návod na práci s ním na strance:
doveda.byl.cz/lcd/index.htm
Zkoušel jsem inicializaci napsat podle tohoto návodu, ale pořad se nedaří nic vykreslit. Na displeji je po celou dobu vykreslena jedna řádka čtverecků. Chci to ovládat na portuD konkrétně na pinech: RS:PIN2, R/W:PIN3, E:PIN4, D0:PIN5, D1:PIN6, D2:PIN7, D3:PIN8

Atmega je nastavená pro chod na 16MHz. Piny displeje D0-D3 jsou připojeny na zem.

Jsem už opravdu zoufaly časi sem nastavoval pomocí _delay_us() funkce z AVR knihovny. Použil jsem i některé cizí hotové knihovny, ale žádna mi nefunguje. Za kazdý nápad budu vděčný.

nejhorší je, že i když zkusím hotový kód. Připojím LCD na piny uvedené zde v návodu:
protostack.com/forum/blog.php?u=2&b=32&c=1
přesně tak jak to tam dělají oni tak to nefunguje.
neměl by někdo ozkousenou knihovnu pro atmegu8 a tento display?

Máš v projektu nastavenou frekvenci mcu? S tou totiž pracují funkce jako delay_us a podobné. Na té stránce nemají krystal, jedou tedy z interního RC - pomaleji než ty. Pokud by jsi měl pauzy při inicializaci displeje nedostatečné, patrně ho nerozjedeš.

jj nazačátku mam F_CPU na 16000000

:frowning:

už zkouším i takove blbosti jako jestli mi dobře sedí konektor v nepájivém poli a nic. Jestli tomu dobře rozumím tak ten LCD je hodne závislej na těch prodlevách? Jaká je asi tak tolerance?

To netuším, snad bude vědět někdo jinej.
Při překladu vše vpořádku? Žádné chyby nebo varování?

vypada to, že jsem nasel nejakou aspon částečně funkční knihovnu. Opravdu asi bude problem s tím časováním. Chci vykreslit slovo “pokus” a vykreslí mi to pouze pismeno p a pak jen bliká kurzor. Navíc první řádek je jako přelitý černou barvou. Chvíli je ale vidět že jede normálně. Du tu knihovnu ješte překontrolovat.
edit: přebarvení vyřešil trimr připojený na Kontrastní PIN. Časování bude ale určitě špatně vypíšu delší řeťězec: “ABCDEFGHIJK” a displej mi zobrazí pouze “AE”

Nastav si správně kontrast.

jak jsem psal v editu ten kontrast sem si uz taky vyřešil. Ted proč se strácejí písmena.

Jo ještě to druhé zobrazené písmenko je vždy jiné. nekdy F nekdy E

Na zkoušku nastav delší časování, třeba 2ms.

nejvetší problem je že nerozumim tomu assembleru jak tam řeší to krátké přerušení. Co to přesně znamena?

#define lcd_e_delay()   __asm__ __volatile__( "rjmp 1f\n 1:" );

EDIT: nevím proč to řešili takhle. Zkusil jsem takto upravit kód:

#define lcd_e_delay()   _delay_us(37);

a zdá se že LCD konečně funguje!!! Děkuji všem za rady

Bohužel ještě to není vše stále nefunguje 2. řádek ale to možná bude nastavením

:arrow_right: administrator: příspěvek byl upraven
Předchozí příspěvky se necitují.

Pro přesun na druhý řádek pošli jako příkaz číslo 192 a pak teprve znaky.

to bych neveril jak citlivé to může byt. kdyź desku zapínám a vypínám jednou z 10ti pokusu zobrazí celej řádek dobre.
To se musí řešit jinak než přes tu funkci _delay() podezřívám jí že neni moc přesná.

Ja pouzivam v programu AVR Studio knihovnu od jump.to/fleury
Zapojene to mam dle druheho pripadu 3 draty Reg Sel,R/W,Enable a 4 draty D4-D7 vse zapojene na port D tak, ze pin 0-pin 3 jsou D7-D4 a pin 5,6,7 jsou zapojene na displey 4,5,6.
Je potreba pridat lcd.c a lcd.h do projektu a upravit lcd.h odpovidajicim spusobem

#define LCD_PORT         PORTD        /**< port for the LCD lines   */
#define LCD_DATA0_PORT   LCD_PORT     /**< port for 4bit data bit 0 */
#define LCD_DATA1_PORT   LCD_PORT     /**< port for 4bit data bit 1 */
#define LCD_DATA2_PORT   LCD_PORT     /**< port for 4bit data bit 2 */
#define LCD_DATA3_PORT   LCD_PORT     /**< port for 4bit data bit 3 */
#define LCD_RS_PORT      LCD_PORT     /**< port for RS line         */
#define LCD_E_PORT       LCD_PORT     /**< port for Enable line     */
#define LCD_RW_PORT      LCD_PORT     /**< port for RW line         */
#define LCD_DATA0_PIN    0            /**< pin for 4bit data bit 0  */
#define LCD_DATA1_PIN    1            /**< pin for 4bit data bit 1  */
#define LCD_DATA2_PIN    2            /**< pin for 4bit data bit 2  */
#define LCD_DATA3_PIN    3            /**< pin for 4bit data bit 3  */
#define LCD_RS_PIN       5            /**< pin  for RS line         */
#define LCD_RW_PIN       6            /**< pin  for RW line         */
#define LCD_E_PIN        7            /**< pin  for Enable line     */

Program sam uz je potom jednoduchy

[code]#define F_CPU 1000000UL

#include <avr/io.h>
//#include <avr/interrupt.h>
#include <util/delay.h>
#include “lcd.h”

unsigned char i;

//-----------------------------------------------------------------------------

int main(void)
{
char buffer[8];
lcd_init(LCD_DISP_ON);
lcd_clrscr();
lcd_gotoxy(0,0);
lcd_puts(“RoBoProG”);
lcd_gotoxy(0,1);
lcd_puts(“Run:”);
for (i=3;i>0;i–)
{
sprintf(buffer,"%2i",i);
lcd_gotoxy(4,1);
lcd_puts(buffer);
_delay_ms(500);
}
lcd_clrscr();
for(;:wink:
{
lcd_gotoxy(0,0);
lcd_puts(“RoBoPrOg”);
}

}
[/code]
Doufam, ze tohle pomuze

děkuji za knihovnu. Bohužel taky nešla. Ta má začala fungovat ve chvíli když jsem zakomentoval tu prvnotní 8.b komunikaci a rovnou nastavil 4. bit. Fungují oba řádky a zatím se zdá, že fungují i texty.

Tak me ten displej zacal fungovat s touhle knihovnou prakticky hned, je divne ze tobe to nefunguje, tipoval bych nejakou chybu v nastaveni krystalu, ja jsem pouzival zakladni nastaveni s 1Mhz internim oscilatorem a pro to je taky program odladeny, nicmene pokud ti funguje ta tvoje, tak neni co resit.