pointer reg (z) yanlış adresi işaetliyor (avr assembly)

Başlatan ilhan_mkp, 27 Mart 2012, 22:34:38

ilhan_mkp

tablodan veri çağırmak istedim  fakat z registeri tablonun ilk baytını döngüyü 3. işletişinde okuyor.
hata nerede yapıyorum bulamadım




$regfile = "m16def.dat"

$asm

.def A = R16
ldi a,0xff
Out Ddrd , A

ldi zl,low(t*2)
ldi zh,high(t*2)

C:
lpm a,z+
Out Portd , A
rjmp c

T:
.db 1 , 2 , 3 , 4
.db 5 , 6 , 7 , 8

$end Asm

End

parda

Aşağıdaki kod debug da doğru çalışıyor.
Düzeltme:
AVR studio da denedim siz farklı bir platformda çalışıyorsunuz galiba

.NOLIST
.INCLUDE "m16def.inc" ; Header for ATMEGA16
.LIST

.def A = R16
ldi a,0xff
Out Ddrd , A

ldi zl,low(t*2)
ldi zh,high(t*2)

C:
lpm a,z+
Out Portd , A
rjmp c

T:
.db 6 , 7 , 8 , 5
.db 5 , 6 , 7 , 8
Bildiğim tek şey, hiç bir şey bilmediğimdir.

ilhan_mkp

evet bascomda denedim sorunun platformdan kaynaklanması sevindirici .
hocam bu ramend nedemek oluyor ramın son adresimi yoksa öylesine bir etiketmi?

parda

RAMEND aynen dediğiniz gibi ram in son adresi header dosyasında tanımlanıyor işlemciye (ram boyutuna) göre değişiyor
Bildiğim tek şey, hiç bir şey bilmediğimdir.

ilhan_mkp

bu ramend registeri stack alanı belirlerken önemli bir unsur sanırım bütün örneklerde var.
asm ile kod yzması çok zor ama gerçekten kontrol tamemen elimde hobi için bile olsa sebebini bilmediğim basic sorunları çok can sıkıcı
avrler hakkinda birkaç sorum daha var aslında bu başlık altında zaman buldukça yardımcı olurmusunuz.


parda

Alıntı Yap
avrler hakkinda birkaç sorum daha var aslında bu başlık altında zaman buldukça yardımcı olurmusunuz
Elbette, bildiğim birşeyse seve seve..
Bildiğim tek şey, hiç bir şey bilmediğimdir.

ilhan_mkp

sorularım glcd ve ds1307 içeren daha önce basic ile yaptığım bir devre üzerine ben bir zaman bulup kabaca glcdye bişiler yazdırmak için denemeleremi yapayım takıldığım yerlerde sorarım mümkün olduğunca kendim uğraşarak öğrenmek istiyorum

şimdilik sorum şu atmega 16yı bu iş için 8mhz dahili osc ile kullanıyorum.
kristall osilatör kullanmam gerektiğindeki fuse ayarlarını bilmiyorum datasheete baktım pek bişi anlamadım
assemblyle bişiler yapmak isteyince süreler iki kat önem kazandı  osc kararlı olması için kristal gerekse ayarları bilimiyorum

parda

AVR fuse olayı ilk tanışmada datasheet den oldukça karışık görünmekte lakin programlayıcı arayüzlerinde daha anlaşılır olmakta örneğin avr studio nun programlayıcı arayüzü gayet anlaşılır. Kullandığınız programlayıcıyı ve arayüzü bilmiyorum.  Pony prog gibi 0 açıklamalı (fuse için) bir arayüz kullanıyorsanız aşağıda verdiğim linkten kolayca fuse ayarı yapıp fuse ayrlarını hex olarak girebilirsiniz.
Dikkat etmeniz gereken nokta
-Ext RC ...
-Ext Clock..
ile başlayanlardan birini ŞEÇMEMENİZ. Olaki şeçmeniz halinde işlemciyi yeniden programlamada güçlük çekebilirsiniz.

Not: SPIEN bitinin önemini bildiğinizi varsayıyorum.


http://www.engbedded.com/fusecalc/
Bildiğim tek şey, hiç bir şey bilmediğimdir.

ilhan_mkp


parda

AVR leri 4 yolla programlayabiliriz.

1) SPI uçlarından; en yaygın olan yol, en basit programlayıcı (buyuk ihtimalle sizin de kullandığınız yol)
2) JTAG uçlarından; aynı zamanda bu uçlardan donamımsal debugda yapılabilir. Daha ciddi programlayıcı gerekir.
3) Paralel programlama; ciddi bir programlayıcı gerekir devre üzerinde programlama imkansıza yakındır.
4) TPI uçlarıyla; tiny serisi az pinli az sayıda AVR ler için

Şimdi MEGA16 yı ele alırsak (popüler tüm avrler için durum aynı) 1,2 ve 3 yolları ile programlaya biliriz.

Fuse ayarlarında
SPIEN (SPI ENABLE):
Adı ustunde, MCU nun SPI donanımı program yuklemek için aktif yada pasif yapmaya yarar, eğer pasif yaparsanız MCU artık 1. yolla PROGRAMLANAMAZ hale gelir. Düzeltebilmeniz için 2 veya 3. yolu kullanmazız gerekir.

önceki mesajımda bahsettiğim osc ayarının öneminden de bahsetmek gerekirse;
SPI dan program yukleyebilmeniz için avr nin fuse da ayarlandığı gibi bir clock sinyali ile beslenmelidir. Açmak gerekirse fuse dan kristal ayarlandı ise avr nin osc uçlarına kristal bağlı olmalı, harici clock ayarlandıysa osc1 ucuna harici clock sinyali geliyor olmalı, harici RC ayarlandı ise osc1 ucunda uygun bir rc devresi olmalı ve spi clock sinyalinin frekansı , avr besleyen clock sinyalinin frekansının 1/4 den buyuk olmamalı.

umarım anlaşılır bir şekilde ifade edebilmişimdir.

Bildiğim tek şey, hiç bir şey bilmediğimdir.

ilhan_mkp

5 adet atmega 16 almıştım.
1. işlemciyi yanlış osc ayarından kullanamaz oldum
daha sonra fuselerle deneme yanılma yaparken üçünü kaybettim sebebin bu spienable olduğuna eminim
elimde 1 tane atmega16 bascomla kod yazıp denediğim bir devre üzerinde devrede ks108 chipli glcd var
bascomda asm code açıp ks108 yazı yazdırmayı deniycem
çıkan hatalara göre eksiklerimi hatalarımı görürüm
yardımlar için çok ama çok teşekkür ederim asmye ilk adımı attım sayılır.