Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

değişkenler

Başlatan i_iMiT, 06 Temmuz 2013, 09:40:38

i_iMiT

merhaba arkadaşlar
sorum biraz saçma olabilir belki çok basittir ama farklı boyutlardaki değişkenlerin birbiriyle nasıl çalıştığını bilmiyorum bi kaynakta bulamadım o yüzden bu soruyu sormak zorunda kaldım
16 bitlik değişkendeki bir bilgiyi 8 bitlik değişkene nasıl atabilirim örneğin 16 bitlik x16 değişkenimdeki veri 1500 bunu 6 ya bölüp 8 bitlik x8 değişkenine atmak istiyorum
x8=x16/6
yapmam yeterli olurmu yoksa
x16=1500/6
x8=x16
mı yapmalıyım

Salih

#1
Soruyu anlamadım ama. Yapmak istediğin 16 bitlik sayıyı 2 baytamı ayırmak istiyorsun?

int16 y
int8 a,b

a = make8(y,0)  -> y'nin 0. baytı
b = make8(y,1)  -> y'nin 1. baytı

sadogan

Alıntı yapılan: i_iMiT - 06 Temmuz 2013, 09:40:38
merhaba arkadaşlar
sorum biraz saçma olabilir belki çok basittir ama farklı boyutlardaki değişkenlerin birbiriyle nasıl çalıştığını bilmiyorum bi kaynakta bulamadım o yüzden bu soruyu sormak zorunda kaldım
16 bitlik değişkendeki bir bilgiyi 8 bitlik değişkene nasıl atabilirim örneğin 16 bitlik x16 değişkenimdeki veri 1500 bunu 6 ya bölüp 8 bitlik x8 değişkenine atmak istiyorum
x8=x16/6
yapmam yeterli olurmu yoksa
x16=1500/6
x8=x16
mı yapmalıyım
Bu işlem her koşulsa doğru deyil  sayınız 1596 olsaydı
1596/6 = 266 bu sayı yine 2 byte
ccs için salih hocamın örneği gibi olmalı.

int16 y
int8 a,b
a=y>>8 ; Yüksek byte
b=y ; Düşük byte

i_iMiT

ilginize teşekkür ederim
bu değişkeni pwm e atacağım orayada en fazla 8 bitlik değer girebilirim
ama dışarıdan alacağım değer yüksek bir değer olacak o yüzden bu değeri belli bir sayıya bölerek 256 yı geçmemesini sağlayacağım

Gökhan BEKEN

Bütün bitlerine tek tek bakmak ta mümkün.
if((1<<0) & a) {} else{} //eğer a nın 0. biti 1 ise
if((1<<5) & a) {} else{} //eğer a nın 5. biti 1 ise
if((1<<10) & a) {} else{} //eğer a nın 10. biti 1 ise
Özel mesaj okumuyorum, lütfen göndermeyin.

sadogan

Alıntı yapılan: i_iMiT - 06 Temmuz 2013, 11:59:10
ilginize teşekkür ederim
bu değişkeni pwm e atacağım orayada en fazla 8 bitlik değer girebilirim
ama dışarıdan alacağım değer yüksek bir değer olacak o yüzden bu değeri belli bir sayıya bölerek 256 yı geçmemesini sağlayacağım
Donanımsal pwm 10 bit pic serisinde
CCS ile yazıyor isen
int16 pwm_val;
pwm_val= işlemler ;
set_pwm1_duty(pwm_val);
gibi kullana bilirsin.

Gökhan BEKEN

16 bitlik bir sayının ilk 8 bitini almak istiyorsanız sayıyı 8 defa, 2 ye bölün
sayı16=0xABCD
for(i=0;i<8;i++) {sayı8=sayı16/2;}

sayı 8 yukarıdaki işlemden sonra 0xCD olacaktır
Özel mesaj okumuyorum, lütfen göndermeyin.

Salih

#7
Şimdi anladım. Sen ölçeklendirme yapacaksın.
O zaman ölçeklendireceğin sayının max değerinin tesbit et. Xmax olsun.
Ölçeklendireceğin X olsun. Dönüştürülmüş olan da Y olsun.
Öyleyse;

Biraz önce formülü yanlış yazmışım. Düzeltiyorum.

Şu formülü kullanabiliriz.

Y =(X / Xmax ) * 255   Olur.

Örneğin;
Xmax = 1000
X = 500 olsun
Bu durumda Y = 127 olur.


Bu arada 8 bitlik sayı 256'yı değil, 255 değerini geçmemelidir.

skara1214

16 bitlik sayinin ilk 8 bitini almak istiyorsanız onu 0x00ff ile and leyin
Herkes ölür ama herkes gerçekten yaşamaz

i_iMiT

Alıntı yapılan: salih - 06 Temmuz 2013, 14:07:15
Şimdi anladım. Sen ölçeklendirme yapacaksın.
O zaman ölçeklendireceğin sayının max değerinin tesbit et. Xmax olsun.
Ölçeklendireceğin X olsun. Dönüştürülmüş olan da Y olsun.
Öyleyse;

Biraz önce formülü yanlış yazmışım. Düzeltiyorum.

Şu formülü kullanabiliriz.

Y =(X / Xmax ) * 255   Olur.

Örneğin;
Xmax = 1000
X = 500 olsun
Bu durumda Y = 127 olur.


Bu arada 8 bitlik sayı 256'yı değil, 255 değerini geçmemelidir.

teşekkürler arkadaşlar fakat ben 16 bitlik sayinin ilk 8 bitini almak değil 16 biti 8 bite oranlamak istiyorum.
Salih bey burda anlamadığım nokta 1000 ve 500 değerleri 8 bitten fazla yer kaplıyor Y ise 8 bitlik bir değişken
bu işlemlerin sonucu en yüksek bite sahip olan değere göre oluşturulmazmı mesela 127 sayısı 0000000001111111 şeklinde olmazmı yoksa Y ye atarken öndeki sıfırları kendisi silermi

Klein

char a;
int b = 867;

a = (char) b;

a'ya ilk 8 bit atılır. a nın yeni değeri  99 olur.

b= 127;

a = (char) b;

a'nın yeni değeri = 127;




Salih

#11
Alıntı yapılan: i_iMiT - 06 Temmuz 2013, 15:03:12
teşekkürler arkadaşlar fakat ben 16 bitlik sayinin ilk 8 bitini almak değil 16 biti 8 bite oranlamak istiyorum.
Salih bey burda anlamadığım nokta 1000 ve 500 değerleri 8 bitten fazla yer kaplıyor Y ise 8 bitlik bir değişken
bu işlemlerin sonucu en yüksek bite sahip olan değere göre oluşturulmazmı mesela 127 sayısı 0000000001111111 şeklinde olmazmı yoksa Y ye atarken öndeki sıfırları kendisi silermi

Haklısın, burada problem olmaması için Y'yide 16 bit tanımla.
Diyelim senin 8 bitlik değişken Z olsun,
Z = Make8(Y,0)  dediğinde Y'nin ilk 8 bitini Z'ye aktarır.
Zaten Y'nin değeri 255 geçemez.

i_iMiT

şimdi anladım olayı yardımınız için hepinize teşekkürler arkadaşlar

skara1214

Herkes ölür ama herkes gerçekten yaşamaz

Klein

Alıntı yapılan: skara1214 - 06 Temmuz 2013, 20:14:54
hocam int 0-255 arası değilmi?

Hayır.
int  işlemciye göre değişir.
8 ve 16 bit işlemcilerde  16 bittir. 0-65535 aralığındadır.