bir degişkeni 60'a bölüp sonucu ondalıklı olarak ekrana yazma ?

Başlatan Evren KILIÇ, 19 Haziran 2010, 22:43:41

Evren KILIÇ

 arkadaşlar;
aşağıda kod larda bir sorunum var
LCDOUT $FE,$C0,"FREKANS=",# FREKANS1," ",".",#FREKANS2," ","Hz" satırında frekans2 degerini istediğim gibi yazdıramıyorum
yani atıyorum SET 550 ise  ekranda frekans :9,16 Hz yazmalı ama bu ondalık kısmı yazdıramadım ,ayrıca bu frekans degişkeninin değerinde portb.3 dan lojik 1 alabilirmiyim mesela frekans 9,16 ise portb.3 den saniyede 9,16 defa lojik 1 almak istiyorum ama şu anda nasıl yapacagımı bilmiyorum :)



PORTA=%1111110
PORTB=%0000000
DEFINE LCD_DREG      PORTB   'LCD data bacakları hangi porta bağlı?
DEFINE LCD_DBIT      4      'LCD data bacakları hangi bitten başlıyor?
DEFINE LCD_RSREG   PORTB   'LCD RS Bacağı Hangi Porta bağlı ?
DEFINE LCD_RSBIT   1      'LCD RS bacağı Hangi Bite bağlı ?
define lcd_RWREG    PORTB
define LC_RWBIT     2
DEFINE LCD_EREG      PORTA   'LCD Enable Bacağı Hangi Porta bağlı?
DEFINE LCD_EBIT      0      'LCD Enable Bacağı Hangi bite bağlı ?
DEFINE LCD_BITS      4      'LCD 4 bit mi yoksa 8 bit olarak bağlı?
DEFINE LCD_LINES   2      'LCD Kaç sıra yazabiliyor
OPTION_REG.7=1
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
@ DEVICE pic16F628A
@ DEVICE pic16F628A, WDT_ON
@ DEVICE pic16F628A, PWRT_ON
@ DEVICE pic16F628A, PROTECT_OFF
@ DEVICE pic16F628A, MCLR_OFF
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
DEVIR   var  word
FREKANS1 VAR WORD
FREKANS2 VAR WORD
YSET VAR WORD
ASET VAR WORD
SET VAR WORD
BYSET VAR PORTA.5  'YUKARI SET BUTONU
BASET VAR PORTA.4  'AŞAĞI SET BUTONU

Low PORTB.2      ' LCD R/W line low (W), şemada direkt GND ye bağlanabilir.
LCDOut $FE,1   ' LCD de CLS yapar
pause 500       ' LCD nin açılması için gerekli süredir.
'-------------------------------------------------------------------------------
         
   SET=500

'PORTB.3 ÇIKIŞ
BASLA:

LCDOUT $FE,$80,"SET DEVIR.=" ,# SET,"     "
LCDOUT $FE,$C0,"FREKANS=",# FREKANS1," ",".",#FREKANS2," ","Hz"

IF BYSET=1 THEN
PAUSE 200
SET=SET+1
IF SET>2400 THEN SET=2400
ENDIF

IF BASET=1 THEN
PAUSE 200
SET=SET-1
IF SET=65535 then set=0
ENDIF
FREKANS1=SET/60
FREKANS2= FREKANS1//10



GOTO BASLA
END

[email]evren1623@hotmail.com[/email]

fatihinanc

Şöyle birşey yapsak istediğiniz gibi olur mu acaba.
Ekranda görünen değer 8.10Hz

LCD yazımı:
LCDOUT $FE,$80,"SET DEVIR.=" ,# SET,"     "
LCDOUT $FE,$C0,"FREKANS=",# FREKANS1,".",#FREKANS2,"Hz"


Frekans ayarlama:
FREKANS1=SET/60
FREKANS2= (FREKANS1 MOD 100)/10
FREKANS2=10+(FREKANS2 MOD 10)
Kainat dediğimiz kitap, yazıldığı dil ve harfler öğrenilmedikçe anlaşılamaz.  (Galileo Galilei)

