128x64 glcd veri okumak

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

Tagli

Alıntı yapılan: sinansinan09 - 21 Mart 2011, 14:52:27
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
10 değil de 8 örnekleme yaparsan PIC sana duacı olur. Bölmeyi sağa kaydırarak yapmak gerekiyor tabi.
Gökçe Tağlıoğlu

crapdeno

Tamam ben hallettim sürücü devre 2 tane pnp transistörle halloluyo zaten.  Dokunduğum yerleri yakabiliyorum çözümünü merak eden arkadaş olursa yardımcı olabilirim oldukça basit bir işlem ama bu sfer başka bir problem çıktı önüme donanımsal bir hatamıdır bilemiyorum. benim dokunduğum yerlerdeki pikseller güzelce yanıyor problem yok da ekranın sağ köşesinde kendi kendine sanki basılmış gibi pikseller yanıyor onu çözemedim threshold değerle alakası varmı bilmiyorum maximum düzeye getirdim gene olmadı bu konuda fikri olan varmı

teknikelektronikci

ekranda voltajlari gösteren programi kendinizmi yazdiniz hazirmi ?
belliki hazir
neyse adc degerleri alindiktan sonra program büyük olasilikla ekrana gösterme alt programina gidiyordur siz öncellikle x ve y ekseninin 0 oldugu andaki voltaji okuyun sonra 128x64 deki voltaji okuyun sonra bu arada alinan degerlere göre ekrana yazdirma(voltajin) bölümünde bir kisim daha ekleyerek biraz matematiksel islem yaparak( artik mühendisiniz bunun denkelimini v.s bulursunuz) okunan voltajin hangi pixele denk geldigini hesaplayin ve o noktaya pixel yazdirma komutu gönderin hani ben böyle uygulama yapmadim ama yapcak olsam bu benim izleyecegim yöntem olurdu

her seyden önce madem elinizde bir program varda niye burda paylasmiyorsunuz forumdan belki birisi cikip geri kalani bitirecek veya yardimci olacakdir en azindna ben tahmin etmek yerine programa bakarak konusurdum !!

son mesajlarini görmeden yukardakini yazmis oldum problemi halletmisin
ama yine sorun burda forumda vatandas ödevi icin soru soruyor ama sorunu hallediyor cözümü yazmiyor niye pm cekilmesini veya crapdeno üstad bize bi yardimci olsana denmesi bekleniyor !! yanlismiyim crapdeno arkadas ?

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

Hayır öyle kasti bir düşüncem olmadı :s ben ilk kez forumda dolanıyorum bilmiyorum forum nasıl kullanılır. Evet voltaj ölçme kısmını netten aldım adc hakkında eksiğim vardı mantığını anladıktan sonra da geri kalan problemi çözmek zor olmadı.  Kodu ve devreyi f_machine arkadaşımın https://320volt.com/pic-ile-dokunmatik-panel-grafik-lcd-kullanimi-mikro-c/
linkinden aldım zaten o kısmı aynı pikseli yakma kısmını anlatayım öncelikle 0-5 volt arasını 10 bitlik adc ile ölçeklendiriyor devre ve ters işlem yaparak bu kod sayesinde değdiğimiz nokttadaki adc değerine karşılık gelen voltajı buluyoruz. Fakat benim ekranım 128 e 64 lük idi. yani adc 10 bit benim x eksenim 7 bit y eksneim 6 bit. Bende burdaki kalibrasyonu yapabilmek için dokunmatik ekran üzerindeki köşe noktalarının geriimlerini ölçtüm ve ona göre yeniden kalibre ettim. Bazı arkadaşalrım niçin direk x ekseni için 1024/8=128 y ekseni için 1024/16=64 yapmadık diye sorabilir. O şekilde olmuyor çünkü benim gözlemlediğim voltajlar maximum 4.60 civarı minimumlar ise 0.4 civarı bişi çıkıyordu dolayısıyla baştan kalibre etmem gerekti. Tam koduda altta paylaşıyorum ama dediğim sorun devam ediyor nedense dokunmadığım yerlerdende piksel yanması alıyorum problem nerdedir bilmiyorum o konuda hala sıkıntım var
unsigned int x_koordinat(void );
unsigned int y_koordinat(void );
unsigned char basma_kontrol(void );
unsigned int adc_deger;
unsigned char ch;
long gerilim;

// 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


