Pic Basic Pro ve Kapasite Sorunu

Başlatan bymrz, 26 Aralık 2008, 17:40:21

bymrz

Arkadaşlar hiç istemediğim halde pratik oluşundan dolayı pic basic kullanıyorum programlamada...

Gel gelelim ki bugün artık sabrımı iyice zorlamaya başladı..

Şuan pic16f648A için bir program yazıyorum. Kodları derliyorum ve sonuç şu:

Success: 2680 words used

Buraya kadar güzel, şimdi de programın başına

on interrpt goto kesme  ekliyorum ve derliyorum....

......
Success: 3749 words used




Sizce de bu biraz abartı değil mi, bunun nedeni ne olabilir sizce... Kesme için bu kadar yer mi ayırıyor. Ki kesme rutininde hiç bişey yazmadım henüz boş  :lol:



:?:  :?:  :?:

bymrz


Elektroemre

Tam olarak emin değilim ama şunu niçin olabilir;

Biliyorsunuz PBP software kesme kullanıyor, üstelik herhangi bir komut işlenirken kesme oluşamıyor.
PBP her işlemden sonra kendisi software olarak kesmenin varlığını kontrol ettiğinden ne kadar komut kullanırsanız pbp bir okadar da kodunuza kesme konrol rutinine dallanması için bir komut ekliyor, sonuç olarak programın boyutu atıyor.

Saygılar...

bymrz

Mantıklı...

Fakat hocam ben de şöyle düşünüyordum.PBP komutu işlerken global kesmeyi iptal ediyor, komut bitince de kesmeyi tekrar aktif ederek donanımsal olarak kesmeye gidiyor diye düşünüyordum...


Bi bakayım hocam dediğin mantıklı...

rree

Buna benzer proton basic de bir saçmalık vardı.Ana programı en alta aldığımda bazende alt programların yerini değiştirdiğimde hatanın düzeldiğini gördüm. Sanırım  block adreslemeden kaynaklanıyor. hangi hallerde bilmiyorum blokları bölmek istemiyor gibi.

bymrz

evet hocam,

ilk önce farkı hesapladım

kesmeli ile kesmesiz arasındaki fark 1077 word...

daha sonra programdan bir kesiti sildim, ufak bir parçasını ve fark 975 word a düştü...

Tagli

Alıntı yapılan: "alone_lover"...PBP komutu işlerken global kesmeyi iptal ediyor, komut bitince de kesmeyi tekrar aktif ederek donanımsal olarak kesmeye gidiyor diye düşünüyordum...
Ben de aynı fikirdeyim.

Ayrıca bir ihtimal PBP, programcı yazmasa bile kendi işlemleri için kesmeye gidiyor olabilir. Belki programcı da kendi kesmesini eklediği zaman kesme kaynağının belirlenmesi amacıyla kesme bölümüne kod ekleniyor olabilir. Ama bence bu kadar yer kaplamaması gerekirdi.

Acaba daha küçük programlarda da bu sorunla karşılaşılıyor mu?

Bence assembly kullanın, rahat edin  ;).
Gökçe Tağlıoğlu

bymrz

Arkadaşlar C de de bu sorunlar oluyor mu peki???

bymrz

Alıntı yapılan: "Elektroemre"Tam olarak emin değilim ama şunu niçin olabilir;

Biliyorsunuz PBP software kesme kullanıyor, üstelik herhangi bir komut işlenirken kesme oluşamıyor.
PBP her işlemden sonra kendisi software olarak kesmenin varlığını kontrol ettiğinden ne kadar komut kullanırsanız pbp bir okadar da kodunuza kesme konrol rutinine dallanması için bir komut ekliyor, sonuç olarak programın boyutu atıyor.

Saygılar...


%100 haklısın hocam, bugün üşenmedim denedim  :)


pbp de ki kodlarım şunlardı

'///////////////////////////////////////
on interrupt goto kesme

porta=0:portb=0
porta.0=1


main:

goto main



disable
kesme

resume
Enable
end
'/////////////////////////////


Daha sonra bu kodu derledim. Hex kodunu da asm ye çevirdim IC-Prog ile...

Ve sonuç;

'////////////////////////////
           LIST      P=16F84, F=INHX8M
           include "P16FXX.inc"
           ORG     0x0000

           GOTO    Label_0001
           ORG     0x0004
           RETURN
Label_0001  BSF     INTCON    , GIE
           GOTO    Label_0002
Label_0004  BTFSC   INTCON    , GIE
           RETURN
           GOTO    Label_0003
Label_0002  CALL    Label_0004
           CLRF    PORTA
           CALL    Label_0004
           CLRF    PORTB
           CALL    Label_0004
           BSF     PORTA     , 00
Label_0005  CALL    Label_0004
           GOTO    Label_0005
Label_0003  RETFIE
           CALL    Label_0004
Label_0006  SLEEP
           GOTO    Label_0006

           ORG     0x2000
           DATA    0x0F
           DATA    0x0F
           DATA    0x0F
           DATA    0x0F

           ORG     0x2007
           DATA    0x0A

           ORG     0x2100

'///////////////////////////////////




Ve görüyosunuz ki kod otomatik olarak ikiye katlanıyor neredeyse, her komut öncesi ve sorası kesme bayrağı kontrol ediliyor...


Yani..................


PBP Tam bi baş belasıymış.... 8O      :lol:

bymrz

PBP nin bi aptallığını daha belirtmeden geçemeyeceğim  :)

kodda
porta.0=1 yazarsanız

asm karşılığı;
BSF     PORTA     , 00   (gayet normal)


ama yok ben
high porta.0   yazacağım derseniz

