Daha önce mutlaka başınıza gelmiştir. Öyle bir sorunla uğraşırsınızki programlamaya lanet okuma derecesine gelirsiniz. Öyle bir andayım.
Sabahtan beri bir sorundur başıma bela oldu.
Daha Önce 18F452 için yazmış olduğum programı Pic18F46K22'ye uyarlamaya çalışıyorum. Fakat bu konuda çok büyük dertlerim var.
4 Sene önce RFID kartların kullanıldığı bir cihaz yapmıştım. Program boyutu 32K yani 18F452'nin hafızası %99 dolu. O zamanlar Pic Basic ile programlamıştım.
Şimdi hem programa ufak tefek eklemeler yapmak hemde 18F452'ye göre daha ucuz ve yeni nesil bir mikrodenetleyici olduğu için aynı yazılımı 18F46K22'ye uyarlamaya çalışıyorum ama sabahtan beri anlamsız problemlerle uğraşmaktan öteye gidemedim.
18F46K22 ile simülasyonda problemsiz çalışıyor fakat gerçekte çok anlamsız problemlerle uğraşıyorum. Belkide uzun zamandır basic ile uğraşmadım ondan dır emin değilim.
Bunlardan birkaçı şöyle
18F452'ye harici 4MHZ kristal bağlayıp 4MHZ de çalıştırıyordum. Yapılan iş için 4Mhz oldukça yeterli. Fakat 46K22 de bunu yapamadım. Sanki işlemci olması gerektiğinden çok hızlı çalışıyor. 4Mhz yerine 40Mhz gibi çalışıyor. Halbuki Konfigürasyon ayarlarını defalarca kontrol ettim.
Şöyle basit program parçaları var.
IKIBIP: ;İki Kısa Bıp
HIGH BUZZER
FOR DLY=0 TO 50:PAUSE 1:NEXT
LOW BUZZER
FOR DLY=0 TO 100:PAUSE 1:NEXT
HIGH BUZZER
FOR DLY=0 TO 50:PAUSE 1:NEXT
LOW BUZZER
RETURN
DELAY1:
FOR DLY=0 TO 2000:PAUSE 1:NEXT
RETURN
Mesela yukarıdaki programcıklarda gecikme yaparken kesmenin sekteye uğramaması için delay fonksiyonlarını döngülerle yapmışım. 2. Kod parçasında DELAY1 isimli fonksiyonun 2sn civarı sürmesi gerekirken hemen hemen anında döngü tamamlanıp çıkıyor. IKIBIP fonksiyonuda aynı şekilde çalışıyor. Bunlardan dolayı osc ayarları ile ilgili olacağını düşündüm. Proteus isiste herşey düzgün çalışıyor.
Konfigürasyon ayarlarım ise bu şekilde
asm
__CONFIG _CONFIG1H, _PLLCFG_OFF_1H & _FOSC_XT_1H & _FCMEN_OFF_1H & _IESO_OFF_1H & _PRICLKEN_ON_1H
__CONFIG _CONFIG2L, _BOREN_OFF_2L & _PWRTEN_ON_2L
__CONFIG _CONFIG2H, _WDTEN_OFF_2H
__CONFIG _CONFIG3H, _CCP2MX_PORTC1_3H &_PBADEN_OFF_3H & _MCLRE_INTMCLR_3H
__CONFIG _CONFIG4L, _STVREN_OFF_4L & _LVP_OFF_4L & _DEBUG_OFF_4L
__CONFIG _CONFIG5L, _CP0_ON_5L & _CP1_ON_5L & _CP2_ON_5L & _CP3_ON_5L
__CONFIG _CONFIG5H, _CPB_OFF_5H & _CPD_OFF_5H
__CONFIG _CONFIG6L, _WRT0_OFF_6L & _WRT1_OFF_6L & _WRT2_OFF_6L & _WRT3_OFF_6L
__CONFIG _CONFIG6H, _WRTC_OFF_6H & _WRTB_OFF_6H & _WRTD_OFF_6H
__CONFIG _CONFIG7L, _EBTR0_OFF_7L & _EBTR1_OFF_7L & _EBTR2_OFF_7L & _EBTR3_OFF_7L
__CONFIG _CONFIG7H, _EBTRB_OFF_7H
endasm
Bunun dışında kesme de düzgün çalışmıyor. Ayarladığım frekanstan çok öte daha yavaş çalışıyor. Aslında kesme oluşması düzenli değil. Arada kesme sekteye uğruyor. Sistemde 20x4 LCD var ve herhalde birtek bu düzgün çalışıyor.
MCU'nun donanım ayarları ise bunlardan ibaret.
TRISA=%00000000 ;Giriş Çıkış Ayarları
TRISB=%00000000
TRISC=%10000000
TRISD=%11110000
TRISE=%00000000
PORTA=0:PORTB=0
PORTC=0:PORTD=0
PORTE=0
ADCON0=0 ;ADC Kapatılıyor
ADCON1=0
ANSELA=0
ANSELB=0
ANSELC=0
ANSELD=0
ANSELE=0
INTCON=%10100000
INTCON2=%10000000
T0CON=%11000011
ON INTERRUPT GOTO KESME
TMR0L=131
SYMBOL INTFLG=INTCON.2
Başkada bir ayarım yok. Programda sorunu anlamak için Bütün fonksiyonları devre dışı bıraktım sadece LCD'ye birkaç birşey yazıyorum. Kesme içerisinde de sadece portD nin 0. bitini togge yapıp o pinden kesme frekansını ölçüyorum. Başka yaptığım birşey yok.
Sorunu anlamak için harici bir program hazırladım. Kesmeyi yine 500Hz için kurup kesme içerisinde bir sayac saydırıyorum. Ana programda da Sayacın değerini ekrana yazdırıyorum. Konfigürasyon ayarları vs aynı. Bu program ile birlikte beynim yanma seviyesine geldi.
DEFINE OSC 4
asm
__CONFIG _CONFIG1H, _PLLCFG_OFF_1H & _FOSC_XT_1H & _FCMEN_OFF_1H & _IESO_OFF_1H & _PRICLKEN_ON_1H
__CONFIG _CONFIG2L, _BOREN_OFF_2L & _PWRTEN_ON_2L
__CONFIG _CONFIG2H, _WDTEN_OFF_2H
__CONFIG _CONFIG3H, _CCP2MX_PORTC1_3H &_PBADEN_OFF_3H & _MCLRE_INTMCLR_3H
__CONFIG _CONFIG4L, _STVREN_OFF_4L & _LVP_OFF_4L & _DEBUG_OFF_4L
__CONFIG _CONFIG5L, _CP0_ON_5L & _CP1_ON_5L & _CP2_ON_5L & _CP3_ON_5L
__CONFIG _CONFIG5H, _CPB_OFF_5H & _CPD_OFF_5H
__CONFIG _CONFIG6L, _WRT0_OFF_6L & _WRT1_OFF_6L & _WRT2_OFF_6L & _WRT3_OFF_6L
__CONFIG _CONFIG6H, _WRTC_OFF_6H & _WRTB_OFF_6H & _WRTD_OFF_6H
__CONFIG _CONFIG7L, _EBTR0_OFF_7L & _EBTR1_OFF_7L & _EBTR2_OFF_7L & _EBTR3_OFF_7L
__CONFIG _CONFIG7H, _EBTRB_OFF_7H
endasm
DEFINE LCD_DREG PORTB 'LCD Data portu PORTB'ye bağlı
DEFINE LCD_DBIT 4 'LCD Data bacakları Portb.4'den başlıyor
DEFINE LCD_RSREG PORTB 'LCD RS bacağı PORTB'ye bağlı
DEFINE LCD_RSBIT 2 'LCD RS bacağı PortB.2'ye bağlı
DEFINE LCD_EREG PORTB 'LCD Enable Bacağı PORTB'ye bağlı
DEFINE LCD_EBIT 3 'LCD Enable Bacağı PortB.3'e bağlı
DEFINE LCD_BITS 4 'LCD 4 bit haberleşiyor
DEFINE LCD_LINES 4 'LCD 4 Satır..
SYC VAR WORD
KURSOR VAR BYTE
D VAR BIT
Z VAR BIT
X VAR BIT
;______________________________Hardware Settings________________________________
TRISA=%00000000 ;Giriş Çıkış Ayarları
TRISB=%00000000
TRISC=%10000000
TRISD=%11110000
TRISE=%00000000
PORTA=0:PORTB=0
PORTC=0:PORTD=0
PORTE=0
ADCON0=0 ;ADC Kapatılıyor
ADCON1=0
ANSELA=0
ANSELB=0
ANSELC=0
ANSELD=0
ANSELE=0
INTCON=%00100000
INTCON2=%10000000
T0CON=%11000011 ;Bölücü oranı 1/16 ve Timer0 8 bit çalışacak
ON INTERRUPT GOTO KESME
TMR0L=131 ;Preload değeriyle timer Kesme Frekansı 500Hz olarak ayarlandı.
SYMBOL INTFLG=INTCON.2
SYMBOL INTEN =INTCON.7
PAUSE 200 ; LCD nin açılmadı için 200ms kada bekle
LCDOUT $FE,1
LCDOUT $FE,$80,"Pic18F46K22 Test" ;Giriş yazını yaz
LCDOUT $FE,$C0,"Deneme"
LCDOUT $FE,$94,"Test"
LCDOUT $FE,$D4,"programi"
PAUSE 2000
LCDOUT $FE,1
INTEN=1
BASLA:
PORTD.0=D
D=1-d
LCDOUT $FE,$D4,DEC3 syc
GOTO BASLA
DISABLE
KESME:
Z=1-Z
PORTD.1=Z
SYC=SYC+1
IF SYC=>300 then SYC=0
INTFLG=0
TMR0L=131
RESUME
ENABLE
END
Çok saçma sayacın değeri 9'a kadar artıp duruyor ama kesme oluşmaya devam ediyor. Nasıl oluyor anlamıyorum. Sayacın değeri sürekli artması gerekirken 9 da çakılıp kalıyor. Ama kesme oluşmaya devam ediyor. Bunu portd.1 den kesme frekansında sinyal alarak doğruluyorum.
Sonuç olarak bu işi çözemedim. Çok çok basit bir hata yapıyor olabilirim çünkü en az 3 senedir basic de hiç bir kod yazmadım. Fikri olan varmı? Artık sabah devam edeceğim.
Ekleme: MicroCode Studio 3.0.0.5 ve PBP 2.60A kullanıyorum.
Birinci kodunuzda DEFINE OSC 4 kullanmadiniz mi?
GT-I9500 cihazımdan Tapatalk kullanılarak gönderildi
Kullandım hepsinde de var o tanimlama
hocam ccs c de şöyle yazıyorum çalışıyor kendine uygularsın;
#include <18F26k22.h>
#include <stdlib.h>
#fuses HSH,NOWDT,NOMCLR,PUT,PROTECT,NOLVP,NOPLLEN
#use delay (clock=20M)
burada hsh ve pll e dikkat et gerisi önemli değil
Sorunu çözdüm aslında
Config 3H'ı düzgün yapılandırmadığımdan dolayı sorun oluşuyormuş. Ayrıca Harici 4Mhz osilatör yerine Dahili osilatörü aktif edip 4Mhz'ye ayarladım. Genel olarak Config ayarlarında sıkıntı vardı diyebilirim.