pbp " >= " büyük eşit de hata...

Başlatan mikro29, 14 Ekim 2006, 08:56:18

mikro29

s.a.
Aşağıda yazılan programda eğer volt 4 veya 4 den büyük ise ve mvolt 2 veya 2 den büyük ise kontrol = $A9 olmayacakmı... Benmi yanlış yapıyorum. Bazen volt  = 5 oluyor. İyi günler.

IF volt >= 4 and mvolt >= 2 then kntrl = $A9

ustad

Alıntı yapılan: "mikro29"s.a.
Aşağıda yazılan programda eğer volt 4 veya 4 den büyük ise ve mvolt 2 veya 2 den büyük ise kontrol = $A9 olmayacakmı... Benmi yanlış yapıyorum. Bazen volt  = 5 oluyor. İyi günler.

IF volt >= 4 and mvolt >= 2 then kntrl = $A9

if li satırın sonunda endif olması gerekmektedir.
IF (volt >= 4 and mvolt >= 2) then 
              kntrl = $A9
         endif

Ayrıca Volt 5 olduğu zaman Mvolt ne oluyor buna göre kntrl nin değeri söylenebilir.

Kolay Gelsin...

ete

Sorunu iyi anlayamadım. Ne demek bazen volt=5 oluyor. Komut da volt kontrolü yok ki. Yoksa sorun şumu volt 4 ve üzeri ve mvolt da 2 ve üzeri olmasına rağmen kntrl=$A9 olmuyormu ! .
En iyisi sorunu daha açık sor.
Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

ibrsel

@ustad demişki;
Alıntı Yap
if li satırın sonunda endif olması gerekmektedir.

Eğer if komutu tek ile yaptığın karşılaştırma veya değerlendirme işlemi tek satırdan oluşuyor ise "Endif" kullanmana gerek yoktur.

Yani;

If a>=5 and b<10 then goto git

gibi bir satır yazar isen endif e gerek kalmaz..

Ama;

If a>=5 and b<10 then
 a=a+b
..
..
endif

gibi birden fazla işlem yapacaksan if döngüsünü endif ile kapatmalısın.

Herkese iyi çalışmalar..

mikro29

Merhaba arkadaşlar verdiğiniz cevaplar için teşekkürederim,

16f877 analog girişini kullanarak voltmetre yapıyorum. yapmak istediğim girişdeki voltaj 4.2 olduğu zaman veya bu voltajı geçtiği zaman pic e bağlı rölenin çekmesi ama bazen girişdeki voltaj örneğin 4.5 volt olduğu zaman röle çekmiyor hatta 5 volt olduğu zaman da çekmiyor.(her zaman olmuyor.) voltajı lcd ekranda okuyorum.Birde akım ölçmeye örnek kod verebilirseniz forumda biraz araştırdım ama tam açık kod ve şema bulamadım  :oops:

Veli B.

Bu kadar uzun ve sıkıntılı yollarla uğraşmak yerine, analog dönüşüm sonucunu direkt işleme alsan ve karşılaştırmanı buna göre yapsan ne kod uzar nede hızın düşer, üstelik işlemde kaçırmazsın.

Ör:
Vref           =+5V
Çözünürlük = 10 bit(1024)
Birim değer =5000mv/1024(PBP  float desteği içermediği için yaklaşık 5 mv alalım)
Set deger    =4200/5 (4.2 volt için ve bütün değerleri mv tabanında değerlendiriyoruz)

V VAR WORD ' 65535 E KADAR DEPOLA
.
.

V=adin 0
IF V>840 then 
Buraya yaptırmak istediğin rutini yazabilirsin

ENDIF
.
.
.


Temel mantık olarak verdim.Kod duruma göre revize edilmelidir.

ete

@mikro29,
mutlaka volt veya mv hesabında bir yanlışlık vardır. Yoksa pic bu konuda hata yapmaz. Doğruyu bulmak için yazdığın kodu da buraya koyarsan gerekli düzeltmeyi yapabiliriz.

