Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

PicBasic ve 18F46K22!!!

Başlatan Mucit23, 01 Ekim 2016, 23:40:43

Mucit23

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.


serkan_esk

Birinci kodunuzda DEFINE OSC 4 kullanmadiniz mi?

GT-I9500 cihazımdan Tapatalk kullanılarak gönderildi


Mucit23

Kullandım hepsinde de var o tanimlama

skara1214

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
Herkes ölür ama herkes gerçekten yaşamaz

Mucit23

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.