usart kesmesi ve lcd

Başlatan greatgonzo, 11 Temmuz 2012, 04:50:29

greatgonzo

Aşağıda verdiğim kodda bir gariplik var ama ben göremedim. İlginç olan LCD nin lcdout komutundaki yazıları ekrana basması gerekirken basmıyor. Ama veri yollandığında yazıyor. Basladan sonra gelen ilk etiket olduğunu düşünürsek kesme çalışmasa bile her halukarda görüntülemesi gerekmez mi? Şunuda belirtmeliyim ki "on interrupt goto kesme satırını silince çalışıyor:-) Acaba neyi gözden kaçırıyorum ?

İyi çalışmalar....



@ DEVICE PIC16F88
@ DEVICE PIC16F88, WDT_ON
@ DEVICE PIC16F88, PWRT_ON
@ DEVICE PIC16F88, PROTECT_OFF
@ DEVICE PIC16F88, MCLR_OFF
@ DEVICE PIC16F88, INTRC_OSC_NOCLKOUT
@ DEVICE PIC16F88, LVP_OFF
@ DEVICE PIC16F88, BOD_ON
@ DEVICE PIC16F88, FCMEN_OFF
@ DEVICE PIC16F88, IESO_OFF
@ DEVICE PIC16F88, CCPMX_OFF
@ DEVICE PIC16F88, DEBUG_OFF
@ DEVICE PIC16F88, WRT_OFF
@ DEVICE PIC16F88, CPD_OFF

define HSER_RCSTA 90h
'define HSER_TXSTA 20h
define HSER_BAUD 2400
DEFINE HSER_CLROERR 1
DEFINE OSC 4

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
ON INTERRUPT GOTO KESME
TRISA=%00000000
TRISB=%00000100
PORTA=0
PORTB=0
OSCCON=%01100110
CMCON=7  'Comparatör pinleri iptal hepsi giriş çıkış
ANSEL=0 ;Analog Girişler İptal

RCIE=1
PEIE=1
GIE=1
RCIF=0

OPTION_REG.7=0

DEFINE LCD_DREG PORTA
DEFINE LCD_DBIT 0
DEFINE LCD_EREG PORTA
DEFINE LCD_EBIT 4
DEFINE LCD_RSREG PORTA
DEFINE LCD_RSBIT 7
DEFINE LCD_BITS 4
DEFINE LCD_LINES 2
LCDOUT $FE,1
PAUSE 200

KNM VAR BYTE
PAUSE 300

BASLA:
LCDOUT $FE,1,"RUTIN "
PAUSE 100
GOTO BASLA

DISABLE
KESME:
    GIE=0
    HSERIN [WAIT("NZM"),KNM] 
    GIE=1
    INTCON.1=0
    Resume
enable

END

Mucit23

Sorun şurada

Kesme içerisinde Hserin komutunun kullanımı yanlış bir şekilde yapıyorsun. Normalda bu şekilde kullanıldığı zaman Program Hserin komutunun olduğu yerde Gelmesi gereken veri gelene kadar bekler. Dolayısıyla Program kesmeye girdiği anda sürekli verinin gelmesini beklediğin için kesmeden çıkamıyorsun. Senin verileri gönderdiğide program gelen veriyi alıyor ve kesmeden çıkıyor. LCD ekranda ilgili yazıyı yazıyor.

Bu yüzden belli bir süre yani timeout ve işaret koyarız. ETE hoca derslerinde bu işi çok güzel anlatmış.

Kendi derslerinden alıntı yaparak devam edelim.

DISABLE
INT:
GIE=0
HSERIN ,5,ATLA,[WAIT("ETE"),ISI1,ISI2,SIGN]
ATLA:
TEMP=RCREG
GIE=1
Resume
enable

Burayı incelersek eğer Hserin komutu aşağıdaki gibi kullanılmıştır.
HSERIN ,5,ATLA,[WAIT("ETE"),ISI1,ISI2,SIGN]
Bu komutun yaptığı işlemi açıklayalım. Program bu komuta geldiğinde 5Ms kadar bekler. Eğer bu 5ms içerisinde hiçbir veri gelmezse program ATLA isimli etikete dallanıp aradan yoluna devam eder. Oradaki sürenin ideali 5-10ms arasıdır.

Sende yukarıdaki yapıya benzeri bir kesme alt yapısı oluşturursan programın çalışacaktır.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

greatgonzo

