LM35 ile sıcaklık ölçümünde şart koymak.

Başlatan . Kağan, 11 Ekim 2014, 21:37:06

. Kağan

    Bir devre yaptım. Şöyle ki;
12F675 kullanıyorum. Dahili osilatör ile işlem yapmak istiyorum ve

GPIO.1 de kırmızı led bağlı
GPIO.2 de lm35 bağlı
GPIO.3 de yeşil led bağlı

Kodda şöyle.
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : KAGAN AYANOGLU                                    *
'*  Notice  : Copyright (c) 2014 SERBEST                        *
'*          : All Rights Reserved                               *
'*  Date    : 11.10.2014                                         *
'*  Version : 1.0                                               *
'*  Notes   : 12F675                                                  *
'*          :                                                   *
'****************************************************************
@ __config _INTRC_OSC_CLKOUT & _WDT_OFF & _MCLRE_OFF & _CP_OFF

DEFINE OSCCAL_1K      1 'DAHİLİ OSİLATÖRÜ KORUMA TANIMLAMASI
'DEFINE OSC            4 'OSİLATOR ÇALIŞMA HIZI BURADA DAHİLİ 4 MHZ
DEFINE ADC_BITS      10 'A/D çevirim sonucu kaç bit olacak         
DEFINE ADC_CLOC       3 'DAHİLİ OSİLATÖR KULLANILIYOR           
DEFINE ADC_SAMPLEUS  11 'Örnekleme zamanı mikro saniye cinsinden.

CMCON = 7             'TÜM PORTLARDA COMPARATOR KAPALI.
ANSEL=%00010100      '7. BİT 0  OLACAK.
                     '6,5,4. BİT 001 ÇÜNKÜ FOSC/8=2 OLUYOR
                     '3,2,1,0. BİT ANALOG SEÇİM BİTİ. BURADA 2. ANALOG OLDUĞUNDAN 0100 OLUYOR.
TRISIO = %00000100   'GİRİŞLER VE ÇIKIŞLAR BELİRLENİR.                     
ADCON0 = %10000000   'SONUÇLARI SAĞA YASLI OLARAK DEĞERLENDİRİR.                   
'ADCON0               TANIMLAMASI SADECE ASM DE KOD YAZARSAN AYARLANIYOR diye biliyorum ama yinede yukarda yazdım. BASICDE GEREK YOK deniyor doğrumu acaba?
WPU = 0

HAM var WORD
ISI VAR WORD
TOPLAM VAR WORD
SONUC VAR BYTE
I VAR BYTE
GPIO=0

PAUSE 100

BASLA:
     GPIO.1=1             ' LEDİ YAK     Bu kısım programın başladığını görmek için yazdım.
     PAUSE 200
     GPIO.1=0             ' LEDİ SONDUR
     PAUSE 200
     GPIO.1=1             ' LEDİ YAK
     PAUSE 200
     GPIO.1=0             ' LEDİ SONDUR
     
     ADCIN 2,HAM           'ADC KANALINI OKU
     For I=1 To 10         ' "1" DEN 10'A KADAR YAP. YANİ 10 KEZ ADCIN DEĞERİNİ TOPLA
     TOPLAM=TOPLAM+HAM     'HER SEFERİNDE OKUDUĞUN YENİ DEĞERİ DİĞERLERİNE EKLE
     NEXT I                ' I' YA GİT TEKRAR YAP
     SONUC=TOPLAM/10         'ÇIKAN TOPLAMI 10'A BÖL VE ORTALAMA SONUCU BUL(ORTALAMA ALINDI)
       
     ISI = ((SONUC * 5000) / 1023 )/10    '10 bit çözünürlükte her 10 mv 1 dereceye denk gelecek şekilde hesap.
     IF ISI>20 AND ISI<30 THEN  'SICAKLIK 20-30 DERECE ARASINDA İSE
     GOTO UYU                   'UYU ETİKETİNE GİT
     ELSE                       'DEĞİLSE
     GOTO UYAN                  'UYAN ETİKETİNE GİT
     ENDIF
     Goto basla                 'BAŞA GİT

     UYU:
     'SLEEP 600
     GPIO.3=1             ' YEŞİL LEDİ YAK
     PAUSE 5000
     GPIO.3=0             ' LEDİ SONDUR
     PAUSE 1000
     GOTO BASLA
     
     UYAN:
     GPIO.1=1             ' KIRMIZI LEDİ YAK
     PAUSE 5000
     GPIO.1=0             ' LEDİ SONDUR
     PAUSE 1000
     GOTO BASLA
