Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

usart kesmesi

Başlatan enrique_iglesias, 07 Haziran 2009, 00:16:13

enrique_iglesias

Arkadaşlar merhaba aşağıdaki gibi örnek bir program yaptım 16F877 rx ve tx pinlerini kullandım rs485 entegresi ile bağlı ama kesmeler çalışmıyor ekranda hep kesme yok yazıyor halbuki pc'den sürekli veri gönderiyorum:(

DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive 
DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1 
DEFINE HSER_SPBRG 25  ' 9600 baud 4mhz de 
DEFINE HSER_CLROERR 1 ' Clear overflow automatically

SYMBOL GIE  =INTCON.7   'genel interruptlary açyyor 
SYMBOL PEIE =INTCON.6   'peripheral interruptlary açyyor 
SYMBOL RCIE =PIE1.5     'USART Recive interrupt enable bit 
SYMBOL RCIF =PIR1.5     'USART Receive interrupt flag bit 

define LCD_DREG PORTD
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG    PORTD
DEFINE LCD_RSBIT    2
DEFINE LCD_EREG     PORTC
DEFINE LCD_EBIT     4
DEFINE LCD_BITS     4
PORTD.3=0

RCIE=1 
PEIE=1 
GIE=1
RCIF=0 
ON INTERRUPT GOTO KESME

enable
PAUSE 500

basla:
pause 100
lcdout $fe,1,  "KESME YOK"
GOTO basla

disable
KESME:
    pause 100
    lcdout $fe,1,  "KESME VAR"  
resume
enable
   
end  

ErsinErce

sürekli kesme yok demesi çok normal 100ms de bir kesme yok yazdırıyorsunuz kesme var yazsa bile en geç 100ms içinde tekrardan kesme yok yazacaktır yazdığınız program

enrique_iglesias

cynetron dostum söylediğin doğru..
ben zaten kesme olup olmadığını görmek için yaptım bu denemeyi... 1000ms yaptım yine yok yine yok en azından kesme var olduğunu görmek istiyorum... projemde takıldım programı bu şekilde basite indirdimki usart öğreneyim diye ama olmuyor

ErsinErce

Programın gerekli kısmını şu şekilde değiştirip tekrar deneyin birde kesmedeki pause u kaldırın lcdoutdan sonra RCIF = 0 koyun


RCIE=1
PEIE=1
GIE=1
RCIF=0
TRISC = 128
ON INTERRUPT GOTO KESME
lcdout $fe , 1
pause 100

basla:
@nop
goto basla

enrique_iglesias

DOSTUM YARDIMLARIN İÇİN ÖNCELİKLE TEŞEKKÜR EDERİM....