Pic kullanarak yapılan voltmetrede takip edilecek adımlar şunlar olmalı.
-Önce ölçülecek voltaj maksimum nereye çıkıyor ise bu değer esas alınarak bir voltaj bölücü hazırlayıp voltajın maksmum olduğu durumda pic AN0 girişine en fazla 5V gitmesi sağlanır.

- Sonra Analog girişten okunacak bilginin voltaja çevrilmesi işi yapılır.
 Burada komut;
 ADCIN 0, HAM   ' okunan değer HAM isimli değişkene aktarılacaktır.
 Burdan sonra okunan değerin voltaja çevrilmesi işi gelir.
 Diyelimki Voltmetre 0-30 Volt arasında çalışacak. O halde pic'e 5 Volt geldiğinde okunan 1023 (+1)=1024 digital değeri 30 volta denk gelecektir.
Bu durumda hesabımız  (30 * 100 /1024 )*256 = 750
O halde digital okuma değerini ;
ARA=((HAM+1)*/750)/10 'bu işlemin karşılığı=((ham+1)*750/256)/10
VOLT=ARA/10
VOLT_ONDALIK=ARA//10

BU arada Adcon1 registerine uygun bir değer verilmelidir. Mesela %ADCON1=%10000101
Ayrıca analog kanal parametreleri programın başında verilmeli
DEFINE ADC_BITS     10     ' Set number of bits in result
DEFINE ADC_CLOCK     3     ' Set clock source (rc = 3)
DEFINE ADC_SAMPLEUS 50 ' Set sampling time in microseconds

Hepsi bu kadar.
Anlaşılmayan husus olursa yine sorarsın.

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

mikro29

arkadaşlar tam olarak yapmak istediğim 20 akü (4 V  8Ah) şarj eden bir makina var bu makina yeni aküleri 2-3 haftada öldürüyor aküler daha şarj tutmuyor. Benim düşüncem akü tam şarj olduğu zaman hangi akü dolu ise onu devre dışı bırakmak. 877 analog girişine cd 4067 bağladım burdan akülere gidiyor. Yardımlarınızı bekliyorum açık kodu yazıyorum.

[code]
TRISA=%00000001
TRISB=%00000000
TRISC=%00000000
TRISD=%00000000
TRISE=%00000000
'-------------------------------------------------------------------------------
@ DEVICE pic16F877
@ DEVICE pic16F877, WDT_on
@ DEVICE pic16F877, PWRT_ON
@ DEVICE pic16F877, PROTECT_OFF
@ DEVICE pic16F877, XT_OSC
'-------------------------------------------------------------------------------
define OSC 4
DEFINE LCD_DREG      PORTB   
DEFINE LCD_DBIT      4      
DEFINE LCD_EREG      PORTB   
DEFINE LCD_EBIT      3      
define LCD RWREG    PORTB  
define LCD_RWBIT    2      
DEFINE LCD_RSREG   PORTB   
DEFINE LCD_RSBIT   1      
DEFINE LCD_BITS      4      
DEFINE LCD_LINES   2      

