kesmeleri donanım destekli kullanmak.(ÇÖZÜLDÜ)

Başlatan erhanzeynel, 11 Eylül 2010, 19:26:41

erhanzeynel

Bildiğiniz üzere picbasic kesmeleri her komutun ardından yazılımsal olarak kontrol ederek kesmelere dallanmakta, bu da programımızı şişirmekte.

Bu yüzden basic programı içinde kesmelere donanımsal olarak dallanmaya çalışıyorum.
Yazdığım basic kodunda, define işlemlerinden hemen sonra;

ASM
      ORG 0X000
      GOTO ILK
      ORG 0X004
      GOTO KESME
ENDASM


satırlarını eklediğimde "collision in ROM @ 000h , collision in ROM @ 004h , collision in ROM @ 005h" hatalarını alıyorum.

Yukarıdaki kodu programdan çıkarıp derleyip kontrol ediyorum, satırları eklediğim yere kadar hiçbir işlem yok. 

acemi2010

Merhaba

Bahsi geçen hataların neden verdiğini bilemiyorum, ama PBP'da kesmeler ile ilgili geçmişte tartışılmış:
https://www.picproje.org/index.php/topic,20163.msg135263.html#msg135263

Timuçin

erhanzeynel

Merhaba;

Çok teşekkür ederim Timuçin bey. Başlıklardan bulamayınca gözden kaçırmışım. aradığımız;
define  INTHAND Benim_Kesmem

Tanımlaması.

Benim_Kesmem kesme alt programı etiketi, yalnız kesme alt programının da assembly yazılmasını gerektiriyor bu tamınlama.

erhanzeynel

Arkadaşlar programımda sorun devam etmekte.
Öncelikle kodu vereyim;
DEFINE OSC 4
DEFINE LCD_DREG PORTA
DEFINE LCD_DBIT 0


DEFINE LCD_RSREG PORTA
DEFINE LCD_RSBIT 6
DEFINE LCD_EREG PORTA
DEFINE LCD_EBIT 7
DEFINE LCD_BITS 4
DEFINE LCD_LINES 2
DEFINE INTHAND KESME                'ASSEMBLER KESME ALT PROGRAMININ ADI KESME
OPTION_REG.7=1
@ DEVICE pic16F628
@ DEVICE pic16F628, WDT_ON
@ DEVICE pic16F628, PWRT_ON
@ DEVICE pic16F628, PROTECT_OFF
@ DEVICE pic16F628, MCLR_OFF
@ DEVICE pic16F628, INTRC_OSC_NOCLKOUT

'---------------------------değişkenler------------------------------
    KONTROL VAR     BYTE    'SENSÖRE GÖNDERİLECEK KONTROL BİTLERİ	   
    ISI1    VAR     BYTE    'HESAPLANAN ISI      
    ISI2    VAR     BYTE    'HESAPLANAN ISI ONDALIK KISMI      
    U1      VAR     BYTE    'HESAPLANAN NEM    
    U2      VAR     BYTE    'HESAPLANAN NEM ONDALIK KISMI
    H0      VAR     HAM.BYTE0
    H1      VAR     HAM.BYTE1
    HAM		VAR	    WORD    'SENSÖRDEN ALINAN İŞLENMEMİŞ DATA
    GAM     VAR     WORD    'HAM İLK HESAPLARDAN SONRA BURADA 
    P1      VAR     WORD    'HESAPLAR İÇİN GEÇİCİ DEĞİŞKEN
    P2      VAR     WORD    'HESAPLAR İÇİN GEÇİCİ DEĞİŞKEN
    P3      VAR     WORD    'HESAPLAR İÇİN GEÇİCİ DEĞİŞKEN         
    W       VAR     WORD    'TRANSMİSYON CLK SAYACI
    CLK     VAR     PORTB.2 'SENSÖRÜN CLOCK BACAĞININ BAĞLI OLDUĞU PİN
    DTA     VAR     PORTB.1  'SENSÖRÜN DATA BACAĞININ BAĞLI OLDUĞU PİN
    ISARET  VAR     BIT   'sensor değeri 0 ise artı, 1 ise eksi
    SIGN    VAR     BIT   'ısı isareti 0 ise artı 1 ise eksi
    HATA    var     BIT    'SENSÖR HATA BİTİ(SENSÖR YOKSA 1)
    TUR     var     bit     'Ölçüm döngüsünde 1.turda ısı 2. turda nem ölçülecek
    atempw   var     byte
    atempp   var     byte
    atemps   var     byte
