Touchscreen TSC2046 entegresi programı hazır

Başlatan pcb, 13 Ekim 2010, 16:21:35

pcb

Merhaba,

TSC2046 ile ilgili SPI uygulama notları aradım, bulamadım ama kendime göre amatör bir program yazmaya çalıştım bunu sizlerle paylaşıyorum.

TCS2046 8bit ve 12bit olmak üzere programlanabilir hızlı bir ADC ye sahip. Bunun yanında touch-interrupt özelliği, harici batarya okuma vb gibi bir kaç özelliği daha var.

Farklı kombinasyon ayarları yapılabildiği gibi bu programda Differential Reference Mode, 8 bit ADC - 16 clock hızlı okuma özelliği kullanılmıştır.


Alıntı Yap
    Dim P_Y As  Word
    Dim P_X As  Word   

    Symbol CLK = PORTE.1
    Symbol DTA = PORTE.2
    Symbol  BUSY    =   PORTE.0
    Symbol  CS  =   PORTC.0
    Symbol  DAT  =   PORTB.3

    Output  DTA
    Output  CLK
    High    CS
    delayms  50

basla:
    Low CS
Y_PS:
   
    While   BUSY  =   0
    SHOut   DTA,CLK,    msbfirst_l  ,[%10011000] 'Y+ OKUMA
    DelayUS 1
    SHIn DAT , CLK , msbpre , [P_Y]
    GoTo    X_PS
    Wend   
    GoTo    Y_PS

X_PS:
    While   BUSY  =   0
    SHOut   DTA,CLK,    msbfirst_l  ,[%11011000] 'X+ OKUMA
    DelayUS 1
    SHIn DAT , CLK , msbpre  ,   [P_X]   
    High    CS
    Print   At  5,1,"Y=",Dec    P_Y,"   "
    Print   At  6,1,"X=",Dec    P_X,"   "   
    GoTo    devam
    Wend   
    GoTo    X_PS   

    devam:
    .............
    .............



               

pcb


mustaphaerdem

merhaba;

saatlerdir uğraşıyorum ama bilgi okutamadım..
bendeki ads7846 entegresi ama datasheet leri inceledim aynı herşeyi tsc2046 ile..
Korkarak yaşıyorsan sadece hayatı seyredersin.

pcb

komutlarda interrupt  enable yani PENIRQ girişinde interrupt oluşmazsa değer okuyamazsınız.
kullandığınız işlemcide harici kesmeyi aktif edin.

mustaphaerdem

Merhaba;

Proje şu anda burada değil işyerimde gidince kodları buraya koyacağım.. RB0 kesmesine bağladım PENIRQ girişini ve RB0'ı 10k dirençle pull up yaptım.. ads7846'nın DOUT ve DIN uçlarını programımda tersleyerek bağladım. Yani dout-din, din-dout gelecek şekilde. Bu arada RB0 kesmesi düşen kenarda oluşuyor çünkü ekrana dokunulduğunda PENIRQ 0v çıkış veriyor. Yazdığım programda kesmeye giriyor fakat bilgi okutamadım hep 0 değerini alıyorum. İş yerine gidince hemen programı koyacağım buraya..

Birde bir şey daha soracağım proton'da shin ve shout komutları nasıl çalışmaktadır? Yani şöyle sorayım;  " shin , din, dclk, msbpre, [al] " dediğimizde, karşı taraftan clock sinyali gelene kadar bekliyor mu program bu komutta? yoksa zamanlama senkronunu bizim mi tutturmamız gerekiyor..

İyi Çalışmalar..
Korkarak yaşıyorsan sadece hayatı seyredersin.

pcb

#5
Öncelikle programını proteus da test et, butonla interrupt oluştur. Düşen kenarda program pulse gönderdiğini gör.
While   BUSY  =   0busy yerine direk olarak kullandığın portu yaz mesela porte.0 bazen bende symbol olarak atadığım isimler çalışmayabiliyor. Busy=0 hiç algılanmıyor olabilir.
Önemli problem ise interrupt dan sonra parmağı vb. çekerken yani PENIRQ 1 olurken de 2. okumayı yapıyor ve en son bunu kaydediyor. Ekrana dokunurken ilk okuma, ekrandan çekerken 2. okuma yapabiliyor. Bunu önlemek için , biraz bekleme süresi ve ekrana dokunuldu mu (interrupt) yoksa ekrandan temas kesildi mi sorusu. Eğer portb.0=1 ise parmağı çekerken tekrar interrupt olduğunu anlıyorum ve döngüden çıkarıyorum. 2ms delay PENIRQ nin 1 den 0 veya 0 dan 1 e geçmesi için yeterli bir süre. (settle time çok önemli)
Alıntı Yapbasla:

