Etepic

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



DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 2
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 1
DEFINE LCD_BITS 4
DEFINE LCD_LINES 2
PAUSE 500
LCDOUT $FE,1,"SELAM........
'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

'XXXXXXXXXXXXXXXXXXXXX EKLENENLER
READ 0,Y_CAP.HIGHBYTE
READ 1,Y_CAP.LOWBYTE



'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


LCDAYAR:
BIRLER=Y_CAP DIG 0:ONLAR=Y_CAP DIG 1:YUZLER=Y_CAP DIG 2:BINLER=Y_CAP DIG 3:ONBINLER=Y_CAP DIG 4
LCDOUT $FE,1,"ycap=",DEC ONBINLER,DEC BINLER,DEC YUZLER,",",DEC ONLAR,DEC BIRLER
PAUSE 500
PORTC.7=0


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

LCDI :
pause 50
ONBINLER=BINLER
BINLER=YUZLER
YUZLER=ONLAR
ONLAR=BIRLER
BIRLER=TUS
Y_CAP=ONBINLER*10000+BINLER*1000+YUZLER*100+ONLAR*10+BIRLER*1
LCDOUT $FE,1,"ycap=",DEC ONBINLER,DEC BINLER,DEC YUZLER,",",DEC ONLAR,DEC BIRLER
PAUSE 500
GOTO TUS_TARAMAI

LCDSILI:
Y_CAP=0
ONBINLER=0:BINLER=0:YUZLER=0:ONLAR=0:BIRLER=0:TUS=0
LCDOUT $FE,1,"ycap=",DEC ONBINLER,DEC BINLER,DEC YUZLER,",",DEC ONLAR,DEC BIRLER
PAUSE 500
GOTO TUS_TARAMAI

LCDONAYI:
Y_CAP=ONBINLER*10000+BINLER*1000+YUZLER*100+ONLAR*10+BIRLER*1
LCDOUT $FE,1,#Y_CAP," MM"
LCDOUT $FE,$C0,"ONAYLANDI"
PAUSE 1000
WRITE 0,Y_CAP.HIGHBYTE
WRITE 1,Y_CAP.LOWBYTE
LCDOUT $FE,1,#Y_CAP," YAZILDI"
PAUSE 1000
LCDOUT $FE,1 '..........................................................................
ONBINLER=0:BINLER=0:YUZLER=0:ONLAR=0:BIRLER=0:TUS=0



Y_CAPONDA=Y_CAP DIG 0 'capın 0.bitini
HESAP1=Y_CAP DIG 1 'capın 1. bitini Y_CAPONDA ya atıyoruz "34
HESAP1=HESAP1*10
Y_CAPONDA=Y_CAPONDA+HESAP1:HESAP1=0
Y_CAP=Y_CAP/100
A:
LCDOUT $FE,1,#Y_CAPONDA," YCAP ONDA"
LCDOUT $FE,$C0,#Y_CAP,"  YCAP"
PAUSE 1000


'BURAYA KADAR GİRİLEN DEĞERİ 111,11 Yİ -111 VE -11 OLARAK AYIRDIM 2 DEĞİŞKENE ATTIM
'YARICAP HAZIR FORMUL İÇİN Pİ=6.28 DİYECEĞİZ BUNU ICIN PI_TAM=7:PI_ONDA=28 DEDIK
HESAP1=0
'QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ
HESAP1=Y_CAP*PI_TAM          'YARICAP * PI TAM CARPIMI
'BU TAMAM
'QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ
B:
LCDOUT $FE,1,#HESAP1," HESAP1"
PAUSE 1000

'QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ

HESAP2=Y_CAP*PI_ONDA/100  'TAM YARICAP İLE PI ONDANIN CARPIMI
HESAP3=Y_CAP*PI_ONDA//100 'TAM YARICAP İLE PI ONDANIN CARPIMINDAN KALAN
HESAP3=HESAP3*10
C:
LCDOUT $FE,1,#HESAP2," HESAP2"
LCDOUT $FE,$C0,#HESAP3,"  HESAP3"
PAUSE 1000
'QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ
'HESAP4=Y_CAPONDA*PI_TAM  'Y_CAP ONDASI İLE PI_TAM CARPIMI
HESAP4=Y_CAPONDA*PI_TAM/100
HESAP5=Y_CAPONDA*PI_TAM//100
HESAP5=HESAP5*10
D:
LCDOUT $FE,1,#HESAP4," HESAP4"
LCDOUT $FE,$C0,#HESAP5, "HESAP 5"
PAUSE 1000

'QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ
HESAP6=Y_CAPONDA*PI_ONDA/10000    'YARICAP ONDASI İLE PI ONDASI NIN CARPIMI
HESAP7=Y_CAPONDA*PI_ONDA//10000 'KALANI ALIYORUZ
HESAP7=HESAP7/10
E:
LCDOUT $FE,1,#HESAP6," HESAP6"
LCDOUT $FE,$C0,#HESAP7,"  HESAP7"
PAUSE 1000
'QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ
CEVRE_TAM=HESAP1+HESAP2
HESAP8=HESAP4+HESAP6

HESAP9=HESAP5+HESAP7




HESAP8=HESAP8/100
F:
LCDOUT $FE,1,#HESAP1,"+",#HESAP2,"=",#CEVRE_TAM,",",#HESAP3 '
LCDOUT $FE,$C0,#HESAP8,",",#HESAP9                           '
PAUSE 5000
HESAP11=CEVRE_TAM+HESAP8
HESAP10=HESAP3+HESAP9
LCDOUT $FE,1,#HESAP8,"+",#CEVRE_TAM,"=",#HESAP11
LCDOUT $FE,$C0,#HESAP3,"+",#HESAP9,"=",#HESAP10
PAUSE 5000

LCDOUT $FE,1,#HESAP11,",",#HESAP10
PAUSE 5000
GOTO F



'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

LCDCIKIS:

end


'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



DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 2
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 1
DEFINE LCD_BITS 4
DEFINE LCD_LINES 2
PAUSE 500
LCDOUT $FE,1,"SELAM........":PAUSE 500 'FIMA ISMI EKRANDA GOZUKME ZAMANI
'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

'XXXXXXXXXXXXXXXXXXXXX EKLENENLER
READ 0,Y_CAP.HIGHBYTE
READ 1,Y_CAP.LOWBYTE



'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


LCDAYAR:
BIRLER=Y_CAP DIG 0:ONLAR=Y_CAP DIG 1:YUZLER=Y_CAP DIG 2:BINLER=Y_CAP DIG 3:ONBINLER=Y_CAP DIG 4
LCDOUT $FE,1,"ycap=",DEC ONBINLER,DEC BINLER,DEC YUZLER,",",DEC ONLAR,DEC BIRLER
PAUSE 500
PORTC.7=0


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

LCDI :
pause 50
ONBINLER=BINLER
BINLER=YUZLER
YUZLER=ONLAR
ONLAR=BIRLER
BIRLER=TUS
Y_CAP=ONBINLER*10000+BINLER*1000+YUZLER*100+ONLAR*10+BIRLER*1
LCDOUT $FE,1,"ycap=",DEC ONBINLER,DEC BINLER,DEC YUZLER,",",DEC ONLAR,DEC BIRLER
PAUSE 500
GOTO TUS_TARAMAI

LCDSILI:
Y_CAP=0
ONBINLER=0:BINLER=0:YUZLER=0:ONLAR=0:BIRLER=0:TUS=0
LCDOUT $FE,1,"ycap=",DEC ONBINLER,DEC BINLER,DEC YUZLER,",",DEC ONLAR,DEC BIRLER
PAUSE 500
GOTO TUS_TARAMAI

LCDONAYI:
Y_CAP=ONBINLER*10000+BINLER*1000+YUZLER*100+ONLAR*10+BIRLER*1
LCDOUT $FE,1,#Y_CAP," MM"
LCDOUT $FE,$C0,"ONAYLANDI"
PAUSE 1000
WRITE 0,Y_CAP.HIGHBYTE
WRITE 1,Y_CAP.LOWBYTE
LCDOUT $FE,1,#Y_CAP," YAZILDI"
PAUSE 1000
LCDOUT $FE,1 '..........................................................................
ONBINLER=0:BINLER=0:YUZLER=0:ONLAR=0:BIRLER=0:TUS=0



Y_CAPONDA=Y_CAP DIG 0 'capın 0.bitini
HESAP1=Y_CAP DIG 1 'capın 1. bitini Y_CAPONDA ya atıyoruz "34
HESAP1=HESAP1*10
Y_CAPONDA=Y_CAPONDA+HESAP1:HESAP1=0
Y_CAP=Y_CAP/100
A:
LCDOUT $FE,1,#Y_CAPONDA," YCAP ONDA"
LCDOUT $FE,$C0,#Y_CAP,"  YCAP"
PAUSE 1000


