Sida 3 av 3

Re: Hur använder man en KS0108B display

Postat: 6 april 2009, 00:53:41
av Pajn
Jag använder "PIC Simulator IDE" så någon "stopwatch" har jag aldrig hör talas om. Det står iof. hur många µs som har gått men om man redan har lyckats blanda ihop det hjälper det ju inte :wink:

Den koder jag har frågat om hjälp på blev tillslut

Kod: Markera allt

void main() {
  PORTA = 0;
  CMCON  = 0x07;
  TRISA = 0;
  while(1) {
    PORTA.F1 = 1;
    delay_ms(1000);
    PORTA.F2 = 1;
    delay_ms(1000);
    PORTA.F1 = 0;
    delay_ms(1000);
    PORTA.F2 = 0;
    delay_ms(2000);
  }
}
Vilken funkar perfekt både i simulator och IRL

Den koden som jag fixade men hjälpen på ovanstående kod var:

Kod: Markera allt

/*
 RS-4 = RA0-17
 R/W-5 = RA1-18
 E-6 = RA2-1
 CS1-15 = RA3-2
 CS2-16 = RA4-3
 DB0-7 = RA0-7

*/

void start() {
     PORTB = 0b00111111;
     delay_us(100);
}
void page(int i) {
     if(i==0) { PORTB = 0b10111000; }
     else if(i==1) { PORTB = 0b10111001; }
     else if(i==2) { PORTB = 0b10111010; }
     else if(i==3) { PORTB = 0b10111011; }
     else if(i==4) { PORTB = 0b10111100; }
     else if(i==5) { PORTB = 0b10111101; }
     else if(i==6) { PORTB = 0b10111110; }
     else if(i==7) { PORTB = 0b10111111; }
}
void y() {
     PORTB = 0b10000010;
}
void write() {
     PORTA.F0 = 1;
     PORTB = 0b11111111;
}
void main() {
  int i = 0;
  int x = 0;
  PORTA = 0;
  CMCON = 7;
  TRISA = 0;
  PORTB = 0;
  TRISB = 0;
  PORTA.F3 = 1;
  PORTA.F4 = 1;
  start();
     PORTA.F2 = 1;
     PORTA.F2 = 0;
  page(i);
     PORTA.F2 = 1;
     PORTA.F2 = 0;
  y();
     PORTA.F2 = 1;
     PORTA.F2 = 0;
    while(x!=64) {
         write();
         PORTA.F2 = 1;
         PORTA.F2 = 0;
         ++x;
    }
}
Denna har jag dock bara kört i en simulator men där funkar den.
Den kanske inte är den bäst optimerade men det spelar inte så stor roll.

Re: Hur använder man en KS0108B display

Postat: 6 april 2009, 01:11:37
av sodjan
Nä, för oss vanliga dödliga så är ju en ms och en us i princip lika långa... :-) :-)

Re: Hur använder man en KS0108B display

Postat: 6 april 2009, 21:58:46
av Pajn
Jag har ett nytt problem. Här är koden

Kod: Markera allt

/*
 RS-4 = RA0-17
 R/W-5 = RA1-18
 E-6 = RA2-1
 CS1-15 = RA3-2
 CS2-16 = RA4-3
 DB0-7 = RA0-7

*/

