USART INTERRUPT ÖRNEĞİ proton+

Başlatan gtekdemir, 26 Kasım 2011, 20:02:27

gtekdemir

  Herkese merhaba, yaşadığım bir kaç problem ardından usart ile donanımsal kesme kullanarak haberleşmeyi hallettikten sonra buradan paylaşmak istedim. Yapacak olduğum bir projede 8byte büyüklüğündeki veri paketlerini kullanmam gerekiyordu, bundan dolayı verdiğim kodları 8byte veri gönderip alacak şekilde yazdım. Umarım faydalı olabilmişimdir.

kod örneği ve isis dosyası:
http://www.upload.gen.tr/d.php/www/wqgd0rtt/usart_kesme_18F452_ile_8Bayt_Veri_G__nderimi.rar.html

master kod:
'***********************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 8     ' Çözünürlük 10 Bit 
Declare ADIN_TAD FRC    ' 
Declare ADIN_STIME 50   ' Örnekleme zamanı 50us 
ADCON1 = %00001110      '7.bit 0 yapılarak 8 bit okuma sağlanır
                        '3,2,1,0 Bitleri 1110 yapılarak SADECE AN0 analog giriş olarak kuruldu 
      
TRISA=%00111001          '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 di0 = PORTA.3     'Dijital input0
Symbol di1 = PORTA.4                            
Symbol di2 = PORTA.5


Dim dizi[8] As Byte     '8Byte büyüklüğünde dizi

Dim adc0 As Byte        'ADC değişkeni


'------------------------------------ilk andaki değerler------------------------------------------------------
dizi[0]=0
dizi[1]=1
dizi[2]=2
dizi[3]=3
dizi[4]=4
dizi[5]=5
dizi[6]=6
dizi[7]=7

'--------------------------------------Ana Program------------------------------------------------------------
main:

    If di0=0  Then
        HSerOut [dizi[0],dizi[0],dizi[0],dizi[0],dizi[0],dizi[0],dizi[0],dizi[0]]
        While di0=0:Wend
    EndIf
   
   
    If di1=0 Then
        HSerOut [dizi[0],dizi[1],dizi[2],dizi[3],dizi[4],dizi[5],dizi[6],dizi[7]]
        While di1=0:Wend
    EndIf
    

    If di2=0 Then
        adc0 = ADIn 0                   'Porta-AN0 dan okunan değeri adc0 değişkeni içine ata
        bak: If ADCON0.2=1 Then bak     'Çevrim bittiğinde alt satırdan devam edecek
        HSerOut [adc0,adc0,adc0,adc0,adc0,adc0,adc0,adc0]
        While di2=0:Wend
   EndIf
 

GoTo main

End


slave kod:
'----------------------------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 gelendata[8] As Byte  '8byte büyüklüğünde usart gelendata dizisi

Dim i As Byte              'usart ile gelen veriyi sırası ile okuyup gelendata dizisine yazmak için for döngüsü değişkeni

'---------------------------------------------------------------------------------------------------------------------
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:                             

High PORTB.3 'Ana program işlendiğini göstermek için
Low PORTB.2

Print At 1,1,DEC3 gelendata[0]," ",DEC3 gelendata[1]," ",DEC3 gelendata[2]," ",DEC3 gelendata[3]," "
Print At 2,1,DEC3 gelendata[4]," ",DEC3 gelendata[5]," ",DEC3 gelendata[6]," ",DEC3 gelendata[7]," ",


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

                           
Low PORTB.3                 'Kesme rutini işlendiğini görmek için
High PORTB.2

For i=0 To 7                
HSerIn[gelendata[i]]        'i degeri ilk anda 0 olduğu için ilk gelen byte gelendata[0] içine yazılır
Next


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

Context Restore

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

End


devre şeması:


Hattusa

s.a.
örnek için tşk ederim usta inanın işimize yarayacak
vardım ilim meclisine eyledim talep, meğer ilim en gerideymiş illa EDEP, illa EDEP <muhyiddin Arabi K.S.>