IF-THEN ve FOR-NEXT dongulerinde ondalıklı sayı

Başlatan OG, 30 Ekim 2005, 22:02:35

OG

Arkadaşlar Merhaba

ADC ile elde edilmiş byte veya word tipindeki bir değişken x ise bunu

y=x/2 ,
y=x/3 ,
y=x/4 ,
y=x/5    

gibi bölüp if-then ve for-next dongulerinde kullanmak istiyorum.

FOR z=1 TO y

IF y=z THEN ....   gibi

Kimi zaman bölünme ile elde edilen bu değer ondalıklı olacaktır. Bu durumlarda dongüde problem cıkarmı, çıkarsa tamsayı tarafını kullanmak için nasıl ayırabilirim?

Problem çıkmıyorsa ayırmadan kullandığımda sayıyı degerlendirme sekli nasıl olur?
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

mhk

Sevgili OG , tamsayı bölmede ondalıklı işlemlerle karşılaşmazsın, dolayısıyla ayrı bir uğraşıyada gerek yok. Yani 100/2=50 , 101/2=50 , 102/2=51 olacak şekilde sonuçlar çıkar.Veya 1000/3=333 ,1001/3=333 ,1002/3=334 örnekleri artırmak mümkün.Sanırım bu açıklama yeterli olacaktır.
"Ya olduğun gibi görün, Ya da göründüğün gibi ol..." Mevlana

OG

FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

lord

hangi programlama dilini kullaniyorsun değişkenlerin float tiptemi tamsayi tiptemi picbasic kullaniyorsan özel bir uğraş vermesen değişkenler tamsayidir ve bölme işleminin ondalikli kismi değişkene atanir... :)

OG

@lord

Evet PBP ile deniyorum, x değişkeni de sürekli ayarı ile oynanabilecek bir pot'dan alınıyor ADC ile 8 veya 10 bit çevriliyor.

Burada birşey daha danışayım

12F675 için
ADCON0.1 = 1
girisyakalama: 
if ADCON0.1 = 1 then girisyakalama  
PauseUs 20             
x = ADRESL


ADCON0.1=1 komutu ile yakalama baslıyor ve yakalama suresince 1 değerinde kalıyormus, yakalama bitince 0 oluyormus. Bu sebeple belli bir pause süresi verin diyorlar. Ancak ben yukarıdaki gibi dongu ile 1'de kaldığı sürece loop olusturdum. Bu durumda pause işlemine gerek varmıdır?
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

lord


ete

@OG,


Alıntı yapılan: "OG"ADCON0.1=1 komutu ile yakalama baslıyor ve yakalama suresince 1 değerinde kalıyormus
Burada bir hata var Adcon0.1 biti değil Adcon0.2 biti olması gerekir.!!!

Adcon0 registerinin 2 biti ADC işlemine ait status bitidir. İşlem devam ettiği müddetçe bu bit 1 konumunda bekler işlem sona erince otomatikman bit sıfır olur.

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

OG

Sevgili ete, buradan yanlışmı bakıyorum anlayamadım?

bit 7 ADFM: A/D Result Formed Select bit
1 = Right justified
0 = Left justified

bit 6 VCFG: Voltage Reference bit
1 = VREF pin
0 = VDD

bit 5-4 Unimplemented: Read as zero

bit 3-2 CHS1:CHS0: Analog Channel Select bits
00 = Channel 00 (AN0)
01 = Channel 01 (AN1)
10 = Channel 02 (AN2)
11 = Channel 03 (AN3)

bit 1 GO/DONE: A/D Conversion Status bit
1 = A/D conversion cycle in progress. Setting this bit starts an A/D conversion cycle.
This bit is automatically cleared by hardware when the A/D conversion has completed.
0 = A/D conversion completed/not in progress

bit 0 ADON: A/D Conversion STATUS bit
1 = A/D converter module is operating
0 = A/D converter is shut-off and consumes no operating current
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

ete

@OG,
Kusura bakma sen haklısın. Ben hata yaptım. Sürekli 16F876 ve 877 ile uğraşıyorum ve orada aklımda kalmış 2 bit diye. 675 in da aynıdır diye düşünmüştüm. Data sheete bakınca senin haklı olduğunu anladım.

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

OG

Estağfirullah üstat, ben yanlış yapmayayım, emin olayım diye.
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

OG

Bazı konuları kafamda çözemedim.

Adam 12F675 ile ADC kullanımında şöyle bir çalışma yapmış.

GPIO.0 giriş olarak kullanılmış ve bir pot üzerinden değişik değer alıyor. ADC ile durum tespit ediliyor.

