Assembly Alıştırmalarım

Başlatan Extreme, 15 Eylül 2014, 09:25:39

Kabil ATICI

İşlemci açısından "A" ile "a" eşit değildir. ASCII tablosunu inceleyebilirsin. dolayısı ile çıkartma işleminin sonuncu 0 olmaz.

ambar7

hasankara

bu iki satırdan öncesinde w içerisinde eğer 'A' yani 0x41 değeri varsa ilk satırda 0x41-0x41 işlemi yapılacak haliyle işlemin sonucu 0 olacak. ikinci satırda da z biti kontrol edilecek. zero biti, ilk satırdaki işlemin sonucundan etkilenerek 1 olduğu için ikinci satırdaki btfss komutu hemen altında bulunacak olan yani 3. asm kodunu atlayıp sonrakine yani 4. asm koduna geçecek.

diğer hatırlatma, sırasıyla ascii,hex,dec formatın da yazacak olursak 'a'=0x61=97  'A'=0x41=65 şeklinde görüldüğü gibi birbirinden farklı oluyorlar. aslında denetleyici 'a' nedir bilmez bunun hex karşılığını derleyici yada linker kendisi çözümler hex i bu sayıya göre oluşturur, diğer deyişle oraya 'a' yazman la 0x61 yazmanın arasında bir fark olmaz. http://www.asciitable.com/index/asciifull.gif buradan listeye göz gezdirebilirsin.

XX_CİHAN_XX

Alıntı yapılan: Extreme - 18 Eylül 2014, 16:20:30
çok çok faydalı oldu. Teşekkürler.


SUBLW		'A'            
	BTFSS		STATUS,Z       


Şimdi ben burdan
ilk satır yorumum w=a;
ikinci satır yorumum ise status.z=w nin 1 veya 0 olma durumuna baktığı için status.z=1 olarak görüyorum.

sanırım bir yerlerde yanlıs düşündüm aydınlatırsanız sevinirim
SUBLW    'A'   komutu, bu komuttan önce W registerinde ne varsa artık o değer ile 'A' değerini birbirinden çıkarır (W = W - 'A' işlemi yapılır). Beraberinde gelen Zero biti kontrolüne bakılırsa bu çıkarmanın amacının W'daki değer ile 'A' değerinin birbirine eşit olup olmadığını kontrol etmek olduğu görülür. Malum iki sayı birbirinden çıkarıldığında sonuç sıfır ise sayılar eşittir. Bu durum Zero bitine lojik 1 olarak yansır. Sayılar eşit değilse sonuç sıfır olmaz ve Zero biti de set olmaz. İkinci satır sonunda W deki sayı 'A' karakterine eşit mi? Sorusunun cevabını elde ederiz.
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

Extreme

BANKSEL 	          ANSEL
					MOVLW	  	B'00001011'	    
					MOVWF	  	ANSEL  

				   	BANKSEL         	ANSELH
					MOVLW	  	B'00000000'	    
					MOVWF	  	ANSELH 


önceki sorumda buna cevap verildi fakat ben net anlamayadım

ansel pini dediğimi AN pinleri mi kullanılan pic 18f887

RaMu

Ansel pini diye birşey yok.
Ansel registerının ANS0 bitinin hangi analog pini kontrol ettiği
analog yaptığı denmek istenmiş.

Ansel dediğin analog select register
yani analog seçim register ı,
ansel aynı TRISx gibi STATUS gibi
picin kendisi için kendi ayarları yapmak için kullandığı sfr (special function register)
senin tanımlayıp kullandığın equ ile yerini belirlediğin general purpose register lardan değil,
bunun yeri bellidir, kullandığın md.nin .inc dosyasında yeri derleyiciye tanıtılır,
bunlarla kafını yormana gerek yok öylesine söyledim,
şimdi eğer meftun un verdiği linke baktıysan
ansel registerı ne yapar yazıyor,
ansel register ına girdiğin değere bağlı olarak,
misal ansel in 0. biti ismi AN0 sıfır yapılırsa
picin AN0 olarak kullanılan pini dijital olur,
misal ansel in 0. biti ismi AN0 bir yapılırsa
picin AN0 olarak kullanılan pini analog olur,
(ayrıca ilgili TRIS bu pini input yapmak için ayarlanmak zorundadır)

Pic16f877 de ansel yoktur buna benzeyen ADCON vardır,
ADCON analog digital control register
bunun ADON diye bir biti var buna verdiğin değere göre ADC açılır kapatılır,
ve
CHS denen Analog Channel Select bits
bitleri vardır
bu bitler ayarlanarak hangi pinin analog olacağına karar verilir.


