kesme kapatma

Başlatan bahdiyarusta, 13 Mart 2016, 20:23:33

bahdiyarusta

merhaba arkadaşlar,

yaptığım projemde bilgi gelince gelen bilgiye göre işlem yaptırıyorum .
amacım pc kontrollü led dimmer devresi seri porttan bilgi geliyor.
aç - 65
kapat - 66
artır - 68
azalt - 67
şeklinde bilgi geliyor.
aç bilgisini gönderince aç satırına gidiyor orda led yakma yazmıştım oraya gittiğini anladım. fakat kapata basınca kapatma yapmıyor ve
artır azalt komutları işlemini yapmıyor. acaba o arada işlemleri yaparken mikrosaniyede elimi çekemediğim için hala bilgi geliyor ve
program kesne satırına gidip tekrar başa mı gönüyor nedir. anlayamadım. o aralara kesmeleri kapat ve aç komutu koyarak denemek istedim.
yorumlarınızı beklerim..

teşekkürler...

@ DEVICE pic16F628A
@ DEVICE pic16F628A, WDT_ON
@ DEVICE pic16F628A, PWRT_ON
@ DEVICE Pic16F628A, BOD_OFF
@ DEVICE Pic16F628A, LVP_OFF
@ DEVICE pic16F628A, PROTECT_ON
@ DEVICE pic16F628A, MCLR_OFF
@ DEVICE pic16F628A, XT_OSC

INCLUDE "modedefs.bas"
CMCON=7
PORTA=0:TRISA=0
PORTB=0:TRISB=%00000010
DEFINE OSC 4
DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1
DEFINE HSER_SPBRG 25  ' 9600 Baud @ 4MHz, 0,16%
DEFINE HSER_CLROERR 1 ' Clear overflow automatically

Symbol GIE  =INTCON.7   'genel interruptları açıyor
Symbol PEIE =INTCON.6   'peripheralinterruptları açıyor
Symbol RCIE =PIE1.5     'USART Recive interrupt enable bit
Symbol RCIF =PIR1.5     'USART Receive interrupt flag bit

DEFINE CCP1_REG PORTB        'HPWM PORTC.1
DEFINE CCP2_BIT 1            'CCP1 PİNİ PORTC.1

TEMP VAR Byte
GELDI VAR Bit
BILGI VAR Byte
SAYAC VAR Word
DEGER VAR WORD
PAUSE 100
GIE=1           
PEIE=1
RCIE=1
BILGI=0
SAYAC=0
DEGER=0
PORTB.3=0

On Interrupt GoTo KESME

BASLA:
      If GELDI=1 Then
         GELDI=0
       IF BILGI=65 THEN AC
       IF BILGI=66 THEN
       BILGI=0
       PORTB.3=0
       SAYAC=0
       ENDIF
       ENDIF
      GoTo BASLA
AC:
   IF SAYAC<254 AND BILGI=68 THEN SAYAC=SAYAC+2
   IF SAYAC>0 AND BILGI=67 THEN SAYAC=SAYAC-2
   HPWM 0,SAYAC,5000 
   BILGI=0
   GOTO AC 
       
DISABLE
KESME:   
    GIE=0
    HSERIN 5,ATLA,[WAIT("B"),BILGI]
ATLA:
    GELDI=1
    TEMP=RCREG
    GIE=1
    RESUME
    ENABLE
    END
<<<***bahdiyarusta****>>>
                  - 66 -

bahdiyarusta

<<<***bahdiyarusta****>>>
                  - 66 -

ete

Nasıl çözüldü onuda söyleseydin keşke. Gördüğüm kadarı ile kesme kısmında GELDI=1 komutu yanlış yerde duruyor.
"B" ifadesi gelsede GELDI=1 oluyor gelmesede (timeout nedeni ile) yada parazit bile gelse GELDI=1 olacak ve ana bölümde program yanlış işleyecektir.

Sorunun asıl kaynağını anlamak için Vericiyide görmek gerekirdi.

Ete

bahdiyarusta

hocam çözüldü derken programdaki hatayı çözemedim açıkçası.
sistemi farklı bir şekilde yapacağım. ona karar verince problem çözülmüş oldu.
bu program aşırı kararsız ve içinden çıkamayınca yöntem değiştirdim.
<<<***bahdiyarusta****>>>
                  - 66 -

ete

Programı başka bir mantık ile yazmak çözüm müdür? yada karşılığı "Çözüldü" kelimesimidir? Bence değil. Zira diğer mantığın çalışacağının garantisi yok. Bu mantığın çalışmadığı gibi (ki sen çalışmadığını söylüyorsun) diğeride çalışmayabilir.
Hiç bir açıklama vermeden yalnızca "Çözüldü" yazmak bence büyük hata.
Verdiğin mesaja bende "Sorunu Buldum" diye cevap yazsa idim bir işine yarayacakmıydı? tabiiki hayır. Bulduğum sorunu açıklamak işin doğrusu oluyor elbette.
Genelde bu tür sorunlar ilgimi çeker ve nerede hata yapıldığını bulmak isterim. Bazen boş oluyorum hemen bakıyorum bazen ise ya yolda yada başka işle meşgul oluyorum hemen cevap yazamıyorum. Bu mesajada hemen cevap yazamadım. Ama yazacağım zaman "çözüldü" ibaresini görünce şaşırdım doğrusu.
Her neyse işin içinde bir art niyet aramadan bulduğum kusurları ben açıklayayım da sen yinede istersen başka mantıkla işini çöz.
1. Program AÇ ma işini yaptıktan sonra tekrar BASLA etiketine gitmeli ki yeniden bir komut geldiğinde onu görebilsin ve işlem yapabilsin. Ama sen ne yapmışsın, GOTO AC diyerek programı AC -GOTO AC arasında kilitlemişsin. Böylece program yalnızca AÇ işlemini yapacak ama başka iş yapayacak şekle gelmiş oluyor.

2. Programda HPWM açılıyor. ancak KAPATMA işlemi çalışsa bile bu sinyali PORTB.3=0 vererek kapatamazsın. HPWM sinyali bir özelliktir. İlgili pinden süreki o sinyalin çıkmasını sağlar. Kapatmak için ya PWM açma komutu içinde Duty değerini sıfır vermek yada CCP1CON=0 komutunu vermek gerekir. Buda yetmez ardından PORTB.3=0 komutunuda vermek gerekiyor zira pin HIGH da kalmış ise onuda LOW a çekmek gerekir.

3. Kesme kısmında ATLA etiketi altına yazılmış olan GELDI=1 ifadesi istenen bilgide gelse çalışır istene bilgi gelmeyip timeout dan dolayı program ATLA etiketine gelsede çalışır. Sonuçta bir parazit sinyalide gelse GELDI=1 olur. Halbuki GELD=1 olması için yalnızca istediğimiz "B" sinyalinin gelmiş olması gerekir ki bu durumda GELDİ=1 komutu HSERIN komutu altına yazılması gerekir.
Tespitlerim bunlar. Bunlar düzeltilirse bu program çalışır.

Ete

bahdiyarusta

hocam yorumlarınız için teşekkür ederim.
belki ben farklı düşündüm ama  orda çözüldü yazmamdaki amaç kimse boş yere uğraşmasın problem çözüldü demek istedim yani.
yoksa forumda dikkatli yazışmaya çalışırım. Tabi ki yanlışlarımız olabilir. anlayışınız için teşekkür ederim.
iyi günler,
<<<***bahdiyarusta****>>>
                  - 66 -

Powered by EzPortal