TSL1406RS

Başlatan SpeedyX, 03 Haziran 2007, 01:13:47

SpeedyX

TSL1406RS ile önceden uğraşmış birileri çıkar mı?
Bir hata yapıyorum ama hatamı bulamadım. 768 pixel yerine 1..3 pixel sayıyorum SO hemen "1" oluyor. Fclock=5Mhz

arslan74

Merhaba,

Bu kullandığın barcode'ların sensörleri değilmi? Datasheetini inceledim. içinde iki tane ayrı 384pixsel sensör var. Her biri birbirinden bağımsız çalışıyor. Ancak  seri bağlanabiliyor. Her göze ait bir analog cıkış var, ayrıca birde serial cıkış var.

Dışardan clk, seri data sinyallerini veriyorsun. SI girişine bir pulslik sinyal veriyoruz. SI 1 olduktan sonra CLk'ın ilk yükselen kenarında ilk pixsel okuması gerceklesir ve düşen kenarda da analog değeri okursun, sonra tekrar yükselen kenarda 2.ci pixel okuması gercekleşir, tekrar düşen kenarda okuma yaparsın. 384 pikseli böyle okuyabilirsin. 385 clk da SO cıkışı SI dan gönderdiğimiz bir pulslık sinyalı dışarı verir.

Benim anladığım bunlar.

Selamlar.

SpeedyX

Evet, ben serial mode da kullanıyorum, normalde herşeyi yapıyorum, hatta farklı kombinasyonlarıda..
float FindVref() {
   unsigned long int v_now=0,v_max=0;
   PixelCount=0;v_now=0;v_max=0;

   CK=0;CK=1;CK=0;CK=1;CK=0;SI=1;CK=1;SI=0;CK=0;
   while(!SO) {
      restart_wdt();CK=1;
      v_now = readX_adc();
      if(v_now>v_max) {
         v_max = v_now;
      }
      CK=0;
      PixelCount++;
      //if(PixelCount==768) break;
   }
   printf("Pixel: %lu - V: %lu\n",PixelCount,v_max);
   return (v_max*Vres*Vort);
}

şeklinde bir kodla, SO ya göre pixel sayısını ve AO üzerinden okunan max voltaj değerini alıyorum ama pixel sayısı 1-7 arasında değişiyor, birkaç defa 767 de gösterdiği oldu ama saçmalıyor.. Adc rutinlerini ortadan kaldırarakta denedim, o şekilde de aynı.
Dün gece bir tane pdf buldum, okudum ama çok anlayamadım, vcc den önce clock vereceksin diyor. Bana garip geldi.

pdf i buraya yükledim.
dn18powerup.pdf - 0.10MB

arslan74

Merhaba,

Bu chip üretiğin pulslerle sana 768 adet analog değer verir. Sonra bu değerleri okuduktan sonra istediğin gibi kullanırsın. dolaysıyla bu değerleri saklamak için senin öncelikle 768 adet bir diziye ihtiyacın var. Her pulsda Analog değeri okuyub sırayla bu dizinin içine atacaksın. Okuma tamamlandıktan sonra elde ettiğin değerleri işleyebilirsin.

Ancak senin programda böyle bir kod göremedim. Sen sadece bu gözlere maximum voltaj değerini bulmaya çalışıyorsun. En önemlisi, düzgün ölçdüğüne dair SO pinini hiç kontrol etmiyorsun. 768 sonra pulsden sonra sana bir bir pulslık cıkış verecek. Bu kontrolü yaparsan düzgün okuyub okumadığını anlarsın.

Datasheetinde herşey açıklıyor.

http://rapidshare.com/files/35117998/TSL1406RS.pdf.html


Çalışmalarında başarılar,

SpeedyX

Alıntı yapılan: "arslan74"En önemlisi, düzgün ölçdüğüne dair SO pinini hiç kontrol etmiyorsun.
Dediklerinin hepsini yapıyorum, while(!SO) demek aynen alıntıdaki cümle demek. internette 3 çeşit datasheet var ve ben üçünüde hatim ettim, bu teorileri çok çok iyi biliyorum. max değeri buldurmamında bir sebebi var. 768 elemanlı dizi yerine ben o işi çok daha basit ve hızlı bir biçimde çözüyorum zaten. Sorun orda değil. Sorun, benim verdiğim palslere sensörün cevap vermemesi, yada sensörün cevap verebileceği tipte palsler verememem.

