avatar_ete

Dokunmatik Buton Kontrolü (CVD system)

Başlatan ete, 04 Eylül 2011, 10:26:39

Mucit23

Alıntı yapılan: EucLid - 03 Mayıs 2012, 08:50:08
http://www.picbasic.co.uk/forum/showthread.php?t=15296    kim kimden almış ete hocam

Lafım sana değil ortaya söylüyorum.

Tekerleği yeniden icat etmeye ne gerek var..
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

ete

Kim kimden almış sorusunu anlamadım.?
Ne anlama geldiğini açıklarsanız sevinirim.

Verdiğin linkte başta yer alan kodları ben koydum oraya. Başlangıçta bu sistem üzerinde çalışırken ADC mekanizmasını tam oalrak bilmiyordum. Bilmediğim şeylerin başında bütün ADC kanalları için yalnızca tek bir Chold kondansatörünün olduğu idi. ben her kanal için ayrı Chold kondansatörü var zannediyordum. Ama sonradan bilmediklerimi Microchip dökümanlarından öğrendim ve olayı çözdüm.
Dolayısıyla oradaki kodlar bana aittir.

Ete

huseyin

ete hocam dokunmatik projesi ile gece lambasi kontrol devresi yaptim gayet güzel çalişiyor fakat bazen lamba kendi kendine yanip sönüyor sebebi ne olabilir hocam

ete

Kendi kendine yanmasının sebebi maalesef benimde çare bulamadığım 50 hzlik şebeke sinyalininden etkilenmesi.
220VAC yakınlarından mutlaka bu sinyal bulunuyor. Heleki oda ışığını yada yakındaki bir başka ışığı açıp kapatın hemen şebeke hattı üserinde bir pik oluşuyor ve oda lambanın yanmasına sebep oluyor.  Dokunma ucunu 100pf ile GND ye bağlamak bazen çözüm olabiliyor. Ama aynı zamanda bu kondansatör dokunma ucunu biraz köreltiyor. Denemeye değer.

Ete

greatgonzo

ETE hocamın kodunu 16f88 e uyarlamaya çalıştım fakat çalıştıramadım. Kontrol ettiğim led sürekli olarak yanıyor. Acaba nerede yanlış yapıyorum yada neyi gözden kaçırıyorum arkadaşlar...

@ DEVICE PIC16F88
@ DEVICE PIC16F88, WDT_OFF
@ DEVICE PIC16F88, PWRT_ON
@ DEVICE PIC16F88, PROTECT_OFF
@ DEVICE PIC16F88, MCLR_OFF
@ DEVICE PIC16F88, INTRC_OSC_NOCLKOUT
@ DEVICE PIC16F88, LVP_OFF
@ DEVICE PIC16F88, BOD_OFF
@ DEVICE PIC16F88, FCMEN_OFF
@ DEVICE PIC16F88, IESO_OFF
@ DEVICE PIC16F88, CCPMX_ON
@ DEVICE PIC16F88, DEBUG_OFF
@ DEVICE PIC16F88, WRT_OFF
@ DEVICE PIC16F88, CPD_OFF

OSCCON=%01101100
DEFINE OSC 4
DEFINE ADC_BITS 8   
'DEFINE ADC_CLOCK 1   
DEFINE ADC_SAMPLEUS 10
CMCON = 7

RAW   VAR byte 56
TOP   VAR WORD
SINIR VAR BYTE
I     VAR BYTE
BUYUK var byte
KUCUK VAR BYTE
poz   var bit

OPTION_REG=%01001111
TRISA=0:PORTA=0
TRISB=0:PORTB=0
ANSEL=%01111111
ADCON0=%01110100
ADCON1=%11000000

PORTA.2=1
SINIR=132  'hassasiyet ayarı Maksimum 136 olacak
BUYUK=0
KUCUK=255

START:     
       GOSUB TUSBAK
       IF RAW>BUYUK THEN BUYUK=RAW
       IF RAW>0 and RAW<KUCUK THEN KUCUK=RAW
       WRITE $10,BUYUK
       WRITE $11,KUCUK
       
       IF RAW<SINIR and POZ=0 THEN
          TOGGLE PORTB.1
          I=0:poz=1

