10bit to 8bit ?

Başlatan Maxim, 14 Aralık 2009, 11:16:01

Maxim

okuduğum 10bit datayı nasıl 8bite çevirebilirim protonda ?
mesela 10bit adc okuyoruz ,
ben okumayı 10bit yapmak ama 8bite çevirmek istiyorum sonradan.
yani 2 biti atıcam,

Erol YILMAZ

10 bit sonucu 4 e bölebilirsin...
:P

C' de,  Basic te pascal da fortran da hepsinde aynı,

PIC için daha pratik birşey de var.
ADC sonucunu sola dayalı olarak ayarlarsan
ve ADC_High registerini okursan direkt 8 bit sonuc alırsın...

ASM kullanıcaksan da başka şekillerde yapmak mümkün,

azimli

datayı dijital olarak iki bit sağa kaydır
yada 10 bit okuduğuna göre datan ya int yana unsigned int tipindedir bunu unsigned char olarak tanımladığın yeni değişkenine at
yada bunları yapamıyorsan datanı 4 bölüp bir değişkene at burda 4 bölümün noktalı kayan sayı çıkma ihtimaline karşın gerekli önlemi al
yada ete nin kesin cevabını bekle hemde kod yardımıyla.

Maxim

bitwise <<
komutu sanırım bu işe yarıyor ,
yani datayı 2 bit sağa kaydırmak için böyle olması lazım
ama data word tipinde , yani 5 volt giriş 1023
işte burada bir eksik var ama ne

ete

maxiboos,

1024 ile 1023 arasında kaldın ve aklın yatmadı galiba.
10 bitlik en büyük sayı 1023 dür.
8 bitlik en büyük sayıda 255 dir. 1023 rakamı 10 adet 1 den oluşur 2 tanesini atarsan 8 bite döner o zaman elinde 8 tane 1 kalırki bunun karşılığı desimal 255 dir.
Normalde 10 bitlik sayısı 1 bit sağa kaydırmak   o sayıyı 2 ye bölmekle eşdeğerdir. Sayıyı 2 bit kaydırmak içinde 2*2=4'e bölmek gerekir. 1023'ü 4 e bölersen 255 rakamını alırsın. Hepsi bu.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

azimli

en net çözüm şu bence 10 bitlik adc değerini 0011111111 saysı ile and işlemine tabi tutup unsigned char tipi bir değişkene aktar olay tamamdır.

C kodu iş görse yazardım ama basic istenmiş aslında benim bu formda işimde yok galiba pic basic bilmiyorumki.

teknikelektronikci

Alıntı yapılan: "azimli"en net çözüm şu bence 10 bitlik adc değerini 0011111111 saysı ile and işlemine tabi tutup unsigned char tipi bir değişkene aktar olay tamamdır.

C kodu iş görse yazardım ama basic istenmiş aslında benim bu formda işimde yok galiba pic basic bilmiyorumki.

bu da mantıklı geldi bana 9 ve 10 uncu bitler maskelencek :)
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!

Klein

Alıntı yapılan: "teknikelektronikci"
Alıntı yapılan: "azimli"en net çözüm şu bence 10 bitlik adc değerini 0011111111 saysı ile and işlemine tabi tutup unsigned char tipi bir değişkene aktar olay tamamdır.

C kodu iş görse yazardım ama basic istenmiş aslında benim bu formda işimde yok galiba pic basic bilmiyorumki.

bu da mantıklı geldi bana 9 ve 10 uncu bitler maskelencek :)

10 bit Ölçüm sonucun 256 ise 8 ve 9. bitleri maskelediğinde ne görürsün?
0 , 512 ise ne görürsün?  yine 0.
Yukarıda bu işin doğru yöntemlerini anlatmış arkadaşlar. Neden onlar kafana yatmadı da  bu yattı???

azimli

arkadaşlar özür diliyorum yanlış anlama oldu.
son yazdığım çözüm hatalı olur çünkü 255 üzeri 10 bit adc sonuçlarınıda 255 olarak gösterir.istenen bu değil;

şöyle birşey;
10bitte 0 ölçüldüğünde= 8bitte 0 gösterilecek
10bitte 512 ölçüldüğünde= 8bitte 128 gösterilecek  
10bitte 1023 ölçüldüğünde= 8bitte 255 gösterilecek  
ara değerlerde doğrusal değişecek.

10 bitte ölçülen sonucu 2 bit sağa kaydırıp çıkan sonucu unsigned char tipli bir değişkene atıp değerlendirmek en mantıklısı

direkt 4 sayısına bölmede yapılabilir ama tavsiye etmem.bölmenin tersi olan çarpma yapılması yani 10 bit datayı 0,25 sayısıyla çarpmak daha avantajlıdır.

Erol YILMAZ

z ye katılıyorum ben,

işlemciye kod yazanlar biraz da olsa ASM öğrenmeli :D

teknikelektronikci

