Sida 1 av 2

Fel position på 4 raders lcd

Postat: 19 mars 2007, 21:07:26
av Samman
Sitter och knåpar med en 4x16 alfanumrerisk lcd. Allt fungerar bra..förrutom att när jag försöker att skriva på rad 3 & 4 så hoppar texten automatiskt in och startar på segment 5.

Kan det vara för att jag kör den i 4 bitars läge kanske?
Det är en HD44780 LCD

Så det blir ca så här..
Test test test
Test test test
Test test
Test test

Jag har kollat koden hundra gånger men kan inte hitta att det skulle vara något fel i den då de två första raderna fungerar fint.

Postat: 19 mars 2007, 21:50:12
av sodjan
Fixa din fråga så att den blir komplett så kanske det går att svara också !
T.ex det viktigaste, vilka adresser använder du som start på varje rad ?
Ditt exempel blir jag inte klok på heller, vad menar du med "ca så här" ??

Postat: 20 mars 2007, 04:49:34
av Samman
Hm, Textformateringen blev fel.

Koden är skriven i microC, tyckte att det var enklast då jag har förträngt all assembler.

Det visar sig att problemet verkar ligga i microC, Sökte runt på nätet igår och såg att flera som använder microC har samma problem med 4 raders lcd.

Kommandot ser ut så här
Lcd_Out(1,3, "Texten");, Texten skriv ut på rad 1, kolum 3

men om jag kör

Lcd_Out(3,1, "Texten");, skall texten hamna på rad 3, kolum 1, men istället så hamnar texten automatiskt på rad 3 och kolum 5.

Men som du sa Sodjan, adresserna.. De blev fel vi kompileringen, Lite knep och knåp fixade till det...

Och Wisp'en gör det hela mycket enklare att sitta och labba...Den är helt enkelt underbar...

Postat: 20 mars 2007, 12:46:30
av sodjan
OK, så det verkar som om MikroC har fel start-adresser till de olika
raderna hårdkodade i sina runtime libbar.

> Lite knep och knåp fixade till det...

Vilka knep och knåp ?

Postat: 20 mars 2007, 12:48:06
av Samman
Att manuellt ange position på lcd'n
128 + 16 = 144, alltså positionen för första tecknet på rad tre är 144.

Postat: 20 mars 2007, 13:09:07
av sodjan
OK, ja. visst...

Men då kör du alltså något annat än Lcd_Out !?

Postat: 20 mars 2007, 14:29:42
av Samman
Jepp,

Lcd_CMD(144); // Rad 3, Position 1
Lcd_Out_CP("Texten"); // Skriver ut texten på aktuell position

Postat: 20 mars 2007, 15:55:07
av vfr
Om jag inte minns helt fel rakt ur huvet, så är adresseringen helt annorlunda på rad 3-4 jämfört med 1-2 på en vanlig HD44780-kontrolller. Det är kanske så att MikroBasic-funktionen egentligen bara är gjord för och testad på LCD med max två rader. Då skulle man kunna få lustiga fenomen när man kör tre eller fyra rader.

Postat: 20 mars 2007, 20:18:01
av sodjan
> så är adresseringen helt annorlunda på rad 3-4 jämfört med 1-2 på en vanlig HD44780-kontrolller.

Annorlunda vet jag inte, det är bara att hålla reda på start-adresser för pos 1 på varje rad.
Och sedan addera positionen på raden så får man rätt teckenadress.

> Det är kanske så att MikroBasic-funktionen egentligen bara är gjord för och testad på LCD med max två rader.

Då ska den inte acceptera syntaxen "Lcd_Out(3,x, "xxx");" utan ge ett felmeddelande istället.
*Om* den accepterar 3 eller 4 som "rad-parameter", så ska den också hantera det rätt...
Väldigt osannolikt att de inte skulle ha testat på en 4-raders LCD.

Postat: 21 mars 2007, 12:15:28
av vfr
Vad jag menade var just att adresseringen skiljer sig åt. Rad 3-4 hanteras som en förlängning av rad 1-2 och rad 3 kommer före rad 2 i displayminnet. Det gör att det inte går att hantera raderna som en enkel multiplikation för att få displayadressen. Så länge man har två rader så funkar det utmärkt.

4-radiga displayer var inte så vanliga tidigare även om det fanns. Så om rutinerna inte är uppdaterade så _skulle_ det kunna vara så. Sedan håller jag med om att det egentligen inte skall acceptera parametern isåfall. Å andra sidan skulle massor av saker vara inkompatibla med framtida varianter på produkter isåfall.

Vad jag menar är att om man t.ex skrev en LCD-drivrutin när det bara fanns 1/2-radiga displayer. För att hantera framtida kommande så "chansar" man lite och hanterar rad 3 på samma sätt som rad 2, d.v.s det som känns mest sannolikt för en kommande produkt. Då skulle den automatisk bli kompatibel även med fler rader. Därför tror jag det är ofta det inte läggs in den typen av spärrar. I det här fallet hade det ju då ändå inte fungerat eftersom man adresserar rad 3/4 annorlunda.

Vad är det för modell på LCD:n?

Tittar man i databladet för några 4x20 eller 4x16 LCD:er så ser man att rad 3 börjar på adress 20. Frågan är om det kan tänkas finnas 16x4 LCD:er där rad 3 börjar direkt efter rad 1 istället, d.v.s på adress 16. Om displayen är gjord på detta sättet och drivrutinerna förväntar sig adress 20, så får man precis det här resultatet. Kollas lämpligen i databladet.

Postat: 21 mars 2007, 16:00:27
av Samman
Fick på Jobbet 10 st 14x16 samt 3 st 4x40 lcd:er, men tyvärr så står där inget.. Så jag kan inte finna datablad på dem, det enda jag vet är att de är HD44780 kompatibla..

Postat: 21 mars 2007, 16:39:43
av sodjan
**4x40** !!??
Det skulle du ha kunnat sagt lite tidigare... :-)

En HD44780 controler har max *80* teckenpositioner.

En 4 x 40 display (som alltså har *160* tecken) har *dubbla*
HD44780 controlers. Alltså i princip två sammanbyggda 2x40
LCD'er.

Jag skulle förvänta mig en adressering som en 2x40 LCD på
rad 3 och 4. Men databladet har naturligtsvis svaret på det.
Eller så testar man helt enkelt...

Postat: 21 mars 2007, 16:51:23
av vfr
Lugn sodjan! :fransman: :)

Han skrev faktiskt i första inlägget att det är en 4x16 han jobbar med. Annars har du naturligtvis helt rätt i att den stora är väldigt annorlunda.

Samman> Finns det inga beteckningar på displayen?

Postat: 21 mars 2007, 16:57:24
av sodjan
OK... :-)

> Fick på Jobbet 10 st 14x16 samt 3 st 4x40 lcd:er,...

> den stora är väldigt annorlunda....

14x16 är också ganska stort... :-)
Jag antog att det var 4x40 modulen det handlare om eftersom
det tidigare talades om just en *4* raders modul...

Postat: 21 mars 2007, 17:06:24
av squiz3r
Eller så menar han 4x16 och inte 14x16 ? :roll: Finns det sånna stora?

//Daniel A