Assembly Alıştırmalarım

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

Extreme

Merhaba arkadaşlar

errorlevel	-302


Bu kod parçası ne anlama gelir ?

Tagli

Varsayılan ayarlarda assembler, bank0'da olmayan tüm register erişimlerinde "Bunlar bank0'da değil, doğru bankı seçmeyi unutmadın değil mi?" gibi saçma bir uyarı / hatırlatma yapıyor. 302 kodlu bu uyarıyı kapatmak için vermiş olduğun kod parçası yazılıyor.
Gökçe Tağlıoğlu

Extreme

Teşekkürler.

eeprom DC, 06 , 00


Peki bu parça ne anlama gelir ?

Ayrıca

;======================	 Sabit Tanimlar
serial_control			EQU    0x00
RS						EQU    0x00
RW						EQU    0x01
;====================== genel_yazmac
pulse					EQU    0x00
sebeke					EQU    0x01


Kod parçasında değişken kısmında böyle bir tanımalama var .

Aynı alanlara farklı değerler vermesini ben anlayamadım. Örneğin 0x00 alanında hem pulse hem RS hemde serial_control var ?

Tagli

DC değil DE olacak sanırım. EEPROM'a veri yerleştirmeye yarıyor. Satır başındaki eeprom yazısının özel bir anlamı yok bildiğim kadarıyla. Sadece bir etiket. Ancak bu komuttan önce ORG ile mutlak EEPROM adresini belirtmen lazım. Bu adres değeri modele göre değişir. Dokümanlara bakmalısın.

Yazar muhtemelen o değişkenleri aynı anda kullanmayacağı için aynı yere yerleştirerek bellekten tasarruf sağlamış Ama dikkatli olmak gerekiyor. Bu yaptığını unutup ikisini aynı anda kullanırsan çok saçma sonuçlarla karşılaşır ve hatayı da kolay kolay bulamazsın.

Aslında değişkenlere tek tek yer gösterme işi bana yanlış geliyor. Bu işi linker'a bırakmak daha iyi. Buna relocatable kod deniyor. Ayrıntılı bilgi için assembler rehberine bak.
Gökçe Tağlıoğlu

XX_CİHAN_XX

EEproma bu şekilde data yazmak için @Tagli'nin da dediği gibi başlangiç vektör adresini belirtmen gerekir. Aynen şu şekilde;
ORG	0x2100
DE	0x00, 0x01, 0x02, 0x03


EQU komutu ise sağ tarafta gösterilen adres kimliğine bir isim vermek amacıyla kullanılır.
Movlw 0xCC
Movwf sebeke
dediğimizde aslında bellekteki 0x1 adresine 0xCC yi atmış oluruz.
Yani bir başka deyişle,
Movwf 0x01 demek ile
Movwf sebeke demek arasında bir fark yok.
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.

Kabil ATICI

Bu hangi işlemciymiş , kullanılabilir RAM adresi 0x00'dan başlamış?
ambar7

Tagli

EQU ile belirtilen değerler register adresi olmak zorunda değil. Sadece o kelimenin yerine o sayı geliyor şeklinde düşün. Bunlar bit isimleri de olabilir, başka sabitler de olabilir. Hatta dolaylı adresler de olabilir. Artık programcının kafasından ne geçiyorsa.

Bu arada PIC18'lerde mesela register adresleri 0'dan başlıyor. Yani SFR'ler 0'da değil.
Gökçe Tağlıoğlu

XX_CİHAN_XX

Evet register adresi olmak zorunda değil nasıl ki
movlw 0x00 diyebiliryosanız aynı şekilde movlw RS te diyebilirsiniz.
RS burada equ ile 0x00 değerine tanımlanmıştır.
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.

Kabil ATICI

;======================    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.
ambar7

ipek

böyle karışık bir adresleme yok ise program kurallarına göre yazılıyorsa kolaylık olsun diye,bir sürü EQU yazmak yerine

   LIST   p=16F628      ;tell assembler what chip we are using
   include "P16F628.inc"      ;include the defaults for the chip
   __config 0x3D18         ;sets the configuration settings (oscillator type etc.)

   cblock    0x20          ;start of general purpose registers
      count1          ;used in delay routine
      counta          ;used in delay routine
      countb          ;used in delay routine
   endc
   
   org   0x0000         ;org sets the origin, 0x0000 for the 16F628,


CBOCK macrosu işinizi kolaylaştıracaktır.kullanılan işlemcinin RAM start adresinden başlamak gerekiyor.
Not= Bu tip Macro'lar DEFINE'de işe yaramaz.

Extreme

BANKSEL 	ANSEL
MOVLW	  	B'00001011'	     ;All digital IO
MOVWF	  	ANSEL  

BANKSEL 	ANSELH
MOVLW	  	B'00000000'	     ;All digital IO
MOVWF	  	ANSELH 


16F877A 'da tanımlı deyil ansel veya anselh .

bunlar nedir ne işe yarar

Mesala bu tanım şöyle olsa anlardım.

ANSEL EQU 0X06

06h bankına ANSEL için ayrıldı die.

Gökhan BEKEN

#11
ANSEL ve ANSELH register'ları pinlerin anolog/dijital ayarı için kullanılıyor.

sayfa 42'de geçiyor: http://ww1.microchip.com/downloads/en/DeviceDoc/41291F.pdf

Örneğin ANSEL.ANS0 biti pic'in hangi pini olduğuna bakarsınız,  bu bit 1 ise o pin anolog, 0 ise digital oluyor.
Özel mesaj okumuyorum, lütfen göndermeyin.

Extreme

#12
Alıntı yapılan: meftun - 16 Eylül 2014, 11:24:26
ANSEL ve ANSELH register'ları pinlerin anolog/dijital ayarı için kullanılıyor.

sayfa 42'de geçiyor: http://ww1.microchip.com/downloads/en/DeviceDoc/41291F.pdf

Örneğin ANSEL.ANS0 biti pic'in hangi pini olduğuna bakarsınız,  bu bit 1 ise o pin anolog, 0 ise digital oluyor.

Faydalı oldu teşekkürler.

mesaj birleştirme:: 16 Eylül 2014, 14:08:07

;MAIN PROGRAM LOOP ===================================================
TIMER1_RB0_INT_BEKLE
			CLRWDT
			NOP
			NOP
			NOP
			GOTO		TIMER1_RB0_INT_BEKLE



Programın bir yerinde bu timer1e giriyor. program burda sonsuz döngüye girmiyor mu ? Eğer giriyorsa burda tıkandım.

XX_CİHAN_XX

Evet sonsuz donguye girer. Bu dongunden kesmeler (interrupt) vasitasiyla cikar oradaki isi halleder ve geri donguye gider. Programin isleyisi kesme altprogramlari uzerinden oldugu icin bu ana prpgram dongusunde bos bos donmesinin bir sakincasi yoktur. Kesme kavramini ogreniniz.
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

Alıntı yapılan: XX_CİHAN_XX - 18 Eylül 2014, 07:45:15
Evet sonsuz donguye girer. Bu dongunden kesmeler (interrupt) vasitasiyla cikar oradaki isi halleder ve geri donguye gider. Programin isleyisi kesme altprogramlari uzerinden oldugu icin bu ana prpgram dongusunde bos bos donmesinin bir sakincasi yoktur. Kesme kavramini ogreniniz.

ç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