Ana Tema => Basic Programlama Komut Kullanımı => Konuyu başlatan: ete - 25 Aralık 2011, 14:12:28
Başlık: Matematik Operatörlerin Kullanımı
Gönderen: ete - 25 Aralık 2011, 14:12:28
PBP matematiğinde gerek işlemlerdeki bit kısıtlaması ve gerekse negatif ve ondalıklı sayıların olmaması nedeni ile bazı operatörler geliştirilmiş ve işlemlerin biraz daha kolaylaştırılması sağlanmıştır. Burada en çok kullanılanlara bir göz atacağız.
*/ operatörü; 16 bit işlemlerde iki sayının çarpılması sonucu elde edilecek olan en azından 32 bitlik sayının Byte0 kısmının atılarak kalan diğer bytelarının bir değişkene yerelştirilmesini sağlar. BUşekilde sayı 256 ya bölünmüş gibi olur. Örnekle açıklayalım. 2300 * 4500 işleminde sonuç 10.350.000 sayısıdır. Bu işlemi */ operatörü ile yaparsanız; 2300*/4500 = 40.429 sayısını elde edersiniz. BU sayı 10.350.000 syısının 256 ya bölünmüş halidir (Tam sayı kısmı). Aslında hex sayılar kullanırsanız sonucu daha mantıklı görebilirsiniz. 2300 * 4500= $9DEDB0 2300 */4500=$9DED (B0 atılmış oldu)
** Operatörü: Buda bir 32 bit çarpma işlemidir. Ancak sonuç dan yalnızca 2 adet high byte alınır. İlk iki byte göz ardı edilir. Örnekle açıklayalım; 2300 * 4500 çarpım sonucu 10.350.000 idi. Aynı işlemi ** operatörü ile yaparsak; 2300 ** 4500 = 157 Aslında bu işlem 48 bitlik bir çarpmaya imkan tanır ve sonucun yalnızca üst iki byte'ını alır. HEX formatında daha kolay gözükür. 2300*4500=$9DEDB0 2300 ** 4500 = $9D ($EDB0 atılmış oldu) bu ise sayının 65536 ya bölünmüş halini verir.
// operatörü (Mod alma işlemi); Br sayının bir başka sayıya bölündükten sonra kalan değeri size verir ve matematikte buna modülüs yada mod alma işlemi denilmektedir. 4500//2300 =2200 4500 sayısını 2300 böldük. Kalan 2200 olarak bulunmuş oldu.
Shift Yani Bit Kaydırma İşlemleri; Sola Kaydır için << işareti ve sağa kaydır için >> işareti kullanılır. Bir sayıyı 1 bit sola kaydırırsanız o sayıyı 2 ile çarpmış olursunuz. %00000001 sayısı (desimal 1) << 1 şeklinde ki bir ifadenin sonucu %00000010 şeklinde olur ve değeri desimal olarak 2 dir. Bunuda bir bit sola kaydırırsak değeri %00000100 olacak idi. Format SAYI << kaydırılacak bit sayısı Örnek 16 sayısını 3 bit sola kaydırlaım 16 << 3 şeklinde yazılır.
Aynı şekilde soldan sağa kaydıma işlemi ise sayının 2'ye bölünmesi anlamına gelir. %10000000 sayısını (desimal 128) 2 bit sağa kaydıralım %10000000 >>2 işlemi sonucu %00100000 olarak bulunur ki buda 128 sayısının 2 defa 2 ye bölünmesi anlamına gelir. SOnuç 32 olarak bulunacaktır.
DCD Operatörü; Decoded bit sayısı anlamına gelir. Bir sayının herhangi bir bitini set etmekte kullanılır. Elimizde 37 şeklinde bir sayı olsun. Sayı ne olursa olsun bu sayının 6 nolu bitini set etmek istersek; SAYI=SAYI+ DCD 6 şeklinde bir komut kullanmamız yeterlidir. SAYI=DCD 2 eşitliği bize sayı değişkenine %00000100 değerini yerleştirir.
DIG operatörü : Desimal dijit operatörü diyede adlandırılır. Her hangi bir sayının desimal hanelerinin alınmasını sağlar. DIG 0 birler hanesini, DIG 1 onlar hanesini DIG 2 yüzler hanesini alır ve gerekirse bunlar ayrı birer değişkene eşitlenirler. SAYI 123 olsun DIG 0 işlemi bize 3 sayısını, DIG 1 işlemi bize 2 sayısını ve DIG 2 işlemide bize 1 sayısını verecektir.
DIV32 operatörü; PBP da çarpma işlemi aslında 32 bitlik bir işlemdir ama hiç bir zaman 32 bitlik sonuca ulaşamazsınız. Ama sonuç bir ara hafızada tutulur. İşlemin devamında bu elde edilen 32 bitlik sonucu bir başka sayıya bölmek isterseniz DIV32 komutunu kullanabilirsiniz. C=2300 * 4500 işlem sonucu 10.350.000 dir ancak siz bunu bir değişkene yazamadağınız gibi sonuca ulaşma imkanınızda yoktur. Ancak sonuç bir ara hafızada tutulur. Şayet o işlmin devamında DIV32 1000 komutunu yazarsam sonuç bana 10.350 olarak gelecektir. Yapalım hemen; C=A * B (2300 x 4500) C=DIV32 1000 C=10350 olarak bulunur.
DIV32 komutu çarpma işleminden hemen sonrasında yer alan satırda verilmelidir. Arada başka işlemler yaparsanız çarpım sonucu otomatik olarak unutulacak yada bozulacaktır.
NCD Operatörü; Zaman zaman kullandığım bir işlem dir. NCD Bir sayı içinde en yüksek değerlikli bit'i bulur. Elimizde SAYI=%01001001 şeklinde bir sayı olsun C=NCD SAYI dersek sonuç 7 olarak gelecektir. Zira Sayı değişkeni değerinde en yüksek bit 7 nolu bit dir. Bitler 1 den başlayıp 8 de biter. Dolayısıyla yukarıdaki değişkende en yüksek değerlikli bit 7 dir. Bir sayının 7 biti 1 midir diye bakmak isterseniz, IF (NCD SAYI)=7 THEN SAYININ 7 ci biti 1 dir denilebilir.
REV operatörü; Bu operatör sayının bitlerini yer değiştirir. Yanında yer alan parametre kadar bitin sıralamasını tamamen tersine çevirir. Elimizde SAYI=%11100001 şeklinde bir sayı olsun. Bunu SAYI=SAYI REV 8 şeklinde bir komut kullanır isek; SAYI=%10000111 şeklinde döner. Dikkatli bakarsanız 1 nolu bir 8 nolu bit olur. 2 nolu bit 7 nolu bite, 3 nolu bit 6 nolu bite, 4 nolu bit ise 5 nolu bit ile yer değiştirir. Yer değiştirme sürerek diziliş 8-7-6-5-4-3-2-1 şeklinde değil 1-2-3-4-5-6-7-8 şeklinde olur.
Matematik operatörleri bu kadar. Birazda lojik operatörlere bakalım. Basicde bit bazında lojik operatör kullanımı oldukça yaygındır. Sırası ile İnceleyelim;
Bir sayının içindan yalnızca istediğimiz bitleri çekip almak için o bitleri AND (&) işlemine tabi tutarız. Örnek verelim PORTB nin ilk 4 bitinde 4 adet buton bağlı ve butonlar boşta HIGH da duruyor ve basılan buton LOW oluyor. Yalnızca butonları bir komut ile okumak istersek BASILAN=PORTB & %00001111 şeklinde bir komut kullanırız. Hiç bir tuşa basılı değil ise BASILAN=%00001111 olarak okunacaktır. PORTB.0 da bulunan tuş basılı ise BASILAN=PORTB & %00001111=%00001110 şeklinde bir değer alacaktır. Şayet hem PortB.0 hemde PortB.1 aynı anda basılı ise BASILAN=%00001100 şeklinde bir değer alacaktır.
Bir sayının herhangi bir bitini set etmek istersek onu 1 ile OR işlemine tabi tutarız. SAYI=%00000000 olsun Bu sayının 4 nolu biti ile 6 nolu bitini set etmek isterse (diğer bitlere dokunmadan) SAYI=SAYI OR %01010000=%01010000 değerini alacaktır. Or komutunun işaretli gösterim şekli ise | şeklindedir.
Bir sayının herhangi bir bit'ine konum değiştirmek istersek o biti 1 ile XOR işlemine tabi tutarız. 1 XOR 1=0 0 XOR 1=1 dir. XOR işaret i ise ^ şeklindedir. SAYI = SAYI ^2 şeklinde bir komut Sayı değişkenini 2 sayısı ile XOR işlemine tabi tutar. SAYI önceden sıfır ise son değeri 2 olacaktır. Çünki SAYI=%00000000 ^ %00000010=%00000010 şeklinde olacaktır.
Hepsi bu kadar.
Ete
Başlık: Ynt: Matematik Operatörlerin Kullanımı
Gönderen: Mucit23 - 25 Aralık 2011, 14:44:34
Hocam Çok Teşekkür Ederim tamda istediğim gibi bir yazı paylaşmışsınız. Ellerinize Yüreğinize sağlık
Başlık: Ynt: Matematik Operatörlerin Kullanımı
Gönderen: F®T - 25 Aralık 2011, 16:53:51
ETE hocam elinize sağlık aslında bir ders serisine bunlarda örneklerle eklenirse daha güzel olur.iyi çalışmalar.
Başlık: Ynt: Matematik Operatörlerin Kullanımı
Gönderen: zoptrik - 26 Aralık 2011, 06:43:03
Yüreğinize sağlık hocam. Forum mükemmel bir kütüphane oldu şimdiden. iyi forumlar...
Başlık: Ynt: Matematik Operatörlerin Kullanımı
Gönderen: ete - 26 Aralık 2011, 11:59:45
Basic de kullanılan ve adına operatör dedğimiz bu komutlardan bazıları gerçekten son derece faydalı ve sıklıkla kullanılıyorlar. Bu nedenle onları yeniden ele almakta fayda görüyorum. Mesela " */" operatörü. ADC ölçümlerinde sabit çarpan hesabını yapmakta sıklıkla kullandığımız bir operatör. Bir tanesini yeniden vereyimki bilgi kafanıza tam otursun. Bir ADC ölçümü yapıyoruz. Ölçüm sonucumuz sonuçta 0-5V girişe karılık olarak 0-1023 olarak değişecektir. Ölçtüğümüz değer bir Voltmetre sistemine adapte edileck olsun. ADC değeri 1023 olduğunda bana 30V luk bir değeri gösterecek olsun. Yani 0-1023 değer aralığı aslında 0-30V luk bir voltmetredeki gösterge aralığına tekabül edecektir. 0-1023 aralığı sıfır dahil 1024 kademe demek oluyor. O halde birim gösterilecek volt başına okunan ADC değeri yada okunan her ADC değerinin Volt karılığı için 30V/1024 = 0,0293 gibi bir değer hesaplarız. Bu durumda okunan değeri bu sayı ile çarparsak bize direk gösterilecek volt değerini vermesi gerekir. Hemen bir deneme yapalım. ADC den 511 okuduk. Buna 1 ekleyelim 512 oldu. Bunu 0,0293 ile çarpalım 15,00 gibi bir sayı elde ederizki bu 15V anlamına gelecektir. Zaten 512 değeri ADC den okunacak değerin tam orta noktasıdır ve 2,5V karşılığına denk gelir. Şimdi olaya Pic matematiği açısından bakarsak 0,0293 gibi bir sayıyı işlemlerde kullanamayız. O halde ne yapalım. Mademki */ işlemi bana 256 ya bölünmüş değeri veriyor o halde ben 0,029 sayısını 256 ile çarparsam ; 0,0293 x 256 = 7,5 gibi bir değer bulurum. Bunuda virgülden kurtarmak için 10 ile çarparım ve bulduğum değer 75 olur. O halde ben çarpma işlemini yaparken * yerine */ operatörünü kullanırsam sonucu 256 ya bölünmüş olarak elde ederim. Ama baştan zaten 256 ile çarptığım için eşitlik bozulmayacaktır. Yalnızca sonradan çarptığım 10 yüzünden sonucu bir kez 10 a bölmem gerekecek. Şimdi aynı hesabı bu seferde 75 rakamı ile yapalım. 512 * 75 = 38.400 değerini bulduk. Bunu 512 */ 75 şeklinde yapsa idik bulacağımız sonuç 38400 rakamının 256 ya bölünmüş hali olacak idi yani 150 rakamını bulacaktım. Bunuda 10'a bölerek 15 rakamını elde edeceğim. Gördüğünüz gibi son derece pratik ve kullanışlı bir komut. Bir çok sıkıntıdan kurtarıyor. Her şeyden önemlisi küçük çarpan rakamını (0,0293) büyük rakam haline getiriyor ve ekstra bir işlem yapmadan direk sonucu veriyor bize.
Buradan aklınıza şunu getirmelisiniz. Küçük ama sabit çarpan rakamlarını kullanırken normal çarpma yerine */ operatörünü kullanarak çarpma yapın işiniz kolaylaşsın.
Diyelimki bir sayıyı 0,018 ile çarpanız gerekiyor. Bunu iki şekilde yapmak mümkün. Sayıyı önce 1000 ile çarparız. 18 rakamını elde ederiz. Sonra o sayıyı 18 ile çarpıp sonucu 1000'e böleriz. İkincisi ise 0,018 sayısını 256 ile çarparım. 4,608 sayısını elde ederim. Bu sayıyı 1000 ile çarpar 4608 sayısını elde ederim. Çarpma işlemini */ ile yaparak (SAYI */ 4608 )/1000 şeklinde sonucu bulurum. Biraz daha pratik ve hassas sonuç veren bir hesaplama şeklidir bu.
Ondalıklı sayı kullanamamaktan kaynaklanan problemlerde çarpan olarak kullandığımız sayıyı 10 veya katları ile çarparak büyüttüğümüzü biliyorsunuz. Mesela bir sayıyı 2,54 ile çarpmak yerine 2,54 x 100=254 ile çarpıp sonucu 100 e bölüyoruz. Bazen sabit çarpan epeyce büyük çıkabiliyor. Mesela 2,5432 şeklinde bir sayının bütün ondalık hanelerini kullanmanız gerekebilir. Bu durumda 2,5432 x 10000 sayısı ile çarpılınca sonuç 25432 şeklinde bir sayı elde edilecektir. Bu sayıyı bir başka sayı ile çarparsanız mesela 3276 sonuç 16 bit sınırlarını aşacaktır. Halbuki siz sabit çarpanı 10000 gibi bir sayı ile çarptınız ve sonucuda aynı sayıya bölerek durumu eşitlemeniz gerekir. İşte burada da DIV32 komutu imdada yetişmektedir. SAYI=25432 * 3276 SAYI=DIV32 10000 şeklinde iki komut ile sonucu 8.331 olarak bulacaksınız. SAYI=DIV32 10000 şeklindeki komut sanki havada duruyormuş ve bir yere bağlı değilmiş gibi gözüksede aslında bir önceki satıra bağımlı durmaktadır. Yani SAYI=25432 * 3276=83.315.232 şeklindeki sonuç direk ulaşılamaz isede ara bir hafızada pic tarafından saklanmaktadır. Sonrasında yer alan DIV32 10000 komutu ise bu sayıyı alarak 10.000 rakamına bölmekte ve sonucu yine SAYI değişkenine yerleştirmektedir. Bu da sıklıkla başvurduğumuz bşr hesap şeklidir.
Diğer opratörler ile ilgili daha fazla örnek vermek isterim ancak komutları çok yerinde örneklerle açıklamak gerekir. Aklıma geldikçe yazacağım. Yada bunların kullanım şekilleri ile ilgili örnekler bulursanız buraya koyun açıklamasını yapmaya çalışayım.
Ete
Başlık: Ynt: Matematik Operatörlerin Kullanımı
Gönderen: Mucit23 - 26 Aralık 2011, 14:10:27
Bu konuyu ele almanız gerçekten beni çok sevindirdi.
Aklıma bir encoderli motordan devir ölçümü örneği geldi. Bende bir tane encoderli DC motor var. Devir hesaplaması için gereken formülleri yazalım. Encoderden gelen palsları Timer1 sayacı ile sayalım. 1Sn de bir timer bir değerinine bakalım Bendeki motorun encoderi motor mili 1 tur döndüğünde 15 pals veriyordu.
Motorun dakikadaki maximun hızı 10000Rpm/dak olduğunu varsayalım. Encoderde 1 tur döndüğünde 15 pals verdiği için katsayımız 15 olacak.
Timer1 değerin 1 sn içinde gelen pals sayısı 2000 olsun. Biz bu değeri 15'e bölersek 133.3(133) değerini buluruz. Bu 1 sn deki devridir. bu değeri 60 ile çarparsak 133*60=7980 Rpm/dak olur. Şöyle bir hesaplama daha yapalım daha hassas bir sonuç için neler yapılabilir diyeyim. Yukarıdaki örnekte motor devri 8000RPM olacak şekilde ayarlamıştım. dakikada 8000 RPM devirle dönüyorsa 1 snde 8000/60=133,33333333333333333333333333333 değeri çıkar yani çok küsüratlı bir sayı. PBP tam sayıyı hesaplamaya kattığı için yukarıdaki örnekte 7980 buldum. Yani aşağı yukarı 20 devir şaşma yapacaktır. Bu tür sonucu çok küsüratlı olan hesaplamalarda PBP nasıl davranıyor. Hesaplamalarda Sadece Tam sayıyı alıyor. Bu tür hesaplamalarda tam net sonuca ulaşabilirmiyiz. Bunu merak ediyorum
Başlık: Ynt: Matematik Operatörlerin Kullanımı
Gönderen: ete - 26 Aralık 2011, 14:23:44
Küsürat işini PBP ile alakası yok biliyorsun. Tamamen matematiksel bir olaydır o. Ne kadar çok küsüratı devreye sokarsan o kadar hassas sonuç alırsın. 133,3 saysı ile işlem yapmak yerine sırası ile; - 133,33 - 133,333 - 133,3333 şeklinde ondalık ksımı artırarak hesap sonucunun gerçeğe daha yakın çıkmasını sağlarsın. Çünki gerçek sonuç 133,333333333333333333333 şeklinde küsürat alınıca ortaya çıkmaktadır.
Ete
Başlık: Ynt: Matematik Operatörlerin Kullanımı
Gönderen: est32 - 26 Aralık 2011, 14:30:34
bi sayı küsüratlı mı çıktı,o zmaan tekrar bir hesaplama yapılabilir.Ben de bunu sıcaklık hesaplarken kendim keşfettim. 8000/60=133
133*60=7980 8000-7980=20
şimdi küsürata bakalım.Küsüratı büyütelim
20*100=2000 2000/60=33
virgülden sonraki iki haneyi görmüş olduk,eğer 1000 ile çarpmış olsaydım üç haneli sonuca ulaşacaktım. işlem uzar gider
Başlık: Ynt: Matematik Operatörlerin Kullanımı
Gönderen: Mucit23 - 26 Aralık 2011, 20:20:24
Alıntı yapılan: ete - 26 Aralık 2011, 14:23:44 Küsürat işini PBP ile alakası yok biliyorsun. Tamamen matematiksel bir olaydır o. Ne kadar çok küsüratı devreye sokarsan o kadar hassas sonuç alırsın. 133,3 saysı ile işlem yapmak yerine sırası ile; - 133,33 - 133,333 - 133,3333 şeklinde ondalık ksımı artırarak hesap sonucunun gerçeğe daha yakın çıkmasını sağlarsın. Çünki gerçek sonuç 133,333333333333333333333 şeklinde küsürat alınıca ortaya çıkmaktadır.
Ete
hocam net sonucu almak için tüm sayıyı virgülden kurtarmak gerekiyor öyle değilmi .Fakat küsüratı bukadar çok olan bir sayıda böyle bir işlem nasıl yapılır bilmem ama 16bit bir sayının el verdiği bir sayıla mesela 10000 ile çarpabiliriz. Galiba sonuca en yakın böyle ulaşırız.
Başlık: Ynt: Matematik Operatörlerin Kullanımı
Gönderen: karbal656 - 28 Aralık 2011, 14:47:41
Ete hocam, öncelikle verdiğiniz bilgiler için çok teşekür edrerim. ADC uygulamalarında kullanışlı bir kod paylaşmak istedim. Biraz açıklarsak: örneğin : üst limiti 50v olan bir ölçüm istiyoruz fomüldeki yere degerimizi girdikmi yeterli. başka hesaplamalara gerek kalmadan haloluyor. Protonda örnek kod: ADIn 0, Adval Inc Adval ' adval + 1 Adval = (Adval*/50) >> 2 ' (adval * 50)/1024
Başarılar
Başlık: Ynt: Matematik Operatörlerin Kullanımı
Gönderen: ooben - 13 Mart 2013, 02:41:28
DEFINE OSC 4 TRISA=%100001:PORTA=0:TRISB=%00000001:PORTB=0 TRISC=%00001110:PORTC=0 ADCON1=0 FRQ VAR WORD:FRQ=5000 SAK VAR BYTE:SAK=0 TUTH VAR WORD:TUTH=0
TUS VAR BYTE:TUS=0 BIRLER VAR BYTE:BIRLER=0 ONLAR VAR BYTE:ONLAR=0 YUZLER VAR BYTE:YUZLER=0 BINLER VAR BYTE:BINLER=0 ONBINLER VAR BYTE:ONBINLER=0
Y_CAP VAR WORD:Y_CAP=0 HESAP1 VAR WORD:HESAP1=0 Y_CAPONDA VAR WORD:Y_CAPONDA=0
PI_TAM VAR BYTE:PI_TAM=6 PI_ONDA VAR BYTE:PI_ONDA=28
CEVRE_TAM VAR WORD:C[color=red][/color]EVRE_TAM=0 CEVRE_ONDA VAR WORD:CEVRE_ONDA=0
HESAP2 VAR WORD:HESAP2=0 HESAP3 VAR WORD:HESAP3=0
HESAP4 VAR WORD:HESAP4=0
HESAP5 VAR WORD:HESAP5=0 HESAP6 VAR WORD:HESAP6=0 HESAP7 VAR WORD:HESAP7=0 HESAP8 VAR WORD:HESAP8=0 HESAP9 VAR WORD:HESAP9=0 HESAP10 VAR WORD:HESAP10=0 HESAP11 VAR WORD:HESAP11=0 HESAP20 VAR WORD:HESAP20=0 HESAP21 VAR WORD:HESAP21=0 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
'ON INTERRUPT GOTO ACIL_STOP 'OPTION_REG=%01000000 'INTCON=%10010000 'lcdout $fe,1 Q: LCDOUT $FE,1,"KALIBRE ICIN #" LCDOUT $FE,$C0,"IS BILGI ICIN *" PAUSE 100 YU: PORTC.7=1 IF PORTC.1=1 THEN GOTO LCDCIKIS IF PORTC.3=1 THEN GOTO LCDAYAR PORTC.7=0 GOTO YU
PAUSE 500 TUS_TARAMAI: PORTC.4=1 IF PORTC.1=1 THEN TUS=1 : gosub LCDI IF PORTC.2=1 THEN TUS=2 : GOSUB LCDI IF PORTC.3=1 THEN TUS=3 : GOSUB LCDI PORTC.4=0 : PORTC.5=1 IF PORTC.1=1 THEN TUS=4 : GOSUB LCDI IF PORTC.2=1 THEN TUS=5 : GOSUB LCDI IF PORTC.3=1 THEN TUS=6 : GOSUB LCDI PORTC.5=0 : PORTC.6=1 IF PORTC.1=1 THEN TUS=7 : GOSUB LCDI IF PORTC.2=1 THEN TUS=8 : GOSUB LCDI IF PORTC.3=1 THEN TUS=9 : GOSUB LCDI PORTC.6=0 : PORTC.7=1 IF PORTC.1=1 THEN TUS=10 : GOSUB LCDSILI IF PORTC.2=1 THEN TUS=0 : GOSUB LCDI IF PORTC.3=1 THEN TUS=11 : GOSUB LCDONAYI PORTC.7=0 GOTO TUS_TARAMAI
'yukardaki kod keypad ten girilen 0-655,35 arası sayıyı alarak dairenin çemberini hesaplamaktadır. formul ise r*2*3.14 "yarıçap*2*pi sayısı
yukarıdaki kodu max girilecek sayı 655,35 olarak tasarladım naçizane xxxxx,xxxxx te "yaniiki word " olabilir ama asıl soracagım (ekte isis te var ) bi yerde hata yaptım ama sadece tahmin ediyorum çoğu zaman doğru sonuçlar almama rağmen neden bazen hata yapıyor. doğru hesaplamıyor yardımcı olurmusunuz teşekkürler ooben
Edit; Foruma kod eklerken kod eklentisi kullanın.
Başlık: Ynt: Matematik Operatörlerin Kullanımı
Gönderen: ete - 13 Mart 2013, 08:53:09
Basicte iki türlü dallanma yada bir yerden başka bir yere atlama komutu vardır. Birincisi GOTO XXX şeklinde kullanılır. Burada XXX gidilecek etiket adıdır. Gittiğniz yerdden dönüş yine goto ile olmalıdır. İkinci komut ise GOSUB XXX dur. Bu komutta da gidilecek yer XXX etiketidir. Ancak bukumutu kullandığınız zaman oradan dönüşü mutlaka RETURN ile yapmanız gerekir. Gidilenyerden bir başka yere goto ile gidebilirsin ama bu seferde yeni yerden Return ile dönmen gerekir. Bunu yapmazda hep goto ile dönersen program bir yerde tıkanır. Çünki her gosub Stack (yığın) denilen hafızaya ayrıldığı yerin adresini yazar. Return görünce bu adresi oradan alır ve ayrıldığı yere geri döner. Stack da sıfırlanır. Çünki bir adres girdi bir adres çıkmış oldu. Ama sürekli gosub komutu verip de return vermez isen stack bir yerde dolar ve programda ipin ucunu kaçırır. Zira stacknyalnızca gosub için kullanılmaz. Hesaplamalarda da ara hafıza olarak kullanılır.
Senin kusurun bolca Gosub kullanıp hiç return kullanmamış olman. Programını incele ya gosubları kaldırbgoto yap yada gosub ile gittiğn yerden return ile dön.
Pek çok kişi iki komutun farkınıda bilmiyor. Bunuda açıklamak gerek. Bir programda formüle bağlı hesaplama olsun. Bu hesap programın değişik yerlerinde gerekiyor onu bir alt programa yerleştirip oraya sürekli gosub ile giderim ve return ile dönerim. Programın 100 satırlı bir program olduğunu düşünürsek. Ve hesap işlemide 10 - 45 - 70 nolu satırlarda gerekiyor ise, 10 nolu satırda Gosub hesap yazıp hesap isimli etikete gidersem oradan Return ile dönersem program otomatikman 11 nolu satıra döner. Aynı işi goto ile yaparsam Goto hesap ilengidip oradan goto 11 demem gerekirdi. Ama bu seferde aynı hesap kısmını 45 de kullanınca hesap kısmında bu sefer goto 46 olması gerekirdi. Halbuki gosub hesap ile gidersem ve return ile dönersem program otomatikman 46 ya dönecektir. İşte iki komutun kullanım farkı budur.
Ete
Başlık: Ynt: Matematik Operatörlerin Kullanımı
Gönderen: pwm3434 - 13 Mart 2013, 14:08:25
ete hocam bu konuyla ilgili bir sorunum var.
sisteme gerekli olan şu; pot tarafından ihtiyaca göre ham biligi serçilip ve ldr ham değer bilgisi pot bilgisine eşit olduğu zaman gerekli komut parametreleri aktif olacak. buraya kadar yapabiliyorum sorun yok ustalar. varsayalım ki sistemin aktif olma ldr ham değer bilisi 45 olsun vede sistemin pasif olma ldr ham değer bilgisi ise 50 olsun. ldr bilgisi sürekli değişiyor kayma yapıyor yani 42-43-44-45-46-47-48 bana gerekli olan 42 ile 49 arasında ki ldr ham değer bilsi okunur haldey iken sisten aktif olsun 50 vede yukarısı olduğu zamanda pasif olsun gerçek komutları ekleyeceğim.
aşağıdaki örnek komutların isteğim gibi çalışması için hangi komut değişikliği yapılması gerekli ıf ldr=potansıyometre then ıf ldr>=50 then goto basla gosub sec portb=bılgı1 portc=bılgı2 endıf
Başlık: Ynt: Matematik Operatörlerin Kullanımı
Gönderen: ooben - 13 Mart 2013, 15:30:16
gosub ların yerini goto aldı teşekür ederim programın bi kısmını sabah tekrar yaptım gece sanıyorum kafam karışmış buraya son halini koyuyorum .
DEFINE OSC 4 '@ device MCLR_OFF TRISA=%100001:PORTA=0:TRISB=%00000001:PORTB=0 TRISC=%00001110:PORTC=0 ADCON1=0 FRQ VAR WORD:FRQ=5000 SAK VAR BYTE:SAK=0 TUTH VAR WORD:TUTH=0 '''''''''FRQ VAR WORD:FRQ=5000 '''''''''SAY VAR BYTE:SAY=0 ''''''''''DENEME '''''''''PORTA.3=1:PAUSE 1 '''''''''A: '''''''''IF FRQ=1000 THEN V '''''''''SAY=SAY+1 '''''''''IF SAY=10 THEN SAY=0:FRQ=FRQ-10 '''''''''V: '''''''''HIGH PORTC.0:PAUSEUS FRQ '''''''''LOW PORTC.0:PAUSEUS FRQ '''''''''GOTO A 'DEGER VAR BIT:DEGER=0 'ISSAYISI VAR WORD:ISSAYISI=0 'KESI_MM VAR WORD:KESI_MM =65535 'ISADEDI VAR WORD:ISADEDI=0 'MMGIT VAR WORD:MMGIT=0 'UZUNLUK VAR WORD:UZUNLUK=0 'SAY VAR WORD:SAY=0 TUS VAR BYTE:TUS=0 BIRLER VAR BYTE:BIRLER=0 ONLAR VAR BYTE:ONLAR=0 YUZLER VAR BYTE:YUZLER=0 BINLER VAR BYTE:BINLER=0 ONBINLER VAR BYTE:ONBINLER=0
Y_CAP VAR WORD:Y_CAP=0 HESAP1 VAR WORD:HESAP1=0 Y_CAPONDA VAR WORD:Y_CAPONDA=0
PI_TAM VAR BYTE:PI_TAM=6 PI_ONDA VAR BYTE:PI_ONDA=28
CEVRE_TAM VAR WORD:CEVRE_TAM=0 CEVRE_ONDA VAR WORD:CEVRE_ONDA=0
HESAP2 VAR WORD:HESAP2=0 HESAP3 VAR WORD:HESAP3=0
HESAP4 VAR WORD:HESAP4=0
HESAP5 VAR WORD:HESAP5=0 HESAP6 VAR WORD:HESAP6=0 HESAP7 VAR WORD:HESAP7=0 HESAP8 VAR WORD:HESAP8=0 HESAP9 VAR WORD:HESAP9=0 HESAP10 VAR WORD:HESAP10=0 HESAP11 VAR WORD:HESAP11=0 HESAP20 VAR WORD:HESAP20=0 HESAP21 VAR WORD:HESAP21=0 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
'ON INTERRUPT GOTO ACIL_STOP 'OPTION_REG=%01000000 'INTCON=%10010000 'lcdout $fe,1 Q: LCDOUT $FE,1,"KALIBRE ICIN #" LCDOUT $FE,$C0,"IS BILGI ICIN *" PAUSE 100 YU: PORTC.7=1 IF PORTC.1=1 THEN GOTO LCDCIKIS IF PORTC.3=1 THEN GOTO LCDAYAR PORTC.7=0 GOTO YU
PAUSE 500 TUS_TARAMAI: PORTC.4=1 IF PORTC.1=1 THEN TUS=1 : goto LCDI IF PORTC.2=1 THEN TUS=2 : GOto LCDI IF PORTC.3=1 THEN TUS=3 : GOto LCDI PORTC.4=0 : PORTC.5=1 IF PORTC.1=1 THEN TUS=4 : GOto LCDI IF PORTC.2=1 THEN TUS=5 : GOto LCDI IF PORTC.3=1 THEN TUS=6 : GOto LCDI PORTC.5=0 : PORTC.6=1 IF PORTC.1=1 THEN TUS=7 : GOto LCDI IF PORTC.2=1 THEN TUS=8 : GOto LCDI IF PORTC.3=1 THEN TUS=9 : GOto LCDI PORTC.6=0 : PORTC.7=1 IF PORTC.1=1 THEN TUS=10 : GOto LCDSILI IF PORTC.2=1 THEN TUS=0 : GOto LCDI IF PORTC.3=1 THEN TUS=11 : GOto LCDONAYI PORTC.7=0 GOTO TUS_TARAMAI
Başlık: Ynt: Matematik Operatörlerin Kullanımı
Gönderen: ooben - 13 Mart 2013, 15:32:12
upps !!
teşekürlerimi sunarım şu an çalışıyor. gereksiz lcd out komutlarını kaldırırsanız daha hızlı ve güzel olabilir. hayal gücünüze bırakıyorum ( ihtiyacı olana )
tekrar teşekkürler. bulent
Başlık: Ynt: Matematik Operatörlerin Kullanımı
Gönderen: ete - 13 Mart 2013, 15:52:20
Pwm3434, Şöyle olabilir;
IF LDR>42 and ldr<49 then sistem aktif If ldr > 50 then sistem pasif
Ete
Başlık: Ynt: Matematik Operatörlerin Kullanımı
Gönderen: pwm3434 - 15 Mart 2013, 13:07:52
etehocam dediğin şekilde yapabiliyorum. ldr,pot ham değerindeki bilgiye göre sistemi aktif etmelidir. şu şekilde tarif etsem sende bunları gerçek kodlara çevirirmisin: hocam pot bilgisinin 50 olduğunu varsayalım.
//eğer ldr ham değer biligisi pot bilgisine eşit olursa yada pot bilgisinden 5 aşağı yada 5 yukarı olursa // yani 45 ile 55 arasında olduğunda sistem aktif.
Başlık: Ynt: Matematik Operatörlerin Kullanımı
Gönderen: pwm3434 - 15 Mart 2013, 13:23:45
hocam aşağıdaki örnekte gibi operatörler kullanılabilirmi.
ıf ldr=pott-5 or ldr=pott-4 or ldr=pott-3 or ldr=pott-2 or ldr=pott-1 or ldr=pott+5 or ldr=pott+4or ldr=pott+3 or_ ldr=pott+2or ldr=pott+1 or ldr=pott then sistem aktif (//http:///%3E%20ldr=pott+2or %20%20ldr=pott+1%20or%20ldr=pott %20then %20sistem %20aktif)
Başlık: Ynt: Matematik Operatörlerin Kullanımı
Gönderen: ete - 15 Mart 2013, 14:52:57
IF LDR>(pott-6) and ldr<(pott+6) then sistem akti
Ete
Başlık: Ynt: Matematik Operatörlerin Kullanımı
Gönderen: pwm3434 - 16 Mart 2013, 13:39:48
ete hocam niçin olmadi ki acaba dosya ekledim bakarmısın.
Başlık: Ynt: Matematik Operatörlerin Kullanımı
Gönderen: ete - 16 Mart 2013, 14:12:57
Pc başına oturamıyorum. Ayağa kalkmam oturmam 10 gün yasak. Ipad ile mesajlara yattığım yerden bakıp cevaplıyabiliyorum. Zip -rar dosyalarını açamam (aslında açıyorumda içindekileri açamıyorum) Olmayan yer neresi ise onu koy buraya ancak öyle görebilirim. Ete
Başlık: Ynt: Matematik Operatörlerin Kullanımı
Gönderen: mg1980 - 16 Mart 2013, 15:32:30
Hocam geçmiş olsun
Başlık: Ynt: Matematik Operatörlerin Kullanımı
Gönderen: pwm3434 - 16 Mart 2013, 16:07:59
ete hocam öncelikle geçmiş olsun allah şifa versin üzüldüm hocam sizin durumunuza neyse inşallah belkide daha iyi sonuç olacak ileride. sizin verdiğiniz komutla ancak pott ve ldr eşit olduğunda sistem aktif oluyor. hocam ldr ile pott un farkını alıp ve bu farkın -5 ile +5 arası olduğunda sistem aktif olurmu.
ete hocam tekrardan allah şifa versin acizane elimizden bişeyler gelirse kötü günlerinizde yardımcı olmaya çalışalım.
Başlık: Ynt: Matematik Operatörlerin Kullanımı
Gönderen: İlyas KAYA - 16 Mart 2013, 18:17:30
Sayın ETE; Geçmiş olsun. Umarım eski sağlığınıza kavuşursunuz. Allah c.c şifa versin.
Sayın PWM3434; Sayın ETE nin verdiği kod doğrudur. Ancak sizin kontrol ettiğiniz +- 5 değeri nerede ise eşite yakın. 10 bitlik bir çözünürlükte 5 değeri çok düşük. Bu nedenle siz eşit olduğunda çalışıyor zannediyorsunuz.
5 değeri 50 olarak değiştirirseniz devreniz sanırım istediğiniz gibi çalışacaktır.
Yani şöyle olmalıdır;
IF LDR>(POTT-50) and LDR<(POTT+50) then GOTO DONGU
Saygılarımla.
Başlık: Ynt: Matematik Operatörlerin Kullanımı
Gönderen: nurim - 16 Mart 2013, 20:22:43
Sayın PWM3434; Sayın ETE nin verdiği kod doğrudur. Ancak sizin kontrol ettiğiniz +- 5 değeri nerede ise eşite yakın. 10 bitlik bir çözünürlükte 5 değeri çok düşük. Bu nedenle siz eşit olduğunda çalışıyor zannediyorsunuz.
5 değeri 50 olarak değiştirirseniz devreniz sanırım istediğiniz gibi çalışacaktır.
Yani şöyle olmalıdır; IF LDR>(POTT-50) and LDR<(POTT+50) then GOTO DONGU Saygılarımla.
Evet, çözüm bu şekilde olmalıdır. Ama, bu değer 46--54 arası aktif olur.
"pwm3434" şöyle istediği için -"...//eğer ldr ham değer biligisi pot bilgisine eşit olursa yada pot bilgisinden 5 aşağı yada 5 yukarı olursa // yani 45 ile 55 arasında olduğunda sistem aktif..."
Küçük bir farkla 45--55 için şöyle olmalıdır. IF LDR>(pott-60) AND ldr<(pott+60) then DONGU 'sistem aktif
Başlık: Ynt: Matematik Operatörlerin Kullanımı
Gönderen: ooben - 18 Mart 2013, 13:34:01
hepinize merhabalar kolaylıklar ve başarılar dilerim ... bi sorum olacaktı hocam;
bi step motor sürüyoruz dir ve pulls göndererek ve her gönderdiğimiz pulls i sayıyoruz. dir=1 a: high portb.3:pauseus bekle low portb.3:pauseus bekle say=say+1 if say=65535 then sey=sey+1 and say=0 goto a
gibi sonra işlem tamamlandığında bir switch yardımıyla veya bir sensör sayesinde 1.turu tamamladığını algılayıp dir i tersleyip "dir=0 " tekrar kontrol ediyoruz ve işlem bitmiş olacak sonuçta
bu arada bu step motorun bağlı olduğu dairenin çevresi "20mm*(2*3.14)=20*6.28 = 125,6*10=1256,000mm bunları da değişkenlere attıım cev_tam ve cev_onda lcdout $fe,1,"pulls ",#sey,",",#say lcdout $fe,$c0,"çevre ",#cev_tam,",",#cev_onda pause 100
Başlık: Ynt: Matematik Operatörlerin Kullanımı
Gönderen: ete - 18 Mart 2013, 13:51:41
Bir sürü şey anlatıp sonunda bir bölme işlemini sormana şaşırdırm. Bende sana başka türlü cevap vereyim o zaman. bir sürü step motorla iş yapan program yazdım. Hiç birisinde senin yazdığın hesaba ihtiyacım olmadı. Sebebi basit. Step motorlar puls başına bir adım atar ve bu adımın derecek karşılığı ise ya motorda yada paramterelerinde yazılıdır. Em çok kullanılanı ise 1,8 derece olanıdır. Bir tam tur 360 derece oldupuna göre bu motor bir tam tur için 200 puls almalıdır diye hemen hesaplayabilirsin. Buradan kaç puls ile ne kadar yol aldığını da hesaplayabilirsin. İllaki hesabı yapmak istersen 32 bit çarpma ile rakamlardan birisini büyütmek veya her ikisinide büyütmek ve sonra yine 32 bit bölme ile bir birlerine bölmen gerekir. B=124,96586 * 100 A=1256 *100: C=DIV 32 B şeklinde olması gerekir.
Ete
Başlık: Ynt: Matematik Operatörlerin Kullanımı
Gönderen: ooben - 18 Mart 2013, 14:02:53
aslında haklısınız ama benim kafamın karışmasına sebep olan şey , ben şunları bilmiyorum *step motorun merkezinden hareket almayacak *kaça kaç rediktör var bilmiyorum *dolayısı ile ben sadece dairenin çevresini biliyorum onun için paulls sayıyorum * ayrıca step motor sürücü sü ise 0 dan 16 ya kadar bölüyor hangi modda çalışacağını da bilmiyorum *belki ekranda ben dicem şuna getir onun için kafam karıştı
hocam bir örnekle açıklar mısınız anlayamadım tyeşekkür ederim ooben
Başlık: Ynt: Matematik Operatörlerin Kullanımı
Gönderen: ete - 18 Mart 2013, 15:41:22
Bir bölme işleminde pay ve payda aynı sayı ile çarpılırsa işlem sonucu değişmez. Bu özellikten yararlandık. Sonra rakam büyüdüğü için 32 bit bölme yaptık. 1256 x 100 işlemi word değerini aşacağı için sonuç pic tarafından ara hafızada 32 bit olarak saklanır. Div32 komutu bu sonucu alıp verilen parametreye böler. Verdiğim örmek zaten başka örnek bekleme. Ete
Başlık: Ynt: Matematik Operatörlerin Kullanımı
Gönderen: ooben - 19 Mart 2013, 22:42:27
iyi akşamlar.. hocam geçmiş olsun umarım yakın zamanda iyileşirsiniz. ( umarım kötü bi sebepten değildir.)
cevre_tam var word :cevre_tam =1256 cevre_onda var word :cevre_onda=235 puls_tam var word :puls_tam =124 'bu sayı "124*65535 aslında" puls_onda var word :puls_onda =9586
1256 - 234 / 124 "65536 ya bolunmuş hali" - 9586
a=cevre_tam/puls_tam : 124 "65536 ya bolunmuş hali" b=cevre_tam//puls_tam :124 "65536 ya bolunmuş hali"
yazılarınızı okudum tüm yazılarınızda küsüratı değişkenin içine aldığınızı gördüm bu örneklerden bi çalışma yaptım.
bu sorduğum biraz farklı hocam yukarıda anlatmış olabilirsiniz belki ama ben anlayamadım. rakamların küsüratlarını mümkün mertebe koruyabilmek için uzun tuttum . bu durumda nasıl olabilir ? teşekkürler hocam.. ooben
Başlık: Ynt: Matematik Operatörlerin Kullanımı
Gönderen: ete - 20 Mart 2013, 07:46:38
Bende bu yazdıklarından bir şey anlamadım doğrusu. Ne gerek var bu kadar çok işleme ? En iyisi sen hesabı direk hesap makinası ike yap ama gerçek hesabı. Buraya koy ona göre yeniden düşünelim. Baştan bir hesap sordun sonra birde ondalık çıkardın. O kadar büyük rakamlarda ondalık etkisi neredeyse sıfıra yakın iken neden gösterme ihtiyacı duyuyorsun bunuda anlamadım. Ete
Başlık: Ynt: Matematik Operatörlerin Kullanımı
Gönderen: pwm3434 - 01 Nisan 2013, 15:27:00
yardımlarınız için teşekkür ederim.
Başlık: Ynt: Matematik Operatörlerin Kullanımı
Gönderen: Hattuşa - 08 Nisan 2013, 22:26:57
slm ETE hocam bi soru soracağım ama umarım yanlış anlaşılmaz; bir alt programda peş peşe matematiksel işlemler yapıyorum, 4 işlem yani, çıkarılan değer ve çıkan değerlerde bir anormallik olmamasına rağmen çıkarma işlemini sağlıklı yapamıyorum, gecikme işlemi yapmadığımdan kaynaklı olabilir mi? hatta hocam sonuc <1 then sonuc =0 dediğim halde word tanımlamasında 65xxx küsür çıkıyor neden bu komut işlevsiz kalıyor? acaba
Başlık: Ynt: Matematik Operatörlerin Kullanımı
Gönderen: ete - 08 Nisan 2013, 22:43:37
Alıntı Yaphatta hocam sonuc <1 then sonuc =0 dediğim halde word tanımlamasında 65xxx küsür çıkıyor
Bu cümleye dikkat etmenizi öneriyorum. Dilimde tüy bitti soruyu sorarken ilgili kodu yada kod parçasını buraya koyun diye ama ısrarla sanki devrlet sırrı imiş gibi koymamakta ısrar ediyorsunuz. Sonucun 65535 veya biraz daha küçük bir değerde çıkması bu if satırının çalışamadığını gösteriyor. Bir word cinsi sayının 1 den küçük olma hali nedir? elbette sayının sıfır olmasıdır. Başka alternatif yok ki. Sayı sıfır ise 1 den küçüktür. Diyelimki elinizde 7 sayısı var ve sayıdan sürekli 3 çıkartıyorsun. 7-3=4 IF SAYI<1 THEN SAYI=0 komut şartı çalışmayacaktır. 4-3=1 IF SAYI<1 THEN SAYI=0 komut şartı çalışmayacaktır. 1-3=65534 elde edilecektir yine senin satır çalışmayacaktır. Buna benzer bir durum meydana geliyor olmasın? Peki kod parçasını vermezsen ben nereden anlayacağım ne hesap yaptığını? Bundan sonra böyle sorulara cevap da vermeyeceğim artık. Ete
Başlık: Ynt: Matematik Operatörlerin Kullanımı
Gönderen: Hattuşa - 08 Nisan 2013, 23:06:33
Alıntı yapılan: ete - 08 Nisan 2013, 22:43:37 Bu cümleye dikkat etmenizi öneriyorum. Dilimde tüy bitti soruyu sorarken ilgili kodu yada kod parçasını buraya koyun diye ama ısrarla sanki devrlet sırrı imiş gibi koymamakta ısrar ediyorsunuz. Sonucun 65535 veya biraz daha küçük bir değerde çıkması bu if satırının çalışamadığını gösteriyor. Bir word cinsi sayının 1 den küçük olma hali nedir? elbette sayının sıfır olmasıdır. Başka alternatif yok ki. Sayı sıfır ise 1 den küçüktür. Diyelimki elinizde 7 sayısı var ve sayıdan sürekli 3 çıkartıyorsun. 7-3=4 IF SAYI<1 THEN SAYI=0 komut şartı çalışmayacaktır. 4-3=1 IF SAYI<1 THEN SAYI=0 komut şartı çalışmayacaktır. 1-3=65534 elde edilecektir yine senin satır çalışmayacaktır. Buna benzer bir durum meydana geliyor olmasın? Peki kod parçasını vermezsen ben nereden anlayacağım ne hesap yaptığını? Bundan sonra böyle sorulara cevap da vermeyeceğim artık. Ete
ete hocam farkında olmadan sanırım hata yaptım, pardon özür dilerim, yazdığım kodun inan devlet sırrı veya başka bir özelliği yok, ilk fırsatta kodu paylaşacağım ve bundan sonraki yardım taleplerimde kesinlikle paylaşmayı unutmamaya çalışacağım. bu arada hatamı farkettim sizin 1-3 =65534 örneği gibi olmuş, ekrana print ettiğim zaman farkettim, yalnız hocam, şu çıkarma işleminde veya diğer matematiksel işlemlerde değerimin 0'ın altında veya 655xx değerleri görmemek için nasıl bir komut kullanmalıyız hocam? yani 1-3 =0 yapmak için bir çare yokmudur. ;D ;D ;D
Başlık: Ynt: Matematik Operatörlerin Kullanımı
Gönderen: ete - 08 Nisan 2013, 23:12:57
IF SAYI>60000 then sayı=0 dersin olur biter. Ete
Başlık: Ynt: Matematik Operatörlerin Kullanımı
Gönderen: Hattuşa - 11 Nisan 2013, 00:03:14
hocam 2 gündür araştırıp duruyorum , yazınızı da yeni farkettim, sizin bu cevabınızdan şunu anladım, yaptığım matematiksel işlemde çıkarma işlemi adc değerleri arası çıkarma işlemi olduğuna göre;
sayı =3-5 if sayı >1024 then sayı =0 dersek word tipinde 655xx rakamını görmeyiz değil mi?
hocam kusura bakmayın, bazen insan basit sorularda boğulup kalıyor, şuan için benim yaşadığımda bu sanırım
Başlık: Ynt: Matematik Operatörlerin Kullanımı
Gönderen: ete - 11 Nisan 2013, 08:25:05
Sayıların limitlerini düşünerek bir if satırı oluşturmak gerekir. Şu anda bu soruyu bana soruyorsun ama elimde hiç bir bilgi yok. Brn neye göre evet yada hayır diyeyim? Bu nedenle kararı kendin ver. Sana genel prensibi söyledim. Küçük sayıdan büyük sayıyı çıkartınca ( birer birer çıkardığını düşünürsen) sayı sıfır oluncaya kadar çıkarma devam eder. Hala çıkaracak sayı varsa bu sefer kalan artık 65535 den çıkartılır. Gerisine sen karar ver. Ete
Başlık: Ynt: Matematik Operatörlerin Kullanımı
Gönderen: Hattuşa - 11 Nisan 2013, 12:03:39
slm ete hocam; yazdığım algoritmayı eklememe nedenim özel bir çalışma olduğundan değil, yaptığım çalışma şu şekilde; RB0 dan yakaladığım harici bir pulsenin (ki bu pulsenin yükselen kenarı kare dalga 90 derece dik, düşen kenarı ise sinüs gibi eğri) ben düşen kenarı üzerinden adc okutuyorum ve okutma işleminden sonra bir önceki değerden çıkarma yapıyorum, ilk değer düşük ise sonucun 0 olmasını yüksek ise farklı işlemler yapacağımdan dolayı bunun üzerinde bu kadar duruyorum
Başlık: Ynt: Matematik Operatörlerin Kullanımı
Gönderen: ete - 11 Nisan 2013, 13:03:37
O işin kolayı şudur. ILK = İlk okunan ADC değerin olsun. SONRA= Okunan ikinci ADC olsun. SONUC=ILK - SONRA yapıyorsun her zaman. O halde , IF SONUC.14=1 then SONUC=~SONUC dersin. BUnların açıklaması şöyle, Şayet ILK>SONRA ise hiç bir zaman Bit.14 HIGH olmaz. Ne zaman olur ancak SONRA>ILK ise Bit.14 HIGH olur. O halde Bit.14 High ise sayı doğru tabir ile negatif çıkması gerekir. Bu durumda o sayının tersini alırsak işlem doğru çıkmış olur. Bunu bir örnekle açıklayalım istersen. ILK=780 olsun SONRA=860 olsun SONUC=780-860=65455 çıkacaktır. Bunu binary olarak yazarsak %1111111110101111 , gördüğün gibi bit 14 "1" dir. O halde SONUC=~SONUC yaparsak , SONUC=80 çıkar. Ete
Başlık: Ynt: Matematik Operatörlerin Kullanımı
Gönderen: elektro77 - 11 Eylül 2019, 23:07:32
if gelenbilgi=gidenbilgi then gosub falan else gosub hata endif
Anladiginiz uzere yukaridaki sorgulamada programa, bilgiler esit se falana degilse hata etiketine git gidiyor.
Bunu matematikte kullandigimiz esitdegilse isareti gibi bir isaret kullanarak sadece If gelenbilgi=/gidenbilgi then gosub hata seklinde yapabilecegimiz bir yol varmi. Cunku ben falan etiketine gitmesini degil sadece hata ekranina gitmesini istiyorum.
Başlık: Ynt: Matematik Operatörlerin Kullanımı
Gönderen: MC_Skywalker - 12 Eylül 2019, 10:03:17
Eşit değilse operatörünü denermisin "!=" işini görecektir.
Başlık: Ynt: Matematik Operatörlerin Kullanımı
Gönderen: elektro77 - 12 Eylül 2019, 12:18:08
Başlık: Ynt: Matematik Operatörlerin Kullanımı
Gönderen: cemilsivas - 06 Aralık 2020, 12:43:26
S. A. Arkadaşlar. Bayağı süredir foruma uğramıyordum. Vallah özlemişim sizleri.😀 Neyse arkadaşlar 16f628a ile mlx90614'ten ısı değeri okumaya çalışıyorum. Mlx 16bit veri gönderiyor. Benim bu değeri hangi işlemlerden geçirmem gerekiyor?
Datasheet'e göre 0.02 hassasiyetle ölçüm yapıyor. Bu veriyi 0.02 ile çarpıp sonucu 273.15 ile çıkarmam gerekiyor.
Ben şöyle bir çözüm buldum ama daha pratik ve çok yer kaplamadan nasıl yapabilirim? Önce word değişken tanımladım. Ardından lowbyte ve highbyte'ı sensörden çektim. Değişkeni 2 ile çarptım. Sonucu 27315'den çıkardım. Ardından çıkan 4 haneli sayıyı digitlerini tek tek alıp yazdırdım. Ama word değerleri çok yer kaplıyor diye biliyorum. Daha iyi öerilerinizi bekliyorum.
Başlık: Ynt: Matematik Operatörlerin Kullanımı
Gönderen: ete - 06 Aralık 2020, 15:48:19
Sensörden okunan değer SICAKLIK.LowByte,SICAKLIK.HighByte şeklinde 16 bit ama 2 byte şeklinde okunuyor.Yani elimizde okunan bir SICAKLIK değeri var ve 16 bitlik bir değer diyelimki $3AD2 diye bir değer okuduk. Bu, desimal olarak 15.058 değerine eşittir. Formülümüz KELVIN=(OKUNAN x 0,02) ve sonrasında SANTIGRAD=KELVIN-273,15 şeklinde .Bu formülleri okunan değere uygulalım, Öncelikle 0,02 değerini basic de kullanamayacağımız için onu 100 ile çarparak 2 değerini elde ederiz. KELVIN=SICAKLIK x 2 Böylece ilk formülü uyguladık ama sonucuda 100 ile çarpış olduk. İşlem eşitliği açısından 273,15 değerinide 100 ile çarpıyoruz ve 27315 değerini elde ediyoruz. Sonra, SANTIGRAD= (KELVIN-27315)/100 dediğimiz zaman net sıcaklığı santigrad değeri üzerinden hesaplamış olacağız. Ama önerim şu olur. SANTIGRAD=(KELVIN-27315)/10 şeklinde yaparsan birde ondalık hane elde edersin. Zira gerçek sıcaklık SANTIGRAD/10 dur ondalık hane ise SANTIGRAD//10 sonucunda elde edilir. İlk okuma örneğini hesaplayacak olursak, KELVIN=15.058 x 2 =30116 Santigrad=30116-27315=2801 Burada çıkan sonucu 100 e bölersek direk 28 dereceyi bulursun Ama 10 a blersek 280 bulacaksın. Tam sayı kısmı için 280/10 ve ondalık kısmı için 280//10 işlemini yaparsın olur biter. Böylece sonuç 28,0 derece olarak bulunur. Burada ondalık sıfır çıkıyor ama bir başka sonuçta mutlaka ondalık değer sıfırdan farklı çıkacaktır.
Ete
Başlık: Ynt: Matematik Operatörlerin Kullanımı
Gönderen: cemilsivas - 06 Aralık 2020, 20:48:35
Anladım hocam. Çok teşekkür ederim.
Başlık: Ynt: Matematik Operatörlerin Kullanımı
Gönderen: Man@41 - 07 Kasım 2023, 16:28:35
Merhaba Arkadaşlar, Forumdaki ilk yorumum :) Dün bir kod sorunum vardı, bu başlıktaki bir bilgi ile çözdüm. Belki başkalarına da yararlı olur diye yazayım dedim. 16F84 PORTB'ye 2 adet 0...9 binary kodlayıcı bağlı. Amacım 00-99 arası gireceğim set değerine göre işlem saymak diyelim. PORTB'nin üst 4 biti onlar hanesi, alt 4 biti birler hanesi oluyor. Alt 4 bitte sorun yok ama üst 4 biti nasıl decimal onlar basamağı haline çevireceğim ? Önce 8 bitlik değeri 11110000 ile maskeledim. Sonra bu değeri > operatörü ile 4 defa sağa kaydırdım. Böylece üst 4 bit aslında alt 4 bit haline gelmiş oldu. Sonra bu değeri 10 ile çarptım ve üstüne 00001111 ile maskelediğim alt 4 biti ekledim. Çalışmadan sonra şunu anladım ; tek başına PBP komutlarını bilmek yeterli olmuyor, diğer bazı dilleri de bilmek gerekiyor. Yıllar önce asm ile 6802 kodlardım ama mesela > operatörünün sayı kaydırdığını yeni öğrendim. Ya da diğer bazı matematik operatörlerinin varlığından haberim bile yok :) Herkese selamlar...
Başlık: Ynt: Matematik Operatörlerin Kullanımı
Gönderen: ete - 08 Kasım 2023, 18:20:43
> operatörü kaydırma (sağa shift) yapmaz. >> operatörü bu işi yapar o işaretten iki tane kullanmalısın.
Yazdıklarını doğru biçimde yeniden yazıyorum. SAYI=%oooobbbb şeklinde olsun (oooo onlar basamağı binary değeri, bbbb birler basamağı binary değeri) Birler=SAYI & %00001111 şeklinde birler basamağını direk çekeriz. ONLAR =(SAYI & %11110000)>>4 şeklinde onlar basamağınıda çekmiş oluruz. Tabiiki desimal bir sayı oluşturacak isen bunlarla; SAYI=ONLAR*10+Birler şeklinde bir formül kullanman yeterli olacaktır.