Grafikus LCD

Hogyha sikeresen O/PLED illetve hagyományos alfanumerikus - esetleg tán grafikus kijelzővel gyűlik meg a baja valakinek:)
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3228
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

HozzászólásSzerző: kapu48 » 2012. július 28. szombat, 11:48

De hamar elmentél!! ???

Most jött volna az eddig megszerzett ismeretek alkalmazása.

Az eredeti „_gpixel:” rutint kiegészítettük volna 2 utasítással.
Hogy „Pset” utasítás után visszakapjuk az előző Pixel állapotát, és a Bit – Byte belüli helyzetét.

Ezáltal Pset után jöhetne az ütközés vizsgálat!
Így elhagyható lenne a Pset előtti Pixelolvasás.

:(

Avatar
solti_imre
DrótVégénSzéndarab
Hozzászólások: 22
Csatlakozott: 2010. december 2. csütörtök, 7:00

HozzászólásSzerző: solti_imre » 2012. július 28. szombat, 12:13

kapu48 írta:De hamar elmentél!! ???

Hamar??? Tegnap látástól mikulásig a monitor előtt ültem! :-)
kapu48 írta:...
Az eredeti „_gpixel:” rutint kiegészítettük volna 2 utasítással.
Hogy „Pset” utasítás után visszakapjuk az előző Pixel állapotát, és a Bit – Byte belüli helyzetét.
Ezáltal Pset után jöhetne az ütközés vizsgálat!
Így elhagyható lenne a Pset előtti Pixelolvasás.


Igen, ilyesmikre gondoltam én is, ezért is írtam a tegnapi utolsó hozzászólásomban, hogy már csak a maszkolás és a vizsgálatok vannak hátra - remélem a jövő héten lesz egy kis időm rá, hogy az ezzel kapcsolatos asm utasításokat átnézzem.

Ismételten nagyon köszönöm a segítséged, további jó hétvégét Neked!

Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3228
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

HozzászólásSzerző: kapu48 » 2012. július 28. szombat, 12:34

Játék programba kellett ütközés vizsgálatot megvalósítani.
Számunkra még ismeretlen HW és SW környezetben.
A téma kezdete: solti_imre Elküldve: 2012. Július 26. Csütörtök, 16:01
A Fenti 2 oldalon keresztül folytatott kísérletezés eredménye összefoglalva.
SBN6400G-D+SBN0064G-D -vel szerelt 128x64-es LCD kijelző.
A használt : „glcdKS108.lib”
Kiindulási alapnak vettük a lib-ben levő Pontrajzoló rutint. ( 3 hsz-el feljebb.)
Amit kiegészítettünk 2 utasítással.
Így elértük, hogy a grafikus „Pset” parancsból visszatéréskor benne lesznek a „Gbyteread” változóban az Pset előtti Pixel értékek amit megvizsgálva eldönthetjük, hogy történt e ütközés?
Használat:

Kód: Egész kijelölése

' Az ASM-nak átadandó változókat előre kell létrehozni, Nem lehet a Sub rutinokban
'grafikus "Pset" parancsból visszatéréskor benne lesznek a "Gbyteread" változóban az
'Pset előtti Pixel értékek amit megvizsgálva eldönthetjük, hogy történt e ütközés?
 Dim Gbyteread As Byte
' Az aktuális bite maszkja
 Dim Pixelbit As Byte

' $lib "glcdSBN6400.lib"

 $lib "glcdKS108.lib"

 Config Graphlcd = 128 * 64sed , Dataport = Portb , Controlport = Portd , Ce = 0 , Ce2 = 1 , Cd = 4 , Rd = 3 , Reset = 2 , Enable = 5
  Cls

Pset X , Y, 1
If  Gbyteread.Pixelbit = 1 Then
   ’Üközés történt
End if

És a módosítót rutin „glcdKS108.lib” -ben:

Kód: Egész kijelölése