Yanıt için teşekkür ederim MUCİT arkadaşım.Aynen senin ve ETE hocamın dediği gibi oldu :-) Fakat bir şeyi anlamadım ki mantık olarak sadece kesme oluştuğunda bu etikete sıçraması gerekmez mi?

İyi çalışmalar...

Mucit23

Zaten kesme oluştuğunda kesme adlı alt programa gidiyor. Fakat kesmeden çıkamıyor. Çünkü program  Hserin komutunda takılıp kalıyor. Bu durumda WDT açık olursa işlemciyi resetler..
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

ete

Usart kesmesi herzaman gercek bilgi geldiginde olusmaz. Bazen alıcıdan gelen parazitlerde kesme olusturur.
Ete

greatgonzo

Yine yukarıdaki problemime benzer garip bir problemim var. Affınıza sığınarak danışmak isterim. Programımda sadece usart kesmesi kullanıyorum fakat bir noktada program kilitleniyor. Mantık olarak iki pic birbiriyle veri paylaşıyor ve son adımda her ikiside verileri eeproma kaydediyor. Clear komutuyla sıfırlama yapıp tekrar başa dönüyor. Fakat bu işlemi tek sefer yapıyorlar. Bir şekilde bir noktada sanki kilitleniyor. Benim şüphe duyduğum ki gariplikte burada kesme noktası. İsis simülasyonunu dondurup registerlara baktığımda intcon %11000001 olarak görünüyor. Hata %11000101 dahi gördüm :-)  2. bit  TMR0 0. bitte RBPort değişikliğine ilişkin kesme. Ben sadece usart kesmesi kullanıyorum.  Program normalde sadece 1 pini dinliyor ve 1 olması halinde veri yollamaya başlıyor. Eeprom kaydı bitince clear ile bu noktaya sıcrıyor fakat yeniden haberleşme işlemine başlamıyor. MCLR ile reset atınca tekrar bir seferlik normale dönüyor. Yine eeprom kaydıda beni şüphelendirdi. Zira 4-5 farklı parolayı alıp eeprom kaydı yapan betiklerde ,kesme  eklendikten sonra kilitlenmeye başladı. Garip olan herşeyi mükemmel biçimde yapıyor fakat bekleme konumuna bir türlü dönmüyor.

Birde reset konusu kaçınılmaz olursa eğer yazılımla bir alternatifimiz varmıdır. Zannedersem 18F serilerinde reset diye bir komut var ama 16-12 serilerinde buna benzer bir işlem yapabilirmiyiz. Mesela WDT bayrağını bir şekilde 1 yapıp reset atabilirmiyiz.


İyi çalışmalar...

ete

Herzanmanki gibi programı koymadan bizi yoruma zorluyorsun.. Bizde tahminde bulunarak yorum yapacagız. Eproma yadiktan sonra pause kullandi isen program orada kilitleniyor olabilir.
Kesme bayragini sifirlamamis isen program kesmeden hic cıkmıyor olabilir.
Sen birde sunu dene,
Disable
Eproma kayit kısmı
Enable
Boylece program kesmeden ciıyor ve eproma kayıt ederken kilitleniyorsa bu ilave ile eproma kayit esnasinda yeniden kesme olusmasi engellenmis olacaktir.
Ete

greatgonzo

Cevabımdaki gecikme için özür dilerim. Hocam proje ticarileştirmeye çalıştığımız bir projeye bağlı olduğu için paylaşma konusunda biraz çekingenim. Bunun içinde havada bıraktığım için ayrıca özür dilerim. Sorunu tespit ettim. Her zaman ki gibi gayet basit ve mantıklı bir sorun. Seri lcd de aynı sebepten saçmalıyordu sanırım. Normalde tuş tarama modunda çalışan pic kayıttan sonra bu konuma sıçradığında tamamen kitleniyordu ki sebebi portların konumunun değişmesinden kaynaklandığına kanaat getirdim. Tarama kısmının başına "PORTA=0:PORTB=0" ibaresi eklenince herşey normale döndü ama bayağı terletti. Aslında baska kayıt satırlarıda vardı fakat onlarda clear komutundan sonra sıcrama yeterli geliyordu. Nedense bu sefer işe yaramamıştı.

Ayrıca İSİS her nedense bazı kesme bayraklarını 1 konumunda tutuyor ki ne sorun çıkartıyor nede bayraklar sıfırlanabiliyor. Tımer0 ile RB4-RB7 kesme bayraklarından biri bazen ikisi birden 1 konumunda oluyor ama ben her iki kesmeyide kullanmıyorum. Garip bir durum :-)

İyi çalışmalar...

Powered by EzPortal