###16F877A Interrupt Sorunu###

querman

Üye
Katılım
30 Ara 2009
Mesajlar
14
Puanları
1
Arkadaşlar Usart Interface'i kullanarak max 232 ile pc arasında veri iletişimi sağlıyorum.Pic'e yollanan dataları gorebiliyor ve picden daha gonderebiliyorum.Ancak Ben ana dongu olarak butona basılıp basılmadıgını kontrol ettirirken usert tarafına bi komut gelirse usart interrupt ile gelen datanın alınması işlemine başlıyorum.Fakat şoyle bir sorun var.
max 232 den pic usart interface'ine surekli 5volt geldiği için pic hep kesmeyi calıstırıyor.Yani yazılımsal bir sorun olmadıgı ortada.Ancak Vmetre ile olctugumde max232 den pic'e daha pc den bilgi gondermen 5v gidiyor.Yani 5V her zaman var ancak bilgi gonderdiğim zaman voltaj değişimi oluyor tabi.
Fakat pic ana donguye hiç bakmıyor cunku hep interrupt'a bakıyor.
Sorun sizce nerededir? Teşekkurler :)
 
rs232 haberleşmenin başlaması için ilk startbiti gerekir. start biti için hat lojik sıfıra çekilir. böylece hattan veri geldiğini anlar ve veriyi almaya başlar. veri alımı bittiğinde RCIF bayrağını kurar. ve RCREG kaydedicisinden veriyi alırsın. o sebepten sürekli 5v görmen normal bir durumdur. bu durumdan pic hata yapmaz.
http://ww1.microchip.com/downloads/en/DeviceDoc/31018a.pdf
adresine bir bak burda tüm haberleşmenin detayları mevcut. ya kodda bir hata olabilir yada parazitlenme. pic etrafında çalışan manyetik bir cihaz varsa motor gibi parazitlenme sonucu bu durum ortaya çıkar.
daha fazla yardım etmemizi istiyorsan hata kodu yaz inceleyip hatayı bulalım .
 
evet esr nin dedigi gibi rx pini haberleşme olmadıgı zaman hep high da kalır eger low inmiyosa ozaman data gelmiyodur,bence senin sorunun donanımsaldır gibime geliyo...
 
Ben Mi Yanlış Anlıyorum,
Neden USART kesmesini Kullanmıyorsunuz. Peripheral Interruptlardan Seri iletişim kesmesini kullannın aldığında yada gönderdiğinde kesme oluşturur.
 
zaten usart kesmesini kullanıyorum
eve gidince kodları gondereceğim arkadaslar
 
arkadaşlar kodlar bunlar


'------------------------------------ASSEMBLY-----------------------------------
@ DEVICE pic16F877A
@ DEVICE pic16F877A, WDT_ON
@ DEVICE pic16F877A, PWRT_ON
@ DEVICE pic16F877A, PROTECT_OFF
@ DEVICE pic16F877A, XT_OSC

'-----------------------------------LCD TANIMLAMALARI---------------------------
DEFINE LCD_DREG PORTD 'LCD data bacakları PortD de bağlı
DEFINE LCD_DBIT 0 'LCD data bacakları 0.bitten başlıyor
DEFINE LCD_EREG PORTE 'LCD Enable Bacağı PortE de bağlı
DEFINE LCD_EBIT 2 'LCD Enable Bacağı 2. bite bağlı
DEFINE LCD_RWREG PORTE 'LCD RW Bacağı PortE de bağlı
DEFINE LCD_RWBIT 1 'LCD RW Bacağı 1. bite bağlı
DEFINE LCD_RSREG PORTE 'LCD RS Bacağı PortE de bağlı
DEFINE LCD_RSBIT 0 'LCD RS bacağı 0. Bite bağlı
DEFINE LCD_BITS 4 'LCD 4 bit olarak bağlı
DEFINE LCD_LINES 2 'LCD 2 sıra olarak çalışıyor.

'----------------------------------USART TANIMLAMALARI--------------------------
DEFINE HSER_RCSTA 90h 'RX Yazmacı Enable Ediliyor
DEFINE HSER_TXSTA 20h 'TX Yazmacı Enable Ediliyor
DEFINE HSER_SPBRG 25 'Baud Rate Ayarı Yapılıyor
DEFINE HSER_CLROERR 1 'Clear Overflow Auto

'----------------------------------INTERRUPT TANIMLAMALARI----------------------
INTCON.6 = 1 ' Enable Peripheral Interrupts
INTCON.7 = 1 ' Enable Global Interrupt Handler
PIE1.5 = 1 ' Enable USART Receive Interrupt