arslan74

Merhaba,

Bu kodda CLK ucunu birden sıfıra cekme sürenle sıfırdan bire cekme süren aynı değil, tam kare dalga oluşturmanışsın.

Asıl en önemli hatan şudurki;
Hangi pic serisi kullandığını bilmiyorum ama 12 ve 16 serisi PIClerde bir bacağa cok hızlı puls verdiğinde çalışmiyor.

Yani mesela,

CLK = 1;
CLK = 0;
CLK = 1;
CLK = 0;
CLK = 1;
CLK = 0;
CLK = 1;
CLK = 0;

şeklindeki kod teoride çalışsada pratikte çalışmıyor. Bu şekilde puls üretmiyor.

Bunun çözümü ben söyle yapiyorum.

CLK = 1;
CLK = 1;
CLK = 1;

CLK = 0;
CLK = 0;
CLK = 0;

CLK = 1;
CLK = 1;
CLK = 1;

CLK = 0;
CLK = 0;
CLK = 0;

CLK = 1;
CLK = 1;
CLK = 1;

CLK = 0;
CLK = 0;
CLK = 0;

CLK = 1;
CLK = 1;
CLK = 1;

CLK = 0;
CLK = 0;
CLK = 0;


Şeklinde en az 3 kere aynı kodu yazarsan sana puls üretiyor. Diğer türlü sistem çalışmiyor. Senin hatan bundan kaynaklaniyor. Seninde dediğin gibi düzgün puls üretemiyorsun.


Alıntı YapDediklerinin hepsini yapıyorum, while(!SO) demek aynen alıntıdaki cümle demek. internette 3 çeşit datasheet var ve ben üçünüde hatim ettim, bu teorileri çok çok iyi biliyorum.

Evet haklısınız kodu dikkatli inçelememişim.
Size bir son bir tavsiyem olacak. Okuma işlemini CLK'ın 1 olduğu zaman değil, CLK'ın 0 olduğunda zaman okuduğunda daha doğru sonuc alırsın. Datasheetlerindeki şemalarda öyle gösteriyor.


Çalışmalarında başarılar,

SpeedyX

Merhaba,
Dediginizi onceden birkac nop bekleme ile denemistim, simdide sizin yontemle denedim fakat yine ayni.

Ilk verdigim pdf dosyasinda, cihaza Vcc vermeden once clock vermek gerektiginden bahsediyordu. Oradaki yaziyi iyi anlayamadim, bana gore fazla karisik yazilmis. Acaba SI yada CK ile ugrasmaktan ote farkli bir problem mi var. Acikcasi cihazin asil datasheetinde de cok acik yazmamis.

Islemci olarak 18F252 kullaniyorum 20Mhz kristal ile. olcumleri pc ye yolluyorum ama dedigim gibi sensorle anlasma saglayamadik gitti :)

Birde, clock 1 ve 0 surelerinin ayni olmadigindan bahsetmissiniz, oyle birsey gerekli mi bilmiyorum. Onu oyle yapipta denedigim var o sekilde de fark yok. Sanki bana daha farkli bir problem varmis gibi geliyor. Elimde 2 tane sensor var ve ikisinde de ayni sonuclari aliyorum.

Tesekkurler.

SpeedyX

  SI=1;delay_cycles(3);SI=0;delay_cycles(3);
   for(i=0;i<769;i++) {CK=0;delay_cycles(3);CK=1;delay_cycles(3);}

Şeklinde ilk başta shift registerın içeriğini temizleyince çalıştı, demekki registerın içinde tesadüf sinyaller var ve hemen SO çıkışa 1 olarak geliyor. Normal taramadan önce boşta clock vererek tüm pixelleri sıfırlayınca sorun ortadan kalktı. Ufak sapıtmalar var, onlarıda çözemezsem yine buraya yazarım.

Birde düşündüm acaba bu picler okadar mı kötü diye, agilent in güzel bir osiloskopuyla CK=0;CK=1;CK=0;CK=1; şeklinde denedim ve tüm sinyalleri sorunsuz 200ns aralıkla veriyor. Belki dediğiniz 16 serisinde oluyordur, onuda uygun bir zamanda denemek istiyorum. Birde CK=1;CK=1;CK=1; şeklinde yapınca çıkışta bir çeşit osilasyon oluşuyor. Bence yapılmamalı.

Şimdiye kadar olan yardımlar için teşekkürler.