orhanc

i'm doing nothing... Giddy Up  http://www.drorhan.com

fatihinanc

Kainat dediğimiz kitap, yazıldığı dil ve harfler öğrenilmedikçe anlaşılamaz.  (Galileo Galilei)

orhanc

i'm doing nothing... Giddy Up  http://www.drorhan.com

Evren KILIÇ

Alıntı yapılan: fatihinanc - 19 Haziran 2010, 23:40:56
Şöyle birşey yapsak istediğiniz gibi olur mu acaba.
Ekranda görünen değer 8.10Hz

LCD yazımı:
LCDOUT $FE,$80,"SET DEVIR.=" ,# SET,"     "
LCDOUT $FE,$C0,"FREKANS=",# FREKANS1,".",#FREKANS2,"Hz"


Frekans ayarlama:
FREKANS1=SET/60
FREKANS2= (FREKANS1 MOD 100)/10
FREKANS2=10+(FREKANS2 MOD 10)




teşekkür ederim ama hala bir sorun var galiba set 500 iken frekans:8,33 olmalı ama 8,10 çıkıyor set 1000 iken frekans 16,66 olmalı ama 16,11 çıkıyor
[email]evren1623@hotmail.com[/email]

fatihinanc

problem picbasic in bölme işlemini tam sayı olarak yapmasından kaynaklanıyor.
ÇÖZÜM:
FREKANS1=SET / 60
FREKANS2= SET // 60
FREKANS2=FREKANS2*10
FREKANS2=FREKANS2/60


@orhanc
işte böyle durumlar da C geçmek için çok neden olduğunu gösteriyor bence...

İyi çalışmalar...

Kainat dediğimiz kitap, yazıldığı dil ve harfler öğrenilmedikçe anlaşılamaz.  (Galileo Galilei)

Evren KILIÇ

teşekkür ederim birde bu işlem sonucundaki frekans degerinde portb.3'output alabilirsem bu iş bitecek :)
[email]evren1623@hotmail.com[/email]

fatihinanc

picbasic proda HPWM(donanımsal PWM) diye bir komut vardı sanırım. onu bir araştırsanız iyi olur.
pals süresini değiştirerek frekansı da değiştirebilirsin.
Kainat dediğimiz kitap, yazıldığı dil ve harfler öğrenilmedikçe anlaşılamaz.  (Galileo Galilei)

Evren KILIÇ

sanırım bu komutlar işimi görecek

ZAMAN=SET*10/60
ZAMAN2=10000/ZAMAN
HIGH PORTB.3
PAUSE ZAMAN2/2
LOW PORTB.3
PAUSE ZAMAN2/2
[email]evren1623@hotmail.com[/email]

fatihinanc

evet daha basiti olarak bu yol da tercih edilebilir.
süreleri deneyerek bulmuşsunuz zaten.
iyi çalışmalar.
Kainat dediğimiz kitap, yazıldığı dil ve harfler öğrenilmedikçe anlaşılamaz.  (Galileo Galilei)

ete

Bölme işlemi basic de diğer derleyicilerde olduğu gibi yapılır.
SUNUC=A/B

Ondalıklı yazdırma işi biraz düşünmeyi gerektiren bir iş. Ondalık kaç hane isteniyor ise elde edeceğiniz sonuç o hane sayısı kadar sonucunuzu hane olarak büyütmeniz gerekir. Kısaca virgülden sonra 2 hane isteniyor ise sonuç, normal sayının 2 hane büyüğü yani 100 ile çarpılmış hali olmalıdır.
Bir sayı örneği ile vermek daha doğru olacak.
ELimizde iki sayı var A sayısı A=1000 ve B sayısı =60 olsun. Sonucu xx,zz şeklinde istiyor isem ;
A=A*100 şeklinde bir işlemle önce bölünecek sayıyı 2 hane fazlalaştırırım.
Sonra bölme işlemini yaparak normal sonucun 100 ile çarpılmış halini bulurum.
Sonuc=A/B yani 100000/60 =1666
Şimdi sıra bunları ekrana yazdırmaya geldi. Bu arada hemen belirteyim Basic de de Mod alma işlemi vardır ve kolaylıkla uygulanabilmektedir. Bu yalnızca C dilinde de olan bir husus değildir.
Ekrana tam sayı kısmını yazdırmak için; Sonuc/100
Ekrana odalık kısmını yazdırmak için Sonuc//100 yazmak yeterlidir. (Mod işlemidir)
Tam komut karşılığı ise;
LCDOUT $FE,2,"sonuc=",dec sonuc/100,",",dec2 sonuc//100
şeklinde olmalıdır.
Görüldüğü gibi hiçde zor değil.