[_GPIXEL]
$external _div8 , _glocate , _adjust_pin
; set or reset a single pixel
; X=R20 , Y=R21 , R25 is on/off
_gpixel:
  Push r0
  Push r1
  Push r2
  Push r3
  Push r16
  Push r25           ; menti a Pixel művelet  H/L jelzőt
    Push r20         ; menti X értékét
    Mov r16,r21                      ; row
    Ldi R20 , 8                      ; 8 Bits In Byte
    call _Div8                       ; r16 tartalmazza a megfelelő Y-cím sort most  contains proper Y/row address now
    Mov r0, r24                      ; save remainder

  ; Itt bővítettük a rutint. Elmentve az Byte.bit számítás eredményét
  * sts {Pixelbit},r24             ; Elmentjük a Bit Sorszámát
    Pop r20                          ; get X back
  Mov r21,r16                      ; y data location
  mov r2,r20                       ; save for later
  mov r3,r21                       ; X, Y Adatokból grafikus memória cím számítás, és be írása a cím regiszterekbe
  rcall _setcol                    ; use the code from locate
  ; GLCD Memoria olvasás
  rcall _gread_data                ; return data in r1
  rcall _gread_data                ; return data in r1  DO NOT REMOVE !!!

  ; Itt bővítettük a rutint. Elmentve az pixelmódosítás előtti állapotot
* sts {Gbyteread},r1             ; Elmentjük a kiolvasót Bytet
  mov r20,r2                      ; X, Y címek frissítése
  mov r21,r3
  rcall _setcol                    ; use the code from locate

  Mov r24,r0                       ; Maradék számítás remainder
  call _Adjust_pin                 ; Bit maszk számítás ???
  Pop r16  ;param r25
  tst r16                    ;  Test for Zero
  breq _gpixel_clear         ; Ugrás ha zéró Branch if Equal
; r1-ben van az eredeti Byte értéke, r24-ben a változtatni kívánt Bit maszk
  or r1,r24                  ; Pixel Set, Logical OR
  rjmp _gpixel_set
_gpixel_clear:               ; Pixel Törlés
  and r1,r25                 ; Logical AND
_gpixel_set:
  mov r24,r1
  rcall _GWrite_data               ; write data
  Pop r16                          ; Regiszterek visszatöltése
  Pop r3
  Pop r2
  Pop r1
  Pop r0
ret
[END]


Remélem segítség lesz ez a kis módosítás!
:)
A hozzászólást 1 alkalommal szerkesztették, utoljára kapu48 2012. november 23. péntek, 20:33-kor.

Avatar
joeharry
Újonc
Újonc
Hozzászólások: 2
Csatlakozott: 2009. június 29. hétfő, 6:00

.bgf fájl

HozzászólásSzerző: joeharry » 2012. november 23. péntek, 18:57

Sziasztok! Napok óta szívok egy grafikus kijelzővel. KS 108 alapú 128*64, semmi különös. Bascom alatt próbálom működése bírni, nagyrészt sikerrel. A SAMPLES \LCDGRAPH könyvtáras alapprogramok mennek szépen, de én új bgf fájlt szerettem volna megjeleníteni.. na itt van a gond. A tools-ban van egy segédprogram:Graphic Converter (gondolom nem mondtam újat), ezzel próbáltam egy egyszerű keretet konvertálni. Elvileg sikerült, megvan a keret.bgf fájl, de amikor ezt illesztem be a példaprogramba, csak kozmikus zavar leképezését jeleníti meg, nem az óhajtott keretet... SZóval teleszemeteli a kijelzőt pontokkal és per jelekkel..
Esetleg 5let, hol szúrhattam el a konvertálást?


A bmp fájlt photosop-al készítettem 1 bites 128x64 kivitelben.

Avatar
winnerbt
Chipfüstölő
Hozzászólások: 884
Csatlakozott: 2007. március 25. vasárnap, 6:00
Tartózkodási hely: Kecskemét

HozzászólásSzerző: winnerbt » 2012. november 23. péntek, 19:25

Szia!
Próbálj meg kisebb képet kirakni előbb.
Ha ez is torzul, akkor a konverternél a 6-8 váltót próbáld átváltani és a SED-et. Elvileg KS108-nál SED config van (annál meg létezik 6-bites logikai karakter is).
BMP szabványos? (én paint-el szoktam bizergálni).
JAni

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9898
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Robert » 2012. november 23. péntek, 19:31

