avatar_Mucit23

18F452 için yazılmış Programı 18F46K22'ye uyarlama

Başlatan Mucit23, 01 Ekim 2016, 22:27:12

Mucit23

Selamlar

18F46K22 ve PicBasic ile başım dertte.

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. Ete hocam hatırlar sanırım. Kendisinden de stack taşması problemi yüzünden yardım almış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.

Bunlardan birkaçı şöyle

18F452'ye harici 4MHZ kristal bağlayıp 4MHZ de çalıştırıyordum. 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

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=%00000110
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.

18F46K22 için PicBasicde temel konfigürasyonlar nasıl olmalı? Harici osilatör şart değil. 4Mhz olsun internal olsun farketmez. MCU'nun temeli sağlam bir şekilde çalışsın yeter.

Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

Mucit23

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.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

mg1980

Mucit,
DLY değişkeni tanımlandı mı ?

for i=0 to 50
pause 1
next i
i=0

değil mi ?

ete

Sorun çok anlamsız görülüyor. Her hangi bir kusur göremedim.
Benim kullandığm konfig ayarları aşağdıki şekilde.
asm
    __CONFIG _CONFIG1H, _FOSC_INTIO67_1H & _PLLCFG_OFF_1H & _PRICLKEN_ON_1H & _FCMEN_OFF_1H & _IESO_OFF_1H       
    __CONFIG _CONFIG2L, _PWRTEN_ON_2L & _BOREN_OFF_2L & _BORV_285_2L
    __CONFIG _CONFIG2H, _WDTEN_OFF_2H & _WDTPS_32_2H
    __CONFIG _CONFIG3H, _CCP2MX_PORTB3_3H & _PBADEN_OFF_3H & _CCP3MX_PORTE0_3H & _HFOFST_OFF_3H & _T3CMX_PORTB5_3H & _P2BMX_PORTC0_3H & _MCLRE_INTMCLR_3H
    __CONFIG _CONFIG4L, _STVREN_OFF_4L & _LVP_OFF_4L & _XINST_OFF_4L & _DEBUG_OFF_4L
    __CONFIG _CONFIG5L, _CP0_ON_5L & _CP1_ON_5L & _CP2_ON_5L & _CP3_ON_5L   
    __CONFIG _CONFIG5H, _CPB_ON_5H & _CPD_ON_5H
    __CONFIG _CONFIG6L, _WRT0_ON_6L & _WRT1_ON_6L & _WRT2_ON_6L & _WRT3_ON_6L
    __CONFIG _CONFIG6H, _WRTC_ON_6H & _WRTB_ON_6H & _WRTD_ON_6H
    __CONFIG _CONFIG7L, _EBTR0_ON_7L & _EBTR1_ON_7L & _EBTR2_ON_7L & _EBTR3_ON_7L
    __CONFIG _CONFIG7H, _EBTRB_ON_7H
endasm
DEFINE OSC 4
OSCCON=%01011100
PORTA=0:TRISA=%00000000
PORTB=0:TRISB=%00000000
PORTC=0:TRISC=%00000000
PORTD=0:TRISD=%00000000
PORTE=0:TRISE=0
ANSELA=0:ANSELB=0
ANSELC=0:ANSELD=0
ANSELE=0
'--------------------ANALOG KANAL KULLANMAK için---------------------------------
ANSELA=%00000001
TRISA=%00000001
ADCON0=0
ADCON1=0
ADCON2=%10110101
'-------------------------------------------------------------------------------
CM1CON0=0
CM2CON0=0
VREFCON1=0

Tek gördüğüm kusur, açılışta LCDOUT $FE,1 komutu verilip daha sonra 200 ms gecikme verilmeli.
İlk verdiğin 200 ms lik gecikme artık açılış gecikmesi olarak kabul edilir.  Bu durumda LCD için gerekli gecikme verilmemiş oluyor şansına ne değer alırsa registerler ona göre çalışır.
Ete

Mucit23

Hocam iyi bir gelişme var. Sizin verdiğiniz konfigürasyon kodlarıyla artık son mesajımdaki sorun yaşanmıyor. Orada gerçekten şaşırıp kaldım. Kesme oluşuyor ama sayaç artmıyor. Yada sayac artıyor fakat ana program bloklanıyor. Siz dahili osilatörü kullanmışsınız gördüğüm diğer farklar ise code protect, write protect gibi korumaların hepsi açık. Bunun pek ilgisi yoktur gerçi.

Şimdi yazılımı tekrar toparlamaya çalışayım. Umarım sorun yaşamam. 
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

ete

Senin kendi Config değerleri ile LCD açılışını düzeltip bir bak.
pause 200
LCDOUT $FE,1   şeklindeki açılış yerine
LCDOUT $fe,1
Pause 200 şeklinde bir açılış ver bakalım. Bu sorunu sanki LCD yaratıyor.
Diğer taraftan OSCCON registerini de 4Mhz için ayarlamak gerek şimdi unuttum bu iş dahili OSC içinmiydi yoksa harici içinde geçerlimiydi. Denemesi bedava nasıl olsa. Sorunu bulki bizde aynı hataya düşmeyelim.

Ete

Mucit23

Hocam Osccon değerini kontrol ettim. Sizde 4Mhz için ayarlamışsınız. Orada sıkıntı yok. Şuanda üzerinde çalışıyorum. Dediğinizi deneyeceğim.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

Mucit23

Hocam Config 3H'a dikkat etmek gerekiyor. Oradaki ayarları tam olarak yapmak gerekiyor aksi halde MCU düzgün çalışmıyor. O da sanırım PinMap olayı ile ilgili. Config3H da genel olarak pin Map işlemleri yapılıyor.

Şimdilik Genel olarak yazılım çalıştı. Biraz test etmem lazım. Yaptığımız değişiklikler Dahili osilatör ve Config3H daki ayarlardan ibaret. Bunun dışında bir değişiklik yapmadım.

Benim şimdi eeprom işini garantiye almam lazım. Eepromda yazılan değerlerin uzun süre bozulmaması gerekiyor. Bazı değerlerin kaydı çok önemli.
Bunun için WriteAndCheck isimli bir program yaptım.

WRITEANDCHECK:
INTEN=0 ;Global Kesmeleri Kapat
  WRITE WRADD,WRBUFF:PAUSE 10   ;İlgili Adrese Değerler yazılıyor
 
  READ WRADD, RDBUFF
  IF WRBUFF<>RDBUFF then
     WRITE WRADD,WRBUFF:PAUSE 10
  ENDIF
INTEN=1 ;Global Kesmeleri Aç
RETURN


İlgili Hafızaya değeri yazıp okuyorum aynı yerden yazılan değer olması gerekenden farklı ise tekrar yazıyorum. Bu sırada kesmeleri de kapatıyorum. Ama yeterlimi emin değilim.

Bazı arkadaşlar picproje de checksum uygulamamdan bahsetti, 2 byte lık word tipi değişkenler veya 4 byte lık dword gibi değişkenler için checksum uygulamanın bana ne faydası olur? Veri bozulmuş ise zaten giden gitmiş oluyor.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

Powered by EzPortal