asm karşılığı;
           BSF     PORTA     , 00
           BSF     STATUS    , RP0
           BCF     TRISA     , 00
           BCF     STATUS    , RP0


Ne güzel değil mi,  :D  devamlı bank0 a geçiyor ve porta.0 ı çıkış olarak tanımlıyor...


Akıllara zarar    :lol:

OG

HIGH veya LOW komutunun PBP'daki özelliğidir, bu komut ile ilgili port çıkış olarak atanır der. Proton için de aynı durum geçerli.
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

bymrz

ama hocam ben zaten bank0 da isem niye tekrar banko a geçeyim ki...

OG

Peki basic kodun o aşamasında bank0 da olunacağı garantisi varmıdır?
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

Gurkan-Demirbas

Merhaba;
Ben de PBP'nun bu tür bug'larından acayip müzdaribim. PBP komutlarının ASM kodlarına direk erişememek ve de arka planda neler olduğunu görememek ciddi rahatsızlık veriyor insana. Bir ara Hi-Tech'e geçeyim dedim ki Hi-Tech benim hemen hemen tüm beklentilerimi karşılıyor.

PBP software Interrupt'a gelirsek; hatırlarsanız, ASM'de interrupt geldiğinde, yürürlükteki komutun bitmesini bekler ve ISR'ye öyle dallanır; PBP'da da aynı mantık işletilmeye çalışılmış, verilen komut bittikten sonra ISR'ye dallanıyor, mesela PAUSE 500 komutu işletilirken interrupt geldiğinde, 0,5 sn bekleme işlemi bittikten sonra ISR'ye dallanır, PBP kullanan arkadaşların buna azami dikkat etmesi gerekir. Bu mantığı yürütmek için de, derleme sırasında her komut satırından sonra bir karşılaştırma ve dallanma komut satırları koyar. Bu da HEX programı acayip şişirir

Ben ISR'yi PBP içerisinde ASM yazarak, kendi aklımca bu sıkıntıdan kurtuluyorum. Ancak bunu kullanırken PBP komutları içerisindeki bazı komutların kullanımına da çok dikkat etmek gerekiyor; mesela WRITE, READ, HSEROUT, HSERIN vs. Bu komutlardan önce tüm interruptları disable ediyorum ve komut işletimi sonrası tekrar açıyorum.

ASM yazılan ISR'ye bir örnek;

' Interrupts in assembly language
'  Turn LED on.  Interrupt on PORTB.0 (INTE) turns LED off.
'  Program waits .5 seconds and turns LED back on.

@ DEVICE PIC16F877 
@ DEVICE PIC16F877, PROTECT_OFF     ; Flash Program Memory Code Protection
@ DEVICE PIC16F877, DEBUG_OFF       ; In-Circuit Debugger
@ DEVICE PIC16F877, WRT_OFF         ; Flash Program memory write
@ DEVICE PIC16F877, CPD_OFF         ; Data EEPROM Memory Code Protection
@ DEVICE PIC16F877, LVP_OFF         ; Low Voltage In-Circuit serial programming
@ DEVICE PIC16F877, BOD_OFF         ; Brown-out Reset
@ DEVICE PIC16F877, PWRT_OFF        ; Power-Up Timer
@ DEVICE PIC16F877, WDT_OFF         ; Watch Dog Timer
@ DEVICE PIC16F877, XT_OSC          ; Oscillator Selection

led     var     PORTB.7

wsave   var     byte $20 system
'wsave1  var     byte $a0 system ' Necessary for devices with RAM in bank1
'wsave2  var     byte $120 system ' Necessary for devices with RAM in bank2
'wsave3  var     byte $1a0 system ' Necessary for devices with RAM in bank3
ssave   var     byte bank0 system
psave   var     byte bank0 system


        Goto start              ' Skip around interrupt handler

' Define interrupt handler
define  INTHAND myint       ' !!!!!!!!!!!!!!!!!!!!!!!.........   ISR TANIMLANMASI !!!!!!!!!!!!!!..........

' Assembly language interrupt handler
asm

; Save W, STATUS and PCLATH registers, if not done previously
myint   
        movwf   wsave
        swapf   STATUS, W
        clrf    STATUS
        movwf   ssave
        movf    PCLATH, W
        movwf   psave

; Insert interrupt code here
; Save and restore FSR and any other registers used

        bcf     _led            ; If interrupt, turn off LED
        bcf     INTCON, 1       ; Clear interrupt flag

; Restore saved registers
        movf    psave, W
        movwf   PCLATH
        swapf   ssave, W
        movwf   STATUS
        swapf   wsave, F
        swapf   wsave, W

        retfie                  ; Return from interrupt

endasm


start:  TRISB = $7f             ' LED out, rest in
        OPTION_REG = $7f        ' Enable PORTB pullups
        INTCON = $90            ' Enable INTE interrupt
        led = 1                 ' Turn LED on

loop:   If led = 1 Then loop    ' Wait here while LED is still on
                                ' If we get here, LED is off
        'Pause   500             ' Wait .5 seconds
        Clearwdt
        SLEEP   800       ' Start over (turn LED back on)
        
  END

Erol YILMAZ

Alıntı yapılan: "alone_lover"Arkadaşlar C de de bu sorunlar oluyor mu peki???

Arkadaşlar dayanamadım bu BASIC muhabbetine...
Doğru düzgün oyuncaklarla oynamak lazım.

İyi bir C derleyicisinde bu şekilde problemler asla olmuyor.

Özellikle de "HI-TECH"...  10 PUAN !!!

Datasheet e bakarak kod yazabilirsiniz. Ve aynen çalışır.