ks 0108 avr problem...

Lysdioder, Optiska sensorer, Fiberoptik, Displayer, Lasrar, Optiska kopplare
sven
Inlägg: 113
Blev medlem: 16 september 2003, 17:47:19

ks 0108 avr problem...

Inlägg 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....


}
Användarvisningsbild
MicaelKarlsson
Inlägg: 4669
Blev medlem: 18 juni 2004, 09:16:07
Ort: Aneby
Kontakt:

Inlägg av MicaelKarlsson »

Har du kollat så att rätt data skickas till displayen?
sven
Inlägg: 113
Blev medlem: 16 september 2003, 17:47:19

Inlägg 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..
Användarvisningsbild
$tiff
Inlägg: 4941
Blev medlem: 31 maj 2003, 19:47:52
Ort: Göteborg
Kontakt:

Inlägg 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...
klopaz
Inlägg: 45
Blev medlem: 26 december 2003, 03:37:48

Inlägg 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?
sven
Inlägg: 113
Blev medlem: 16 september 2003, 17:47:19

Inlägg 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));



}
matseng
Inlägg: 2360
Blev medlem: 16 september 2003, 17:18:13
Ort: Dubai, United Arab Emirates
Kontakt:

Inlägg 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?
Användarvisningsbild
cykze
EF Sponsor
Inlägg: 1539
Blev medlem: 8 april 2004, 10:40:28
Ort: Uppsala

Inlägg 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...
sven
Inlägg: 113
Blev medlem: 16 september 2003, 17:47:19

Inlägg 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...
matseng
Inlägg: 2360
Blev medlem: 16 september 2003, 17:18:13
Ort: Dubai, United Arab Emirates
Kontakt:

Inlägg 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
sven
Inlägg: 113
Blev medlem: 16 september 2003, 17:47:19

Inlägg 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...
Användarvisningsbild
$tiff
Inlägg: 4941
Blev medlem: 31 maj 2003, 19:47:52
Ort: Göteborg
Kontakt:

Inlägg 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.
matseng
Inlägg: 2360
Blev medlem: 16 september 2003, 17:18:13
Ort: Dubai, United Arab Emirates
Kontakt:

Inlägg 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?
sven
Inlägg: 113
Blev medlem: 16 september 2003, 17:47:19

Inlägg 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..
matseng
Inlägg: 2360
Blev medlem: 16 september 2003, 17:18:13
Ort: Dubai, United Arab Emirates
Kontakt:

Inlägg 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.
Skriv svar