ANLADIĞIM KADARIYLA RX PİNİNİ GİRİŞ YAPTIK AMA NAFİLE YİNE OLMADI :( BU DONANIM KESMESİNİ BECEREMEYECEĞİM GALİBA AMA ÖĞRENMEM GEREKLİ DELİRECEĞİM....RX PİNİNE BİRDE LED BAĞLADIM İYİ OLDU DEĞİŞİKLİĞİ GÖRÜYORUM AMA KESME OLMUYOR

ErsinErce

Problem compilerdan kaynaklanıyor galiba protonda denedim az önce bendede işe yaramadı RCSTA nın değerini programın içinde tekrar atayınca sorun çözüldü
TRISC den sonra RCSTA = 144 diye eklersen büyük ihtimal sorun ortadan kalkıcaktır

enrique_iglesias

şuanda ilk veri gelmezken kesme yok yazıyor bağlantı kurunca kesme var yazıyor ve öyle kalıyor :( yani hep kesmede gürültüden mi oluyor acaba?????

enrique_iglesias

Arkadaşlar sabah oldu ben hala USART KESMESİ yaptıramadım :(

Belli bir yere kaddar geldim mesela kesmenin olduğunu gördüm ama 10 uncu kesmeden sonra bir daha kesme olmuyor??????

çok garip veri gönderiyorum mesela kesme oluşuyor tam seviniyorum bir daha kesme mesme olmuyor nedendir anlamadım...

rcif bayrağını sıfırlıyorum
rcreg sıfırlıyorum
genel int açıyorum
çevresel int açıyorum
usart int açıyorum

olmuyor olmuyor olmuyor bikaç kesmeden sonra bir daha kesme olmuyor... pic'i resetlemem gerekiyor.... sonra oluyor sonra yine olmuyor nedendir çıldıracağım elinde tam kod olan varsa paylaşırsa sevinirim saygılar....

ete

Programın son halini vemediğin için ne yaptığını göremiyorum. Ancak muhtemel hata RCREG registerinin boşaltılması olarak görüyorum.

Programın Kesme  kısmında;
TEMP=RCREG

şeklinde bir komut ile RCREG registerinin içeriğini başka bir değişkene aktararak boşaltman gerekiyor. AKsi halde yeniden kesme oluşmayacaktır.
Bunun asıl sebebi kesme oluştuğunde set edilen RCIF bayrağıdır. Diğer kesmelerde olduğu gibi yeniden kesme oluşması için set edilen kesme bayrağının silinmesi gerekir. Diğer kesmelerde bu bayrağı sıfıra eşitleyerek veya ilgili biti sıfırlayarak bu işlemi yaparken usart kesmesinde bunu yapamıyoruz. Nedeni ise RCIF bayrağının yalnızca read-only olmasından kaynaklanıyor. Bu bayrak yalnızca donanımsal olarak sıfırlanabiliyor. Bununda yolu RCREG registerinin okunması ve boşaltılması ile oluyor. İşte bu nedenden dolayı TEMP=RCREG komutu registeri okuyup boşaltma işlemini yapıyor ve buna bağlı olarak da donanım otomatikman RCIF bayrağını sıfırlayarak yeniden kesme oluşmasına imkan tanıyor.
Sendeki eksiklik buradan geliyor sanırım.

Bütün bunları data sheet de ilgili bölümü defalarca okuyarak anlıyorum yada oradan çıkartıyorum. Bütün bu bilgiler ve diğerleri hepsi orada yazılı. Lütfen biraz data sheet takip edin. Bu data sheetler yüzünden ingilizcem ilerledi desem yalan olmaz.

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

enrique_iglesias

HOCAM merhabalar şimdi biraz daha toparladım ama hata devam ediyor kodlarım ;

DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive 
DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1 
DEFINE HSER_BAUD 2400
DEFINE HSER_CLROERR 1 ' Clear overflow automatically

SYMBOL GIE  =INTCON.7   'genel interruptlary açyyor 
SYMBOL PEIE =INTCON.6   'peripheral interruptlary açyyor 
SYMBOL RCIE =PIE1.5     'USART Recive interrupt enable bit 
SYMBOL RCIF =PIR1.5     'USART Receive interrupt flag bit 
symbol T0IE =INTCON.5   'TIMER0 KESMESI AÇILDI
symbol T0IF =INTCON.2    'TIMER0 BAYRAĞI

OPTION_REG=%10000101   'Pull up dirençleri İPTAL- Bölme oranı 1/64.
RCIE=1                  'SERİ İLETİŞİM KESMESİ AKTİF EDİLDİ
T0IE=1                   'TIMER0 KESMESİ AKTİF EDİLDİ
PEIE=1                    'ÇEVRESEL DONANIM KESMELERİ AKTİF EDİLDİ
GIE=1                      'GENEL KESMELER AKTİF EDİLDİ
TRISC=%10000000             'RX PİNİ GİRİŞ OLARAK ATANDI
RCSTA = 144                  'TCTEMP SABİT
rctemp var byte
salise var byte
saniye var byte
ON INTERRUPT GOTO KESME
lcdout $fe , 1 
pause 100


'////SERİ İLETİŞİM DEĞİŞKENLERİ//////////////////////////////////////////////
alinan1 var byte
alinan var byte
alinan1=0

enable
basla:
LCDOUT $FE,$C0, "kesme bekleniyor"
 
goto basla

disable
KESME:
if rcif=1 then 
                rctemp=RCREG  'RCREG OKUYORUM VE FLAG SIFIRLANIYOR
                rcsta.4=0    'BURAYI SIFIRLAMAZSAM HEP KESMEDE KALIYOR
                if rctemp=66 then 'EĞER B ALINDIYSA
                hserin 200,pass1,[dec3 alinan1] 'SONRAKİ VERİYİDE AL
                    
                    if alinan1=254 then 
                        high tx_enable
                        pause 100
                        hserout ["254 ALINDI BASARILI",13]
                        pause 100
                        low tx_enable
                    endif      
                endif
                pass1: 'PASS OLDUĞU DURUMDA BİLGİ VER
                high tx_enable
                pause 100
                hserout ["PASS OLDU",13]
                pause 100
                low tx_enable
                rcsta.4=1
endif

if T0IF=1 then
    Salise = Salise + 1      		' Saniye parçacıklarını say
	IF Salise < 61 Then pass2       ' 61 * 16,384ms = 1sn
	Salise = 0
    Saniye = Saniye + 1
    IF Saniye >= 60 Then
     Saniye = 0
    EndIF
    pass2:
    if saniye>=0 and saniye<=3 then ekran=1
    if saniye>=4 and saniye <=6 then ekran=2
    if saniye>=7 then saniye=0

    T0IF=0
endif

resume                               
enable
end  


şimdi bu kodlarda kesme içinde pass yaptım B verisini alıyor yani kesme oluşuyor kesmede sorun yok şükür olsun..Bikaç denemeyle bunu doğrulattım..

Ancaakkkk B harfinden sonraki veriyi çok zor alıyor belki 5nci veya 10ncu denememde alıyor..Bunu anlamamın nedeni pass 'dan sonra ekrana pass oldu yazdırmamdandır... Bu neden olur????

enrique_iglesias

ARKADAŞLAR TAMAMDIR SORUN ÇÖZÜLDÜ........


BU TİP BİR SORUNLA KARŞILAŞAN ARKADAŞLAR İÇİN ÇÖZÜM İĞRENÇ VE SİNİR BOZUCU YÖNTEM :)

KESME RUTİNİNDEKİ DÜZELTME :

.
.
.
.

KESME: 
if rcif=1 then 
                rctemp=RCREG  'RCREG OKUYORUM VE FLAG SIFIRLANIYOR  
                if rctemp=66 then 'EĞER B ALINDIYSA 
                hserin 200,pass1,[dec3 alinan1] 'SONRAKİ VERİYİDE AL 
                    
                    if alinan1=254 then 
                        high tx_enable 
                        pause 100 
                        hserout ["254 ALINDI BASARILI",13] 
                        pause 100 
                        low tx_enable 
                    endif      
                endif 
                pass1: 'PASS OLDUĞU DURUMDA BİLGİ VER 
                high tx_enable 
                pause 100 
                hserout ["PASS OLDU",13] 
                pause 100 
                low tx_enable
                rcsta.4=0    'BURASI ARKA ARKAYA OLACAK
                rcsta.4=1 
endif 

.
.
.
.

Tagli

rcsta.4=0    'BURASI ARKA ARKAYA OLACAK
rcsta.4=1
Bu bölümün mantığı nedir? Sanki OERR'i sıfırlama işini görüyor gibi ki durum böyle ise hala bir yerlerde sorun var demektir.
Gökçe Tağlıoğlu

OG

Burada
basla:
LCDOUT $FE,$C0, "kesme bekleniyor"
 
goto basla

herşey olup biter, datalar uçup gider, datayı alamazsın.

Önce

LCDOUT $FE,$C0, "kesme bekleniyor"

bunu gönder, sonra usartı temizle, sonra kesmeyi aktif et ve arada vakit kaybettirecek herhangi bir işlem olmayan  donguye gir,

bekle:
goto bekle

gibi.

Ayrıca Proton ile çalışırsan donanım kesmesi kullanabilirsin, pbp da donanım kesmesi kullanamazsın, çünkü icra edilen bir komut varsa illaki o komut bitmeden kesme rutinine dallanamaz ve o arada gelebilecek dataları kaçırırsın.
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

enrique_iglesias

mikromuh dostum aynen dediğin gibi  oerr sıfırlamak için yaptım.eğer koymazsam bunu sürekli kesmede kalıyor....Nasıl bir sorun??? Şu durumda gayet güzel çalışıyor sorun açarmı acaba......



Og hocam bu yaptığım sadece kesmeyi öğrenmek içinde asıl programımım içine sokarsam yığınlamasına veri var...birde şunu gördüm pause kullandığım an veri kaçıyor... Bende :

for i=0 100
pause 1
next i

şeklinde bir bekletme yapıyorum ozaman fazla kaçmıyor... Birde veri göndermeden önce uyandırma bitleri gönderiyorum ondan sonra asıl veriyi gönderiyorum..birnevi rf'deki gibi preable....

Proton çok istiyorum aslında geçmek lazım ama başa dönmekten korkuyorum düzenim bozulduğunda bişey yapamadığımda hevesim kaçıyor... Bazen oluyor bir led yaktıramıyorum :) sinir yükleniyorum en basit şeyleri görmüyorum.....

Tagli

OG hocamın dediği gibi, OERR 1 oluyorsa veri kaçırmışsın demektir.
Gökçe Tağlıoğlu