'----------------------------------BACAK TANIMLAMALARI--------------------------
ADCON1=7 'A ve E Portu Çıkışları Dijital Yapılıyor.
CMCON=7 'Komparator Pinleri İptal,Hepsi Giriş Çıkış
OPTION_REG.7=1 'PortBdeki Dahili PULL-UP lar İptal edildi
TRISA=1 'A portu giriş olaraka ayarlandı.
TRISB=1 'B portu giriş olaraka ayarlandı.
TRISC=%10000000 'C portu giriş-çıkış olaraka ayarlandı.
TRISD=0 'D portu çıkış olarak ayarlandı.
TRISE=0 'E portu çıkış olarak ayarlandı.

PORTA=0
PORTB=0
PORTC=0
PORTD=0
PORTE=0

'----------------------------------LCD DISPLAY HAZIRLANIYOR---------------------
LOW PORTE.1 'RW bacağı ekrana yazmaya imkan vermek için LOW yapıldı.
PAUSE 200 'CD nin kullanıma hazır hale gelebilmesi için gerekli süre
LCDOUT $FE,1 'Önce Ekranı siliyoruz.

'----------------------------------DEĞİŞKENLER----------------------------------
SAYAC_1 VAR WORD
'----------------------------------EPROMDAN DEĞİŞKEN DEĞERLERİ OKUNUYOR---------
READ 0,SAYAC_1
IF SAYAC_1=255 THEN
SAYAC_1=0
WRITE 0,SAYAC_1
ENDIF
'--------------------------------PROGRAM BAŞLANGICI-----------------------------

LCDOUT $FE,1,"SAYAC 1=",#SAYAC_1,

on interrupt goto KESME

'/////////////////////////////SAYAC_1 SAYMA KODU///////////////////////////////
SAYAC:

IF PORTB.0=1 THEN
SAYAC_1=SAYAC_1+1
WRITE 0,SAYAC_1
LCDOUT $FE,1 'Önce Ekranı siliyoruz.
LCDOUT $FE,$80,"SAYAC 1=",#SAYAC_1
PORTB.0=0
PAUSE 500

ENDIF

goto SAYAC




'//////////////////////////////KESME INTERRUPT/////////////////////////////////
DISABLE '-----------------------KESME AKTİF------------------------
KESME:
If PIR1.5 = 1 Then
toggle portD.7
endif
PIR1.5 = 0

Resume
enable
 
hocam pbp değilde protonda yazdığım bir bir örnek var. çevirmesi zor olmaz
Kod:
        Device = 16F877A
        Xtal = 4
        
        All_Digital true
        
        Hserial_Baud = 9600		' Seri iletişim hızı 9600 bPs
        Hserial_RCSTA = %10010000	' seriport açık ve alıma herzaman açık
        Hserial_Clear = On		' bilgi alındığında Tampon belleği temizle   
        LCD_DTPin = PORTD.4	
        LCD_RSPin = PORTE.0
        LCD_ENPin = PORTE.1
        LCD_Interface = 4		' 4-bit Interface
        LCD_Lines = 2
        LCD_Type = 0
        LCD_CommandUs = 2000
        LCD_DataUs = 50
        
        
        
        Symbol PEIE = INTCON.6 	' Peripheral Interrupt Enable
        Symbol GIE = INTCON.7  	' Global Interrupt Enable
        Symbol RCIE = PIE1.5   	' USART Receive Interrupt yetki
        Symbol RCIF = PIR1.5   	' USART Receive Interrupt bayrağı
        
        GIE=0   			'tüm kesmeler kapalı 
        PEIE=1  			'Çevre birim kesmesi aktif
        RCIE=1  			'Usart alım kesmesi aktif 
        GIE=1   			'tüm kesmeler aktif
        
        Dim satir As Byte   	'satir adında byte değişken
        Dim Dongu As Byte   	'donu adında byte değişken  
        Dim GelenBilgi As Byte
        satir=1              
        
        On Interrupt GoTo kesme	'software kesmesi
        
basla:					'ana program başlangıç
      For Dongu=1 To 16		'
          Print At 2,Dongu,"#"	'2 satırın "Dongu" sütünuna "#" yaz
          DelayMS 100		'100ms bekle
      Next				'
      For Dongu=1 To 16		'
          Print At 2,Dongu," "	'2 satırın "Dongu" sütünuna " " yaz
          DelayMS 100		'
      Next				'
      GoTo basla			'
hata:
      Print At 1,satir,"Hata"
      Return            
kesme:					'kesme alt programı
      Disable			'kayıcıların içeriğini sakla
      HSerIn 1000,hata,[GelenBilgi]	'Hardware Usart Kullanarak bilgiyi al '"gelenbilgi" 'değişkeninin içeriğine at eğer timeout olursa (1000 ms) "Hata" ya dallan

      Print At 1,1,"Gelen Deger ",Dec GelenBilgi	'gelen bilginin değerini yazdır                       
      RCIF = 0	'USART Receive interrupt Flag  Temizleniyor
      Resume
      Enable 	'tüm kayıtlı reg. tekrar yüklenip keseden çıkılıyor            
      End	'program sonu
 
