ASM den PBP deki satıra dallanma nasıl?

Başlatan mzeybek, 10 Haziran 2004, 09:07:46

mzeybek

Arkadaşlar PBP nin içine ASM olarak Interrupt gömdüm. Fakat interrupt bitince PBP daki bir etikete dallanmasını istiyorum.

Bir de ASM olarak yazdığım bir blok içerisindeki sayıcı olarak kullandığım registeri PBP dan nasıl kontrol edebilirim.

YAni anlayacağınız PBP nin içerisinde ASM de biraz yardıma ihtiyacım var.

Şimdiden çok teşekkürler.
UcAnTuRk

alayli

Arkadaşım;

Bunun için aşağıdaki gibi bir yol izleyebilirsin.

ASM                                 'ile ASM komutu gireceğini PBP'ye bildirisinsin.
Senin interrupt rutinin:          'şeklinde bir etiket belirlersin.      
........
.........
.........
.........
.........
........  
ENDASM

 
  RETURN      'return ile buraya geldiğin yere geri dönersin.


Sayıcı registerini zaten PBP'de de tanımlamış olman gerekiyor. Tanımladığın isimle çağırıp kullanabilirsin.  
Anca kazganmiş itmiş ilimiz törümüz erti. Türk Oguz begleri budun esiding. Üze tengri basmasar, asra yir telinmeser, Türk budun, ilingin törüngin kim artati? (udaci erti)

mzeybek

Kodun tamamını yazmaya karar verdim. Bu hani şu mesafe ölçüm cihazı var ya işte onun PBP ile yaptığım versiyonu.

Tam olarak 40 KHz vermek için ASM kullandım.

İlginçtir aşağıdaki şekilde ASM içerisinde yazarken PBP de tanımlanmış olan register yada etiketleri _ işareti ile başlatınca sorun kalkıyor gibi.
neden böylebir kullanımı kitabında da görmedim ama.

Bu arada DISABLE ve ENABLE komutlarını doğru kullanmışmıyım ??? yorumlarınızı bekliyorum.

TIME1 ve TIME2 40 KHz i gönderdikten sonra TMR0 interrupt ı ile saydırdığım counter lar. TMR0 her overflow olduğunda TIME1 1 artıyor.
TIME1 dolduğunda (255) ise TIME2 artıyor.

Tabi bu işlemleri yaparken interrupları kesmek için DISABLE ve ENABLKE kullanıyorum ama tam emin değilim doğru olduklarından.

M metre, CM santimetre cinsinden mesafe yi hesapladığım register lar.

22 ve 9 çarpanları ise şuradan geliyor.

ses hızını 341 m/s aldığımda 1 metreyi yaklaşık olarak 2932 Us de tamamlıyor. TMR0 1/2 de çalıştığı için gidiş - geliş olduğundan 2 ile çarpmama da gerek kalmıyor.

TIME2 de 255(TIME1)*255(TMR0) olduğundan = 65025 Us herbir TIME2 artışı: buda 65025/2932 ~= 22. Yani herbir TIME2 artışının 22 de biri 1 metre

Aynı şekilde TIME1 i de santimetre için hesaplarsak yaklaşık 9 çıkıyor.

Gerisi belli zaten.

Eğer bir hata yapmadıysam kod çalışıyor. Proteus da denedim o da tamam.

RB7 ucundan da ECHO sinyalini kontrol ediyorum ama hardware olarak sistem çalışmıyor.

