Hur använder man en KS0108B display

Lysdioder, Optiska sensorer, Fiberoptik, Displayer, Lasrar, Optiska kopplare
Pajn
Inlägg: 1160
Blev medlem: 6 juni 2008, 19:14:29
Ort: Nyköping
Kontakt:

Re: Hur använder man en KS0108B display

Inlägg 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.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Hur använder man en KS0108B display

Inlägg av sodjan »

Nä, för oss vanliga dödliga så är ju en ms och en us i princip lika långa... :-) :-)
Pajn
Inlägg: 1160
Blev medlem: 6 juni 2008, 19:14:29
Ort: Nyköping
Kontakt:

Re: Hur använder man en KS0108B display

Inlägg 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?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Hur använder man en KS0108B display

Inlägg av sodjan »

Vart tar main() "vägen" när x = 64 ?
Notera att main() aldrig får "ta slut", så att säga...
Pajn
Inlägg: 1160
Blev medlem: 6 juni 2008, 19:14:29
Ort: Nyköping
Kontakt:

Re: Hur använder man en KS0108B display

Inlägg 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.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Hur använder man en KS0108B display

Inlägg 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 ?
Pajn
Inlägg: 1160
Blev medlem: 6 juni 2008, 19:14:29
Ort: Nyköping
Kontakt:

Re: Hur använder man en KS0108B display

Inlägg 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) {}
    
}
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Hur använder man en KS0108B display

Inlägg 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
Pajn
Inlägg: 1160
Blev medlem: 6 juni 2008, 19:14:29
Ort: Nyköping
Kontakt:

Re: Hur använder man en KS0108B display

Inlägg 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.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Hur använder man en KS0108B display

Inlägg 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...
Pajn
Inlägg: 1160
Blev medlem: 6 juni 2008, 19:14:29
Ort: Nyköping
Kontakt:

Re: Hur använder man en KS0108B display

Inlägg 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?
Användarvisningsbild
Korken
Inlägg: 2230
Blev medlem: 3 februari 2006, 19:19:36
Ort: Luleå, Porsön

Re: Hur använder man en KS0108B display

Inlägg 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
Pajn
Inlägg: 1160
Blev medlem: 6 juni 2008, 19:14:29
Ort: Nyköping
Kontakt:

Re: Hur använder man en KS0108B display

Inlägg av Pajn »

Trevligt :) Äntligen kom nya picar (idag) så det får bli att testa lite sen.
Användarvisningsbild
Korken
Inlägg: 2230
Blev medlem: 3 februari 2006, 19:19:36
Ort: Luleå, Porsön

Re: Hur använder man en KS0108B display

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