öncelikler portc yi kullanmıyorsan trisc kaydedicisini yönlendirme, yada sadece kullandığın pinleri yönlendir, saçma ama ben bu hata ile çok karşılaştım(doanımsal usart kullanıryorsun bu yüzden RC6 ve RC7 pinlerine müdahele etme.kalan pinleri bit komutlarıyla yönlendirebilirsin). 2.si programda watchdog timer kullanmıyorsun kapat, çünkü manasız resetlenmelere yol açar(ki bu senin manasız kesme girişlerinin sebebi de olabilir.) , onun dışında programda yanlışlık göze çarmıyor ama şunu belirteyim uzun zamandır basicte program yazmadım. o sebeple benim gözümede çarpmamış olabilr. tavsiyem debug yapman. kolay gelsin.
 
Kod:
Device 16F648A
Config  HS_OSC,WDT_OFF , PWRTE_OFF , CP_OFF , MCLRE_OFF 
Xtal 20
CMCON = 7
On_Interrupt GoTo INT
Symbol GIE  =INTCON.7
Symbol PEIE =INTCON.6
Symbol RCIE =PIE1.5
Symbol RCIF =PIR1.5 
All_Digital = TRUE
Pulsin_Maximum 2700
SDA_Pin PORTB.7
SCL_Pin PORTB.6
Declare Slow_Bus On 
Hserial_Baud    = 9600 ' Set baud rate to 9600 
Hserial_RCSTA   = %10010000 ' Enable Hardware USART receive 
Hserial_TXSTA   = %00100000 ' Set Hardware USART parameters 
Hserial_Clear On 
'**********RF TANIMLAMALARI
Dim Header		As Word
	Dim bit_value	As Word
	Dim bit_count	As Word
	Dim K           As Byte
	Dim DASTOP      As Word 
    Dim PP          As Dword
    Dim GRUPH       As PP.Byte3
    Dim GRUPL       As PP.Byte2
    Dim ID          As PP.Byte1
    Dim COM         As PP.Byte0
Dim SGRUP       As Word
Dim ST          As Bit   
Symbol _RFIN    =PORTB.5
Symbol LED      =PORTA.1
'*********PCF TANIMLAMALARI
Dim SN As Byte
Dim _SN As Byte
Dim DK As Byte
Dim SA As Byte
Dim GUN As Byte
Dim AY As Byte
'*********EPROM TANIMLAMLARI
Dim ADRES As Word
Dim FTEMP As Byte
Dim FLAG As Byte
Dim FP As 222
'*********MAIN TANIMLAMALARI
Dim GON[6] As Byte
Dim ADEPROM As Word
Dim TEMP As Word
Dim T As Byte
Dim RCTEMP As Byte
Symbol START =PORTA.3
Dim CUNT As Word
TRISB=%00100010
PORTB=0
TRISA=%00000100
PORTA=0
Header=0
bit_value=0
bit_count=0
ADRES=0
GIE=1
PEIE=1
RCIE=1
SGRUP=8520
GoTo MAIN

INT:
Context Save
    GIE = 0          
    While GIE = 1
        GIE  = 0
        PEIE = 0
        PEIE = 0
    Wend 
    RCTEMP =RCREG
    If RCTEMP="R" Then  GoTo YOLLA
Context Restore
     
MAIN:
RCIF=0
GoSub RFIN
If SGRUP=PP.Word1 Then GoSub DEGERLENDIR
GoTo MAIN


RFIN:	
.
.
.
Return

DEGERLENDIR:
Set LED
BusIn  %10100000,3,[DK,SA,GUN,AY]
BusOut %10100010,ADRES,[AY,GUN,SA,DK,PP.Byte1,"#"]
ADRES= ADRES + 5
DelayMS 1000
Clear LED
PP=0
Return
'********************************************************

    GoTo MAIN
'**********************************************
YOLLA:
    RCTEMP=0    
    ADEPROM=0
    CUNT=1
    KONT: If ADEPROM>30010 Then CIKIS 
    BusIn %10100010,ADEPROM,[GON[5],GON[4],GON[3],GON[2],GON[1],GON[0]]
     GON[5]=GON[5] & %00011111
     GON[4]=GON[4] & %00111111
    HSerOut [13]
    HSerOut [Dec4 CUNT,"*  "]
    HSerOut [Hex2 GON[5],"/"]
    HSerOut [Hex2 GON[4],"-"]
    HSerOut [Hex2 GON[3],":"]
    HSerOut [Hex2 GON[2],"="]
    HSerOut [Dec3 GON[1]]
    HSerOut [13]
    If GON[0] ="#" Then
CIKIS:    
    GIE=1
     PEIE=1
     RCIE=1
     PP=0
     GoTo MAIN
     EndIf     
    ADEPROM=ADEPROM+5
    Inc CUNT
    GoTo KONT
 

Forum istatistikleri

Konular
127,950
Mesajlar
913,849
Kullanıcılar
449,596
Son üye
anilhikmet

Yeni konular

Geri
Üst