Sida 1 av 3

ks 0108 avr problem...

Postat: 27 december 2004, 15:14:24
av sven
är total novis på att programmera c men ja har iaf skrivit ihop en kod (som inte funkar) för att testa min ks0108 display från fractronics... har kollat alla kopplingar och dom stämmer överens med koden... är de nån som är haj på detta så kanske den kanta sig en titt å se vad som är fel...


#include <avr/io.h>
#include <inttypes.h>
#include <avr/delay.h>
#define RS 0b01000000
#define RW 0b00100000
#define E 0b00010000
#define CS1 0b00001000
#define CS2 0b00000100
#define RST 0b00000010

int main()
{
DDRB = 0xff;
DDRC = 0xff;


//display on
PORTC = _BV(CS1);
PORTB = 0b00111111;
PORTC = _BV(E);
_delay_loop_1(30);
PORTC = ~_BV(E);
_delay_loop_1(30);
//set page address

PORTB = 0b10111010;
PORTC = _BV(E);
_delay_loop_1(30);
PORTC = ~_BV(E);
_delay_loop_1(30);

//set y address

PORTB = 0b01000110;
PORTC = _BV(E);
_delay_loop_1(30);
PORTC = ~_BV(E);
_delay_loop_1(30);

//start line

PORTB = 0b11000000;
PORTC = _BV(E);
_delay_loop_1(30);
PORTC = ~_BV(E);
_delay_loop_1(30);

//write data

PORTC = _BV(RS);
PORTB = 0b11111111;
PORTC = _BV(E);
_delay_loop_1(30);
PORTC = ~_BV(E);
_delay_loop_1(30);
PORTC = _BV(E);
_delay_loop_1(30); //strobe data(javet inte fint men men....)
PORTC = ~_BV(E);
_delay_loop_1(30);
PORTC = _BV(E);
_delay_loop_1(30);
PORTC = ~_BV(E);
_delay_loop_1(30);
PORTC = _BV(E);
_delay_loop_1(30);
PORTC = ~_BV(E);
_delay_loop_1(30);
PORTC = _BV(E);
_delay_loop_1(30);
PORTC = ~_BV(E);
_delay_loop_1(30);

PORTB = 0b00111111; //sätt displayen i läge on igen för att visa vad som finns i ramet....


}

Postat: 27 december 2004, 19:23:49
av MicaelKarlsson
Har du kollat så att rätt data skickas till displayen?

Postat: 28 december 2004, 19:23:03
av sven
jao.. det ska vara rätt.. men jag är lite osäker på hur E signalen ska användas, och hur långa delays det ska vara osv..

Postat: 28 december 2004, 19:40:20
av $tiff
Du kan ju börja med delay på någon ms, sen när du får det att funka så kan du sänka den tlls det börjar flippa :wink:

Synd att jag inte har en likadan display i näven, är nämligen också mycket sugen på att försöka få igång en KS0108!

Jag hittade lite mumma här, mer specifikt är det nog den här appnoten som är av intresse.


Edit: Dumheter, E är 'la klocksignalen. På en HD44780 gäller att data till LCDn triggas på fallande flank, medans data från LCDn ges ut på stigande flank och försvinner på fallande, det kan vara så här med...

Postat: 28 december 2004, 22:06:22
av klopaz
Kolla in databladet: http://www.fractronics.com/12864b_full.pdf
Står allt man vill veta och lite till. Har lite kod som jag kör på en mega32 och den där displayen om du vill ha?

Postat: 29 december 2004, 13:16:31
av sven
kom fram till att den förra koden var skit.. har nu följt timing diagrammet i databladet och gissa vad?!! de funkar fortfarande inte...

#include <avr/io.h>
#include <inttypes.h>
#include <avr/delay.h>
#define RS PC6
#define RW PC5
#define E PC4
#define CS1 PC3
#define CS2 PC2
#define RST PC1