Alıntı yapılan: "Klein"
Alıntı yapılan: "teknikelektronikci"
Alıntı yapılan: "azimli"en net çözüm şu bence 10 bitlik adc değerini 0011111111 saysı ile and işlemine tabi tutup unsigned char tipi bir değişkene aktar olay tamamdır.

C kodu iş görse yazardım ama basic istenmiş aslında benim bu formda işimde yok galiba pic basic bilmiyorumki.

bu da mantıklı geldi bana 9 ve 10 uncu bitler maskelencek :)

10 bit Ölçüm sonucun 256 ise 8 ve 9. bitleri maskelediğinde ne görürsün?
0 , 512 ise ne görürsün?  yine 0.
Yukarıda bu işin doğru yöntemlerini anlatmış arkadaşlar. Neden onlar kafana yatmadı da  bu yattı???

yok hocam zaten diğer arkadaşların söylediği kesin yattı ona bir sözüm yok ama yazımı daha kolay ve pratık olur olur diye düşünmüştüm yalnız dediğinizi düşünmemişim ;)
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!

hasangurlek

Alıntı yapılan: "Allegro"z ye katılıyorum ben,

işlemciye kod yazanlar biraz da olsa ASM öğrenmeli :D

Arkadaşımızın yazım hatası yeni bir konu açtı. Hocama katılıyorum ve bir ilave yapmak istiyorum;

Assembly bilgisi temel olarak şart fakat bundan önce dijital donanımların olmazsa olmazı ikilik sayı sistemini, bu sistemde matematik işlemlerini ve diğer sayı sistemlerine dönüşümünü iyi bir  şekilde kavramak önemli. Çünkü ikilik sayı sistemi dijital donanımların alfabesi, assembly dili ise heceleridir. Bunlar bilindikten sonra kelimeleri ve cümleleri ister assembly ile kurun, ister C ister bir başkası ile ve kurduğunuz bu cümleleri ister bloknota, ister deftere yazın isterseniz kitap yayınlayın.
http://www.cyber-warrior.org, Although they like whiteness, sometimes twilight is required...  Hala evlilermi bilinmez ama kesinlikle artık uygun değiller !!!

Maxim

aslında yapmak istediğim hasan gürlek ile klein hocanın yazışmaları üzerine bir deneme yapmaktı, başlığı açarken yazıyı bulamamıştım , buldum .

https://www.picproje.org/index.php/topic,26702&postdays=0&postorder=asc&highlight=klein&start=20

amaç adc yi 10bit okuduktan sonra 2 biti çıkarmak böylece gereksiz parazitlerden kurtulmak.

10bitlik datayı direk 4 e bölmek aynı sonucu vermez diye düşünüyorum,

eksik anlattıysam affola

azimli

adc yi 10bit okuyup sonra en büyük 2 biti aradan çıkartıp sonucu 8 bit değerlendirmenin parazitlerden kurtulma anlamında bence hiç bir faydası olmaz.

10 bit adc sonucunu lineer olarak doğru orantılı artış ve azalış yapacak şekilde 8 bit görüntülemek istersenizde bu işin en iyi 3 çözümü bence sırası ile şöyledir.

-10bit adc sonucunu 2 bit sağa kaydırmak,
-10bit adc sonucunu 0,25 rakkamı ile çarpmak  
-10bit adc sonucunu 4 e bölmektir.

zaten siz 10 bit datayı sayısal örneklenen değerleri üzerinden 4 e bölerek kullanmakla 4 kat daha az hassasiyetli bir iş yapmış oluyorsunuz buda bir gerçek.zaten adc bit çözünürlük sayısının artma nedeni daha hassas çalışma aralığı elde etmek ara değerlerede ulaşmak değilmidir.

ama bunun haricinde adc örneklemelerinde yazılımsal ve donanımsal filtrelemelerde yapılabilir tabiki.bu anlamda benim yaptığım ve memnun kaldığım yöntemlerimide daha önce yazmıştım.bu yöntemler seminerlerde ve kurslardada dile getirilir hatta açık kaynaklardada verilir zaten.

konunun başka bir yönü ise;

işlemci üzerindeki bu türden işlemlerde asm olmazsa olmaz manasını çıkarmak hatalı bir davranış olur.

bu türden işler asm dilinin nin tekelinde değildir C de de bu işler çok iyi yapılır.ama bir dili kullanan kişinin bilgi ve tecrübesi deneyimleri o dilde ve işlemcide etkin iyi kod yazıp geliştirilmesinde daha ön plana çıkmakdadır.Dil beceriklidir çok iyidir ama onu kullanan o kadar iyi değildir burası ayrı meseledir.  

yine fikirlerimi söylüyorum Microchip firmasının 16 bit ve 32 bit yeni nesil işlemcilerinde üreticisinin sunduğu asm dili tek iken.

bu işlemcilerin C derleyicileri çeşitli olmaktadır.

