Serin komutu kullanımı sırasındaki gecikme.

Başlatan dyonizos, 28 Ekim 2011, 14:50:07

dyonizos

selam arkadaşlar SERIN komutunu kullanırken programın bu komut sırasında gecikme yapmasını nasıl engelleriz. Denediğim örnek programda SERIN komutu ile aldığım datayı potansiyometre ile DC motor pozisyonunu değiştirmekte kullanıyorum. Yani Potansiyometre motor shaftına baglı. Ancak serin komutundaki gecikme nedeniyle motor dönerken durdurmam gereken potansiyometre noktasını kaçırıyor ve durmadan devam ediyor.

SerIn pin, 84,2000, MAIN,[Wait("AZ"), Dec Azimuth]

komutunda 2000 rakamını 1 e kadar indirebilirmiyiz? Sonuçta bu komut program içinde sürekli döngü arasında çalışıyor ve pc den gelcek datayı kontrol ediyor. 2000 vermemiz gerekirmi?

mozkan87

Denemek lazım ama burada en garanti yol kesme kullanmak olacaktır. Seri iletişimi kesme ile yapın garanti olsun. Eğer 1 yaparsanız verileri yakalayamama gibi bir durum söz konusu olabilir. Yada motoru kaçırmaması daha önemli derseniz motordan gelen bilgiyi kesme ile yapabilirsiniz duruma göre uygun sistemi seçmek size kalmış.

-Hasan-

mozkan87 arkadaşımızın da dediği gibi; varsa donanımsal seri iletişimi (USART) kullanının. Bu sayede veri geldiğinde kesme oluşturup, veri gelene kadar beklememiş olursunuz.

Maxim

yada hserin komutunu deneyin (hardware serial)
daha hızlıdır

dyonizos

Serin neysede hserin ile rsin arasindaki fark nedir. İkiside usart kullaniyor sanirim. Hangisini onerirsiniz.

OG

Proton kitabı HSERIN başlığı altında şöyle demiş,

Bu komutla HRSIN arasında syntax açısından tek fark modifier ve variable terimlerinin köşeli parantez içinde kullanılmasıdır. MELABS'ın PBP derleyicisi ile uyumludur.

----------------
Hserin Timeout, Timeout Label, Parity Error Label, [Modifiers, Variable {, Variable... }]

----------------
Variable = Hrsin, { Timeout, Timeout Label }
or
Hrsin { Timeout, Timeout Label }, { Parity Error Label }, Modifiers, Variable {, Variable... }
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

dyonizos

Fonksiyon olarak bir fark yok o zaman anladigim kadariyla. İkiside kullanilabilir birbirlerinin yerine.

OG

Evet, deklarasyonları da aynı, yalnızca syntax hatası olmamalı.
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

dyonizos

SerIn PORTC.0, 84,20, MAIN,[Wait("AZ"), Dec Azimuth]

olarak bilgiyi alıyordum. Ekstra bir config tanımlamam gerekmiyordu. 18f252 de Usart kullanabilmek için.

HSerIn 1000,MAIN,[Wait("AZ"),Azimuth]

olarak satırları değiştirdim ve

Declare HSERIAL_BAUD=9600
Declare HSERIAL_RCSTA=%10010000
Declare HSERIAL_TXSTA=%00100000
Declare HSERIAL_CLEAR=On

bu ayarları yaptım. ancak calıstıramadım nerede hata yapıyorum acaba? 18f252 de pc den gelen datayı C7 ile alıyorum.


Maxim

hserin için picin hangi ayaklarını kullandınız ?
portc.0 ise olmaz biliyorsunuz değilmi ?

18F252
portc.7 > RX
portc.6 > TX
uçlarıdır

birde kaç mhz osc var ?

dyonizos

portc.7 yi kullandım ve 4mhz kristal var.

kodlar asagıda yanlız bıraz karısık oldu. duzenleyemedım. Ancak bu kodlarla ilk merhaba yazısı cıkıyor. sonrasında gelen datayı okuyamadıgım ıcın bos ekranda beklıyorum.



