Kesme sorunu

Başlatan ogy, 22 Ekim 2011, 15:20:02

ogy

Merhaba

16F877A'nın C portuna bağlı ledler birer aralıkla yanar iken rb0 kesmesi kullanılarak yanık ve sönük kalma sürelerini kontrol eden ufak bi program yazdım.Başlangıç süresi 200 ms.Her kesmede 200 ms artıcak.1 sn olduğunda ise tekrar 200 ms olacak.Yani 4 kademeli süre artışı sağlanacak.Fakat yazdığım program ters çalışıyor.200-400-600 vs 800 ms olması gerekirken 800ms den geri geliyor.bu şekilde 2 tur çalışınca 3. turda ya hepsi yanık kalıyor yada 50 ms gibi çok hızlı titreme oluyor.Yardımcı olursanız sevinirim.Şimdiden teşekkürler

Kod:


' **************** DEVICE TANIMLAMARI *************************
@ DEVICE pic16F877A 'işlemci 16F877A
@ DEVICE pic16F877A, WDT_OFF'Watch Dog timer kapalı
@ DEVICE pic16F877A, PWRT_ON 'Power on timer açık
@ DEVICE pic16F877A, PROTECT_OFF 'Kod Protek kapalı
@ DEVICE pic16F877A, XT_OSC ' Harici kristal



'**************** DEĞİŞKEN, PORT VE KESME TANIMLAMALARI ***********

           DEFINE OSC 4       'OSİLATÖR ÇALIŞMA FREKANSI
           TRISC=0            'C PORTU ÇIKIŞ
           TRISB=%00000001    'PORTB.0 GİRİŞ DİĞERLERİ ÇIKIŞ
           TRISD=0           'D PORTU ÇIKIŞ
           TRISA=0           'A PORTU ÇIKIŞ
           TRISE=0           'E PORTU ÇIKIŞ
           ADCON1=%00000111   '16f877a nın analog girişlerini dijitale çevirir
           SAYAC VAR BYTE   ' SAYAC DEĞİŞKENİ
           i VAR BYTE      ' FOR NEXT DEĞİŞKENİ
           SAYAC=0         ' SAYAC DEĞİŞKENİNİN İLK DEĞERİ
           ZAMAN VAR BYTE
           ZAMAN=200
           
On Interrupt  Goto   KESME   'KESME OLUŞTUĞUNDA KESME ALTPROGRAMINA GİT
OPTION_REG = %01000000    ' 6. BİT SIFIR.DÜŞEN KENARDA KESME OLUŞUR
INTCON  =   %10010000     ' RB0 VE TÜM KESMELER AKTİF
PAUSE 300 ' TANIMLAMARIN YERLEŞMESİ İÇİN GEREKLİ SÜRE

'******************* ANA PROGRAM ***********************

ANA_PROGRAM:       
        PORTC=%01010101
        PAUSE ZAMAN
        PORTC=%10101010
        PAUSE ZAMAN
    GOTO ANA_PROGRAM
DISABLE

KESME:
ZAMAN=ZAMAN+200
IF ZAMAN=1000 THEN
ZAMAN=200
ENDIF
INTCON.1=0
RESUME ANA_PROGRAM
ENABLE
END

ete

Kesme kullanılan programlarda Pause komutunu kullanmaktan kaçının.
Zira pause komutu işletilirken kesme oluşsa bile pause süresi bitmeden program kesme etiketine gidemez.
Bunun çaresi bekletmeleride kesme altına almak yada döngüsel bekletme kullanmaktır.
Pause 200 yerine
For I=1 to 200
Pause 1
next
derseniz yine yaklaşık 200 ms lik gecikme yaratır ama kesmeye gitmek için en fazla 1 ms beklersiniz.
Ama Pause 200 dediğiniz zaman 200 ms dolmadan kesme etiketine gidemezsiniz.
Bu nedenle pause yerine pauseus kullanmaya bakın ve en büyük değerinizde 5us olsun. Bunu döngü içinde kullanarak gerekli gecikmeyi sağlayın . Ama unutmayın döngü komutları da her biri 5us den fazla bir gecikme yaratır. Bu nedenle 200 ms lik gecikme için 200.000/5=40000 hesaplayıp döngüyü for I=1 to 40000 şeklinde kurarsanız 200 ms değil 800 ms gecikme sağlarsınız. Biraz deneyerek gerçek zamanı yakalamak için I değerinin ne olmasını bulabilirsiniz.
Genelde vermeniz gereken değerin yarısından biraz eksiğini verin.

Sorununuz buradan kaynaklanıyor.

Ete

ogy

Teşekkürler hocam.Peki beklemeleri kesme altına nasıl alacağız?Örnek verebilir misiniz acaba?

ete

Beklemeleri kesme icine almak yine olumsuz sonuclar dogurur. Neden boyle bir ihtiyac var aciklarsan sevinirim.
Ete

ogy

Hocam çünkü 14 kanal ve 10 animasyonlu bi devre tasarladım fakat animasyonlar
PORTA=%00000000
PAUSE 500
PORTA=%11111111
PAUSE 500
şeklinde ve sonuç olarak çok fazla pause kullandım.Animasyon geçişlerini rb0 kesmesi ile yapıyorum fakat aynı şekilde tek butonla zaman değiştirme konusunda takıldım.

ete

sürekli tekrarlıyorum. İçinde kesme olan programlarda pause komutunu hiç kullanmayın. Aksi halde pause bitmeden program kesmeye geçmez. Pause 500 500 ms lik bir gecikmedir ve gecikmeninbaşında kesme oluşsa program kesmeye 500 ms sonra geçecek demektirki buda programda ne tuş kontrolü nede kesme kontrolü yapmanıza imkan tanır.
Gecikmeleri ya timer kullanın yada döngü gecikme kullanın.
Ete

ogy


Powered by EzPortal