END


ama 20-30 derece arasında  bir türlü yeşil led yanmıyor.

Yardım edermisiniz neyi gözden kaçırıyorum acaba?

ete

Toplam isimli değişkeni döngüye girmeden önce sıfırlamaz iseniz, her seferinde okunan adc değerleri üzerine eklenerek sayı değeri 65535'e kadar büyür ve sonra yeniden sıfırlanarak toplama devam eder sonuçlarda hep yanlış çıkar.
ADCIN 2,HAM komut satırından hemen sonra ,
TOPLAM=0 komutu ilave edilmeli.

ADCON0 konusunda yazdığınız açıklama doğru değil. Basic de de bu tanımlama yapılması gerekir. Yoksa 10 bit ADC okumasını sağa yaslı olarak nasıl elde edersiniz?.

Diğer bir sorunda Sıcaklık hesabında olsa gerek. Kullandığınız formül;
ISI = ((SONUC * 5000) / 1023 )/10  şeklinde.
Maksimum sıcaklığı hesap edersek sonuç 500 çıkıyor bu 50 dereceye tekabül edecek herhalde. Bu durumda 20 derece de 200 olarak hesaplanır ve benzer şekilde 30 derecede 300 olarak hesaplanır. Bu durumda karşılaştırma komutlarınızda yanlış olacak zira siz 20 - 30 şeklinde kullanmışsınız.

Bir diğer konu da SONUC*5000 hesabının 16 biti aşmasıdır. Düşünün 50 derece sıcaklıkta ADC den 1023 okunacak ve 1023 x 5000= 5115000 sonucunu verecektir. Bu durumda o hesabın sonucu sürekli yanlış çıkacaktır.
Bana kalırsa hesap formülünüz;
ISI=(SONUC */1252)/10 şeklinde olmalıdır. BU işlem de aynı sonuçları hesaplar ama 32 bit hesaplama yapacağı için sonuçlar doğru çıkacaktır.
Tabiiki ;
IF ISI>20 AND ISI<30 THEN satırını  IF ISI>200 AND ISI<300 THEN olarak değiştirmeniz gerekir.

Ete


. Kağan

ETE hocam ilgilendiniz teşekkürler.

Alıntı YapDiğer bir sorunda Sıcaklık hesabında olsa gerek. Kullandığınız formül;
ISI = ((SONUC * 5000) / 1023 )/10  şeklinde.
Maksimum sıcaklığı hesap edersek sonuç 500 çıkıyor bu 50 dereceye tekabül edecek herhalde.

burada LM 35 den maksimum 1000 mv gelebiliyor yani 0-100 derece arasında ölçüm yapabiliyor diye bildiğim için yazdım. Yani değer maksimum 204,6 yani 100 derece yani 1000 mv olabiliyor. Bu nedenle 32 bit değerini aşamaz diye yazmıştım.

Alıntı YapBir diğer konu da SONUC*5000 hesabının 16 biti aşmasıdır. Düşünün 50 derece sıcaklıkta ADC den 1023 okunacak ve 1023 x 5000= 5115000 sonucunu verecektir. Bu durumda o hesabın sonucu sürekli yanlış çıkacaktır.
Yani 50 derece için LM35 entegresi 102,3 değerini, 100 derece için 204,6 değerini oluşturacak ve 1000 milivolttan daha yüksek gerilim veremeyecek. Bu durumda da taşma olma ihtimali olmayacak diye düşünmüştüm.

   Yanlışmı düşünmüşüm?

. Kağan

#3
Hocam ayrıca söylediklerinizi aşağıdaki gibi düzelttim fakat yine durum aynı. Simuasyonda yaptım ondada aynı oluyor.

'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : KAGAN AYANOGLU                                    *
'*  Notice  : Copyright (c) 2014 SERBEST                        *
'*          : All Rights Reserved                               *
'*  Date    : 11.10.2014                                         *
'*  Version : 1.0                                               *
'*  Notes   : 12F675                                              *
'*          :                                                   *
'****************************************************************
@ __config _INTRC_OSC_CLKOUT & _WDT_OFF & _MCLRE_OFF & _CP_OFF

