PIC18F4520 Seri İletişim Kesme Sorunu

Başlatan M.A.A, 19 Ocak 2019, 16:07:24

M.A.A

Merhabalar.

Eusart kesmesine bir türlü giremedim. Acaba nerede eksiğim var. LEDY, LEDK, LEDS yi programın nereleri işlettiğini görmek için koydum. Veri gelse de LEDY ve LEDS hiç yanmıyor.



Device = 18F4520
OSCCON = %01110000     'Internal 8 MHz clock select,
Xtal=8
Config_Start
   OSC = INTIO67 ; Internal oscillator block, port function on RA6 and RA7
   PWRT = OFF ; PWRT disabled
   BOREN = OFF ; Brown-out Reset disabled in hardware and software
   BORV = 0 ; Maximum setting
   WDT = OFF ; WDT disabled (control is placed on the SWDTEN bit)
   MCLRE = OFF ; RE3 input pin enabled; MCLR disabled
   PBADEN = OFF ; PORTB<4:0> pins are configured as digital I/O on Reset
   LVP = OFF ; Single-Supply ICSP disabled
   Cp0 = On ; Block 0 (000800-001FFFh) code-protected
   CP1 = On ; Block 1 (002000-003FFFh) code-protected
   CP2 = On ; Block 2 (004000-005FFFh) code-protected
   CP3 = On ; Block 3 (006000-007FFFh) code-protected
   CPB = On ; Boot block (000000-0007FFh) code-protected
   WRTD = OFF ; Data EEPROM not write-protected
Config_End

Declare Hserial_Baud = 9600
Declare Hserial_RCSTA = %10010000 ' Enable continuous receive
Declare Hserial_TXSTA = %00100000 ' Enable transmit and asynchronous mode
Declare Hserial_Clear = On

All_Digital = TRUE

'Port Tanımlamaları,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

Symbol LEDY PORTA.6   
Symbol LEDK PORTB.4   
Symbol LEDS PORTC.2   
 
Symbol GENELKESME =INTCON.7
Symbol USARTKESME =INTCON.6
Symbol RXENABLE = PIE1.5
Symbol RXFLAG = PIR1.5

TRISA.6=0
TRISB.4=0
TRISC.2=0

PORTA=0 :LATA=0
PORTB=0 :LATB=0
PORTC=0 :LATC=0
PORTD=0 :LATD=0
PORTE=0 :LATE=0
'RCON.7=1

Dim GELEN As Byte
Dim TEMP As Byte

Dim x1 As Byte :Dim x2 As Byte

GENELKESME= 0
USARTKESME = 1
RXENABLE = 1
GENELKESME= 1

On_Hardware_Interrupt GoTo KESME
'On_Interrupt GoTo KESME
GoTo ANADONGU

'Disable
KESME:
Context Save
LEDY=1
GENELKESME= 0
USARTKESME = 0
RXENABLE = 0
TEMP= RCREG
GENELKESME= 1
USARTKESME = 1
RXENABLE = 1
LEDS=1
Context Restore
'Enable
'Resume



ANADONGU:
         Toggle LEDK       
         Call BEKLE
GoTo ANADONGU


BEKLE:
    For x1 = 0 To 250
        For x2 = 0 To 250
        DelayUS 1
        Next
    Next
Return





Hattuşa

kodu tam inceleyemedim ama kesme configrasyonunda PIEI yani çevresel birimlerden gelen kesme registeri set edilip açılmamış gibi gözüküyor, sitede bolca örnek vardı ama oradan bakabilirsiniz. hala olmazsa haber verin detaylı bakalım

ete

Programda her şey yerli yerinde registerler set edilmiş durumda eksik olan

declare  HSER_SPBRG 51  ' 9600 Baud @ 8MHz, 0,16%
SPBRGH = 0
BAUDCON.3 = 1         ' Enable 16 bit baudrate generator

Bunlar. Bu işlemcide  USART değil ESUART bulunuyor.  Yukarıdaki eksikleri tamamlayıp tekrar dene istersen.
Birde yazıp iptal ettiğin satırlar var. Onların detaylarına Proton klavuzundan bakmanı öneririm.

Ete

M.A.A

Yazdıklarınız neticesinde kodu kontrol ettim. Picin RX ucu ile TX ucunu birleştirip ana döngü içinde ile bilgi yolladım kesmeye girdi. Sorunun başka yerde olduğunu düşünüp bir sürü deneme yaptım ama işin içinden çıkamadım. (16F628A ile de denedim)

Ben Simmodul ile haberleşmeye çalışıyorum. Simmodulu ardunio ile denedim çalışıyor. Çift taraflı haberleşe biliyorum.
Pic ile Simmodul e komut yollayabiliyorum hem HSerOut hemde SerOut komutları ile.
Pic ile ardunio arasında hem HSerOut hemde SerOut komutları ile çift taraflı (interrupsız) haberleşme sağlayabiliyorum. İşin içine interrup girince olmuyor.
Osiloskop ile RX ve TX leri kontrol ettim nedenini anlayamadığım bir durum söz konusu.