int main()
{
DDRB = 0xff;
DDRC = 0xff;


//display on
PORTC |= _BV(E);
_delay_loop_2(210); //30ns
PORTC &= ~_BV(E);
_delay_loop_2(2400); //310ns
PORTC &= ~(_BV(RW) | _BV(RS) | _BV(CS1));
PORTC &= ~_BV(CS2);
_delay_loop_2(1200); //140ns
PORTC |= _BV(E);
_delay_loop_2(220); //30ns
PORTB = 0b00111111;
PORTC |= _BV(E);
_delay_loop_2(1600);
PORTC &= ~_BV(E);
_delay_loop_2(220);
PORTB = 0b00000000;
_delay_loop_2(80); //10ns
PORTC &= ~(_BV(CS2) | _BV(RW) | _BV(RS) | _BV(CS1));


//set page address
PORTC |= _BV(E);
_delay_loop_2(210); //30ns
PORTC &= ~_BV(E);
_delay_loop_2(2400); //310ns
PORTC &= ~(_BV(RW) | _BV(RS) | _BV(CS1));
PORTC &= ~_BV(CS2);
_delay_loop_2(1200); //140ns
PORTC |= _BV(E);
_delay_loop_2(220); //30ns
PORTB = 0b10111010;
PORTC |= _BV(E);
_delay_loop_2(1600);
PORTC &= ~_BV(E);
_delay_loop_2(220);
PORTB = 0b00000000;
_delay_loop_2(80); //10ns
PORTC &= ~(_BV(CS2) | _BV(RW) | _BV(RS) | _BV(CS1));





//set y address
PORTC |= _BV(E);
_delay_loop_2(210); //30ns
PORTC &= ~_BV(E);
_delay_loop_2(2400); //310ns
PORTC &= ~(_BV(RW) | _BV(RS) | _BV(CS1));
PORTC &= ~_BV(CS2);
_delay_loop_2(1200); //140ns
PORTC |= _BV(E);
_delay_loop_2(220); //30ns
PORTB = 0b01000110;
PORTC |= _BV(E);
_delay_loop_2(1600);
PORTC &= ~_BV(E);
_delay_loop_2(220);
PORTB = 0b00000000;
_delay_loop_2(80); //10ns
PORTC &= ~(_BV(CS2) | _BV(RW) | _BV(RS) | _BV(CS1));


//start line
PORTC |= _BV(E);
_delay_loop_2(210); //30ns
PORTC &= ~_BV(E);
_delay_loop_2(2400); //310ns
PORTC &= ~(_BV(RW) | _BV(RS) | _BV(CS1));
PORTC &= ~_BV(CS2);
_delay_loop_2(1200); //140ns
PORTC |= _BV(E);
_delay_loop_2(220); //30ns
PORTB = 0b11000000;
PORTC |= _BV(E);
_delay_loop_2(1600);
PORTC &= ~_BV(E);
_delay_loop_2(220);
PORTB = 0b00000000;
_delay_loop_2(80); //10ns
PORTC &= ~(_BV(CS2) | _BV(RW) | _BV(RS) | _BV(CS1));


//write data
PORTC |= _BV(E);
_delay_loop_2(210); //30ns
PORTC &= ~_BV(E);
_delay_loop_2(2400); //310ns
PORTC &= ~(_BV(RW) | _BV(RS) | _BV(CS1));
PORTC &= ~_BV(CS2);
_delay_loop_2(1200); //140ns
PORTC |= _BV(E);
_delay_loop_2(220); //30ns
PORTB = 0b11111111;
PORTC |= _BV(E);
_delay_loop_2(1600);
PORTC &= ~_BV(E);
_delay_loop_2(220);
PORTB = 0b00000001;
_delay_loop_2(80); //10ns
PORTC &= ~(_BV(CS2) | _BV(RW) | _BV(RS) | _BV(CS1));



}

Postat: 29 december 2004, 13:19:41
av matseng
Du använder aldrig RST-pinnen? Är den inte inkopplad eller står den i rätt läge från början?

Postat: 29 december 2004, 15:01:10
av cykze
delay:sen är väl ändå lite fel uträknade. Om delay-funktionen och kommentarerna ska stämma överrens så kör du AVR:en i ca 30 GHz, om jag har räknat rätt...

Postat: 30 december 2004, 13:22:28
av sven
har kikat på endel andra lösningar till pic kretsar och vad jag ser så andvänds den inte.. om man då inte vill reseta lcdn..

hmm... nano är väll 10^-6? så i 8000000hz tar det väll 8 "klockslag" per ns? eller jag kanske är helt ute å cyklar...

Postat: 30 december 2004, 13:34:26
av matseng
Och man behöver inte mjukvaruresetta den som man kan bli tvungen att göra med HD77480-kretsar?

milli = 10^-3
mikro = 10^-6
nano = 10^-9
piko = 10^-12

Postat: 30 december 2004, 16:22:18
av sven
lite felräknat med delayerna där =) men om det krävs så lite tid som databladet säger tex adress setup time 140ns, då borde det ju inte behöva läggas in några delays i koden när man bara kör i 8mhz?

blir inte klok på detta...

Postat: 30 december 2004, 16:40:19
av $tiff
Det är mycket möjligt att man inte behöver någon delay. Kanske en enda nop om man nu vill vara på säkra sidan. Men varför bråkar du med delays när det inte fungerar som det ska överhuvudtaget? Ett för stort delay kan ju inte skada eftersom överföringen är synkron, så börja med några ms i delay överallt, sen när du fått igång displayen så kan du börja skärna ner på delayerna tills det inte går längre, om det nu är överföringshastighet du är ute efter.

Postat: 30 december 2004, 16:48:13
av matseng
Har du pinne 17 (Reset) inkopplad mellan displayen och avr'en?

Om ja: mät på den och kolla att den verkligen är satt hög (+5 volt). Är den 0'a så ligger diplayen i reset hela tiden och kommer inte att vilja fungera.

Om nej: Har du kopplat en sladd mellan pinne 17 på displyen och plus eller ligger den flytande? Dra upp den till plus isådanafall för säkerhets skull.

Förresten - vad händer när du kör programmet? Och vad förväntar du dig ska hända?

Postat: 30 december 2004, 17:07:45
av sven
jepp restet är ansluten till avren
jag förväntar mig att det 8 verikala pixlar på rad ska tändas..
men ska inte reseten vara låg vid användning?
på tex en avr är det väll när reset är hög som reseten inträffar??

blir bara rörigare och rörigare det här.. ska ta och skriva om koden igen..

Postat: 30 december 2004, 17:21:47
av matseng
Fractronics datablad säger egentligen inget om huruvida RST är aktiv låg eller hög.

Men på
http://www.compsys1.com/workbench/On_to ... oller.html
och
http://www.skippari.net/lcd/ks0108.html
och Samsungs datablad för KS0108B http://www.perfectlcd.com/form/IC_spec/ ... ks0108.pdf
så är "Reset Active" låg, dvs den ska kopplas till plus vid normal drift.

Prova att lägg den på plus och se vad som händer.