Milyen Bascom verzió?
Milyen AVR?

Avatar
joeharry
Újonc
Újonc
Hozzászólások: 2
Csatlakozott: 2009. június 29. hétfő, 6:00

HozzászólásSzerző: joeharry » 2012. november 23. péntek, 20:34

Jani, Király vagy! SED beállítás kell!

Valamiért ezt direkt nem pipáltam ki, úgy emlékeztem rá, hogy ez nem a ks107/108 -hoz való.. de mégis..

@Robert, ATMEGA1284 , Bascom 2.0.7.1
egyébként ez amit vettem, P nélküli, és nem is szerepel a dat állományban. Csináltam egy másolt datot, és itt átírtam a DEVID-t 1E9706-ra (eredeti 1E9705)

Köszi mégegyszer!

Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3228
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

HozzászólásSzerző: kapu48 » 2012. november 24. szombat, 12:04

Szerintem még az m128def.dat 1384 sorból: PWM1B=$8A
is törölnöd kellene!
:wink:

Ezek a különbségek a 2 állomány között:

m1284Pdef.dat:
1: [DEVICE]
2: FILE=M1284PDEF.DAT ; file name
3: pdf=ATmega1284P.pdf
4: pdfurl=http://www.atmel.com/Images/doc8059.pdf
5: device = ATMEGA1284P
6: UP = M1284P ; shortname for micro
7: RAMSTART = $100 ; start of SRAM memory

37: DEVID=1E9705 ; device ID

1384: PWM1B=$8A


m1284def.dat:
1: [DEVICE]
2: FILE=M1284PDEF.DAT ; file name
3: pdf=ATmega1284.pdf
4: pdfurl=http://www.atmel.com/Images/doc8059.pdf
5: device = ATMEGA1284
6: UP = M1284 ; shortname for micro
7: RAMSTART = $100 ; start of SRAM memory

37: DEVID=1E9706 ; device ID

8)

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9898
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Robert » 2012. november 24. szombat, 12:26

Bascomból a 2.0.7.5 a legfrissebb...

Avatar
onexer
Újonc
Újonc
Hozzászólások: 1
Csatlakozott: 2009. július 18. szombat, 6:00

Re: Grafikus LCD

HozzászólásSzerző: onexer » 2013. december 7. szombat, 17:46

Sziasztok.
Segítséget szeretnék kérni egy bizonyos GMS márkájú "msg12864a" tipusú lcd bekötésével kapcsolatban. http://lcd-systeme.com/downloads/goods_ ... 000214.pdf
A fenti linken látjátok az infókat.
Egy arduino mega 2560 -as hoz szeretném kötni és onnan vezérelni, de nem tudom pontosan, hogy melyiket hova kössem.
Élőre is köszönöm aki tud segíteni!!!

Üdv Dani

Avatar
winnerbt
Chipfüstölő
Hozzászólások: 884
Csatlakozott: 2007. március 25. vasárnap, 6:00
Tartózkodási hely: Kecskemét

Re: Grafikus LCD

HozzászólásSzerző: winnerbt » 2013. december 7. szombat, 18:40

Szia!
Úgy, mint bármely másik KS108-szerű LCD-t.
D0-D7 egy portra, a többi vezérlőjel egy másik port bitjeire, tetszőlegesen.
Különféle kijelzőknél, ahol 2db ChipSelect van, néha felcserélik a jobb/bal oldal CS-t, de ez hamar kiderül.
Config Graphlcd = 120 * 64sed , Dataport = Porta , Controlport = Portd , Ce = 5 , Ce2 = 7 , Cd = 3 , Rd = 4
Persze, hogy az adott kontroller melyik meglévővel kompatibilis, azt hirtelen nem tudom... ahhoz
megfelelő LIB-et kell alátenni.
JAni

holex
Biztosítékgyilkos
Hozzászólások: 70
Csatlakozott: 2013. október 29. kedd, 1:35

Re: Grafikus LCD

HozzászólásSzerző: holex » 2014. február 2. vasárnap, 21:36

Sziasztok, grafikus LCD-t szeretnék működésre bírni, de egyelőre nem sok életjelet ad azon kívül, hogy tudom változtatni a kontrasztot.
Arduino Mega 2560-am van, így kötöttem be a kijelzőt (a szám azt jelenti, hogy az arduino panel melyik lábára kötöttem):