Diğer 1, 2, 4 nolu portlarından çıkış alarak girişteki değere göre ikaz çıkışı alıyor.

Gereken atamalar yapılmış ;

DEFINE ADC_BITS 10
DEFINE ADC_CLOCK 3
DEFINE ADC_SAMPLEUS 50
number VAR word

CMCON = 7          ' Comparators off
ANSEL = %00000001  ' GPIO.0 A/D giriş
ADCON0.7 = 1      
TRISIO = %00000001 ' Giriş çıkış atanmış


Pause 100

Loop:
   ADCIN 0, number ' (0-1023)
   IF (number > 0) AND (number < 400) Then
     GPIO = %00000010 Burada GPIO.0 giriş iken çıkış durumuna gecmiyormu ve 0 değeri almıyormu, oysa bu pin giriş olmalı ve öyle atanmıştı
      EndIF
   IF (number > 401) AND (number < 800) Then
     GPIO = %00000100 Aynı durum
     EndIF
   IF (number > 801) AND (number < 1024) Then
     GPIO = %00010000 Aynı durum
     EndIF
   number = 0
   GoTo loop
   
   End


-Yani önceden ADC girişi atanmış bu pin program içinde çıkış konumuna geçiyor ve daha sonra "ADCIN 0, number" satırı ile tekrar giriş konumunu alıyor doğrumudur?
-Bu şekilli çalışmanın donanımsal mahsuru olurmu? Neden derseniz bu pin üzerinden bir pot ile giriş verirken kimi zaman direk 5V  bağlanacak çıkışın o anki L (0V) konumu bir kısa devreye sebep olacak, doğrumu düşünüyorum?
-Yanılmadı isem bunun çözümü
GPIO.1=x
GPIO.2=x
GPIO.4=x
şeklindemidir?
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

ete

@OG,

Yanlışdüşünüyorsun.
Adam sıfır nolu pin'i giriş yapmış ve oradan ADC değeri okuyor.
Okunan değer 0-1023 arasındadır. Okunan değere bağlı olarak;
şayet değer 0-40 arasında ise High Port.1 (GPIO.1) yapılıyor.
Şayet okunan değer 400-800 arasında ise bu sefer High Port.2 (GPIO.2) yapılıyor.
Şayet okunan değer 800-1024 arasında ise High Port.4 (GPIO.4)  yapılıyor.
Gördüğün gibi TRIS yani yön registeri ile oynamamış.
ETE
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

CaFFeiNe

GPIO ile TRISIO yu karıştırıyorsun kendini acayip bir şekilde kaptırmışsın galiba  :)

OG

Arkadaşlar teşekkür ederim. Belki kafamı karıştıran okuduklarım. Çünkü şöyle bir şey hatırlıyorum, "bir pine 0 veya 1 gibi bir değer atanınca o pin otomatikman çıkış konumunu alır" diyordu.

Başlangıçtaki TRISO atamalarında GPIO.0 input konumunda. Oysa dongu içinde GPIO = %00000010  demekle GPIO.0=0 değeri atanmış oluyor. Yani böylece çıkış konumu alıyor diye düşündüm.

Demekki yanlış hatırlamışım.

Edit;

İlgili konu şöyle:

LOW

LOW Pin

Make the specified Pin low. Pin is automatically made an output. Pin may be a constant, 0 - 15, or a variable that contains a number 0 - 15 (e.g. B0) or a pin name (e.g. PORTA.0).

   LOW 0      ' Make Pin0 an output and set it low (0 volts)
   LOW PORTA.0   ' Make PORTA, pin 0 an output and set it low (0 volts)

led   var   PORTB.0   ' Define LED pin
   LOW led      ' Make LED pin an output and set it low (0 volts)   
Alternatively, if the pin is already an output, a much quicker and shorter way (from a generated code standpoint) to set it low would be:

   PORTB.0 = 0   ' Set PORTB, pin 0 low


HIGH

HIGH Pin
Make the specified Pin high. Pin is automatically made an output. Pin may be a constant, 0-15, or a variable that contains a number 0-15 (e.g. B0) or a pin name (e.g. PORTA.0).

   HIGH 0         ' Make Pin0 an output and set it high (~5 volts)
   HIGH PORTA.0      ' Make PORTA, pin 0 an output and set it high (~5 volts)

led   var   PORTB.0      ' Define LED pin
   HIGH led      ' Make LED pin an output and set it high (~5 volts)   
Alternatively, if the pin is already an output, a much quicker and shorter way (from a generated code standpoint) to set it high would be:

   PORTB.0 = 1      ' Set PORTB pin 0 high


Bu durumda High veya low komutu port=1 veya port=0 anlamına gelmiyormu?
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.