128x64 glcd veri okumak

Başlatan crapdeno, 15 Mart 2011, 13:46:43

crapdeno

Arkadaşlar benim projem dokunmatik ekran aracılığıyla çizdiğim birşeyi okuyarak rs232 ile bilgisayara atmam gerekiyor. bu glcd üzerindeki datayı okuyup atma işlemini çözemedim yardımcı olabilir misiniz??

Tagli

Konu başlığını yanlış vermişsin. "Touchpad Kullanımı" veya "Dokunmatik Ekrandan Veri Okumak" gibi birşey olmalıydı. Bu şekilde değiştirirsen yardım alman kolaylaşır.

Mesela ben KS0108 sürücülü bir 128x64 GLCD'nin hafızasından nasıl veri okunacağını biliyorum ve senin "128x64 glcd veri okumak" başlığını görünce belki yardımcı olabilirim diye atladım hemen. Ancak malesef dokunmatik ekranlar hakkında hiçbir fikrim yok.
Gökçe Tağlıoğlu

satilla

#2
dokunmatikten aldıgın analog veriyi 10 defa değişkene ekle sonra bunların ortalamasını al
aldığın ortalamayla elde eetigin verileri pc ye aktar
yazdıgın pc programıda bu noktalarla dot matris dizilimi tamamlasın


teknikelektronikci

yani cizdigin veriyi glcd den degil üzerindkei touch screen denen folyodan analog ollarak okuyup digitale cevirip (mcu ile) öyle bilgisyara aktaracaksin
ayrica microchipin hazir entegreleri mevcut arastirmani tavsiye ederim
Ey Türk istikbalinin evlâdı! İşte, bu ahval ve şerâit içinde dahi, vazifen; Türk İstiklâl ve Cumhuriyetini kurtarmaktır! Muhtaç olduğun kudret, damarlarındaki asil kanda mevcuttur!

f_machine


https://320volt.com/pic-ile-dokunmatik-panel-grafik-lcd-kullanimi-mikro-c/

Burada rezistif dokunmatik panellerle ilgili yazmış olduğum bi yazı var.

vebsel

genelde touch pad okumak için  r    c şarj   devresi kullanılıyor önce iki eksenin kondansatörleri bir transiatör yardımıyla boşaltılıyor daha sonra dolma zamanı sayılıyor

crapdeno

Tagli arkadaşım banada zaten GLCD deki lazım ks108 den nasıl okuma yapabilirim?? bana o lazım zaten. f_machine bende ordan yardım aldım zaten ama ekrana dokunduğum noktayı çizdirtmek istiyorum kalibra de edemedim o konuda bana yardımcı olabilir misin??

Tagli

Yazdığın iki şey birbirinden farklı. Bu başlıkta iki farklı okuma şekli, daha doğrusu kaynağı anılıyor:

Bunlardan birincisi KS0108'in hafızasındaki veri. Bu veri zaten ekrana yazı yazılırken KS0108'in içindeki hafıza alanına işlemci tarafından yükleniyor. Ancak bazı durumlarda veriyi bu hafızadan geri okumak gerekebiliyor. Aklıma gelen en basit örneği, ekrandaki resmin veya gösterilen her neyse onun tersini almak. Yani yanan pikselleri söndürüp sönenleri yakmak. Benim nasıl yapılacağını bildiğim okuma şekli bu.

İkincisi ise GLCD'nin üstüne iliştirilmiş touchpad denen ve yanlış bilmiyorsam 4 adet kablosu olan ince katmandan, üzerine dokunulduğu zaman neresine dokunulduğunu anlamak için gerekli okumayı yapmak. Bu işlemin KS0108 entegresi ve onun veri hafızası ile hiçbir ilgisi yok. İlk mesajından anladığım kadarıyla sen nereye dokunulduğunu anlamak istiyorsun. Bu durumda KS0108'in hafızasından veri okumana gerek de yok. Mesele şu ki benim dokunmatik yüzeyden veri okunması hakkında bir bilgim yok, ama zaten arkadaşlar kaynak göstermişler.
Gökçe Tağlıoğlu

f_machine