4. RS - 35
5. RW - 33
6. E - 34
7. DB0 - 22
8. DB1 -23
9. DB2 - 24
10. DB3 - 25
11. DB4 - 26
12. DB5 - 27
13. DB6 - 28
14. DB7 - 29
15. CSA - 37
16. CSB - 36
17. RST - +5V

Ha egy pixel kirajzolna azzal már elégedett lennék, de nem csinál semmit. A kód:

Kód: Egész kijelölése

#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>

void GLCD_On(){
   DDRA=0xFF;
   DDRC=0xFF;
   PORTA=0x3F;
   PORTC=0b00001000;
   _delay_ms(3);
   PORTC=0;
}

void GLCD_Pixel (){
   PORTA=0x04;
   PORTC=0b1110;
   _delay_ms(3);
   PORTC=0;
   
}

int main(void)
{
   GLCD_On();
   _delay_ms(3);
   GLCD_Pixel();
    while(1)
    {
        //TODO:: Please write your application code
    }
}


Van valakinek ötlete, hogy miért nem csinál semmit? A vezérlőchip KS0108

holex
Biztosítékgyilkos
Hozzászólások: 70
Csatlakozott: 2013. október 29. kedd, 1:35

Re: Grafikus LCD

HozzászólásSzerző: holex » 2014. február 2. vasárnap, 23:20

Közben rájöttem, hogy a szimulátorban pont fordított logikával működött a CS.

holex
Biztosítékgyilkos
Hozzászólások: 70
Csatlakozott: 2013. október 29. kedd, 1:35

Re: Grafikus LCD

HozzászólásSzerző: holex » 2014. február 3. hétfő, 14:27

Ha LCD-n át akarok állítani egy pixelt, de úgy, hogy a többi ne változzon azt, hogy tehetem meg? Gondolom be kell olvasni az LCD-ről azt az 1x8-as oszlopot az LCD-ről, átírni az egyik pixelt, majd visszaírni. De ha LCD-ről akarok olvasni, akkor az adat portot az AVR-en át kell állítanom bemenetnek, ez eddig rendben. De hogy tudom visszaírni az adatot a kijelzőre? Ha előbb visszaállítom kimenetnek a portot, akkor az LCD is kimenet lesz meg az AVR portja is, abból gondolom nem sok jó sül ki. Mi erre a megoldás?

holex
Biztosítékgyilkos
Hozzászólások: 70
Csatlakozott: 2013. október 29. kedd, 1:35

Re: Grafikus LCD

HozzászólásSzerző: holex » 2014. február 3. hétfő, 14:27

Mi a hiba? Azt akarom, hogy írja végig a kijelzőt sorról sorra fekete pixelekkel, de benne marad egy egy pixel, ami minden sorváltásnál jobbra tolódik.

Kód: Egész kijelölése

#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>

#define LCD_CMD_PORT      PORTC      // Command Output Register
#define LCD_CMD_DIR         DDRC      // Data Direction Register for Command Port

#define LCD_DATA_IN         PINA      // Data Input Register
#define LCD_DATA_PORT      PORTA      // Data Output Register
#define LCD_DATA_DIR      DDRA      // Data Direction Register for Data Port

#define RS               2         // D/I Bit Number
#define RW               4         // R/W Bit Number
#define EN               3         // EN Bit Number
#define CSA               1         // CS1 Bit Number
#define CSB               0         // CS2 Bit Number
#define RST               5         // RESET

#define GLCD_ON            0x3F
#define GLCD_OFF         0x3E
#define BEIRAS            LCD_CMD_PORT&=~(1<<EN)

#define BLACK            0xFF
#define WHITE            0