DEFINE OSCCAL_1K      1 'DAHİLİ OSİLATÖRÜ KORUMA TANIMLAMASI
'DEFINE OSC            4 'OSİLATOR ÇALIŞMA HIZI BURADA DAHİLİ 4 MHZ
DEFINE ADC_BITS      10 'A/D çevirim sonucu kaç bit olacak         
DEFINE ADC_CLOC       3 'DAHİLİ OSİLATÖR KULLANILIYOR           
DEFINE ADC_SAMPLEUS  11 'Örnekleme zamanı mikro saniye cinsinden.

CMCON = 7             'TÜM PORTLARDA COMPARATOR KAPALI.
ANSEL=%00010100      '7. BİT 0  OLACAK.
                     '6,5,4. BİT 001 ÇÜNKÜ FOSC/8=2 OLUYOR
                     '3,2,1,0. BİT ANALOG SEÇİM BİTİ. BURADA 2. ANALOG OLDUĞUNDAN 0100 OLUYOR.
TRISIO = %00000100   'GİRİŞLER VE ÇIKIŞLAR BELİRLENİR.                     
ADCON0 = %10000000   'SONUÇLARI SAĞA YASLI OLARAK DEĞERLENDİRİR.                   
WPU = 0                        'DAHİLİ PULLUP DİRENÇLER DEVRE DIŞI

HAM var WORD
ISI VAR WORD
TOPLAM VAR WORD
SONUC VAR BYTE
I VAR BYTE
GPIO=0

PAUSE 100

BASLA:
     GPIO.1=1             ' LEDİ YAK
     PAUSE 200
     GPIO.1=0             ' LEDİ SONDUR
     PAUSE 200
     GPIO.1=1             ' LEDİ YAK
     PAUSE 200
     GPIO.1=0             ' LEDİ SONDUR
     
     ADCIN 2,HAM           'ADC KANALINI OKU
     TOPLAM = 0            'TOPLAM DEĞERİ 1. DEN SONRAKİ SİKLUSLAR İÇİN SIFIRLANDI.
     For I=1 To 10         ' "1" DEN 10'A KADAR YAP. YANİ 10 KEZ ADCIN DEĞERİNİ TOPLA
     TOPLAM=TOPLAM+HAM     'HER SEFERİNDE OKUDUĞUN YENİ DEĞERİ DİĞERLERİNE EKLE
     NEXT I                ' I' YA GİT TEKRAR YAP
     SONUC=TOPLAM/10         'ÇIKAN TOPLAMI 10'A BÖL VE ORTALAMA SONUCU BUL(ORTALAMA ALINDI)
       
     ISI=(SONUC */1252)/10
     IF ISI>200 AND ISI<300 THEN  'SICAKLIK 20-30 DERECE ARASINDA İSE
     GOTO UYU                   'UYU ETİKETİNE GİT
     ELSE                       'DEĞİLSE
     GOTO UYAN                  'UYAN ETİKETİNE GİT
     ENDIF
     Goto basla                 'BAŞA GİT

     UYU:
     GPIO.3=1             ' YEŞİL LEDİ YAK
     PAUSE 5000
     GPIO.3=0             ' LEDİ SONDUR
     PAUSE 1000
     GOTO BASLA
     
     UYAN:
     GPIO.1=1             ' KIRMIZI LEDİ YAK
     PAUSE 5000
     GPIO.1=0             ' LEDİ SONDUR
     PAUSE 1000
     GOTO BASLA
END

Maxim

#4
1-bendeki derleyici konfig satırına hata veriyor!
2-SONUC VAR BYTE > SONUC VAR word olmalı
3-gpio.3 çıkış vermez, mclr ucudur.
4-birde goto yerine gosub kullanın.

şöyle
    IF ISI>200 AND ISI<300 THEN  'SICAKLIK 20-30 DERECE ARASINDA İSE
     GOsub UYU                   'UYU ETİKETİNE GİT
     ELSE                       'DEĞİLSE
     GOsub UYAN                  'UYAN ETİKETİNE GİT
     ENDIF
     
     Goto basla                 'BAŞA GİT


     UYU:
     GPIO.0=1             ' YEŞİL LEDİ YAK
     PAUSE 5000
     GPIO.0=0             ' LEDİ SONDUR
     PAUSE 1000
     return
     
     UYAN:
     GPIO.1=1             ' KIRMIZI LEDİ YAK
     PAUSE 5000
     GPIO.1=0             ' LEDİ SONDUR
     PAUSE 1000
    return

Maxim

ete abi kızmaz umarım bana :)

neden picbasic kullanıcıları proton+ kullanmaz anlamam :)
-float sayı var
-gerçek interrupt var
-proteusta real time satır satır kod çalıştırma var