void start() {
     PORTB = 0b00111111;
     delay_us(250);
}
void page(int i) {
     if(i==0) { PORTB = 0b10111000; }
     else if(i==1) { PORTB = 0b10111001; }
     else if(i==2) { PORTB = 0b10111010; }
     else if(i==3) { PORTB = 0b10111011; }
     else if(i==4) { PORTB = 0b10111100; }
     else if(i==5) { PORTB = 0b10111101; }
     else if(i==6) { PORTB = 0b10111110; }
     else if(i==7) { PORTB = 0b10111111; }
     delay_us(250);
}
void y() {
     PORTB = 0b10000010;
     delay_us(250);
}
void write() {
     PORTA.F0 = 1;
     PORTB = 0b11111111;
     delay_us(250);
}
void main() {
  int i = 3;
  int x = 0;
  PORTA = 0;
  CMCON = 7;
  TRISA = 0;
  PORTB = 0;
  TRISB = 0;
  PORTA.F3 = 1;
  PORTA.F4 = 1;
  PORTA.F7 = 1;
  start();
     PORTA.F2 = 1;
     delay_us(250);
     PORTA.F2 = 0;
  page(i);
     PORTA.F2 = 1;
     delay_us(250);
     PORTA.F2 = 0;
  y();
     PORTA.F2 = 1;
     delay_us(250);
     PORTA.F2 = 0;
    while(x!=64) {
         write();
         PORTA.F2 = 1;
         PORTA.F2 = 0;
         ++x;
    }
  PORTA.F7 = 0;
    
}
Denna funkar bra i en simulator men jag får ingen bild på displayen och dioden som är kopplad till RA7 blinkar. Vad kan det vara för fel jag har dubbelkollat kopplingen men den ser bra ut och fel på displayen borde ju kunna uteslutas eftersom även dioden beter sig underligt. Någon som vet vad det kan vara för fel?

Re: Hur använder man en KS0108B display

Postat: 6 april 2009, 22:30:47
av sodjan
Vart tar main() "vägen" när x = 64 ?
Notera att main() aldrig får "ta slut", så att säga...

Re: Hur använder man en KS0108B display

Postat: 6 april 2009, 22:46:58
av Pajn
Jag stoppade in

Kod: Markera allt

while(1) {}
i slutet precis innan slutet på main(), nu funkar dioden (RA7) men displayen säger fortfarande inget.

Re: Hur använder man en KS0108B display

Postat: 6 april 2009, 22:59:33
av sodjan
OK. När det gäller själva displayen så känns din kod väldigt enkel/kort.
Är det inte en hel del inställningar av displayen som behövs innan
den börjar visa något alls ? Jag kollade lite snabbt på en test-kod
som jag gjorde till en KS0108 display, och där har jag rutiner som
dessa i början (alltså innan jag skriver något som syns alls) :

Kod: Markera allt

    call    EW12A00_reset
    call    EW12A00_set_duty_1_32
    call    EW12A00_set_display_on
    call    EW12A00_set_static_off
    call    EW12A00_set_adc_rev
    call    EW12A00_clear
Har du kollat KS0108 specen och gjort det som behövs ?

Re: Hur använder man en KS0108B display

Postat: 6 april 2009, 23:06:32
av Pajn
Om du kollar i databladet sida 14 (länk i första posten i denna tråd) så verkar det inte som jag behöver göra något mer.

Kod: Markera allt

EW12A00_reset                  En reset, denna nämns inte ens i databladet (om man nu inte ska läsa status på displayen)
EW12A00_set_duty_1_32     Vad gör denna?
EW12A00_set_display_on     Sätter på displayen, det gör jag
EW12A00_set_static_off      Vad gör denna?
EW12A00_set_adc_rev        Vad gör denna?
EW12A00_clear                  Tömmer skärmen??
EDIT: Nu har dioden börjat blinka igen, säkert har jag missat något men kan f*n inte hitta det

Kod: Markera allt

/*
 RS-4 = RA0-17
 R/W-5 = RA1-18
 E-6 = RA2-1
 CS1-15 = RA3-2
 CS2-16 = RA4-3
 DB0-7 = RA0-7

*/