DelayMS 2
If  PORTB.0 =   1   Then    devam
Low CS
Y_PS:
.........
..........
portb.0 kesmesini okumaları bitirdikten sonra aktif yap. programın en sonunda

shin komutu ile alınan bilgi shout komutu gönderilip bittikten sonra timing diagrama bakarsan ns hızında data geri gönderimi oluştuğu için eklenen delayus 1 süresi bile fazla. Yani shout bitiminden hemen sonra geri data gönderiliyor. Herhangi bir tanımlayıcı bir bilgi gönderilmiyor.

PENIRQ herhangi pullup ekleme yapma zaten kendisi internal pullup.
Bu entegreler çok küçük yaptığın PCB yi kontrol et herhangi bir temassızlık var mı kontrol et.
Devreye enerji verdiğinde ekrana dokunmadan TSC2046 X+ ve X- pinlerinde 5V, Y+ ve Y- pinlerinde ise 0 volt olmalı.

mustaphaerdem

Evet bende önce sadece ekrana dokunuldu mu diye test ettim PENIRQ girişini RB0 a bağladım ve her dokunuşta bir değişkeni bir arttırdım ve her seferinde 2 kere arttığını gördüm gecikme koyduğum halde bile.. Dediğiniz gibi ekrandan çekildi mi diye kontrol edip öyle çıkmak gerekiyor..

Dediğiniz timing diagrama bakmıştım 200ns gibi bir süre var shout tan sonra shin e geçerken 1 us fazla diye  " while busy=1 : wend " kullanmıştım.. busy iken bekleme sağlamak için fakat 0 dan başka hiçbir veri alamamıştım.. Birazdan iş yerine yola çıkacağım orada tekrar kontrol ederim ve programı buraya koyarım..

Anlamadığım şey shin komutu bir şey alamazsa orada beklemiyor mu? Demek ki programım sonraki komuta geçip ekrana 0 yazdırdığına göre sadece 0 değerini mi alıyorum ?
Korkarak yaşıyorsan sadece hayatı seyredersin.

pcb

shin komutu bir şey beklemez data gelirse alır o sırada. bence hata bu komutlarda değil.

mustaphaerdem

#8
Alıntı Yap
Device 16F877A
Xtal 4

On_Hardware_Interrupt GoTo KESME

Declare LCD_Type Toshiba
Declare LCD_DTPort PORTD
Declare LCD_WRPin PORTC.7
Declare LCD_RDPin PORTC.6
Declare LCD_CEPin PORTC.4
Declare LCD_CDPin PORTC.5
Declare LCD_RSTPin PORTC.3
Declare LCD_X_Res 240
Declare LCD_Y_Res 128
Declare LCD_Font_Width 6

Dim INTEDG As OPTION_REG.6
Dim GIE As INTCON.7
Dim INTE As INTCON.4
Dim INTF As INTCON.1

INTEDG=0    'RBO KESMESİ DÜŞEN KENAR
GIE=1       'TÜM KESMELER AKTİF
INTE=1      'RB0 KESMESİ AKTİF

Dim YDEGER As Word
Dim XDEGER As Word
Dim SAYI As Word

Dim DIN As PORTB.7     'ADS7846 DOUT PININE BAĞLANACAK
Dim BUSY As PORTB.6    'ADS7846 BUSY PININE BAĞLANACAK
Dim DOUT As PORTB.5    'ADS7846 DIN PININE BAĞLANACAK
Dim CS As PORTB.4      'ADS7846 CS PININE BAĞLANACAK
Dim DCLK As PORTB.3    'ADS7846 DCLK PININE BAĞLANACAK

Dim INT As PORTB.0
Dim FS1 As PORTC.2   

Dim E0 As PORTE.0
Dim E1 As PORTE.1
Dim E2 As PORTE.2

Input DIN       
Input BUSY   

Output DOUT     
Output DCLK     
Output CS       
Output PORTE   

All_Digital = true

High FS1       
High CS       
DelayMS 200   
Cls           
Print At 1,1,"BASMA SAYISI = ",Dec3 SAYI
Print At 2,1,"Y = ",Dec3 YDEGER
Print At 3,1,"X = ",Dec3 XDEGER

BASLA:
DelayMS 50
GoTo BASLA

KESME:
Context Save
    DelayMS 2
   
    If INT=1 Then
        INTF=0
        Context Restore
    EndIf

Low CS

YAL:
    While BUSY=0
    SHOut DOUT,DCLK,msbfirst_l,[%10011000]
    DelayUS 1
    SHIn DIN,DCLK,msbpre,[YDEGER]
    GoTo XAL
    Wend   