BIR:      gosub tusbak
          IF RAW<SINIR then
             I=0
             GOTO BIR
          ELSE   
            I=I+1
            IF I<SINIR then BIR 
          ENDIF 
          pause 50           
          I=0
          goto start
       endif   
       
       pause 10
         poz=0
       GOTO START
       
TUSBAK:       
       PORTA.2=0
       ANSEL.2=0
       HIGH PORTA.2   
       ADCON0=%01110100 'ADC nin yönü GPIO.2 de C_hold AN2 den gelen HIGH ile şarj ediliyor
'TRISB0 = 0;  RB0 = 0;  TRISB0 = 1;  ADCON0 = 0b01110001;  break;             
       ANSEL.0=0  'sensör pini digital
       TRISA.0=0 'sensör pini çıkış     
       PORTA.0=0   'sensör pini LOW ve sensör kapasitesi deşarj oldu
       PORTA.0=1 'Sensör pini giriş yapıldı
       ANSEL.0=1  'sensör pini analog giriş yapıldı
       ADCIN 0,RAW   

BAK:               
       TRISA.0=0
       ANSEL.0=0
       PORTA.0=0       
       RETURN   


İyi çalışmalar....

ete

İşlem sırasında hata gözüküyor.
Buraya işlem sırasını yazıyorum ona göre yeniden düzenle. Söylediğim şeyler TUSBAK alt programı ile ilgilidir.
1. Kondansatör şarj pini ni Analog olarak ayarla. ................................ANSEL.2=1
Bunun aynı pini giriş yada çıkış yapmak ile alakası yok.
2. Aynı pine HIGH ver BU kondansatörü şarj etmek için gerekli............PortA.2=1
2. Aynı pini çıkış olarak ayarla   ............................................................TRISA.2=0 dolayısıyla HIGH çıkışta şu anda.
3. Aynı pini ADC kanalı olarak seç.........................................................ADCON0=%01010000 ,  AN2,  ADC girişi olarak seçildi
    Bu işlem çıkıştaki HIGH voltajın ADC kondansatörüne bağlanmasını ve şarj olmasını sağlayacak.
4. 10us kadar şarj için bekle  ...............................................................Pauseus 10
5. Sensör pinini çıkış yap.......................................................................TRISA.0=0:ANSEL.0=0
6. Sensör pinine LOW ver Sensör plakasını dejarj etmek için................PORTA.0=0
7. Şimdi sensör pinini giriş yap..............................................................TRISA.0=1
8. Sensör pinini Analog yap...................................................................ANSEL.0=1
9.Şimdi ADC seçimini Sensör pinine yönlendir........................................ADCON0=%01000000
10.10us bekle ADC kondansatörü şimdi sensör kapasitesi ile bölünecek pauseus 10
11. Analog değeri ölç..............................................................................ADCIN 0,HAM
12. Şarj pini yeniden digital yapılacak.....................................................ANSEL.2=0
13. Sensör pinini çıkış olarak ayarla........................................................TRISA.0=0
14. Sensör pini çıkışı HIGH yap................................................................PORTA.0=1
15. Biraz bekle  ......................................................................................Pause 1
16. Çıkışı Tekrar low yap.........................................................................PORTA.0=0
17. Biraz bekle .......................................................................................Pause 1
18. Geri dön............................................................................................RETURN

Bu sıraya göre yeniden düzenle bakalım ne olacak.

Ete

greatgonzo

Hocam  gecikme için özür dilerim . Dediğiniz gibi ilgili etiketin altını güncelledim ama sonuç aynı oldu. Sanki kondansatör şarj olmuyor gibi aynı şekilde led sürekli yanıyor. Hiç yanmasa gam yemiyeceğim :-)  Breadbord üzerinde deniyorum hocam fiziksel olarak bir eksiğim olabilirmi diye düşünüyorum artık ki teknik olarak gerekli herşey 16f88 in içinde. Gözünüze takılan birşey varsa yine yorumunuzu beklerim hocam. Hafta sonu daha detaylı bakacağım yine. Çok teşekkür ederim hocam...

İyi çalışmalar...