Burada mikroe nin örnek kodu var önce ekranı kalibre ediyor.Sonrada dokunulan noktaları ekrana çiziyor.
/*
 * Project name:
     TouchPanel (Demo for working with TouchPanel Controller)
 * Copyright:
     (c) Mikroelektronika, 2009.
 * Revision History:
     20081218:
       - initial release;
       - 20090720 - modified by Slavisa Zlatanovic;
 * Description:
     This code works with TouchPanel and GLCD. Two digital output and
     two analog input signals are used for communication with TouchPanel.
 * Test configuration:
     MCU:             PIC16F887
                      http://ww1.microchip.com/downloads/en/DeviceDoc/41291F.pdf
     Dev.Board:       EasyPIC6
                      http://www.mikroe.com/en/tools/easypic6/
     Oscillator:      HS, 08.0000 MHz
     Ext. Modules:    GLCD 128x64, Touch Panel
                      http://www.mikroe.com/en/tools/components/
     SW:              mikroC PRO for PIC
                      http://www.mikroe.com/en/compilers/mikroc/pro/pic/
 * Notes:
     - Turn on GLCD backlight switch SW8.8.
     - Turn on TouchPanel Controller switches SW9.5, SW9.6, SW9.7 and SW9.8.
     - Turn off PORTA LEDs SW9.1.
*/

// Glcd module connections
char GLCD_DataPort at PORTD;

sbit GLCD_CS1 at RB0_bit;
sbit GLCD_CS2 at RB1_bit;
sbit GLCD_RS  at RB2_bit;
sbit GLCD_RW  at RB3_bit;
sbit GLCD_EN  at RB4_bit;
sbit GLCD_RST at RB5_bit;

sbit GLCD_CS1_Direction at TRISB0_bit;
sbit GLCD_CS2_Direction at TRISB1_bit;
sbit GLCD_RS_Direction  at TRISB2_bit;
sbit GLCD_RW_Direction  at TRISB3_bit;
sbit GLCD_EN_Direction  at TRISB4_bit;
sbit GLCD_RST_Direction at TRISB5_bit;
// End Glcd module connections

// Touch Panel module connections
sbit DRIVE_A at RC0_bit;
sbit DRIVE_B at RC1_bit;
sbit DRIVE_A_Direction at TRISC0_bit;
sbit DRIVE_B_Direction at TRISC1_bit;
const char READ_X_CHANNEL = 0;                             // READ X line is connected to analog channel 0
const char READ_Y_CHANNEL = 1;                             // READ Y line is connected to analog channel 1
// End Touch Panel module connections

bit          write_erase;
char         pen_size;
unsigned int x_coord, y_coord, x_coord_old, y_coord_old, x_coord_diff, y_coord_diff;
long         x_coord128, y_coord64;                        // Scaled x-y position
int          cal_x_min, cal_y_min, cal_x_max, cal_y_max;   // Calibration constants
char write_msg[] = "WRITE";                                // GLCD menu messages
char clear_msg[] = "CLEAR";
char erase_msg[] = "ERASE";
const unsigned int ADC_THRESHOLD = 900;                    // Threshold value for press detecting

// Returns 1 if TouchPanel is pressed, 0 otherwise
char PressDetect() {
  unsigned adc_rd;
  char result;

  // PRESS detecting
  DRIVE_A = 0;                                             // DRIVEA = 0 (LEFT drive off, RIGHT drive off, TOP drive on)
  DRIVE_B = 0;                                             // DRIVEB = 0 (BOTTOM drive off)
  Delay_ms(5);

  adc_rd = ADC_Read(READ_Y_CHANNEL);                       // READ-Y
  result = (adc_rd > ADC_THRESHOLD);                       // if logical one is detectet

  // Debouncing, repeat detecting after 2ms
  Delay_ms(2);
  adc_rd = ADC_Read(READ_Y_CHANNEL);                       // READ-Y
  result = result & (adc_rd > ADC_THRESHOLD);
  return result;
}

unsigned int GetX() {
  unsigned int result;
  // Reading X
  DRIVE_A = 1;                                             // DRIVEA = 1 (LEFT drive on, RIGHT drive on, TOP drive off)
  DRIVE_B = 0;                                             // DRIVEB = 0 (BOTTOM drive off)

  Delay_ms(5);
  result = ADC_Read(READ_X_CHANNEL);                       // READ-X (BOTTOM)
  return result;
}

unsigned int GetY() {
  unsigned int result;
  // Reading Y
  DRIVE_A = 0;                                             // DRIVEA = 0 (LEFT drive off, RIGHT drive off, TOP drive on)
  DRIVE_B = 1;                                             // DRIVEB = 1 (BOTTOM drive on)

  Delay_ms(5);
  result = ADC_Read(READ_Y_CHANNEL);                       // READ-X (LEFT)
  return result;
}

void Calibrate() {

  Glcd_Dot(0,63,1);
  Glcd_Write_Text("TOUCH BOTTOM LEFT",12,3,1);
  while (!PressDetect());

  // Get calibration constants (reading and compensating TouchPanel nonlinearity)
  cal_x_min = GetX() - 10;
  cal_y_min = GetY() - 10;
  Delay_ms(1000);

  Glcd_Fill(0);
  Glcd_Dot(127,0,1);
  Glcd_Write_Text("TOUCH UPPER RIGHT",12,4,1);
  while (!PressDetect()) ;

  // Get calibration constants (reading and compensating TouchPanel nonlinearity)
  cal_x_max = GetX() + 5;
  cal_y_max = GetY() + 5;
  Delay_ms(1000);
}