BU genel açıklamaya birde verilen örneği ekleyelim.
FREKANS1=SET/60
FREKANS2= FREKANS1//10
yerine,
FREKANS1=(SET*100)/60
FREKANS2= FREKANS1//100
FREKANS1=FREKANS1/100
şeklinde yazmak ve ekranada aynı komutları kullanarak
LCDOUT $FE,$80,"SET DEVIR.=" ,# SET,"     "
LCDOUT $FE,$C0,"FREKANS=",# FREKANS1, "," ,#FREKANS2," Hz"
şeklinde yazdırmak gerekir.

100 ile çarparken yada hane sayısını artırırken sonucun  16 bit sınırlarını aşıp aşmayacağını bilmek gerekir. Şayet çarpılan sayı 65535'i aşacak durumda ise, bölme işlemini 32 bit yapmak gerekir. Bu durumda sayının 100 ile çapılması sonucunda elde edilen sonuç bir tampon hafızaya atılır ve siz onu göremezsiniz. Ancak Basic onu bilir ve hemen ardından 32 bitlik bölmeyi yaparsanız tampondaki değer alınıp 60'a bölünür. Aşağıdaki gibi.

İşlem sırası şöyle olmalıdır.

Frekans1=Set * 100  'burada Frekans1 değeri tampon yada ara hafızaya atılır.
Frekans1=div32  60   'bu işlem ara hafızada bulunan 16 bitden büyük olan sonuç değerinin 60'a bölünmesini gerçekleştirir.
Frekans2=Frekans1//100
Frekans1=Frekans1/100

Frekans değerine bağlı olarak bir port pininden çıkış alma işlemi değişik şekillerde yapılabilir.
Ancak ondalıklı çıkış diye bir şey olamayacağı için sayının tamsayı kısmı kullanılır.
Verilen örnekte 9,16 sonucu için PortB.3 den 1 saniyede 9,16 defa HIGH alabilirmiyim denilmiş.
Bir defa 1 saniye 1000 ms eder. Sayının tam sayı kısmı 9 olduğuna göre ondalık kısmı göz ardı eder isek
9x2=18 ve 1000/18=55,5 = 555 us de bir konum değişrtirmek gerekecektir.
ondalık kısmıda devreye almak için,
9,16 x2=18,32 ve 1000/18,32=54,5 ms yada 545us bulunur.
Şİmdi işlemi Basic ortamında yapalım,9,16 sayısı zaten 916 olarak önceden hesaplanmış olacaktır
A=916*2
B=1000*1000
C=div32 A

Hemen bir döngü kurarız
For I=1 to (A/100)
  PORTB.3=1
  Pauseus  C
  PORTB.3=0
  Pauseus C
Next
ve bu şekilde işlem hallolabilir.

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

Evren KILIÇ

Arkadaşlar prog.bu şekilde çalışlıyor ama çıkış frekansım olması gerekenden 1 ila 4 hz kadar farklı daha az oluyor sanırın bu prog.diğer komutlarının çalışması için geçen süreden kaynaklanıyor 
örnek :740 devirde olması gereken frekans=12,3 hz ama porta.0 dan 11,08 hz alıyorum bu sorunu nasıl aşabilirim ?

program:

PORTA=%0011100
PORTB=%0000000
DEFINE LCD_DREG      PORTB   'LCD data bacakları hangi porta bağlı?
DEFINE LCD_DBIT      4      'LCD data bacakları hangi bitten başlıyor?
DEFINE LCD_RSREG   PORTB   'LCD RS Bacağı Hangi Porta bağlı ?
DEFINE LCD_RSBIT   1      'LCD RS bacağı Hangi Bite bağlı ?
define lcd_RWREG    PORTB
define LC_RWBIT     2
DEFINE LCD_EREG      PORTB   'LCD Enable Bacağı Hangi Porta bağlı?
DEFINE LCD_EBIT      3      'LCD Enable Bacağı Hangi bite bağlı ?
DEFINE LCD_BITS      4      'LCD 4 bit mi yoksa 8 bit olarak bağlı?
DEFINE LCD_LINES   2      'LCD Kaç sıra yazabiliyor

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
@ DEVICE pic16F628A
@ DEVICE pic16F628A, WDT_ON
@ DEVICE pic16F628A, PWRT_ON
@ DEVICE pic16F628A, PROTECT_OFF
@ DEVICE pic16F628A, MCLR_OFF
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT
OPTION_REG.7=1
CMCON=7
VRCON=0

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
DEVIR   var  word
FREKANS1 VAR WORD
FREKANS2 VAR WORD
ZAMAN VAR WORD
ZAMAN2 VAR WORD
CIKIS VAR WORD
CIKIS2 VAR WORD
YSET VAR WORD
ASET VAR WORD
SET VAR WORD
BYSET VAR PORTA.2  'YUKARI SET BUTONU
BASET VAR PORTA.4  'AŞAĞI SET BUTONU
BONSET VAR PORTA.3  '10 AR  SET BUTONU

Low PORTB.2      ' LCD R/W line low (W), şemada direkt GND ye bağlanabilir.
LCDOut $FE,1   ' LCD de CLS yapar
pause 500       ' LCD nin açılması için gerekli süredir.
'-------------------------------------------------------------------------------
           'LCDOUT $FE,$80,"   1.satır  "
           'LCDOUT $FE,$C0,"   2.satır    "
   SET=900
   
'PORTA.0 ÇIKIŞ


BASLA:




LCDOUT $FE,$80,"SET DEVIR=" ,# SET,"  "
LCDOUT $FE,$C0,"FREKANS  =",# FREKANS1,".",#FREKANS2,"Hz"

IF BYSET=1 THEN
IF BONSET=1 THEN
PAUSE 200
SET=SET+10
ELSE
SET=SET+1
IF SET>2400 THEN SET=2400
ENDIF
ENDIF

IF BASET=1 THEN
PAUSE 200
SET=SET-10

IF SET<100 then set=100
ENDIF


FREKANS1=SET / 60
FREKANS2= SET // 60
FREKANS2=FREKANS2*10
FREKANS2=FREKANS2/60
ZAMAN=SET*10/60
ZAMAN2=10000/ZAMAN/2
GOTO PALS


PALS:


HIGH PORTA.0
PAUSE ZAMAN2
LOW PORTA.0
PAUSE ZAMAN2

GOTO BASLA
[email]evren1623@hotmail.com[/email]

fatihinanc

ben çalıştırdığımda 12,3 Hz alıyorum.
ek : ben lcd de görünen değerden bahsediyorsunuz zannettim.
11,08 hz almanız hesaplamalarınızla ilgili bir sorun.
çarpma bölme değerleri oynarak uygun değerleri bulmanız lazım.
Kainat dediğimiz kitap, yazıldığı dil ve harfler öğrenilmedikçe anlaşılamaz.  (Galileo Galilei)

Evren KILIÇ

Alıntı yapılan: fatihinanc - 20 Haziran 2010, 14:11:23
ben çalıştırdığımda 12,3 Hz alıyorum.
ek : ben lcd de görünen değerden bahsediyorsunuz zannettim.
11,08 hz almanız hesaplamalarınızla ilgili bir sorun.
çarpma bölme değerleri oynarak uygun değerleri bulmanız lazım.

yani ekranda gördüğünüz frekans değeri ile porta.0 dan aldığınız frekans değeri eşitmi
[email]evren1623@hotmail.com[/email]