@ DEVICE PIC16F88
@ DEVICE PIC16F88, WDT_OFF
@ DEVICE PIC16F88, PWRT_ON
@ DEVICE PIC16F88, PROTECT_OFF
@ DEVICE PIC16F88, MCLR_OFF
@ DEVICE PIC16F88, INTRC_OSC_NOCLKOUT
@ DEVICE PIC16F88, LVP_OFF
@ DEVICE PIC16F88, BOD_OFF
@ DEVICE PIC16F88, FCMEN_OFF
@ DEVICE PIC16F88, IESO_OFF
@ DEVICE PIC16F88, CCPMX_ON
@ DEVICE PIC16F88, DEBUG_OFF
@ DEVICE PIC16F88, WRT_OFF
@ DEVICE PIC16F88, CPD_OFF

OSCCON=%01101100
DEFINE OSC 4
DEFINE ADC_BITS 8   
'DEFINE ADC_CLOCK 1   
DEFINE ADC_SAMPLEUS 10
CMCON = 7

RAW   VAR byte 56
TOP   VAR WORD
SINIR VAR BYTE
I     VAR BYTE
BUYUK var byte
KUCUK VAR BYTE
poz   var bit

OPTION_REG=%11001111
TRISA=0:PORTA=0
TRISB=0:PORTB=0
ANSEL=%01111111
ADCON0=%01110100
ADCON1=%11000000

PORTA.2=1
SINIR=132  'hassasiyet ayarı Maksimum 136 olacak
BUYUK=0
KUCUK=255

START:     
       GOSUB TUSBAK
       IF RAW>BUYUK THEN BUYUK=RAW
       IF RAW>0 and RAW<KUCUK THEN KUCUK=RAW
       WRITE $10,BUYUK
       WRITE $11,KUCUK
       
       IF RAW<SINIR and POZ=0 THEN
          TOGGLE PORTB.1
          I=0:poz=1

BIR:      gosub tusbak
          IF RAW<SINIR then
             I=0
             GOTO BIR
          ELSE   
            I=I+1
            IF I<SINIR then BIR 
          ENDIF 
          pause 50           
          I=0
          goto start
       endif   
       
       pause 10
         poz=0
       GOTO START
       
TUSBAK:
ANSEL.2=1
PortA.2=1
TRISA.2=0
ADCON0=%01010000
Pauseus 10
TRISA.0=0:ANSEL.0=0
PORTA.0=0
TRISA.0=1
ANSEL.0=1
ADCON0=%01000000
Pauseus 10
ADCIN 0,raw
ANSEL.2=0
TRISA.0=0
PORTA.0=1
Pause 1
PORTA.0=0
Pause 1
RETURN   

BAK:               
       TRISA.0=0
       ANSEL.0=0
       PORTA.0=0       
       RETURN   
       
       end 

greatgonzo

Problemi bulamadım ama adcnin çalışmadığı kesin. Lcd m olmadığından b portuna 8 tane led bağladım ve adc değerini Bportuna  yönlendirdim. Sonuç 0. Raw değerinin 1den küçük olmasına göre toggle yaptırdım ve 500 ms gecikme verdim. Ledde 500 ms yanıp söndü. Aynı adc ayarları ile sadece adc konvertörü çalıştırdığımda da hiçbir değer üreteci bağlı olmadığında dengesiz çalıştı ama çalıştı. Diğer yazığım kodlar hocamın 16f675 te kullandıklarının kopyasıydı. Buda düşündürüyor ki acaba iki mcu arasında yapısal farklarmı var ? Ya da ben mevcut olaydaki zamanlama değerlerini anlamadım.

İyi çalışmalar...

ete

İki tane önemli sayılabilecek hata var.
Birincisi;
TUSBAK:
ANSEL.2=1         'referans ucu analog yapıldı
PortA.2=1         'aynı pine HIGH verildi
TRISA.2=0         'Aynı pin Çıkış yapıldı
ADCON0=%01010000  'ADCON0=%01010001*****************olacak***********************
Burada ADCON0 registeri ADC kanalını pin ile birleştiren bir selector anahtarı gibi çalışır. Ancak sistem ADC modülünü aktive edersen beklediğin işi yapacaktır. Aksi taktirde sistem yine kapalı kalacaktır. ADCON.0 biti ADC çevirici modülünü aktive eder. Sen bu bite sıfır vermişsin. yani modül kapalı durumda bekliyor.

İkinci hata yine benzer şekilde bu seferde Buton pinini ADC kanalına bağladığında oluşmuş.
ADCON0=%01000000  'ADCON0=%01000001****************olacak***************************
bu satırda sıfır nolu biti HIGH yapman gerekiyor.
Bu değişiklikleri yapıp yeniden denermisin.

