8051 Asm si ile ilgili basit bir soru

Başlatan XX_CİHAN_XX, 13 Kasım 2015, 12:56:52

XX_CİHAN_XX

Basit bir look-up table uygulaması yapmak istiyorum (Tablo 256 bayttan büyük!!). Kod örneklerine baktığımda genelde DPTR ye ofset vererek tablodan veri çekilmiş. (movc A,@A+DPTR) şeklinde. Ben ofset vermeden aşağıdaki şekilde tablodan veri çeksem bir şey fark eder mi?

ORG 00H

mov DPTR, #table
loop:
movc A, @DPTR
mov P1, A
inc DPTR
call delay
jmp loop

ORG 1000H
table: DB 1,2,3,4,5,6,7, ...... , 500

Tablo 256 bayttan büyük olsa da bu şekilde olur mu?
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.

sadogan

#1
Amaç tablodan herhangi bir elemanı almak ise
DPTR ye tablo adresi A ya ise tablo elemanı yüklemek gerekiyor ,
A ya 255 den büyük bir sayı yazılamayacağından olmaz.
Ama amaç tablo elemanlarını sıra ile almak
ise olur diye düşünüyorum.   
not: komut un yazım sekli bu diye hatırlıyorum movc a,@a+dptr

XX_CİHAN_XX

Anladım hocam eğer 255 büyük bir tablo söz konusuysa tabloyu 255 lik parçalara bölüp her birine ORG ile farklı noktalara konumlandırıp oralarda çalışmak lazım öyleyse. PIC'te de böyle bir durum vardı.
Peki öyleyse 255 tane veri için verileri ardışıl olarak P1 portuna belli gecikmeyle göndermek istersek bu yazım şekli doğru olsa gerek doğru mudur?

ORG 00H
 jmp main
 
 ORG 100H
main:
 mov R0, #255
 mov DPTR, #table

loop:
 movc A, @DPTR
 mov P1, A      ;tablodaki sıradaki veriyi porta at
 inc DPTR
 call delay        ; gecikme yap
 djnz R0,loop
 jmp main

ORG 1000H
table: DB 1,2,3,4,5,6,7, ...... , 255
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.

sadogan

Dogru deyil.
Çünki komut DPTR ve A yı toplayıp tobladaki o elemana gider.
Movc a+a@dptr
komutundan önce Akümlatorü sıfıra eşitlemeniz gerekir.