ben Microchip firmasının ürettiği 16-32 bit mikro işlemcilerinin kendi ürettiği ve satışını yaptığı C30,C33,C32 derleyicileri ile çok iyi bir şekilde asm yi aratmayacak şekilde programlanabildiğine iananıyorum.

belki c ile hızlı kod yazımı geliştirimi kod okunurluğu olurda asm kadar hızlı kodları yürütüp çalıştıramaz şeklinde asm yi savunan görüşlerede asla katılmıyorum adamlar bu çipi üretirken C diline temelleri dayandırdılar ve geliştirdiler.bunu kendileri söylüyorlar zaten.benim savunmama gerek yok.

zannedilmesin hala bu çipler asm ile programlanabiliyor asm vazgeçilmezdir C kodları bile asm üzerinden hex koda dönüşüyorlar
asm olmazsa olmaz diye.

ne yapsın adamlar gerçekte küçümsenemeyecek seviyede eski bir asm kullanıcı kitlesi var C eskiden bu kadar geliştirilmiş değildiki yeni mimarili ve model çipler gündemde değildiki mecburen günümüzde asm kullanıcılarınıda gözetilmek zorundalar para var sonuçta işin ucunda.
kimse kullanıcı kitlesinden vazgeçmek istermi?

isteseler asm yi komple aradan çıkarıp direkt C derleyici kodları üzerinden işlemci hex makina kodlarıda üretilebilirler asm yi arada bir yerde bile göremeyebilirsiniz.bu günlerde gelecektir tabiki ama daha var.

ama bu işlemcilerde siz C30,C33,C32 dışında bir C derleyicisinden bahsederseniz orası farklı ben onları çok iyi bilmem yalnızca incelediğim kadarı ile bilirim asm nin onlara göre vantajı olabiliyordur belki burası ayrı bir konu.

bit bazındaki işlemler asm tekelinde değildir C nin ortaya çıkma amaçlarından birisi bu tür işlerde çok fazla iyi olmasıdır.ilk ortaya çıkma nedenlerinden biriside bu tür işlemlerdir aslında.

ama dilin kendisi dışında onun etkin şekilde kullanılabilme durumu vardır
burdada insan faktörü işin içine girer.

bu formda birbirimize elimizden geldiğince iyi davranmaya ve yardım etmeye çalışırsak iyi niyetli herkes bundan en iyi şekilde istifade eder faydalanır.

forum konularında bir iki şık ve kısa kimilerine göre yakışıklı cümle ile işi geçiştirmeye çalışırsak bundan herkes istifade etmemiş olur.amaç herkesin ortaya katkı sunması ve konulardan herkesin istifade etmesiyse daha etkin anlamları olan cümleler kurmak olmalıdır şeklinde düşünüyorum.

iş böyle yürüyecekse bende şık bir veya bir iki cümle ile işi geçiştireyim
bundan ben dahil kimse fayda görmez düşüncesindeyim.

yoksa ne gereği var uzunca konu hakkında bildiklerimi anlatmama ve tecrübelerimi paylaşmama.

ben bildiğim yada bildiğimi düşündüğüm konuda elimden geleni vermeliyimki karşıdaki kişide daha sonra sıkıştığım noktada iyi niyetli davranıp yardım etsin.hatam varsa uyarsın.bunun yöntemleride makul olmalı ve çözüme katkı sunmalıdır diye düşünüyorum.

herkese iyi çalışmalar.

hasangurlek

Datayı 2 bit sağa kaydırmak 4 e bölmek ile aynıdır. Noktadan sonrası için bölünende kalan artık değeri işleme almazsanız sonuç aynıdır. 8 bit çözünürlük uygulamanıza yetiyorsa sonucu bu şekilde kullanabilirsiniz. Kaydırma sonrası 10 bit çözünürlük gerekliyse 12 bit çözünürlüğe sahip 18Fx5x3 tipi PIC serisi veya harici ADC çipleri kullanabilirsiniz.

Verdiğiniz linkte tartıştığımız ADC hataları (parazit giderme değil) ile ilgili testleri 3x1.5=4.5 volt pil besleme ve 1 veya 2x1.5 volt pil çıkışından AD çevrim yaparak inceleyebilirsiniz. PC bağlantısı kurabiliyor ve PC tarafında VB VC vs. herhangi bir yazılımı kullanabiliyorsanız 512, 1.024, 4.096 vs. defa gibi sayılarda okuduğunuz analog değerleri bir excel tablosuna aktarıp inceleme şansınız olursa pil gibi stabil bir besleme ile bile sonuçların +/- farklılıkları çok net bir şekilde izlenebiliyor. Her ne kadar dikkatli tasarım yapılırsa yapılsın çoğu kez ADC hataları düşük değerlikli 3. biti bile (+/- 8 LSB ye kadar) etkileyebiliyor.
http://www.cyber-warrior.org, Although they like whiteness, sometimes twilight is required...  Hala evlilermi bilinmez ama kesinlikle artık uygun değiller !!!