GoTo YAL

XAL:
    While BUSY=0
    SHOut DOUT,DCLK,msbfirst_l,[%11011000]
    DelayUS 1
    SHIn DIN,DCLK,msbpre,[XDEGER]
    GoTo GONDER
    Wend
GoTo XAL

GONDER:
    High CS
    Toggle E0
    Inc SAYI
    Print At 1,1,"BASMA SAYISI = ",Dec3 SAYI
    Print At 2,1,"Y = ",Dec3 YDEGER
    Print At 3,1,"X = ",Dec3 XDEGER
    INTF=0
Context Restore

End

merhaba;
işte kodlar bunlar bugun bir daha deneyeceğim.. gonderdiğim veriyi  ads7846 alıyor son biti 1 yaptığımda penirq devre dışı kalıyor. yani alıyor veriyi.. ama sonuç olarak hep 0 yazısını ekranda görüyorum.. nedenini anlamaya çalışlıyorum.. kesme ile ilgili bir problem herhalde kesme içindeyken kesmeye mi giriyordur nedir anlayamadım.. normalde bu kodların çalışması lazım ama genelde 0 alıyorum..
Korkarak yaşıyorsan sadece hayatı seyredersin.

pcb


mustaphaerdem

merhaba

Dikkatsizliğimden kaynaklanan bir sorunmuş icsp soketinde rb6 ve rb7 uçlarını devreden ayırmak için iki tane atlama koymuştum.. Daha icsp ile yeni programlama öğrendiğim için çıkarıp deneyince programlamıştı ve öylece unutmuşum ve 2 gün uğraştım sorun nerede diye ve onları takınca veriyi gönderip almaya başladı.. Sonradan bayağı kurcaladım çoğu şeyini keşfettim ancak program ve devre şeması yanımda değil.. En kısa zamanda şemayı ve programı buraya koyacağım diğer arkadaşların faydalanması için.

Bu arada benim kullandığım touch controller ADS7846 ve TSC2046 ile hemen hemen aynı özelliklere ve uçlara sahip. İlgilenenler içi yazayım Karaköy'de 240128 grafik lcd touch paneli üzerinde ve ADS7846 ekranın plaketine eklenmiş olarak buldum. Touch panelin kablosu direk lcd ekrana girilmiş ve ADS7846nın devresi kurulmuş ve haberleşme uçları sokette çıkılmış halde idi.. Böyle olması büyük kolaylık oldu.. Yalnız lcd ekranın uçları WG240128 modelinin uçlarından farklı dizilime sahip. Toshiba ekranın pdf dosyasından bakarak ölçerek bulmak gerekiyor.

ADS7846 entegresinden X ve Y değerlerini aldıktan sonra iş bitmiyor daha sonra Z1 ve Z2 değerlerini de almak gerekiyor. Bunlar dokunmatik ekranın basınç değerleri. Bu değerleri pdf dökümanında verilen formülden geçirerek ekrana uygulanan baskının kohm cinsinden değeri bulunuyor. Peki bu ne işe yarıyor? Ekrana belli bir basıncın altında basıldığı zaman X ve Y değerlerinde basılan yerden farklı direnç değerleri okunuyor buda yanlış okumalara sebep olabiliyor. Ekrana uygulanan baskı değeri elde edildikten sonra belirli bir baskının altındaki değerlerin okunması engelleniyor ve çok temiz X ve Y değerleri elde edilmiş oluyor. Programı eklediğimde daha detaylı anlatacağım.. Bilgi vermesi açısından..

Yardımlarınız için teşekkür ederim..
Korkarak yaşıyorsan sadece hayatı seyredersin.

oooben

merhaba acaba karaköyde kimden aldığınızı yazarmısınız ben protona ve bu tarz projelere yeni başladım yardımınız için teşekkürler

pcb


oooben

#13
teşekkürler bi kakayım dönüş yaparım şimdiden teşekkürler

mesaj birleştirme:: 16 Nisan 2013, 11:02:09

burayla konuştum atel elektronik diye biryerde varmış oda 128*240 42 $+kdv dedi oldukça hesaplı tekrar teşekkürler

oooben

ABG240128N14-BIW-R
diye bir ürün buldum daha önce bahsettiğim yerde 42$+kdv markası shenzhen av-display co.ltd bu ürünü kullanbilir miyiz ben ben ilk defa dokunmatik yapmaya çalışıyorum da yardımcı olurmusunuz yukardaki yazılımı denemek istiyorum mümkünse şemasını da verirmisiniz. şimdiden teşekkürler bulentkugu_@hotmail.com