'BURAYA KADAR GİRİLEN DEĞERİ 111,11 Yİ -111 VE -11 OLARAK AYIRDIM 2 DEĞİŞKENE ATTIM
'YARICAP HAZIR FORMUL İÇİN Pİ=6.28 DİYECEĞİZ BUNU ICIN PI_TAM=6:PI_ONDA=28 DEDIK
HESAP1=0
'QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ
HESAP1=Y_CAP*PI_TAM          'YARICAP * PI TAM CARPIMI
'BU TAMAM
'QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ
B:
LCDOUT $FE,1,#HESAP1," tyc-pıtam"'" HESAP1"
PAUSE 1000

'QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ

HESAP2=Y_CAP*PI_ONDA/100  'TAM YARICAP İLE PI ONDANIN CARPIMI
HESAP3=Y_CAP*PI_ONDA//100 'TAM YARICAP İLE PI ONDANIN CARPIMINDAN KALAN
HESAP3=HESAP3*10     '10 ile çarpıp tam sayı halıne getırmısım
C:
LCDOUT $FE,1,#HESAP2,"tyc-pion"'" HESAP2"
LCDOUT $FE,$C0,#HESAP3,"  tyc-pion kal"
PAUSE 1000
'QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ
'HESAP4=Y_CAPONDA*PI_TAM  'Y_CAP ONDASI İLE PI_TAM CARPIMI
HESAP4=Y_CAPONDA*PI_TAM/100
HESAP5=Y_CAPONDA*PI_TAM//100
HESAP5=HESAP5*10
D:
LCDOUT $FE,1,#HESAP4,"c.on*pitam"' HESAP4"
LCDOUT $FE,$C0,#HESAP5,"c.on*pitam kal"' "HESAP 5"
PAUSE 1000

'QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ
HESAP6=Y_CAPONDA*PI_ONDA/10000    'YARICAP ONDASI İLE PI ONDASI NIN CARPIMI
HESAP7=Y_CAPONDA*PI_ONDA//10000 'KALANI ALIYORUZ
HESAP7=HESAP7/10 '/10 DU
E:
LCDOUT $FE,1,#HESAP6,"yco*pion"' HESAP6"
LCDOUT $FE,$C0,#HESAP7,"yco*pion kal" '  HESAP7"
PAUSE 1000
'QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ

CEVRE_TAM= hesap1+hesap2+hesap4+hesap6


HESAP30 VAR WORD:HESAP30=0
HESAP31 VAR WORD:HESAP31=0
HESAP32 VAR WORD:HESAP32=0

cevre_onda=hesap3+hesap5+hesap7
HESAP30=CEVRE_ONDA DIG 0
HESAP31=CEVRE_ONDA DIG 1 :HESAP31=HESAP31*10
HESAP32=CEVRE_ONDA DIG 2 :HESAP32=HESAP32*100

HESAP20=CEVRE_ONDA DIG 3
HESAP21=CEVRE_ONDA DIG 4 :HESAP21=HESAP21*10

CEVRE_TAM=CEVRE_TAM+HESAP20           '+HESAP21

CEVRE_ONDA=0
CEVRE_ONDA=HESAP30+HESAP31+HESAP32




LCDOUT $FE,1,#cevre_tam,",",#CEVRE_ONDA
lcdout $fe,$C0,"cevre tam","CEVRE ONDA"
PAUSE 1000
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
Alıntı yapılan: kayatech - 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.

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

ekranda gördük.
sorum şu :

cevre             /             pulls sayısı ( sey,say
1256.000  /        124,96586
teşekkürler hocam..
ooben
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"

c=cevre-_tam/puls_onda
d=cevre-_tam/puls_onda

e=cevre_onda/puls_tam
f=cevre_onda//puls_tam

g=cevre_onda/puls=onda
h=cevre_onda//puls=onda
k=a+c+e+g
m=b+d+f+h


gibi mi olacak

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
Alıntı yapılan: ete - 08 Nisan 2013, 23:12:57
IF SAYI>60000 then sayı=0 dersin olur biter.
Ete

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
Alıntı yapılan: MC_Skywalker - 12 Eylül 2019, 10:03:17Eşit değilse operatörünü denermisin  "!=" işini görecektir.
çalıştı.Çok teşekkür ederim.
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.

Ete