örnek olsun diye yukarıdaki kodu protonda derledim
proteusta satır satır simulasyon yaparak göstermek istiyorum.
videoyu 480p modunda seyrediniz daha net görünür.

http://youtu.be/4ZD5Ow5Eyl8


. Kağan

#7
Merhaba Maksim,

Önce yardımına teşekkür ederim. Ben 1 yıl önce bu konular hakkında hiçbir şey bilmiyordum. ETEPİC te okuduklarımdan sonra öğrenmeye başladım ve ETE kardeş Picbasic kullandığı için bende onu öğrendim. Zaten kendisi diğer derleyicilerle yazılmış kodlara pek destek vermiyor. :) Yani geçmişim bu konu da bu kadar. :)

Senin derleyici proton plus anlıyorum. Ama bu saatten sonra protonuda öğrenmek zor be kardeşim. Zaten 40 ı geçtik. Neyse kafanızı ağrıtmayayım.

Senin söylediğin gibi düzeltmeleri yaptım fakat bende yine çalışmıyor. Simüle de edemediğimden anlayamıyorum hatayı. Fakat bendeki derleyici hata vermesede konfig satırında bir hata olabilir. Çünkü örneğin _WDT_Off yaptığımda program hiç çalışmıyor. Yani kırmızı led bile yanmıyor.

Programcığın son hali şöyle ama yine bu ufaklık çalışmıyor.
ETE Sigorta konusunda yardım edermi acaba?   ???
@ __config _INTRC_OSC_NOCLKOUT & _WDT_ON & _MCLRE_OFF & _CP_OFF

DEFINE OSCCAL_1K      1 'DAHİLİ OSİLATÖRÜ KORUMA TANIMLAMASI
'DEFINE OSC            4 'OSİLATOR ÇALIŞMA HIZI BURADA DAHİLİ 4 MHZ
DEFINE ADC_BITS      10 'A/D çevirim sonucu kaç bit olacak         
DEFINE ADC_CLOC       3 'DAHİLİ OSİLATÖR KULLANILIYOR           
DEFINE ADC_SAMPLEUS  11 'Örnekleme zamanı mikro saniye cinsinden.

CMCON = 7            'TÜM PORTLARDA COMPARATOR KAPALI.
ANSEL=%00010100      '7. BİT 0  OLACAK.
                     '6,5,4. BİT 001 ÇÜNKÜ FOSC/8=2 OLUYOR
                     '3,2,1,0. BİT ANALOG SEÇİM BİTİ. BURADA 2. ANALOG OLDUĞUNDAN 0100 OLUYOR.
TRISIO = %00000100   'GİRİŞLER VE ÇIKIŞLAR BELİRLENİR.                     
ADCON0 = %10000000   'SONUÇLARI SAĞA YASLI OLARAK DEĞERLENDİRİR.                   
WPU = 0

HAM var WORD
ISI VAR WORD
TOPLAM VAR WORD
SONUC VAR WORD
I VAR BYTE
GPIO=0

PAUSE 100

BASLA:
     GPIO.1=1             ' LEDİ YAK
     PAUSE 200
     GPIO.1=0             ' LEDİ SONDUR
     PAUSE 200
     GPIO.1=1             ' LEDİ YAK
     PAUSE 200
     GPIO.1=0             ' LEDİ SONDUR
     
     ADCIN 2,HAM           'ADC KANALINI OKU HAM'a yaz.
     TOPLAM = 0            'TOPLAM DEĞERİ 1. DEN SONRAKİ SİKLUSLAR İÇİN SIFIRLANDI.
     For I=1 To 10         ' "1" DEN 10'A KADAR YAP. YANİ 10 KEZ ADCIN DEĞERİNİ TOPLA
     TOPLAM=TOPLAM+HAM     'HER SEFERİNDE OKUDUĞUN YENİ DEĞERİ DİĞERLERİNE EKLE
     NEXT I                ' I' YA GİT TEKRAR YAP
     SONUC=TOPLAM/10         'ÇIKAN TOPLAMI 10'A BÖL VE ORTALAMA SONUCU BUL(ORTALAMA ALINDI)
     
     
     ISI = (SONUC*5)/1023    'Maximin yazdığı kod.
     ISI = ISI *100   
     'ISI = ((SONUC * 5000) / 1023 )/10
     'ISI=(SONUC */1252)/10
     IF ISI>20 AND ISI<30 THEN  'SICAKLIK 20-30 DERECE ARASINDA İSE
     GOSUB UYU                   'UYU ETİKETİNE GİT
     ELSE                       'DEĞİLSE
     GOSUB UYAN                  'UYAN ETİKETİNE GİT
     ENDIF
     Goto basla                 'BAŞA GİT

     UYU:
     'SLEEP 600
     GPIO.4=1             ' YEŞİL LEDİ YAK
     PAUSE 5000
     GPIO.4=0             ' LEDİ SONDUR
     PAUSE 1000
     RETURN
     
     UYAN:
     GPIO.1=1             ' KIRMIZI LEDİ YAK
     PAUSE 5000
     GPIO.1=0             ' LEDİ SONDUR
     PAUSE 1000
     RETURN