void start() {
     PORTB = 0b00111111;
     delay_us(250);
}
void page(int i) {
     if(i==0) { PORTB = 0b10111000; }
     else if(i==1) { PORTB = 0b10111001; }
     else if(i==2) { PORTB = 0b10111010; }
     else if(i==3) { PORTB = 0b10111011; }
     else if(i==4) { PORTB = 0b10111100; }
     else if(i==5) { PORTB = 0b10111101; }
     else if(i==6) { PORTB = 0b10111110; }
     else if(i==7) { PORTB = 0b10111111; }
     delay_us(250);
}
void y() {
     PORTB = 0b10000010;
     delay_us(250);
}
void write() {
     PORTA.F0 = 1;
     PORTB = 0b11111111;
     delay_us(250);
}
void main() {
  int i = 0;
  int x = 0;
  PORTA = 0;
  CMCON = 7;
  TRISA = 0;
  PORTB = 0;
  TRISB = 0;
  PORTA.F3 = 1;
  PORTA.F4 = 1;
  PORTA.F7 = 1;
  start();
     PORTA.F2 = 1;
     delay_us(250);
     PORTA.F2 = 0;
  page(i);
     PORTA.F2 = 1;
     delay_us(250);
     PORTA.F2 = 0;
  y();
     PORTA.F2 = 1;
     delay_us(250);
     PORTA.F2 = 0;
    while(x!=64) {
         write();
         PORTA.F2 = 1;
         PORTA.F2 = 0;
         ++x;
    }
  PORTA.F7 = 0;
  while(1) {}
    
}

Re: Hur använder man en KS0108B display

Postat: 6 april 2009, 23:34:12
av sodjan
Jag minns inte längre vad som behövdes eller inte, men här kan du se vilka kommandon
som de olika rutinerna skickar. Om de behövs eller om det har något med dina
aktuella problem har jag inte en susning om...

Den modul jag har har alltså 4 "pages" (0...3) och 122 "cols" (0...121).
Sen har den två controllers också så allt görs en gång till CS1 och en gång till CS2.

Modulen jag använde är denna : http://www.datasheet4u.com/download.php?id=605306
(Om länken fungerar. Leta annars, om du vill, efter "EW12A00"). 122x32 pixels.

Kod: Markera allt

;**********************************************************
EW12A00_set_adc_rev
    movlw   b'10100001'
    call    EW12A00_cmd
    return
    
;**********************************************************
EW12A00_set_static_off
    movlw   b'10100100'
    call    EW12A00_cmd
    return
    
;**********************************************************
EW12A00_set_display_on
    movlw   b'10101111'
    call    EW12A00_cmd
    return
    
;**********************************************************
EW12A00_reset
    movlw   b'11100010'
    call    EW12A00_cmd
    return
    
;**********************************************************
EW12A00_set_duty_1_32
    movlw   b'11100010'
    call    EW12A00_cmd
    return
    
;**********************************************************
EW12A00_clear
; clear EW12A00...
; Page : 3 => 0
; Column : 121 => 0
;

    movlw   d'04'
    movwf   EW12A00_page_addr

clear_page_loop

    decf    EW12A00_page_addr, f
    movf    EW12A00_page_addr, w
    call    EW12A00_set_page

    movlw   d'122'
    movwf   EW12A00_col_addr

clear_col_loop

    decf    EW12A00_col_addr, f
    movf    EW12A00_col_addr, w
    call    EW12A00_set_col
    EW12A00_write_data  h'00'   <<<=== Ändra för att "fylla" displayen...
    tstfsz  EW12A00_col_addr
    goto    clear_col_loop
    tstfsz  EW12A00_page_addr
    goto    clear_page_loop
    
    return

Re: Hur använder man en KS0108B display

Postat: 7 april 2009, 09:37:41
av Pajn
Här är koden som den ser ut nu i debug-stadiet:

Kod: Markera allt

/*
 RS-4 = RA0-17
 R/W-5 = RA1-18
 E-6 = RA2-1
 CS1-15 = RA3-2
 CS2-16 = RA4-3
 DB0-7 = RA0-7
 RST = RA6
*/