DEFINE   ADC_BITS   10       
DEFINE   ADC_CLOCK   3       
DEFINE   ADC_SAMPLEUS   100   
'-------------------------------------------------------------------------------
ADCON1=%10001110
'-------------------------------------------------------------------------------
HAM    var  word                                                                        
VOLT   var  word
Mvolt  var  byte
kntrl  var  byte
akuno  var  byte
yetki  var  portd.0
high yetki
'-------------------------------------------------------------------------------
Low PORTB.2      
LCDOut $FE,1   
pause 200      
'-------------------------------------------------------------------------------
porta=%00000000
portb=%00000000
portc=%00000000
portd=%00000000
porte=%00000000
kntrl = 0
akuno = 0
DEVAM:
high yetki
   PORTC= $0
   GOSUB BASLA
   IF HAM= 922 then kntrl = $0:yetki = 0:lcdout $fe,1,"     AK",$F5," DOLU"
   akuno = 1
   gosub kontrol
   PORTC= $1
   GOSUB BASLA
   IF HAM>= 922 then kntrl = $A9:yetki = 0:lcdout $fe,1,"     AK",$F5," DOLU"
   akuno = 2
   gosub kontrol
   PORTC= $2
    GOSUB BASLA
   IF HAM>= 922 then kntrl = $2:yetki = 0:lcdout $fe,1,"     AK",$F5," DOLU"
   akuno = 3
   gosub kontrol
   PORTC= $3
    GOSUB BASLA
   IF HAM>= 922 then kntrl = $3:yetki = 0:lcdout $fe,1,"     AK",$F5," DOLU"
   akuno = 4
   gosub kontrol
   PORTC= $4
    GOSUB BASLA
   IF HAM>= 922 then kntrl = $4:yetki = 0:lcdout $fe,1,"     AK",$F5," DOLU"
   akuno = 5
   gosub kontrol
   PORTC= $5
    GOSUB BASLA
   IF HAM>= 922 then kntrl = $5:yetki = 0:lcdout $fe,1,"     AK",$F5," DOLU"
   akuno = 6
   gosub kontrol
   PORTC= $6
    GOSUB BASLA
   IF HAM>= 922 then kntrl = $6:yetki = 0:lcdout $fe,1,"     AK",$F5," DOLU"
   akuno = 7
   gosub kontrol
   PORTC= $7
    GOSUB BASLA
   IF HAM>= 922 then kntrl = $7:yetki = 0:lcdout $fe,1,"     AK",$F5," DOLU"
   akuno = 8
   gosub kontrol
   PORTC= $8
    GOSUB BASLA
   IF HAM>= 922 then kntrl = $8:yetki = 0:lcdout $fe,1,"     AK",$F5," DOLU"
   akuno = 9
   gosub kontrol
   PORTC= $9
    GOSUB BASLA
   IF HAM>= 922 then kntrl = $A9:yetki = 0:lcdout $fe,1,"    AK",$F5," DOLU"
   akuno = 10
   gosub kontrol
   PORTC= $A
    GOSUB BASLA
   IF HAM>= 922 then kntrl = $A:yetki = 0:lcdout $fe,1,"     AK",$F5," DOLU"
   akuno = 11
   gosub kontrol
   PORTC= $B
    GOSUB BASLA
   IF HAM>= 922 then kntrl = $B:yetki = 0:lcdout $fe,1,"     AK",$F5," DOLU"
   akuno = 12
   gosub kontrol
   PORTC= $C
    GOSUB BASLA
   IF HAM>= 922 then kntrl = $C:yetki = 0:lcdout $fe,1,"     AK",$F5," DOLU"
   akuno = 13
   gosub kontrol
   PORTC= $D
    GOSUB BASLA
   IF HAM>= 922 then kntrl = $D:yetki = 0:lcdout $fe,1,"     AK",$F5," DOLU"
   akuno = 14
   gosub kontrol
   PORTC= $E
    GOSUB BASLA
   IF HAM>= 922 then kntrl = $E:yetki = 0:lcdout $fe,1,"     AK",$F5," DOLU"
   akuno = 15
   gosub kontrol
   PORTC= $F
    GOSUB BASLA
   IF HAM>= 922 then kntrl = $F:yetki = 0:lcdout $fe,1,"     AK",$F5," DOLU"
   akuno = 16
   gosub kontrol
   goto devam
kontrol:
 high yetki
 pause 100
 LCDOUT $FE,$C0,"AK",$F5,"  ", #akuno
 pause 1000
 VOLT = 0
 return
 goto basla
 BASLA:
     ADCIN 0,HAM  
   
BAK:  IF ADCON0.2=1 THEN BAK
   
HESAP:
     HAM=ham+1
     Volt=(ham */ 1250)/100
     Mvolt=volt//10
     Volt=Volt/10
     LCDOUT $FE,1,"V=",#VOLT,",",#MVOLT,"  HAM=",#HAM
     RETURN
    end