Bu arada BANKSEL bank select
karşısına yazılan registerın bulunduğu bankı seçme işini yapar,
yukarıdaki kodlarda baksel ansel ile ansel registerının bulunduğu bank seçilmiş,
ve sonra gereken değer yüklenerek analog digital ayarı yapılmış,
picine göre 2-4 gibi bank sayısı vardır,
buda ayrı bir konu,
ama önemli olan şu
register hangi bank daysa o banka geçmeden register ın değerini öğrenemez ve değiştiremezsin.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

Extreme

#20
@RAMU  ve @meftun

ANSEL, ANSELH anlatımı için teşekkürler.
meftun ilk anlattığıda çok yardımcı olmuştu kafam başka konularda karışmıştı . çok net anladım şu an ANSEL ve ANSELH registerlarını.

Bu arada tüm uygularımda 16f887 kullanıyorum . 16f877a veya 16f877 değil.


tanımlamalar
ORG 0X0000
[b]GO TO[/b] Baslangic
ORG OX0004
{{Tüm işlemlerin yapıldığı yer}}
[b]RETFIE[/b]

Baslangic:
Kurulumlar
;SETUP TIMER1 ========================================================
[b]MOVLW[/b]   	0xFC             ;252		
[b]MOVWF [/b]  	TMR1H            		;Set timer 1 to (315,6) timeout period
[b]MOVLW[/b]   	0xFD              ;253
[b]MOVWF[/b]   	TMR1L
[b]BSF   [/b]  	T1CON,0          		;Timer1'i çalistir
;MAIN PROGRAM LOOP ===================================================
TIMER1_RB0_INT_BEKLE
[b]CLRWDT[/b]
NOP
NOP
NOP
[b]GOTO[/b]		TIMER1_RB0_INT_BEKLE



Bu programı günlerdir çözmeye çalışıyorum. Ticari bir program olduğu için burda tamamını paylaşmam mümkün olmuyor.

Benim anladığım kesmelerle program çalışıyor. kesme oluyor program çalışıyor kesme yokken boşta bekliyor.



diyagramda programı gerçekleştir yazmamın nedeni tüm ana döngüleri yapılcak işleri burda yapmasından dolayıdır.

akış diyagramını bu şekilde çıkardım en sade haliyle  doğru mu ?




Pyrodigy

#21
Watchdog Timer özelliği kullanılmış.
Tavsiyelerim;
1- Öncelikle Orhan Altınbaşak 'ın Mikrodenetleyiciler ve PIC Programlama isimli kitabını alıp 2-3 defa okuman ve uygulamalı tekrarlaman
2- Forum paneline yazacağın kodları ''#'' kod ekle butonuna basarak yapıştırman.
Ekleme: Kesme ile program çalışmaz. Kesme adı üstünde program akışı devam ederken harici veya dahili tetiklemeler ile programın akışını kesmesi ve kesme alt programlarının çalışacağı adrese yönlendirmesidir.
Burada Timer kullanılarak kesme üretilmiş ve kesme alt prog. çalıştırılmış. Ayrıca watchdog timer kullanılarak kendi kendine reset atması sağlanmış.
Tavsiye 3: 1 numaralı tavsiyemi 1 kez daha okuman. Çok yararlı olacağına şüphem yok.
Persistance is the name of the game in this business....

FEHMİ_ASM

#22
  İşlemcinin (muhtemelen beklenen kesme olayının gerçekleşememe ihtimaline karşı) sonsuz döngüden bir sebeple çıkamayacağını veya farklı bir fonksiyon için işlemcinin müdahele etmekte gecikmemesini düşündüğünden dolayı wdt'yi aktif etmiş olabilir.
Hz.Hamza'nın Belinde İki Kılıç Duruyor ! Attığı Her Adım Bir Kalbi Durduruyor ! Ey Hamza ! Gördüğün Hiçbir Şeyden Korkmazsın , Bu Doğru Ama Heybetini Gizli Tut , Yürüyüşün Ölümü Korkutuyor !  İşte Hz.Ömer ve Hz.Ali , Biri Hattaboğlu , Biri Haydâr-ı Kerrar ! Ve Kolkola Ölümün Ağzına Giriyorlar !  Azrai

Extreme

