18f46k22 donanımsal usart yardım

Başlatan mikro29, 12 Şubat 2015, 14:49:32

mikro29

Biraz araştırmama rağmen Proton basic  ile donanımsal usart çalıştıramadım. Aslında  şöyle çalışıyor usart çalıştığı zaman ekran çalışmıyor, ama programdan usartı silince herşey normal. Daha önceden burada [url=http://etepic.com/index.php?topic=911.0]http://etepic.com/index.php?topic=911.0 [/url] konu açılmış ama sonuca ulaşamadım yardımlarınızı bekliyorum. Teşekkürler



Device = 18F46K22
Xtal 64
Config_Start
  FOSC = HSHP ;HS oscillator (high power > 16 MHz)
  PLLCFG = On ;Oscillator multiplied by 4
  PRICLKEN = On ;Primary clock is always enabled
  FCMEN = OFF ;Fail-Safe Clock Monitor disabled
  IESO = OFF ;Oscillator Switchover mode disabled
  PWRTEN = OFF ;Power up timer disabled
  BOREN = SBORDIS ;Brown-out Reset enabled in hardware only (SBOREN is disabled)
  BORV = 190 ;VBOR set to 1.90 V nominal
  WDTEN = OFF ;Watch dog timer is always disabled. SWDTEN has no effect.
  WDTPS = 32768 ;1:32768
  CCP2MX = PORTC1 ;CCP2 input/output is multiplexed with RC1
  PBADEN = OFF ;PORTB<5:0> pins are configured as digital I/O on Reset
  CCP3MX = PORTB5 ;P3A/CCP3 input/output is multiplexed with RB5
  HFOFST = OFF ;HFINTOSC output and ready status are delayed by the oscillator stable status
  T3CMX = PORTC0 ;T3CKI is on RC0
  P2BMX = PORTD2 ;P2B is on RD2
  MCLRE = EXTMCLR ;MCLR pin enabled, RE3 input pin disabled
  STVREN = On ;Stack full/underflow will cause Reset
  LVP = OFF ;Single-Supply ICSP disabled
  XINST = OFF ;Instruction set extension and Indexed Addressing mode disabled (Legacy mode)
  Debug = OFF ;Disabled
  CP0 = OFF ;Block 0 (000800-003FFFh) not code-protected
  CP1 = OFF ;Block 1 (004000-007FFFh) not code-protected
  CP2 = OFF ;Block 2 (008000-00BFFFh) not code-protected
  CP3 = OFF ;Block 3 (00C000-00FFFFh) not code-protected
  CPB = OFF ;Boot block (000000-0007FFh) not code-protected
  CPD = OFF ;Data EEPROM not code-protected
  WRT0 = OFF ;Block 0 (000800-003FFFh) not write-protected
  WRT1 = OFF ;Block 1 (004000-007FFFh) not write-protected
  WRT2 = OFF ;Block 2 (008000-00BFFFh) not write-protected
  WRT3 = OFF ;Block 3 (00C000-00FFFFh) not write-protected
  WRTC = OFF ;Configuration registers (300000-3000FFh) not write-protected
  WRTB = OFF ;Boot Block (000000-0007FFh) not write-protected
  WRTD = OFF ;Data EEPROM not write-protected
  EBTR0 = OFF ;Block 0 (000800-003FFFh) not protected from table reads executed in other blocks
  EBTR1 = OFF ;Block 1 (004000-007FFFh) not protected from table reads executed in other blocks
  EBTR2 = OFF ;Block 2 (008000-00BFFFh) not protected from table reads executed in other blocks
  EBTR3 = OFF ;Block 3 (00C000-00FFFFh) not protected from table reads executed in other blocks
  EBTRB = OFF ;Boot Block (000000-0007FFh) not protected from table reads executed in other blocks
Config_End

OSCCON.6 = 1 '111 = 16Mhz
OSCCON.5 = 1
OSCCON.4 = 1
OSCTUNE.6 = 1 '(multiplier 4 on 16*4 =64 MHZ)
'INTCON2.7 = 0 ' PULL UP PORTB REGISTER RBPU
                       
Declare  SHOW_SYSTEM_VARIABLES = OFF   
Declare  FSR_CONTEXT_SAVE = OFF   
Declare  Reminders = OFF   
Declare  Warnings = OFF   
'Declare  Optimiser_Level 0   
Declare  Bootloader = OFF

'**********GIRIS-CIKIS TANIMLAMALARI****************** 
'      76543210     
TRISA=%00111111 :PORTA=0
TRISB=%00000000 :PORTB=0
TRISC=%10000000 :PORTC=0
TRISD=%00000000 :PORTD=0
TRISE=%00000001 :PORTE=0

PortB_Pullups = On
PortB_Pullups = TRUE

'-------------------------- GLCD AYARLARI ------------------------
                                                                   
Declare  LCD_Type Toshiba     ' LCD type - graphical. Toshiba T6963 chipset
Declare  LCD_DTPort PORTD     ' Data port
Declare  LCD_WRPin  PORTC.3   ' WR line
Declare  LCD_RDPin  PORTC.2   ' RD line
Declare  LCD_CDPin  PORTC.1   ' CD line
Declare  LCD_CEPin  PORTB.0   ' CE line
'Declare  LCD_RSTPin PORTB.6   ' RST line
Declare  LCD_FSPIN  PORTC.5   ' FS line
Declare  LCD_X_Res   240      ' YATAY PiKSEL SAYISI
Declare  LCD_Y_Res  128       ' DiKEY PiKSEL SAYISI
Declare  LCD_Font_Width  8    ' FONT BÜYÜKLÜĞÜ
Declare  LCD_RAM_Size  8192   ' Display memory size
Declare  LCD_CommandUs 10
Declare  LCD_DataUs 10
Declare  GLCD_STROBE_DELAY 100
'GLCD_EXTERNAL_PRINT = PPRINT

Declare Adin_Res   10
Declare Adin_Tad   FRC
Declare Adin_Stime   10
Declare FSR_Context_Save = On

'-------------------------- ADC AYARLARI --------------------------
        '76543210
ADCON0 =%00000001
ADCON1 =%00001010
ADCON2 =%10000000

'-------------------------- USART AYARLARI ------------------------ 
Declare Hserial_Baud =9600
Declare Hserial_RCSTA=$90h
Declare Hserial_TXSTA=$25h
Declare Hserial_SPBRG= 103
Declare Hserial_Clear= On

'-------------------------- BAUD AYARLARI ------------------------ 
BAUDCON1.7 = 0 '1 = Otomatik baud zamanlayıcı taştı , 0 = Otomatik baud zamanlayıcı taşma kapalı
BAUDCON1.6 = 1 'Asenkron ise ve 1 = Alıcı boşta     , 0 = Başlangıç biti tespit edilmiş ve alıcı aktif
BAUDCON1.5 = 1 'Asenkron ise ve 1 = Alma verileri ( RX ) ters çevrilir , 0 = Alma verileri ( RXx ) ters çevrilmez
               'Senkron ise ve 1 = Veriler ( DTx) ters çevrilir
BAUDCON1.4 = 0 'Asenkronda ise 1 = (Tx) iletim düşük modda , 0 = (Tx) iletim yüksek modda
BAUDCON1.3 = 0 'Baud Rate Generator 8 bit
BAUDCON1.2 = 0 'Geçersiz bit
BAUDCON1.1 = 0 'Uyandırma modu Asenkronda
               '1 = Alıcı düşen kenarı bekliyor . Hiçbir karakter alınacak
               '    ancak RCxIF düşen üzerine kurulacaktır Yükselen kenarında WUE otomatik olarak açık
               '0 = Alıcı normal çalışıyor
BAUDCON1.0 = 0 ' Asenkron modda 1 = Otomatik Baud modu etkinleştirildiğinde Algılama ( otomatik baud tamamlandığında temizler )
               ' 0 = Otomatik Baud Algılama modu devre dışı
                             
'-------------------------- VERİCİ DURUM VE KONTROL AYARLARI ------------------------ 
TXSTA1.7  =  1 ' Asenkron Modda işe yaramaz
TXSTA1.6  =  0 '1 = 9-bit iletimi seçer , 0 = 8-Bit iletimi seçer
TXSTA1.5  =  1 '1 = İletim etkin, 0 = İletim kapalı
TXSTA1.4  =  0 '1 = Senkron (eşzamanlı) ,  0 = Asenkron (eşzamansız)
TXSTA1.3  =  0 'Asenkron modda 1 = Bir sonraki iletim Sync sonunu gönder , 0 = Sync Arası İletim tamamlandı 
TXSTA1.2  =  0 'Asenkron modda 1 = Yüksek hız  0 = Düşük hız
TXSTA1.1  =  0 'Kayıt durumu   1 = boş , 0 = dolu
TXSTA1.0  =  0 'Geçersiz bit, Adres / veri biti veya bir eşlik biti olabilir

'-------------------------- GENEL KESME AYARLARI ------------------------ 
PIR1.7 = 0 ' Geçersiz bit
PIR1.6 = 0 ' A/D çevrim kesme biti   1 = Aktif , 0 = pasif
PIR1.5 = 1 ' EUSART1 Alma (Rx) Kesme Bayrak bit    1= RCREG1 okunduğu zaman temizlenir, 0= EUSART1 tamponu boş alıyorsunuz,
PIR1.4 = 1 ' EUSART1 İletim  (Tx) Kesme Bayrak bit 1 = EUSART1 iletim tampon , TXREG1 , boş ( TXREG1 yazıldığı zaman temizlenir )
           ' 0 = EUSART1 ileti (Tx) tampon dolu
PIR1.3 = 0 ' Master Senkron Seri Port1 Kesme Bayrak biti 1 = Iletim alımı tamamlandı , 0 = Iletmek almak için bekliyor
PIR1.2 = 0 ' Capture mode ise
           '1= TMR1 kayıt yakalama oluştu 0 = TMR1 kayıt yakalama oluşmaz
           ' Compare mode ise
           
PIR1.1 = 0 '
PIR1.0 = 0 '

'-------------------------- GENEL KESME AYARLARI ------------------------
       '76543210
PIR2 = %00000000
PIR3 = %00000000
PIR4 = %00000000
PIR5 = %00000000

'-------------------------- GENEL KESME AKTİF ETME AYARLARI ------------------------
PIE1.7 = 0 ' Geçersiz bit
PIE1.6 = 0 ' A/D Dönüştürücü Kesme izin verme biti   0 = A/D kesmesine izin verilmez
PIE1.5 = 1 ' EUSART1 bigi alındı Kesmesine izin verme biti , 0 = EUSART1 bilgi alındı kesmesine izin verilmez
PIE1.4 = 1 ' EUSART1 bigi gönderme Kesmesine izin verme biti  , 0 = EUSART1 KESME Bit TX etkinleştirme kapalı
PIE1.3 = 0 ' Senkronize  Seri Port1 Kesmesine izinverme  bit etkinleştirme 1 = MSSP1 kesme aktif , 0 = MSSP1 KESME pasif          '
PIE1.2 = 0 ' 1 = CCP1 Kesme aktif , 0 = CCP1 KESME pasif
PIE1.1 = 0 ' 1 = TMR2 KESME AKTİF 0 = TMR2 KESME PASİF
PIE1.0 = 0 ' 1= TMR1 KESMES BAYRAĞI SIFIRLANDI

'-------------------------- ÇEVRESEL KESME AKTİF ETME AYARLARI ------------------------
IPR1.7 = 0 ' Geçersiz
IPR1.6 = 1 ' A/D 1 = Dönüştürücü Kesme Öncelik
IPR1.5 = 1 ' EUSART1 Alıcı kesme önceliği 1 = HIGH öncelik , 0 = LOW öncelik
IPR1.4 = 1 ' EUSART1 Verici kesme önceliği 1 = HIGH öncelik , 0 = LOW öncelik
IPR1.3 = 0 ' Master Senkron Seri Port 1 Kesme Öncelik biraz  1 = High öncelik , 0 = Low öncelik
IPR1.2 = 0 ' CCP1 kesme önceliği   1 = High öncelik , 0 = Low öncelik
IPR1.1 = 0 'TMR2 Kesme önceliği  1 = High öncelik , 0 = Low öncelik
IPR1.0 = 0 'TMR1 TMR1 Taşma Kesme Öncelik 1 = High öncelik , 0 = Low öncelik

'-------------------------- ÇEVRESEL KESME ÖNCELİK AYARLARI ------------------------
       '76543210
IPR2 = %00000000
IPR3 = %00000000
IPR4 = %00000000
IPR5 = %00000000

'------------------------------ KIYASLAYICI AYARLARI  ------------------------------
CM1CON0.7 = 0 ' COMPARATOR İPTAL
' ------------------------------ TMR0 KESME AYARLARI -------------------------------
T0CON.7 = 1' TMR0 1 = AÇIK , 0 = KAPALI
T0CON.6 = 0' TMR0 1 = 8 BIT , 0 = 16 BIT
T0CON.5 = 0' TMR0 GİRİŞ PİNİ 1 = T0CKI , 0 = Dahili kaynak
T0CON.4 = 0' TMR0 KENAR BİTİ 1 = Yükselen kenar tetiklemesi , 0 = Düşen kenar tetiklemesi
T0CON.3 = 0' TMR0 ÖN BÖLÜCÜ ATAMA BİTİ 1 = 
T0CON.2 = 0' 111 1/256   100 1/32   001 1/4
T0CON.1 = 0' 110 1/128   011 1/16   000 1/2
T0CON.0 = 0' 101 1/64    010 1/8
             
''       76543210
'T0CON= %10000000
'' ------------------------------ KESME KONTROL AYARLARI ----------------------------
INTCON.7 = 1 'bütün kesmelere izin verme biti  1=KESMELER AKTİF
INTCON.6 = 0 'ÇEVRESEL KESMELER 1= AKTİF
INTCON.5 = 1 'TMR0 taşma kesmesi 1 = AKTİF
INTCON.4 = 0 'INT0 kesmesi 1 = AKTİF
INTCON.3 = 0 'PORTB4-7 değişim kesmesi 1 = AKTİF
INTCON.2 = 1 'TIMER0 ZAMAN AŞIMI 1 = AKTİF 
INTCON.1 = 0 'PORTB0 DIŞ KESME 1 = AKTİF 
INTCON.0 = 0 'PORTB4-7 DEĞİŞİM KESMESİ 1 = AKTİF
''        '76543210
''INTCON =%11100000

INTCON2 = %10000000 ' Portb pull up 1 = pasif , 0= aktif

''------------------------------ KESME KONTROL AYARLARI ----------------------------

PIE1.6 = 0'ADC KESMESİ AKTİF      1 = AKTİF
PIE1.5 = 1'EUSART1 ALICI KESMESİ  1 = AKTİF
PIE1.4 = 1'EUSART1 VERİCİ KESMESİ 1 = AKTİF
PIE1.3 = 0'MSSP1 KESMESİ AKTİF    1 = AKTİF
PIE1.2 = 0'CCP1 KESMESİ AKTİF     1 = AKTİF
PIE1.1 = 0'TMR2 KESMESİ AKTİF     1 = AKTİF
PIE1.0 = 1'TMR1 TAŞMASI AKTİF     1 = AKTİF
        '76543210
'PIE1  = %00110000

'<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
'-------------------------- Ports settings ---------------------------------
                                                                   
PortB_Pullups = OFF   ' Disable PORTB pullup resistors
Declare  All_Digital = OFF ' Do not set analogue pins to digital
Symbol RBIF = INTCON.0 ' RB Port Interrupt Flag
Symbol INTF = INTCON.1 ' RB0 External Interrupt Flag
Symbol T0IF = INTCON.2 ' TMR0 Overflow Interrupt Flag
Symbol RBIE = INTCON.3 ' RB Port Change Interrupt Enable
Symbol INTE = INTCON.4 ' RB0 External Interrupt Enable
Symbol T0IE = INTCON.5 ' TMR0 Overflow Interrupt Enable
Symbol PEIE = INTCON.6 ' Peripheral Interrupt Enable
Symbol GIE = INTCON.7  ' Global Interrupt Enable
                                                                   
'-------------------------- PIE1, PIR1 ----------------------------------------------
                                                                   
Symbol TXIE = PIE1.4   ' USART Transmit Interrupt Enable
Symbol TXIF = PIR1.4   ' USART Transmit Interrupt Flag
                                                                   
dim deger as byte
Dim SAYAC As Byte
Dim SN As Byte
Dim DAK As Byte
                           
Clear                           ' BÜTÜN DEĞİŞKENLERİ TEMİZLE                                       
'-------------------------- USART interrupt settings -------------------
TXIE = 1    ' USART transmit interrupt enable
PEIE = 1    ' Peripheral interrupt enable
GIE = 1    ' Global interrupt enable
                                                                   
ON_INTERRUPT goto  Int_Label
Goto  MainProgram
                                                                   
'-------------------------- Interrupt--------------------------
                                                                   
Int_Label:
Context Save
hserout [#deger]                  '                                 
                                                                   
Context Restore                ' Return from the interrupt subroutine
                                                                   
'-------------------------- Main program -------------------------
                                                                   
MainProgram:
print at 1,1,"deger = ",#deger                                                                 
                                                                   
                                                                   
Goto  MainProgram
end
' <<<<<<<<<<<<<<<<<<<<<<<<<<<<< TIMER0 KESME >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Disable
KESME:
SAYAC=SAYAC+1
If SAYAC=99 Then
SAYAC=0
SN=SN+1
If SN=60 Then
SN=0
DAK=DAK+1
If DAK=60 Then
DAK=0

EndIf
EndIf
EndIf

INTCON.2=0
Resume
Enable 


gergy

Ne yapmak istediğinizi anlamadım ancak internal osilatör ile genelde usart haberleşmede sorunlar yaşanabiliyor. Harici osilatör kullanarak başlayın derim. Programınızı detaylı incelemedim, fakat usart ayarları yanlış gibi geldi, 8 bit için ayarları aşağı ekledim. USART ayarlarında hem deklerasyon hem register ayarlarını yazmışsınız, birinin üzerinden gitmeniz daha doğru olur. Kesme ayarları birden fazla tekrarlanmış ve anlamadığım timer 0 kullanılrken neden timer1 kesmesi aktive edilmiş. Program sanırım kopyala-yapıştır hazırlanmış, herbir kısmı ayrı ayrı yerlerden alınıp yapıştırılmış gibi, keza kesme kısmı donanımsal kesme olarak başlanmış ancak timer kesmesi yazılımsal kesmeye göre yazılmış (yapıştırılmış). Kesmeye girilince hangisi için hangi işlemin yapılacağı belli değil. FSR_Context_Save deklerasyonu proton'un son sürümünde yok diye biliyorum. Özetle ne yapmak istediğiniz tam olarak belli değil. Seri veri ile haberleşme amacınız ise siz sadece seri veri göndermeye çalışmışsınız ki onu da kesmeleri doğru kullanmadan yapmaya kalkışmışsınız. Proton'un kendi örnek klasöründe usart ile ilgili detaylı örnekler mevcut, bir inceleyin derim.


Hserial_RCSTA = 144 ; Enable continuous receive
Hserial_TXSTA = 32  ; Enable transmit, BRGH = 0
Hserial_SPBRG = 103 ; Baud Rate Generator Value
Hserial_Clear = On  ; Clear overflow automati



Powered by EzPortal