Usart Hardware Interrupt Problemi - Proton+ 18F452

Başlatan gtekdemir, 22 Kasım 2011, 23:13:55

gtekdemir


  Merhaba arkadaşlar, öncelikle şunu belirteyim bu başlığı açmadan önce problemin çözümünü bulmak için birkaç gün araştırdım fakat bir netice alamadığım için forumu meşgul etmek zorunda kaldım kusura bakmayın. Sorun şu, usart modülünü donanımsal kesme ile kullanmak istiyorum fakat bir türlü alıcı tarafta kesme oluşmuyor. Nerede yanlış yapıyorum ? Yardımlarınızı bekliyorum.

Proteus dosyası ve kod linki: http://www.upload.gen.tr/d.php/www/k0sgd8i7/usart_kesme.rar.html

Verici Kodu :
'***************************M A S T ER********************************************************************

Device 18F452
XTAL = 20
OPTIMISER_LEVEL = 6            ' Full optimisation

Declare HSERIAL_BAUD  = 9600       ' Set baud rate to 9600
Declare HSERIAL_RCSTA = %10010000  ' Bit7 SPEN: Serial Port Enable bit 
                                                               ' Bit6 RX9: 9-Bit Receive Enable Bit : 9Bit kullanılmayacak
                                                               ' Bit4 CREN: Continuous Receive Enable bit 
                                                               ' Bit3 ADDEN: Address Detect Enable bit Asynchronous mode 9-bit (RX9 = 0):RS485 Adresleme kullanılmayacak
                                                               ' 1 = Enables address detection, enable interrupt and load of the receive buffer when RSR<8> is set
                                    

Declare HSERIAL_TXSTA = %00100100  ' Bit5 TXEN: tx enable , Bit3 BRGH: High Baud Rate Select
Declare HSERIAL_CLEAR = On                ' Optionally clear the buffer before receiving
Declare HSERIAL_SPBRG = 129              ' 20MHZ osilatör ve 9600 baud rate için SPBRG=129 bkz.datasheet

Declare FSR_CONTEXT_SAVE = On

Declare ADIN_RES 10          ' Çözünürlük 10 Bit 
Declare ADIN_TAD FRC       ' 
Declare ADIN_STIME 50      ' Örnekleme zamanı 50us 
ADCON1 = %10001110      '7.bit 1 yapılarak 10 bit okuma sağlanır
                                           '3,2,1,0 Bitleri 1110 yapılarak SADECE AN0 analog giriş olarak kuruldu 
      
TRISA=%01111001          'RA0(Analog)AN0 giriş olarak kuruldu, RA3,4,5,6 DI olarak kuruldu

TRISB=%00000000          'çıkış  

TRISC=%10000000          'RC6-TX çıkış, RC7-RX (USART) giriş olarak kuruldu

TRISD=%00000000          'RD0-DO0, RD1-DO1, ... , RD7-DO7 (Dijital Out) çıkış olarak kuruldu
TRISE=%00000000          'RE0-DI3, RE1-DI4, RE2-DI5 (Digital In) giriş olarak kuruldu

PORTA=0                  'Tüm portlar sıfırlanıyor
PORTC=0
PORTB=0
PORTD=0
PORTE=0                               

Symbol an0 = PORTA.0     'Analog input an0

Symbol di0 = PORTA.3     'Dijital input0
Symbol di1 = PORTA.4                            
Symbol di2 = PORTA.5
Symbol di3 = PORTA.6


main:

    If di0=0 Then
        HSerOut [Dec 255,"a"," "]
    EndIf


    If di1=0 Then
        HSerOut [Dec 127,"b"," "]
    EndIf

GoTo main

End


Alıcı Kodu :
'----------------------------S L A V E-----------------------------------------------------------------------------------------------------

Device 18F452
XTAL = 20
OPTIMISER_LEVEL = 6            ' Full optimisation

Declare LCD_DTPIN PORTD.4   	'DATA girişi PORTB'nin 4. ucundan başlayacak
Declare LCD_ENPIN PORTD.3    	'LCD'nin Enable ucu
Declare LCD_RSPIN PORTD.2	        'LCD'nin Register Select ucu
Declare LCD_INTERFACE 4	        'LCD veri yolu 4 bit olacak
Declare LCD_LINES 2		        'LCD 2 satırdan oluşuyor
Cls					                'Ekranı temizler ve 30 ms gecikme sağlar


Declare HSERIAL_BAUD  = 9600                   ' Set baud rate to 9600
Declare HSERIAL_RCSTA = %10010000       ' Bit7 SPEN: Serial Port Enable bit 
                                                                     ' Bit4 CREN: Continuous Receive Enable bit 
                                   