#23
Alıntı yapılan: Pyrodigy - 25 Eylül 2014, 12:24:01
Watchdog Timer özelliği kullanılmış.
Tavsiyelerim;
1- Öncelikle Orhan Altınbaşak 'ın Mikrodenetleyiciler ve PIC Programlama isimli kitabını alıp 2-3 defa okuman ve uygulamalı tekrarlaman
2- Forum paneline yazacağın kodları ''#'' kod ekle butonuna basarak yapıştırman.
Ekleme: Kesme ile program çalışmaz. Kesme adı üstünde program akışı devam ederken harici veya dahili tetiklemeler ile programın akışını kesmesi ve kesme alt programlarının çalışacağı adrese yönlendirmesidir.
Burada Timer kullanılarak kesme üretilmiş ve kesme alt prog. çalıştırılmış. Ayrıca watchdog timer kullanılarak kendi kendine reset atması sağlanmış.
Tavsiye 3: 1 numaralı tavsiyemi 1 kez daha okuman. Çok yararlı olacağına şüphem yok.

Tavsiyeleriniz için teşekkür ederim.

Şu an belirttiğiniz kitap tamda yanımda ve açık vasiyette.
Bu kitabı inceliyorum fakat eğer işimde başarılı olmak istiyorsam çözüm üretmekte biraz daha hızlı olmam gerekiyor bu yüzden size göre çok kolay olan soruları sorabiliyorum.

Akış diyagramını kontrol ederseniz sevinirim.

RaMu

Demekki yapılacak iş sadece kesme ile halledilebiliyor,
kesme içinde gerekli işlem yapılıp olay bitiyor.

CLRWDT kullanımı şunu sağlamıştır;
öncelikle eğer WDT kurulduysa ki bu programda kurulmuştur,
hangi süreye kurulduysa bu süreye eriştiği takdirde
pice reset atar,
WDT kendi başına sayar, sen ayarlandığı değere ulaşmadan
CLRWDT diyerek WDT yi sıfırlarsan program olağan akışına devam eder
sıfırlamazsan pice reset atar,
peki ne işe yarar
eğer program biryerde WDT periyodundan fazla süre takılırsa
ki bu aslında program öngörülenin dışına çıkmış biryerde kapana kısılmış demektir
buradan kurtulmak için WDT periyodu dolunca pic kendiliğinden resetlenir
programa baştan başlar.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

Extreme

BANKSEL 	ADCON1     
MOVLW	  	B'00000000'	 
MOVWF	  	ADCON1       


Kodlar böle olunca left justify oluyor. vdd,vss referans oluyor.

left justify veya right justify yapmamızın önemi nedir .? nerede karşımıza çıkar

sadogan

Adc yi 10 bit kullanırken  right justify 8 bit kullanırken left justify işlem kolaylığı sağlıyor.

Extreme

#27
Alıntı yapılan: ambar7 - 16 Eylül 2014, 09:43:54
;======================    Sabit Tanimlar
serial_control         EQU    0x00
RS                  EQU    0x00
RW                  EQU    0x01
;====================== genel_yazmac
pulse               EQU    0x00
sebeke               EQU    0x01

tanımlamasında bacak pinlerin sayılarını (bit) tanımlamak için kullanılırsa, aynı port üzerinde olmadıklarında birbiri ile çakışma durumu olmaz.

Yazılımcı Muhtemelen bacak pinleri için kullanmış. Fakat ben picin pinlerine tanımladığını nereden anlayabilirim.
normal değişken olarak tanımlayıp kullanmayı biliyorum ama pinlere tanımlayıp tanımladığı konusunda fikir yürütemedim.

yazılım ticari olduğu için paylaşamıyorum.

XX_CİHAN_XX

Yazılımda RS ve RW pinlerinin kullanıldığı yere bakın.
BSF   PORTC,RS
gibi bir şey varsa PORTC,0 ıncı bit RS pinidir.
yada
BSF   LCD_DATA,RS gibi birşey olabilir
bu durumda LCD_DATA nın hangi port olarak tanımlandığına defination kısmından bakarak sonuca varabilirsiniz.
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

Extreme

banksel hakkında bir soru sormak istiyorum.

ANSEL VE ANSELH 16f887 PİCİMİN 4.bankında yer alıyor.

BANKSEL 	          ANSEL
         MOVLW	  	B'00001011'	    
         MOVWF	  	ANSEL  

         BANKSEL         	ANSELH
         MOVLW	  	B'00000000'	    
         MOVWF	  	ANSELH


ve

BSF STATUS,5
BSF STATUS,6

MOVLW	  	B'00001011'	    
MOVWF	  	ANSEL 

MOVLW	  	B'00000000'	    
MOVWF	  	ANSELH


aynı işlemi yapar mı ?

yani BANKSEL              ANSEL  ; ansel in bulunduğu bankı seç diyor değil mi ?

Doğru mu anlamışım acaba ?