Bu arada deney boardında bu işden tam netice alamayabilirsin. Zira buton pini bir kapasite oluşturması gerekir.
Gerekirse 2 cm x 2 cm ebadında bir PCP plakasını dokunma ucu olarak kullanmanı öneririm. Daha küçükde olabilir. Bu şekilde gerekli kapasite oluşacak ve dokununca kapasite değişikliği sistem tarafından algılanabilecektir. Buton pinine yalnızca kablo bağlıyorsan yeterli sonucu alamayabilirsin.

Ete

greatgonzo

Gecikme için özür dilerim hocam. Sorunumu yazdıktan hemen sonra denemelerimde adcnin kapalı olduğunu fark edip açarakta denemiştim. Tavsiyeniz üzerine tekrar denedim hocam sonuç nafile. Belkide dediğiniz gibi breadboarddan kaynaklanıyordur. Kapasite problemi içinde 4 tane devre yolunu kısa ederek bozuk para gibi kombinasyonlarıda denedim. İlginç olan adc nin çalışması. raw değerini portb ye yolladım ve 250 ms gecikme verdim. Sonuç 0.  Bunun üzerine parçalardan bütüne doğru hareket etmeye kara verdim ve sadece adcyi acıp port b ye yönlendirdim. Genellikle 01000000 değerini okudum. pini 5v a kısa devre edince 11000000 okudum 0 a cekincede yine 01000000 okudum. MAntığıma göre 5v çekince 11111111 okumam 0 a çekince 00000000 okumam lazım değilmi. Yine aynı şekilde cvd çalışmasada manrıklı yada saçma bir değer vermesi gerekmezmi acaba. Artık nasıl çalışacağından ziyade nerede hata yaptığımı merak ediyorum :-)

İyi çalışmalar...

ete

Düşündüğün mantıktan daha karmaşık bir yapı var bu sistemde.
İkincil pin dediğimiz ve Buton pinini şarj etmede kullanılan diğer ADC kanalı kondansatörü şarj eder. O jarj olmuş beklerken sen buton pinini low'a çekerek kapasitesini boşaltırsın. Sonra buton pinini kondansatöre bağladığın zaman üzerindeki voltaj buton kapasitesini şarj ederek boşalma yapar ama hiç bir zaman tam bir boşalma değildir. İki kndansatörün olduğunu düşün. Biri şarj edilmiş diğeri boş. Bo olanı şarj edilmişe bağladığın zaman dolu olandaki enerjinin bir kısmı boş olana aktarılır ve onu doldurur. Dolduğu anda önceden dolu olan kondansatörün voltaj değeri ya yarıya düşer yada yarının biraz altında yada üstünde olur.
Dolayısıyla okuyacağın değer bu değer olacaktır. Birde çok kısa sürelerde cereyan eden bu olayda ADC değerini korumak mümkün olamıyor. Ben eeproma yazdırarak sonradan okumuştum bu değerleri. Yoksa ekrana yaz dediğin zaman hep sıfır görüyorsun.

Ete

greatgonzo

Gecikmeler için çok özür dilerim. Zamansızlık ve yorgunluk bayağı yavaşlatıyor :-)  Nihayet birşeyler oldu. Hocamın betikleri direkt çalışmayınca bütünden parçalara indim (-ki ilk yapmam gereken şeydi sanırım.) . Öncelikle sadece dummy pin olan RA2 pinini çıkış ayarlayıp 5v a çektim.Adc ye bağlayıp örnekleme aldım ve B portuna bağlı ledlere yönlendirdim. Kondansatörün şarj olduğuna emin olunca aynı örnekleme işlemini RA2 yi analog kanaldan ayırıp sensör pini RA0 dan aldım. Kondansatör yine şarj konumundaydı ki çalışması için hiç bir engel kalmadığı anlamına geliyordu.

ANSEL.2=1
TRISA.2=0   'dummy pin çıkış
PortA.2=1   'dummy pin high
ADCON0=%01010001 'dummy pin kanalı adc ye bağlı ve şarj ediyor
Pause 10        'şarj için bekliyor
ANSEL.0=1:TRISA.0=0
pauseus 10
TRISA.0=1
ANSEL=%00000001
ADCON0=%01000001 'sensör pini adc kanala bağlı
ADCIN 0,raw      'sensör pininden kondansatör degeri okunuyor.
pause 10
PORTB=RAW       'kondansatör değeri portb ye bağlı 8 adet led ile görüntüleniyor.
GOTO TUSBAK 