void start() {
     PORTB = 0b00111111;
     delay_us(250);
}
void page(int i) {
     /*if(i==0) { PORTB = 0b10111000; }
     else if(i==1) { PORTB = 0b10111001; }
     else if(i==2) { PORTB = 0b10111010; }
     else if(i==3) { PORTB = 0b10111011; }
     else if(i==4) { PORTB = 0b10111100; }
     else if(i==5) { PORTB = 0b10111101; }
     else if(i==6) { PORTB = 0b10111110; }
     else if(i==7) { PORTB = 0b10111111; }   */
     PORTB = 0b10111001;
     delay_us(250);
}
void y() {
     PORTB = 0b10000010;
     delay_us(250);
}
void write() {
     PORTA.F0 = 1;
     PORTB = 0b11111111;
     delay_us(250);
}
void main() {
  int i = 0;
  int x = 0;
  PORTA = 0;
  CMCON = 0x07; // Turn off comparators
  TRISA = 0;
  PORTB = 0;
  TRISB = 0;
  TRISB.F4 = 1;
  PORTA.F6 = 1;
  delay_us(250);
  PORTA.F6 = 1;
  delay_us(250);
  if(PORTB.F4==0){}
  else {delay_us(10000);}
  TRISB.F4 = 0;
  PORTA.F3 = 1;
  PORTA.F4 = 1;
  PORTA.F7 = 1;
  /*start();
     PORTA.F2 = 1;
     delay_us(250);
     PORTA.F2 = 0;
  page(i);
     PORTA.F2 = 1;
     delay_us(250);
     PORTA.F2 = 0;
  y();
     PORTA.F2 = 1;
     delay_us(250);
     PORTA.F2 = 0;
    while(x!=64) {
         write();
         PORTA.F2 = 1;
         PORTA.F2 = 0;
         ++x;
    }
  PORTA.F7 = 0;  */
  while(1) {
    PORTA.F7 = 1;
    delay_ms(1000);
    PORTA.F7 = 0;
    delay_ms(2000);
  }
}
Allt som skickas till displayen är bortkommenterat, om jag istället väljer att skicka start så börjar lysdioden på pinne RA7 blinka helt slumpvis och efter en stund lyser den med ett fast sken. Om jag verifierar programmet då säger den att picen är tömd även fast den gick igenom verifieringen utan problem innan.

Re: Hur använder man en KS0108B display

Postat: 7 april 2009, 10:34:04
av sodjan
Jag skulle försöka få igång det med ett testprogram som är lite mer "rakt-på".
D.v.s utan alla olika funktioner (page() o.s.v) utan enbart sätta PORTB
och de olika kontrollsignalerna i en rak sekvens i main() för att försöka få igång det.
Så att du är bombsäker på vad du skickar till displayen.

Sen, vid slumpmässiga problem, så är det de vanliga standardfrågorna
kring öppna ingångar, avkoppling o.s.v. D.v.s allt det som inte direkt har
med displayen att göra...

Re: Hur använder man en KS0108B display

Postat: 7 april 2009, 11:11:51
av Pajn
Det slumpmässiga problemet kom av att jag hade glömt att stänga av LVP :doh:
Nu visar displayen ett tjockt vitt sträck när jag kör programmet, det blinkar till väldigt fort och försvinner sedan. Förut fick displayen ett smalare vitt sträck. Skulle detta kunna vara något medelande till mig?

Re: Hur använder man en KS0108B display

Postat: 20 april 2009, 22:03:57
av Korken
Jag har nu inte läst hela tråden men, tror detta kan ge dig en spark på vägen. ;)
Komplett kod med några funktioner.
Drivrutin för Grafisk KS0108B display

Jag har skrivit den så har du några funderingar så kan jag nog hjälpa dig lite.

//Korken

Re: Hur använder man en KS0108B display

Postat: 22 april 2009, 18:34:00
av Pajn
Trevligt :) Äntligen kom nya picar (idag) så det får bli att testa lite sen.

Re: Hur använder man en KS0108B display

Postat: 22 april 2009, 22:20:06
av Korken
Kör hårt! :)
Min kod är dock för AVR men tror inte att det sa vara några problem att porta den.

//Emil