@ atempw  EQU     0x7A'h
@ atempp  EQU     0x7B'h  
@ atemps  EQU     0x7C'h

  '-----------------------------B A Ş L A N G I Ç ---------------------------    
GOTO ILK


        ASM                     ;ASSEMBLER KESME ALT PROGRAMI
KESME   
        atempw  EQU     0x7A'h
        atempp  EQU     0x7B'h  
        atemps  EQU     0x7C'h                        ;SATATUS PCLATH VE VE W SAKLANMALI
        movwf   atempw
        swapf   STATUS, W
        clrf    STATUS
        movwf   atemps
        movf    PCLATH, W
        movwf   atempp
;---------------KESME KODU BURADAN BAŞLIYOR------------


;---------------KESME İŞLEMİ BİTTİ---------------------
;------KAYDEDİLEN DEĞİŞKENLER GERİ YÜKLENİYOR----------
        movf    atempp, W
        movwf   PCLATH
        swapf   atemps, W
        movwf   STATUS
        swapf   atempw, F
        swapf   atempw, W

        RETFIE    
        ENDASM
ILK:


Programı derlemeye çalıştığımda assembly olarak yapılmış tanımlamalar için;
"opcode expected instead of 'değişkenadı'
Sorunlu değişkenlerin geçtiği satırlar içinse;
"undefined symbol'değişkenadı'
şeklinde hatalar alıyorum.
Örnek kodda aynı değişkenleri hem basic hem de assembly olarak iki defa tanımlanmış olmasına aldırmayın. yalnızca basic olarak tanımladığımda "undefined symbol" hatası devam ediyor.
Yalnızca assembly denedim yine sonuç değişmedi.
Ben de ikisinde birden tanımladım yine değişmedi.

erhanzeynel

Merhabalar. Yine ben.

Google da devam ettiğim araştırmalar sonucunda melabs dökümanlarına ulaştım ve burada bir örnek buldum(tabii ingilizce olarak).

define inthand etiket

kullanılırken dikkat edilecekler;

kesme altprogramında kullanılacak değişkenler, byte olarak, değişken tanımlamalarının en başında, adres belirtilerek ve sistem değişkeni olarak tanımlanmalı.

'---------------------------değişkenler------------------------------
    tempw   var     byte   $7A  SYSTEM
    tempp   var     byte   $7B  SYSTEM
    temps   var     byte   $7C  SYSTEM
   
    KONTROL VAR     BYTE    'SENSÖRE GÖNDERİLECEK KONTROL BİTLERİ	   
    ISI1    VAR     BYTE    'HESAPLANAN ISI     


Bilindiği üzere basic kodlarıyla çalışırken mikrodenetleyicinin o sırada hangi bakta olduğunu bilemeyiz ve araya assembler kodlar serpiştirdiğimizde bu karşımıza sorun olarak çıkar. kesme alt programında bu handikapı aşmanın iki yolu bulunmaktadır.

1. Biraz kirli bir yol. assembly koda başlarken status değişkeninde değer vererek ya da bitlerini değiştirerek belirlediğimiz banka geçmek.
2. assembly program altında kullanacağımız değişkenlere her bankta gölge kopyası olan adreslerden vermek. Örneğin pic16f628 datasheetinde hafıza haritasını incelediğinizde 7A adresinden başlayarak bu şekilde birkaç adres olduğunu görebilirsiniz.

Hepinize hafif programlar. ;)