Declare HSERIAL_TXSTA = %00100100         ' Bit5 TXEN: tx enable , Bit2 BRGH: High Baud Rate Select = 1
Declare HSERIAL_CLEAR = On                       ' Optionally clear the buffer before receiving
Declare HSERIAL_SPBRG = 129                     ' 20MHZ osilatör ve 9600 baud rate için SPBRG=129 bkz.datasheet (BRGH=1 ise)
   
Declare FSR_CONTEXT_SAVE = On              

TRISA=%00111000          'RA3-DI0, RA4-DI1, RA5-DI2 (Dijital In) giriş olarak kuruldu 

TRISB=%00000000          'RB2, RB3, RB4, RB5 (Status led) çıkış olarak kuruldu  

TRISC=%10001111          'RC6-TX çıkış, RC7-RX (USART) giriş olarak kuruldu

TRISD=%00000000          'RD0-DO0, RD1-DO1, ... , RD7-DO7 (Dijital Out) çıkış olarak kuruldu
TRISE=%00000111          'RE0-DI3, RE1-DI4, RE2-DI5 (Digital In) giriş olarak kuruldu

PORTA=0                  'Tüm portlar sıfırlanıyor
PORTC=0
PORTB=0
PORTD=0
PORTE=0                               


Symbol di0 = PORTA.3     'Dijital input0
Symbol di1 = PORTA.4                            
Symbol di2 = PORTA.5
Symbol di3 = PORTE.0
Symbol di4 = PORTE.1
Symbol di5 = PORTE.2
Symbol di6 = PORTC.0
Symbol di7 = PORTC.1
Symbol di8 = PORTC.2
Symbol di9 = PORTC.3

Dim rctemp As Byte


'---------------------------------------------------------------------------------------------------------------------
ON_INTERRUPT GoTo int      'Interrupt oluştuğunda int etiketine dallan
Symbol GIE  =INTCON.7       'General interrupt enable bit
Symbol PEIE =INTCON.6      'Peripheral(çevresel) interrupt enable bit
Symbol RCIE =PIE1.5           'Receiver interrupt enable bit
Symbol RCIF =PIR1.5           'Receiver interrupt flag

'--------------------------Interruptları devreye alırken en kısıtlı kontrolden en geniş kontrole doğru sıralıyoruz-----
GIE=0                       'General interrupt enable bit

RCIE=1                     'Receiver interrupt enable bit    
PEIE=1                     'Peripheral interrupt enable bit
GIE=1                       'General interrupt enable bit



'--------------------------ANA PROGRAM----------------------------------------------------------------------------------------------------------


main:                             

Toggle PORTB.3 : DelayMS 250
Print At 2,1,"rcreg=",DEC3 rctemp            'gelen veri yazılacak

GoTo main



'---------------------------KESME RUTİNİ------------------------------------------------------------------------------------------------------   

int:                       'Kesme oluştuğu için int etine dallanıldı
Context SAVE

GIE=0                      'General interrupt enable bit
PEIE=0                     'Peripheral interrupt enable bit
RCIE=0                     'Receiver interrupt enable bit

RCIF=0

PORTB.2=1              'kesme olduysa portb.2 high olsun


rctemp = RCREG             'RCIF değeri sıfırlanması için RCREG değerinin okunması gereklidir.
                                      'Okuma yapıldıktan sonra bu değer rctemp değişkenine aktarılır

RCIE=1                     'Receiver interrupt enable bit
PEIE=1                     'Peripheral interrupt enable bit
GIE=1                       'General interrupt enable bit

Context Restore

'---------------------------------------------------------------------------------------------------------------------------------------------


End



fryrmnd

hocam  herşeyi uzun uzun yazmışsınız zaten. çok detaylı bakamadım ama 250 ms lik delay kısmını for döngüsü ile yapmayı deneseniz. basic te bu beklemeler sorun oluşturuyordu.

gtekdemir

O satırı sildiğimde herhangi bir değişiklik olmuyor ne yazıkki.

muhittin_kaplan

derslerimde usart ile ilgili donanımsal kesme örneği (sadece RX) var. bakıp deneyiniz.

FEHMİ_ASM

Datasheet bilgilerine göre RX pininin de "Çıkış" olarak tanımlanması gerekliymiş.

gtekdemir

Alıntı yapılan: muhittin_kaplan - 22 Kasım 2011, 23:25:32
derslerimde usart ile ilgili donanımsal kesme örneği (sadece RX) var. bakıp deneyiniz.

Hocam çok teşekkür ederim sayenizde sorunu çözdüm. Kesme rutini içine HSERIN komutunu yazmamışım :)

Maxim

muhittin hocam
elinizde hardware interrupt usart transmit için bir örnek kod varmı acaba ?

muhittin_kaplan