void main() {
  PORTA = 0x00;
  TRISA = 0x03;                                // RA0 i RA1 are analog inputs
  ANSEL = 0x03;
  ANSELH = 0;                                  // Configure other AN pins as digital I/O
  PORTC = 0 ;
  TRISC = 0 ;                                  // PORTC is output
  Glcd_Init();                                 // Glcd_Init_EP5
  Glcd_Set_Font(FontSystem5x7_v2, 5, 7, 32);   // Choose font size 5x7
  Glcd_Fill(0);                                // Clear GLCD




  Glcd_Write_Text("X= ",10,3,1);
  Glcd_Write_Text("Y= ",10,5,1);

    for (;;) {
      while (!basma_kontrol()); //panele dokunuldu mu?
      gerilim = (long)x_koordinat() * 5000; // okunan değeri mv a dönüştür
      gerilim = gerilim / 1023; // 0..1023 -> 0-5000mV
      ch = gerilim / 1000; // voltu elde et
      Glcd_Write_Char(48+ch,42,3,1); // voltu yazdır
      Glcd_Write_Char('.',50,3,1);
      ch = (gerilim / 100) % 10; // 0.1 volt değerlerini elde et
      Glcd_Write_Char(48+ch,58,3,1);
      ch = (gerilim / 10) % 10; // 0.01 volt değerlerini elde et
      Glcd_Write_Char(48+ch,66,3,1);
      ch = gerilim % 10; // 0.001 volt değerlerini elde et
      Glcd_Write_Char(48+ch,74,3,1);
      Glcd_Write_Char('V',82,3,1);
      //y koordinatı için aynı işlemleri tekrarla
      gerilim = (long)y_koordinat() * 5000;
      gerilim = gerilim / 1023;
      ch = gerilim / 1000;
      Glcd_Write_Char(48+ch,42,5,1);
      Glcd_Write_Char('.',50,5,1);
      ch = (gerilim / 100) % 10;
      Glcd_Write_Char(48+ch,58,5,1);
      ch = (gerilim / 10) % 10;
      Glcd_Write_Char(48+ch,66,5,1);
      ch = gerilim % 10;
      Glcd_Write_Char(48+ch,74,5,1);
      Glcd_Write_Char('V',82,5,1);
      Delay_Ms(5);
      glcd_dot((x_koordinat()/6.812)-10,(y_koordinat()/11.67)-15,2); // bu kısımda kendim kalibre ediyorum 
    }
}

unsigned int x_koordinat() {
  unsigned int sonuc;
  TRISA.F0=0; // porta 0. bit çıkış
  PORTA=0; //porta yı temizle
  PORTC.F1=1; // Y+ yüksek empedans
  PORTC.F0 = 0; // X+ +5v
  Delay_Ms(5);
  sonuc=adc_read(1); // X koordinatını al
  TRISA.F0=1; //porta 0.bit analog giriş
  return sonuc;
}
unsigned int y_koordinat() {
  unsigned int sonuc;
  TRISA.F1=0; //porta 1.bit çıkış
  PORTA=0; //porta yı temizle
  PORTC.F1 = 0; // Y+ +5v
  PORTC.F0 = 1; // X+ yüksek empedans
  Delay_Ms(5);
  sonuc = adc_read(0); // Y koordinatını al
  TRISA.F1=1;
  return sonuc;
}
unsigned char basma_kontrol(void ) {
  unsigned int ADC_ESIK_DEGER=900; //esik deger (5V/1024)*(800)=3.9v
  unsigned char sonuc;
  TRISA.F1=1; // RA0 analog giriş
  TRISA.F0=1; //RA1 analog giriş
  PORTA=0; //portayı temizle
  PORTC.F1=0; // Y+ +5v
  PORTC.F0=1; //X+ yüksek empedans
  adc_deger=adc_read(0); // y koordinatını al
  sonuc = (adc_deger > ADC_ESIK_DEGER); // okunan değer eşik değerden büyükse sonuc=1
  Delay_Ms(2);
  adc_deger = adc_read(0); // hata olasılığı için işlemi tekrarla
  sonuc = sonuc & (adc_deger > ADC_ESIK_DEGER);
  return sonuc; //basıldıysa 1,basılmadıysa 0 olur
}

dediğim gibi kodun voltaj ölçme kısmı f_machine dostumdan alıntıdır. Tekrara teşekkürler

teknikelektronikci

kodu incelemedim ama programa baslarken ekrani temizle sonra programa basla belki faydasi ollabilir
bu arada eline saglik 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!