END
 

ete

#8
Sigorta ayarlarında hata yok. Ama kurduğunuz döngüde hata var.
10 adet ADC okuması yapıp okunan değerleri toplayarak sonra 10 bölmekle ADC ortalaması alırsınız.
Ama sizin döngüde yalnızca 1 kere ADC okuması yapılıyor ama aynı şey 10 defa toplanıyor. Döngü hiç işe yaramıyor desek yeridir.
ADC okuma komutu döngü içinde olmalıdır.
Bana göre hala formül de yanlış. Doğru ve çalışan program aşağıdaki şekilde olmalıdır.
@ __config _INTRC_OSC_NOCLKOUT & _WDT_OFF & _MCLRE_OFF & _CP_OFF

DEFINE OSCCAL_1K      1 'DAHİLİ OSİLATÖRÜ KORUMA TANIMLAMASI
DEFINE OSC            4 'OSİLATOR ÇALIŞMA HIZI BURADA DAHİLİ 4 MHZ
'DEFINE ADC_BITS      10 'A/D çevirim sonucu kaç bit olacak         
'DEFINE ADC_CLOC       3 'DAHİLİ OSİLATÖR KULLANILIYOR           
'DEFINE ADC_SAMPLEUS  11 'Örnekleme zamanı mikro saniye cinsinden.

DEFINE ADC_BITS 10    ' ADCIN resolution  (Bits)
DEFINE ADC_CLOCK 1    ' ADC clock source  (Fosc/8)
DEFINE ADC_SAMPLEUS 20 ' ADC sampling time (uSec)

CMCON = 7            'TÜM PORTLARDA COMPARATOR KAPALI.
ANSEL=%00010100      '7. BİT 0  OLACAK.
                     '6,5,4. BİT 001 ÇÜNKÜ FOSC/8=2 OLUYOR
                     '3,2,1,0. BİT ANALOG SEÇİM BİTİ. BURADA 2. ANALOG OLDUĞUNDAN 0100 OLUYOR.
TRISIO = %00000100   'GİRİŞLER VE ÇIKIŞLAR BELİRLENİR.                     
ADCON0 = %10000000   'SONUÇLARI SAĞA YASLI OLARAK DEĞERLENDİRİR.                   
WPU = 0

HAM    var WORD 56
ISI    VAR WORD 58
TOPLAM VAR WORD 60
SONUC  VAR WORD 62
I      VAR BYTE 64
GPIO=0

PAUSE 100

BASLA:
     GPIO.1=1             ' LEDİ YAK
     PAUSE 200
     GPIO.1=0             ' LEDİ SONDUR
     PAUSE 200
     GPIO.1=1             ' LEDİ YAK
     PAUSE 200
     GPIO.1=0             ' LEDİ SONDUR
     TOPLAM = 0
     For I=1 To 10
     ADCIN 2,HAM           'ADC KANALINI OKU HAM'a yaz.
     TOPLAM=TOPLAM+(HAM+1)     'HER SEFERİNDE OKUDUĞUN YENİ DEĞERİ DİĞERLERİNE EKLE
     NEXT I                ' I' YA GİT TEKRAR YAP
     SONUC=TOPLAM/10         'ÇIKAN TOPLAMI 10'A BÖL VE ORTALAMA SONUCU BUL(ORTALAMA ALINDI)
     
     ISI=SONUC*/125     '

     IF ISI>20 AND ISI<30 THEN  'SICAKLIK 20-30 DERECE ARASINDA İSE
     GOSUB UYU                   'UYU ETİKETİNE GİT
     ELSE                       'DEĞİLSE
     GOSUB UYAN                  'UYAN ETİKETİNE GİT
     ENDIF
     Goto basla                 'BAŞA GİT

     UYU:
     'SLEEP 600
     GPIO.4=1             ' YEŞİL LEDİ YAK
     PAUSE 5000
     GPIO.4=0             ' LEDİ SONDUR
     PAUSE 1000
     RETURN
     
     UYAN:
     GPIO.1=1             ' KIRMIZI LEDİ YAK
     PAUSE 5000
     GPIO.1=0             ' LEDİ SONDUR
     PAUSE 1000
     RETURN