Pazartesi ye kadar de yetiştirmem lazım. Galiba kalıcam bu dersten :((

Neyse yorumlarınızı bekliyorum.



'************************************************************
'*  Name    : RANGE FINDER.BAS                                                        
'*  Author  : MEHMET ZEYBEK                                    
'*  Notice  : Copyright (c) 2004 TURK TELEKOM & DEU            
'*  Date    : 10.06.2004                                        
'*  Version : 1.0                                              
'*  Notes   :                                                                                              
'************************************************************
DISABLE
               OPTION_REG  =   $80
               INTCON      =   $A0
C_SEND         VAR         BYTE
TIME1            VAR         BYTE
TIME2            VAR         BYTE
CM                VAR         WORD
M                  VAR         WORD
N                  CON         255

define          LCD_DREG    PORTB
define          LCD_DBIT    0        
DEFINE        LCD_RSREG   PORTB
DEFINE        LCD_RSBIT   4        
DEFINE        LCD_EREG    PORTB
DEFINE        LCD_EBIT    5        
DEFINE        LCD_BITS    4
DEFINE        LCD_LINES   2  

               GOSUB       HELLO_MES
               GOSUB       PRESS_MES
               TRISA   =   %00011100
               TRISB   =   %00000001
               PORTA   =   0
               PORTB   =   0
               
BUTTON_TEST:
               IF  PORTA.2 =   1   THEN    SEND1
               GOTO        BUTTON_TEST
ENABLE

SEND1:
               GOSUB       SENDING_MES
               PORTB.7 =   0
               ON  INTERRUPT   GOTO    INT
               OPTION_REG  =   $80
               INTCON      =   $A0
TXIT:
               ASM
               MOVLW       0xFF
               MOVWF       _C_SEND
               CLRF        _TIME1
               CLRF        _TIME2
               BSF         PORTA,0
TEST            
               NOP
               NOP
               NOP
               NOP
               NOP
               NOP
               NOP
               NOP
               COMF        PORTA,F
               DECFSZ      _C_SEND,F
               GOTO        TEST
               CLRF        PORTA
               CALL        _RECEIVE_TEST
               ENDASM

RECEIVE_TEST:
               IF  PORTB.7 =   1   THEN    RECEIVED
               GOTO        RECEIVE_TEST
               
DISABLE
RECEIVED:
               GOSUB       RECEIVED_MES
               GOSUB       CALCULATE
               GOSUB       RESULT_MES
               STOP
ENABLE

DISABLE
CALCULATE:
               M   =       TIME2   *   22
               CM  =      TIME1   *   9
               IF  CM  >   100 THEN
                       CM  =   CM  -   100
                       M   =   M   +   1
               ENDIF
               RETURN
ENABLE

DISABLE
INT:
               INTCON.7    =   0
               TIME1   =   TIME1   +   1
               IF  TIME1   =   255 THEN
                   TIME1   =   0
                   TIME2   =   TIME2   +   1
               ENDIF
               INTCON.7    =   1
               OPTION_REG  =   $80
               INTCON      =   $A0
               RESUME
ENABLE
DISABLE
HELLO_MES:
               LCDOUT  $FE,1,"MEHMET    ZEYBEK"
               PAUSE   N
               LCDOUT  $FE,$C0,"   MERHABA :)   "
               PAUSE   N
               LCDOUT  $FE,$C0,"   MERHABA      "      
               PAUSE   N
               LCDOUT  $FE,$C0,"   MERHABA :)   "      
               PAUSE   N
               LCDOUT  $FE,$C0,"   MERHABA      "      
               PAUSE   N
               LCDOUT  $FE,$C0,"   MERHABA :)   "
               PAUSE   N
               TRISB   =   %00000001
               RETURN
ENABLE

DISABLE        
PRESS_MES:
               LCDOUT  $FE,1,"     PRESS      "
               PAUSE   N
               LCDOUT  $FE,$C0,"  SEND  BUTTON  "
               PAUSE   N
               TRISB   =   %00000001      
               RETURN
ENABLE

DISABLE
SENDING_MES:
               LCDOUT  $FE, 1, " SENDING  WAVES "
               PAUSE   N
               LCDOUT  $FE,$C0,"))))            "
               PAUSE   N
               LCDOUT  $FE,$C0,"      ))))      "
               PAUSE   N
               LCDOUT  $FE,$C0,"            ))))"
               PAUSE   N
               LCDOUT  $FE,1
               PAUSE   N
               TRISB   =   %00000001
               RETURN
ENABLE

DISABLE
RECEIVED_MES:
               LCDOUT  $FE, 1, "  PLEASE  WAIT  "
               PAUSE   N
               LCDOUT  $FE,$C0, "   CALCULATING  "
               PAUSE   N
               TRISB   =   %00000001
               RETURN
ENABLE

DISABLE        
RESULT_MES:
               LCDOUT  $FE,1, "    MESAFE :    "
               PAUSE   N
               LCDOUT  $FE,$C0, "   ", DEC M, "m " , DEC CM, "cm ", "   "
               PAUSE 2000
               TRISB   =   %00000001
               RETURN
ENABLE        
               END
UcAnTuRk

mmengi

dostlarım eğer sizde benim gibi basic meraklısı iseniz pbp de int. sorunları yaşayabilirsiniz zira pbp de bir int. oluştuğunda pic önce işlediği basic komutunu bitirip daha sonra int. varmı diye bakaıp int. etiketine gidiyor. dolayısıyla hassas şeyler yaparken sıkıntı yaşabilirsiniz ve program gereksiz yere her basic komutundan sonra int. varmı diye baktığından gereksiz yere uzuyor. sizlere bu konularda çözüm sağlayabilecek olan proton+(pic basic plus) ı önerebilirim bu derleyicide ister software int. veya hardware int. kullanma şansınız var.Yani hardware int. ile asm de olduğu gibi gerçek zamanlı int. kontrolü yapabilirsiniz.bunun dışında daha birçok güzel yanı var.

asm_Coder

mmengiye kesinlikle katılıyorum.bir an önce protona geçmenizi şiddetle tavsiye diyorum...
y=f(x);

james

mmengiye bende katılıyorum.proton basic ve c karışımı bir yazılım..
ARAMIYORUM , BULUYORUM

cozturk

protonun 2.0 dan yukarı versiyonu var mı acaba kırılmış? Bunun editöründe filan bazı anormallikler görmüştüm. bu açıdan pek ısınamadım. yada Sonsivriden indirilen dışından başka bir editör önerebilir misiniz?

mmengi

dostum şu an 2.1.3 versiyonu var piyasada herhangi bir anormallikte ben göremedim.Sonsivri de vardı bu versiyon ama şu an kapanmış bizler için çok iyi bir nimetti sonsivrinin sitesi tekrar açılması ümidi ile, elimizden gelen herhangi bir yardım olursa buradan kendisinede seslenmiş olalım.

venusson

pbp de tanımlı bir registeri
örnek:
sayac var byte
@comf _sayac,f 'asm tek satır


şeklindede kullanırsa hiçbi sorun çıkmaz
alt çizgiye dikkat et
YADA
ASM
COMF _SAYAC,F
ENDASM

ASM İLE İLGİLİ TÜM SORUNLARINI BANA SORABİLİRSİN
ats2000

fsan

Alıntı yapılan: "mmengi"dostlarım eğer sizde benim gibi basic meraklısı iseniz pbp de int. sorunları yaşayabilirsiniz zira pbp de bir int. oluştuğunda pic önce işlediği basic komutunu bitirip daha sonra int. varmı diye bakaıp int. etiketine gidiyor. dolayısıyla hassas şeyler yaparken sıkıntı yaşabilirsiniz ve program gereksiz yere her basic komutundan sonra int. varmı diye baktığından gereksiz yere uzuyor.
Alıntı Yapsizlere bu konularda çözüm sağlayabilecek olan proton+(pic basic plus) ı önerebilirim bu derleyicide ister software int. veya hardware int. kullanma şansınız var.Yani hardware int. ile asm de olduğu gibi gerçek zamanlı int. kontrolü yapabilirsiniz.bunun dışında daha birçok güzel yanı var.

Sevgili mmengi,
Birara seninle bu Proton+ kullanma konusunu konusmustuk hatirlarsin,  debugger ve proteus uyumlulugu felan.. Senin dedigin gibi harware.int varsa bu harika. Gecenlerde acaba PicC ye mi gecsek diye merak edip boarda bir mesaj yazmistim. DumrulBey sağolsun biraz yardimda bulunmus ve bende biraz inceledim, yalniz picbasic pro nun sagladigi kolayliga o kadar alistimki, PicC de ben bunu göremedim diyebilirim. Dikkatimi ceken baska birsey nette "picbasic pro support" cok fazla, merak ettigimiz bir sey olunca buna mutlaka bir cözüm üreten bir yer bulunuyor.

ayrica PBP fazla kod üretiyor falan diyoruz ama bunun benim icin aslinda pek fazla önemi yok cünkü artik hafiza sorunu yasamamamiz icin adamlar yeni, büyük hafizali ve daha düsük fiyatli PIC üretiyorlar.. (mesela yakinda 16f84 ü neredeyse piyasada bulamiycagiz ?) PBP de mesela "argument li function call" olsaydi cok iyi olurdu, ama asil sorun  bu harware.int olayinin olmamasi.. ama proton+ ile bu problemi ortadan kaldirmislar demekki.

Simdi merak ediyorum:
bu proton+ nasil birsey? Picbasic pro da olan bütün "built-in function" lar ondada varmidir, mesela simdiye gelesiye pbp de yaptigimiz programlari proton+ ya konvert edip ayni pbp de eski calistigi gibi calistirabilirmiyiz?

bu hw.int sorununu asmak icin acaba PicC mi yoksa proton+ mi ?  :?

sevgiler, saygilar..

mmengi

dostum pbp deki dahili fonksiyonların fazlası proton+ ta mevcut. İzlenimlerime göre sen basic tabanlı çalışıyorsun proton a geçtiğinde hiçte zorlanmayacağını düşünüyorum. Pic C (CCS) dersen onuda öğren ve karşılaştır. Ama basic teki gibi register isimlerine ve bit lerine çok rahat ulaşamıyorsun. Bu işlemleri programın başında tanımlaman gerekiyor bu bana fazla angarya geldi.Bunu birzdaha basite indirmek için bir header dosyası oluşturup bütün pic özel registerlerini buraya tanımladım. 1 dil 1 insandır sen C de öğren zarırını görmezsin.  :)

Ersin

PBP2.45 te


ASM
delay NOP
DECFSZ 1A,1
GOTO Delay
DECFSZ 1B,1
GOTO Delay
RETURN

ENDASM  

kullandigimda "Found opcode in column 1[decfsz]""Illegal digit" gibi
hatalar veriyor.Acaba program basinda felan dosya yi icer mi demek gerekiyo (Include)

Veli B.

1A 1B gibi oolan yazmaç tanımlamalarını bir kontrol et istersen.