#define DATA_TO_A         1<<CSA | 1<< RS | 1<<EN | 1<<RST
#define DATA_TO_B         1<<CSB | 1<< RS | 1<<EN | 1<<RST
#define DATA_TO_BOTH      1<<CSA | 1<<CSB | 1<<RS | 1<<EN | 1<<RST
#define INSTR_TO_A         1<<CSA | 1<<EN | 1<<RST
#define INSTR_TO_B         1<<CSB | 1<<EN | 1<<RST
#define INSTR_TO_BOTH      1<<CSA | 1<<CSB | 1<<EN | 1<<RST
#define SET_COL            0x40
#define SET_PAGE         0b10111000
#define READ_DSP_A         1<<CSA | 1<<EN | 1<<RST | 1<<RS | 1<<RW
#define READ_DSP_B         1<<CSB | 1<<EN | 1<<RST | 1<<RS | 1<<RW      

uint8_t i,j;

void beir(){
      _delay_us(10);
      BEIRAS;
      _delay_us(10);
}

void GLCD_Init(uint8_t szin){
   LCD_DATA_DIR=0xFF;
   LCD_CMD_DIR=0xFF;
   LCD_CMD_PORT&=~(0<<RST);
   _delay_us(10);
   
   LCD_DATA_PORT=GLCD_ON;
   LCD_CMD_PORT=INSTR_TO_BOTH;
   beir();
   LCD_DATA_PORT=SET_COL;  //Y address
   LCD_CMD_PORT=INSTR_TO_BOTH;
   beir();
   for(j=0;j<8;j++){
      LCD_DATA_PORT=SET_PAGE+j;
      LCD_CMD_PORT=INSTR_TO_BOTH;
      beir();
       for(i=0;i<64;i++){
         LCD_DATA_PORT=szin;
         LCD_CMD_PORT=DATA_TO_BOTH;
         beir();
      }
   }
   LCD_DATA_PORT=SET_COL;
   LCD_CMD_PORT=INSTR_TO_BOTH;
   beir();
   LCD_DATA_PORT=SET_PAGE;
   LCD_CMD_PORT=INSTR_TO_BOTH;
   beir();
   
}

void GLCD_SetPixel (uint8_t x, uint8_t y, uint8_t szin){
   uint8_t sor=y%8;
   uint8_t page=y/8;
   uint8_t tmpdata=0x00;
   LCD_DATA_PORT=SET_PAGE | page;
   if(x<64){
      LCD_CMD_PORT=INSTR_TO_A;
      beir();
      LCD_DATA_PORT=SET_COL | x;
      LCD_CMD_PORT=INSTR_TO_A;
      beir();
      LCD_DATA_DIR=0;
      LCD_CMD_PORT=READ_DSP_A;
      _delay_us(10);
      tmpdata=LCD_DATA_IN;
      beir();
      LCD_DATA_DIR=0xFF;
      LCD_DATA_PORT=SET_COL | x;
      LCD_CMD_PORT=INSTR_TO_A;
      beir();
      if (szin) LCD_DATA_PORT=(tmpdata|(1<<sor));
      else LCD_DATA_PORT=(tmpdata&~(1<<sor));
      LCD_CMD_PORT=DATA_TO_A;
      beir();
      
   }
   else{
      LCD_CMD_PORT=INSTR_TO_B;
      beir();
      LCD_DATA_PORT=SET_COL | (x-64);
      LCD_CMD_PORT=INSTR_TO_B;
      beir();
      LCD_DATA_DIR=0;
      LCD_CMD_PORT=READ_DSP_B;
      _delay_us(10);
      tmpdata=LCD_DATA_IN;
      beir();
      LCD_DATA_DIR=0xFF;
      LCD_DATA_PORT=SET_COL | (x-64);
      LCD_CMD_PORT=INSTR_TO_B;
      beir();
      if (szin) LCD_DATA_PORT=tmpdata|(1<<sor);
      else LCD_DATA_PORT=tmpdata&~(1<<sor);
      LCD_CMD_PORT=DATA_TO_B;
      beir();
   }
   
}

int main(void)
{
   GLCD_Init(WHITE);
   _delay_ms(1);
   for(j=0;j<8;j++)
   for(i=0;i<8;i++){
   GLCD_SetPixel(i,j,BLACK);
   _delay_ms(500);}
    while(1)
    {
        //TODO:: Please write your application code
    }
}


Vissza: “LCD kezelése”

Ki van itt

Jelenlévő fórumozók: nincs regisztrált felhasználó valamint 2 vendég