END


Sensör , derece başına 10mv voltaj vermektedir. 100 derece de 100*10=1000mv voltaj verecektir.
ADC okuması 5000 mv da 1024 digital kademe (sıfır dahil) değer verir. Ohalde 1000 mv için vereceği değer;
1024*1000/5000=204,8 olacaktır. 100 dereceye karşılk okunacak ADC değeri 204,8 olacaktır.
Bu durumda sabit çarpanımız 100/204,8*256=125 olarak bulunur.
O halde formül, ISI=(HAM+1)*/125  şeklinde uygulanmalıdır.

Ete

. Kağan

#9
Büyüksün ETE kardeş.

Vaktin olursa bir kaç sorum olacak.
HAM    var WORD 56
ISI    VAR WORD 58
TOPLAM VAR WORD 60
SONUC  VAR WORD 62
I      VAR BYTE 64


tanımlamalarında yazan 56-58-60-62-64 rakamları neyi ifade ediyor.
ve ayrıca
TOPLAM=TOPLAM+(HAM+1)


satırında niçin (HAM+1) YAZIYORUZ. Bu satırı TOPLAM=TOPLAM+HAM yazınca hep aynı değerimi ekliyor. Yani HAM+1 yeni bir okumayı mı temsil ediyor.

ilaveten
ISI=SONUC*/125

satırında " */ " işlemi tam olarak neyi ifade ediyor.

Teşekkürler.

ete

Değişkenlerin yanındaki rakamlar, o değişkenin pic hafızasındaki yerleşeceği adresi belirliyor. Normalde derleyici otomatik bir adres veriyor. Ancak simulasyonda değişkenlerin aldığı değerleri "watch Window" da izleyebilmek için değişkenin hangi adrese yerleştiğini ve tipini (byte veya word) bilmek gerekiyor. Bu nedenle yerleşeceği adresleri ben belirleyerek izlenmelerini sağlayabiliyorum. İzleme yapmayacaksanız adres vermeye gerek yoktur.

ISI değerini hesaplarken toplam 1024 kademeyi dikkate alıyoruz. ADC den okunan değer maksimum 1023 dür. Bu sayıyı hesaplamada 1024 olarak kullanmamız gerekiyor bu nedenle 1 ekliyorum. BU şekilde sonuş doğru çıkıyor. Eklemeden de kullanılabilir ancak sabi çarpanı 125 değilde 125,2 gibi bir değerde almak gerekir. BUnlarla uğraşmamak için okunan değere  1 eklersek daha uygun oluyor.

ISI=SONUC*/125 işlemindeki "*/" operatörü 32 bitlik çarpma yapıp 32 bitlik sonucun ortada yer alan 16 bitlik kısmını veren yani kalanı 256 ya bölerek veren bir işlemdir. Açıklamasını daha iyi anlamak için işlemleri hexadesimal sistemde yapmak gerekir.
1000 ile 125 i çarparsam (1000 * 125=) sonuç 125.000 çıkar bu sayı HEX olarak 1E848 dir. Yada şöyle yazmak (32 bit formatında) daha doğrudur  00 01 E8 40
Aynı işlemi */ 125 ile yaparsak (1000 */125=) sonuç 1E8 olarak çıkar. 16 bit formatında 01 E8 şeklinde yazılır.
Dikkat edilirse  ilk çarpamaya göre yalnızca ortadaki 2x8 bitlik değer alınıyor. BU sayının 256 ya bölünmüş hali demektir.
Bu nedenle hesap makinası ile 1000 */ 125 işlemini şöyle yaparız. (1000 * 125)/256
Sırf bu yüzden sabit çarpanı bulurken (100 / 204,8)*256 şeklinde sonucu 256 ile çarpıyoruz. Çünki hesap sonucu 256 ya bölünmüş olarak veriliyor bize. Bir sayıyı 256 ile çarpıp yeniden 256 ya bölersen sayı değeri değişmeyecektir işte bu özelliği kullanarak sabit çarpan hesabında önce 256 ile çarpıyor sonra */ işleminde otomatik 256 ya bölünmüş olarak sonucu almış oluyoruz.

Ete

Powered by EzPortal