İlginç olan bir iki nokta var. Bunlardan biri ETE hocamın sensör pinin örnekleme almadan deşarj etmesi 16F88 de yada bende herşeyi bozuyor. Bir diğeri  ADC nin 5v bağlandığında en büyük 196 okudum. Dokunma durumunda da en düşük 98 okudum çok nadiren 0 lanıyor fakat ilginçtir bir kaç cm lik kablo ile gayet hassas görünüyordu. Biraz daha çalışmam gerekiyor sanırım.

İyi çalışmalar...

ooben

hocam iyi çalışmalar ben pic ile çalışmalarıma devam ediyorum bu konuda ama yinede analog sistemlerle de uğraşıyorum           http://elektroinfo.blogspot.com/2008/10/dokunmatik-devresi.html#comment-form   sitesinde bir şema buldum sanıyorum malumunuzdur. devreyi kurdum ama led sürekliyanıyor. anlayamadığım şemada çizilen haliyle bc107 ler ve bc307 lerin kollektör ve emiterleri doğru yerlerdemi yani tam tersi olması gerekmiyor mu anlayamadım npn bir transistör collektöründen +12 beslenip emiterinden çıkış anınabilir mi saygılar..

ete

Şemada yanlışlık yok. NPN transistörler benzer şekilde bağlanabilirler. Sonuçta transistör bir anahtarlama elemanı gibide çalışabilir. Beys'ine verilen sinyal ile Emitter Collector arasını birleştirir.
Led sürekli yanıyor ise dokunma ucu 50hz sinyal alıyordur. Bu tür devreler sakıncalıdır. Ortamda her yerde şebeke frekansını gürültü olarak görebilirsin. Zatenbu devrede bu özelliğe göre çalışıyor. Ama devreyi çalıştırırsan göreceksin ki odanın ışığını yakıp söndürdüğünde sistem el dokunmuş gibi tetiklenecektir. Bu nedenle kısa yoldan bu tür devrelerden vaz geç.

555 li kapasitif çalışan devreler olması gerekir Onları araştır ve yap.

Ete

Mastercodex

Ete Hocan Merhaba ,

Ben Capacitive Dokunmatik buton kontrol işlemlerinde Atmel firmasının Qtouch teknolojisini kullanmaya karar verdim.Firmadan öncelikle 7 buton kontrollü AT42QT1070 çipini talep ettim ve sonrasındada 48 kanala kadar çiplerini deneyeceğim.Firmasından sample sipaişlerim geldi ve piyasa fiyatları çok uygun.

Burada size sormak istediğim esas konu ise AT42QT1070 çipinin Comms modundaki I2C haberleşme tekniği.Ben bu çipi Standalone modunda kullanıyorum ve çok performanslı bir çip.Standalone modunda tuş kontrol sayısı 5'e iniyor ama Comms modunda tuş kontrol sayısı 7'ye çıkıyor.Burada önemli olan ise Comms modunda çalıştırdığımız zaman 18F2550 işlemcisinin sadece 2 portunu meşgul ediyor.Standalone modunda ise 5 tuş kontrolü için 5 adet port meşgul ediliyor.Bu aşamada I2C iletişimini kullanmak çok daha mantıklı bir seçenek.Bu yüzden bana I2Cread komutlarını nasıl kullanacağım hakkında yönlendirme yapabilirmisiniz. ?

İnternetteki tüm örnekler hep Epprom entegreleri ile haberleşme sağlanmıış ama diğer cihazlar ile haberleşme konusunda bir fikir verilmemiş.Benim 18f2550 işlemcisi ile AT42QT1070 çipini nasıl haberleştireceğim konusunda yardımlarınızı bekliyorum.

Eğer başka önerileriniz varsa onlarıda değerlendirebilirim.

http://www.atmel.com/Images/doc9596.pdf




Saygılarımla

Mastercodex® 3D Teknoloji
----------------------------------
http://www.mastercodex.com
info@mastercodex.com

Powered by EzPortal