Boşta iken;
Simmodul RX = 2,75V
Simmodul TX = 2,75V
Ardunio RX    = 5V
Ardunio TX    = 5V
PIC RX            =1,65V
PIC TX            =0 V

Bağlı İken ve veri yollamadan;
Simmodul RX + Ardunio TX =5V   
Simmodul TX + Ardunio RX =2,75V
Simmodul RX + PIC TX          =0V    (beslemeleri ortak)
Simmodul TX + PIC RX         =2,75V (beslemeleri ortak)
PIC TX + Ardunio RX             = 0V   
PIC RX + Ardunio TX            = 5V

Bu gerilim farklarının nedeni ne olabilir. Yaşadığım sorun bunlarla alakalı olabilir mi ?


ete

Normalde USART sistemini  aktive ettiğiniz zamn TX pini otomatik HIGH olması gerekir. TX_RX birbirine bağlı oluncada otomatikman orada 5V okumanız doğal. Ama neden pic de bu olmuyor onu bilmiyorum. Belkide IPEN biti (RCON registeri 7. bit) SET edilmiş durumdadır. Hal böyle olunca kesmelerde öncelik sistemi aktive edilmiş oluyor ve şayet durum bu ise  IPR1  registeri 4 ve 5 nolu bitleri 1 yapılmalıdır.

Programa önce RCON.7=0 komutunu vererek bir dene bakalım. Bu şekilde normal öncelik sırasında sistemin çalışması gerekir.
Baktım da bu işlemcide özel kontrol registeri de yok. Olanlarda bazı işlevler başka pinlere aktarılabiliyor idi.
Aklıma başka bir şey de gelmiyor.

Ete

M.A.A

Hocam şuan 16F628 li devrem kurulu olduğu için yazdığınızı daha yapmadım ama şöyle bir şey yaptım. Oldu.

"Normalde USART sistemini  aktive ettiğiniz zamn TX pini otomatik HIGH olması gerekir." bu istinaden kodun başına

HSerOut ["BOS"]
Call BEKLE
HSerIn 1000, [TEMP]
Call BEKLE

Bunları ekledim. Başlangıçta bir defa çalışıyor.  Daha sonra ana döngü içinde kesme girmeye başlıyor. Galiba unuttuğum bir veya birkaç registeri aktif yapıp çalışır hale getiriyor. Ama neyi bilmiyorum.

ete

Unutulmuş bi rşey yok ama Proton TX tarafını set etmemiş sanırım . Bu ilave ile TX çalışır hale geliyor ve sistem normale dönüyor.
Protonun kusurlarından biri olsa gerek.
Ete

M.A.A

Galiba nedeni buldum hocam.

Declare Hserial_RCSTA = %10010000
Declare Hserial_TXSTA = %00100000
yerine
RCSTA = %10010000
TXSTA = %00100000

yapınca diğer kodları eklemeden çalıştı. Proton HSerOut ve HSerIn komutlarını program içinde çalıştırmadan onlarla ilgili olan Declare leri işleme almıyor demek ki.

ete

Duymayanlar duysun. Protonda çalışanlar buna dikkat etsinler.
Ete

M.A.A

Hocam bir sorunum daha var.

Sim Modul ile ardunio yu haberleştirirken gelen veriler anlamlı oluyor.
Ardunio dan pic e veri yollayıp kesme ile alıyorum gelen veriler anlamlı oluyor.
Sim Modul den pic e gelen veri anlamsız. Hepsi 0. Kesme ye giriyor. Ama gelen veriye anlamlandıramıyor. ,

Gelen veriyi tuttuğum diziyi başta GELEN="AHMET" yapıyorum.
Veri gelmeden ekrana basınca AHMET yazıyor.
Veri gelince ekrana hiç bir şey yazmıyor.
Sim modulden OK verisi gelecek şekilde ayarlıyorum. GELEN dizisini ASCII olarak yazdırıyorum.
Bazen  0   0   77  69  84
Bazen  0  72  77  69  84          yazıyor.
Sanki gelen veriyi anlamlandıramadığından  0  olarak alıyor gibi.

ete

Bence o proton derleyicisinde sorun var. Doğru dürüst çalışır bir hex derleyemiyor bana kalırsa.
Ya versiyon değiştir özellikle declare komutlarını kabullenen bir sürüm olursa diğerlerininde çalıştığından emin olabilirsin.
Anlamlı veri alamadığına göre sistemin yada programın istenildiği gibi çalışmıyor demektir.

Öncelikle bu şüpheden kurtulmak ardından sorun devam ediyor ise bakmak gerek.

Ete

Powered by EzPortal