void Initialize() {
  DRIVE_A_Direction = 0;                                   // Set DRIVE_A pin as output
  DRIVE_B_Direction = 0;                                   // Set DRIVE_B pin as output

  ANSEL  = 3;                                              // Configure AN0 and AN1 pins as analog inputs
  ANSELH = 0;                                              // and other AN pins as digital I/O
  TRISA  = 3;
  C1ON_bit = 0;                                            // Disable comparators
  C2ON_bit = 0;
  Glcd_Init();                                             // Initialize GLCD
}

void main() {

  Initialize();
  Glcd_Fill(0x00);                                         // Clear GLCD
  Glcd_Set_Font(font5x7, 5, 7, 32);                        // Choose font
  Glcd_Write_Text("CALIBRATION", 30, 2, 1);
  // Delay_ms(1500);

  Glcd_Fill(0);
  Calibrate();
  Glcd_Fill(0);

  Glcd_Write_Text("WRITE ON SCREEN", 20, 5, 1) ;
  Delay_ms(1000);
  Glcd_Fill(0);

  Glcd_Fill(0);
  Glcd_V_Line(0,7,0,1);
  Glcd_Write_Text(clear_msg,1,0,0);
  Glcd_V_Line(0,7,97,1);
  Glcd_Write_Text(erase_msg,98,0,0);

  // Pen Menu:
  Glcd_Rectangle(41,0,52,9,1);
  Glcd_Box(45,3,48,6,1);
  Glcd_Rectangle(63,0,70,7,1);
  Glcd_Box(66,3,67,4,1);
  Glcd_Rectangle(80,0,86,6,1);
  Glcd_Dot(83,3,1);

  write_erase = 1;
  pen_size = 1;
  x_coord_old = 0;
  y_coord_old = 0;

  while (1) {

    if (PressDetect()) {
      // After a PRESS is detected read X-Y and convert it to 128x64 space
      x_coord = GetX() - cal_x_min;
      y_coord = GetY() - cal_y_min;

      // When lifting pen from the touchpanel surface GetX and GetY readings
      // (after correct PressDetect reading) may be incorrect
      x_coord_diff = abs(x_coord - x_coord_old);           // Compare with old values
      y_coord_diff = abs(y_coord - y_coord_old);
      x_coord_old = x_coord;                               // Save old values
      y_coord_old = y_coord;

      if ( (x_coord_diff>50) || (y_coord_diff>50) )        // If difference is too big then ignore the reading
        continue;

      x_coord128 = (x_coord * 128l) / (cal_x_max - cal_x_min);
      y_coord64 = (64 -(y_coord *64) / (cal_y_max - cal_y_min));

      if ((x_coord128 < 0) || (x_coord128 > 127))
        continue;
      if ((y_coord64 < 0) || (y_coord64 > 63))
        continue;

      // If clear is pressed
      if ((x_coord128 < 31) && (y_coord64 < 8)) {

        Glcd_Fill(0);

        // Pen Menu:
        Glcd_Rectangle(41,0,52,9,1);
        Glcd_Box(45,3,48,6,1);
        Glcd_Rectangle(63,0,70,7,1);
        Glcd_Box(66,3,67,4,1);
        Glcd_Rectangle(80,0,86,6,1);
        Glcd_Dot(83,3,1);

        Glcd_V_Line(0,7,0,1);
        Glcd_Write_Text(clear_msg,1,0,0);
        Glcd_V_Line(0,7,97,1);
        if (write_erase)
          Glcd_Write_Text(erase_msg,98,0,0);
        else
          Glcd_Write_Text(write_msg,98,0,0);
        }

      // If write/erase is pressed
      if ((x_coord128 > 96) && (y_coord64 < 8)) {
        if (write_erase) {
          write_erase = 0;
          Glcd_Write_Text(write_msg,98,0,0);
          Delay_ms(500);
          }
        else {
          write_erase = 1;
          Glcd_Write_Text(erase_msg,98,0,0);
          Delay_ms(500);
          }
        }

      // If pen size is selected
      if ((x_coord128 >= 41) && (x_coord128 <= 52) && (y_coord64 <= 9))
        pen_size = 3;

      if ((x_coord128 >= 63) && (x_coord128 <= 70) && (y_coord64 <= 7))
        pen_size = 2;

      if ((x_coord128 >= 80) && (x_coord128 <= 86) && (y_coord64 <= 6))
        pen_size = 1;

      if (y_coord64 < 11)
        continue;

      switch (pen_size) {
        case 1 : Glcd_Dot(x_coord128, y_coord64, write_erase); break;
        case 2 : Glcd_Box(x_coord128, y_coord64, x_coord128 + 1, y_coord64 + 1, write_erase); break;
        case 3 : Glcd_Box(x_coord128-1, y_coord64-1, x_coord128 + 2, y_coord64 + 2, write_erase); break;
        }

    }
  }

}