Device 18F252
Declare XTAL 4
CONFIG_START
OSC = HS
PWRT   = On    ; Power Up Timer Enabled
WDT    = OFF    ; Watchdog Timer Disabled
WRTD   = OFF ; Data EEPROM Write Protection Disabled
CONFIG_END


Declare LCD_DTPIN = PORTB.0 ;LCD Data Pin
Declare LCD_RSPIN = PORTA.4 ;LCD RS Pin
Declare LCD_ENPIN = PORTA.5 ;LCD EN Pin
Declare LCD_LINES = 2       ;LCD Satır Sayısı

Declare ADIN_RES 10
Declare ADIN_TAD 8_FOSC
Declare ADIN_STIME 50

Declare HSERIAL_BAUD=9600
Declare HSERIAL_RCSTA=%10010000
Declare HSERIAL_TXSTA=%00100000
Declare HSERIAL_CLEAR=On


TRISA=%00000011
TRISB=%00000000
TRISC=0
ADCON1 = %10000010
INTCON=%00100000
PORTB=0
CCP1CON = %00001100
CCP2CON = %00001100

Symbol CIKIS = PORTB
 
Declare CCP1_PIN = PORTC.2
Declare CCP2_PIN = PORTC.1



Dim elpot As Word
Dim azpot As Word
Dim OLDelpot As Word
Dim OLDazpot As Word
Dim elpott As Word
Dim azpott As Word
Dim Azimuth As Word
Dim Elevator As Word


Dim x As Byte

Cls
Print At 1,1,"  merhaba  "
DelayMS 2000
Cls



MAIN:
elpott=0
azpott=0
GoSub adc_oku

Azimuth=azpot

HSerIn 1000,MAIN,[Wait("AZ"),Azimuth]
'SerIn DATAPIN, 84,20, MAIN,[Wait("AZ"), Dec Azimuth] eski çalışan
'SerIn DATAPIN, 84,1, MAIN,[Wait("EL"), Dec Elevator] eski çalışan
GoSub hareket


Print At 1,1, "Az: ",Dec Azimuth,"   "
Print At 2,1, "El: ",Dec Elevator,"   "
Print At 1,9, "A: ",Dec azpot,"   "
Print At 2,9, "E: ",Dec elpot,"   "


GoTo MAIN


adc_oku:

For x=1 To 30
ADcIn 0,elpot
elpott=elpott+elpot
ADcIn 1,azpot
azpott=azpott+azpot
Next

elpot=elpott/30
azpot=azpott/30
                       
Return

hareket:
If azpot>Azimuth Then
CIKIS=%01000000
Else
CIKIS=%10000000
EndIf

If azpot=Azimuth Then  CIKIS=%00000000:HPWM 1,0,1250

HPWM 1,100,1250
Return

Maxim

Declare HSERIAL_BAUD=9600
Declare HSERIAL_RCSTA=%10010000
Declare HSERIAL_TXSTA=%00100100
Declare HSERIAL_SPBRG=25
Declare HSERIAL_CLEAR=On

yapın

ayrıca
OSC = XT olacak

dyonizos

yine merhaba yazıyor sonrasında lcd bos olarak bekliyor yıne :(

Andromeda

serin komutunda zaman aşımı birimi 1 usn diyor....
yeterli değil mi mikro saniyeler.....
hserinde donanım kullanılıyor...yani haberleşme olurken başka işler yapılabilir..
ama bilgi gelip gelmediğini kontrol etmen gerekiyor...
bir ara uğraşmıştım.....

" Tanrı, iradesini hakim kılmak için yeryüzündeki iyi insanları kullanır, yeryüzündeki kötü insanlar ise kendi iradelerini hakim kılmak için Tanrı'yı kullanırlar." ..." Tanrı'dan mesaj gelmiyor, biz Tanrı'ya mesaj gönderiyoruz"

Maxim

nerede takılıyor pic ? ona bakın
bence bu satırda
HSerIn 1000,MAIN,[Wait("AZ"),Azimuth]

kaldırıp deneyin bir