teknikelektronikci

benim anlamadigim mcu bilgiis olmayan arkadaslar niye cok büyük projelerin altina giriyor gecenlerdede bir tanesi cosfi yapacak amcam mcu bilmiyor

arkadasim sana soracagim sey öncellikle elektronik bilgin varmi bölümün ne ona göre sana tavsiyelerde bulunalim eger bölümün bilgisyar ise
yelkenci arkadasin kullandigi modülü kullan derim elektronik bilgi gerektirmez

https://www.picproje.org/index.php/topic,32062.msg227292/topicseen.html#msg227292

yok ben elektronik bilyiorum ama pic v.s mcu ögrencem dersen

projen icin önce lcd ve dokunmatik ekrani temin et

http://www.elektrovadi.com/LCD-DOKUNMATIK-PANEL,LA_182-2.html

tabi elektronik kisim icin bir prototyp baski devre hazirlaman gerekecek öncesinde isis de semani ciz
hani bilgin nedir ne degildir bunlari yazda bizde yönlendirelim birde lütven p.m ile degil kolay gelsin

Ey Türk istikbalinin evlâdı! İşte, bu ahval ve şerâit içinde dahi, vazifen; Türk İstiklâl ve Cumhuriyetini kurtarmaktır! Muhtaç olduğun kudret, damarlarındaki asil kanda mevcuttur!

crapdeno

Elektronik ve haberleşme mühendisliği okuyorum. Mikroişlemci ve denetleyici bilgim var biraz ama daha önce sadece basit projelerde bulunduğum için bu çeşit bir proje zor geldi. Bitirme projem çok ağır o yüzden stresliyim dokunmatik ekran işini hallettikten sonra imza tanımaya geçmem gerekiyor. bu yüzden öncelikle imza atıp ardından seri portla bilgisayara yollayıp matlab ile yapay sinir ağları yardımıyla  traninge başlayacağım. Çok vaktim kalmadıığı için sizden bu kadar çok yardım talep ettim. 8086 6802 8051 gibi işlmeci ve mikrodenetleyicileri assembly olarak gördüm. Ama c ile detaylı projelerde zorlanıyorum işte. Teşekkür edeirm yinede edebileceğiniz yardımlar için kusura bakmayın

crapdeno

bu arada dokunmatik ekranım ve  glcd im var zaten devreyi kurdum ondada sıkıntı yok dookunduğum yerdeki voltajları görebiliyorum

teknikelektronikci

o zaman sorun nedir devreyi kurmusunuz dokundugunuz yerdeki voltaji görüyorsunuz geriye ne kaldi bu bilgiyi seri portla aktarmak gerisinide artik bilgisyarda halledeceksiniz veya programi gelistirmek size kalmis bir sey yaniliormuyum ?
Ey Türk istikbalinin evlâdı! İşte, bu ahval ve şerâit içinde dahi, vazifen; Türk İstiklâl ve Cumhuriyetini kurtarmaktır! Muhtaç olduğun kudret, damarlarındaki asil kanda mevcuttur!

crapdeno

İşte problem sadece voltajı ölçebiliyorum dokunduğum yerdeki pikselleri yakamıorm. ADC 10 bitlik benim ekranım ise 128x64.  Burdan işin içinden çıkamadım işte ya biliyorum çoksoru sordum ama ordaki matematik oyununu nasıl çözerim bilmiyorum

satilla

dediğim gibi yapacaksın aldığın ölçümlerin doğru olması için 10 defa örnekleme yapacaksın aldığın değeri ve bu değerlerin ortalamasını alıp dokunduğun noktayı belirliyeceksin
eğer dokunmatik ekranlı bir pda kullandıysan onlardada bu sistem mantığı vardır cihaz açılırken touch'un 4 köşesine ve ekran ortasına belirlenmiş noktaya dokunursun, böylece kalibre etmiş olursun
ekrandaki nokta bilgisinide seri haberleşme kullanarak pc'ye aktarmanda zor olmasa gerek?
bu arada eğer 2 ay kadar bir vaktin varsa ben de benzer bir proje yapacağım yaptıktan sonra sana yollarım
touch için sürücü devresiyi halledebildin değil mi?