Arama butonu
Bu konudaki kullanıcılar: 1 misafir
21
Cevap
2592
Tıklama
0
Öne Çıkarma
8051 yardıım C kullanmaya çalışıyorum
T
15 yıl
Yüzbaşı
Konu Sahibi

Arkadaşlar yardıma ihtiyacım var.

şimdi 8051 işlemcisini asm ile kodlarken dolaylı adresleme yapabiliyoruz.
mesela

MOVC DPTR,1000
MOV A,00

MOVC @A+DPTR,FF

DPTR + A nın gösterdiği harici bellek adresine FF değerini atıyor.

Şimdi ben bi eşşeklik ettim ve projeyi C kodlarıyla hazırlamaya başladım. şimdi yazdığım satırlarca kodu da silip tümünü baştan ASM ile yazmak da istemiyorum :D
Bu işin kolay bi yolu var mı? yani yukarıdaki olayı C kodlarıyla yapmamız mümkünmü? nolur birisi yarıdm etsin deli olcak saatlerdir onunla uğraşıyorum :)

DH forumlarında vakit geçirmekten keyif alıyor gibisin ancak giriş yapmadığını görüyoruz.

Üye olduğunda özel mesaj gönderebilir, beğendiğin konuları favorilerine ekleyip takibe alabilir ve daha önce gezdiğin konulara hızlıca erişebilirsin.

Üye Ol Şimdi Değil



T
15 yıl
Yüzbaşı
Konu Sahibi

Yanıt veren herkese teşekkürler,

Dolaylı adreslemeyle erişilebilen harici veri hafızası bölgesine erişmek istemekteki tek amacım, dizi tanımlarken kullanılan tüm alanın
128 karakteri geçememesiydi yani bir diziyi sadece RAM de tanımlıyodu tabi 128 byte ram yetmiyordu.

cevaplarınızı görmeden biraz daha araştırma yapmıştım. ve 64kbyte lık alana erişebilmek için olan C kodlarını buldum.
Sorunumu çözdüm. aynı problemi olacak arkadaşlar olabilir diye paylaşıyorum. buyrun.

öncelikle <absacc.h> başlık dosyasını yüklemek gerekiyor(bu başlık dosyası keil kütüphanesinde mevcut indirmeden sadece programın başına eklemek yetiyor)


Dizi tanımlamak için char xdata dizi[boyut]; boyut 0-65535 (0000-FFFF) arası değişebiliyor tabi C de yazarken 0xFFFF veya 0x0000 yazmak gerekiyor.

XBYTE [0x0002] = 5; // 0002 h adresli data belleğe 5 bilgisini yaz
Oku = XBYTE [0x0002]; // 0002 h adresli code bellekten 1 byte oku

bunlar en temelleri bikaç kod daha şurada mevcut.

bütün bunları yaptıktan sonra bahsettiğiniz #pragma komutunu denedim.
Keil tanıdı yani komutun rengi değişti ama derleme anında şu hatayı verdi. aktif olabilmesi için src nin kontrol edilmesi gerekiyor diyo ama anlamadım tabi ne demek istediğini D:.d

error C272: 'asm/endasm' requires src-control to be active

Herkese tekrar teşekkürler..


Bu mesaja 1 cevap geldi.
I
15 yıl
Yüzbaşı

Error C272 : ASM Requires SRC Directive

Kaynak dosyasında asm-endasm kullanılırsa,
SRC (compiler directive) ile derlemek gerekiyor.
Derleyici asembler kaynak dosyası oluşturuyor.
Bundan sonra asm.kaynak dosyasını kullanabiliyorsunuz..

http://www.keil.com/support/man/docs/c51/c51_c272.htm
===

keil'in "inline asm" özelliğine ilişkin bazı uyarılar var.
Bu yapının biraz hatalı oduğu ama düzeltilebileceği söyleniyor.
Bu yüzden projeni daha fazla ilerletmeden aşağıdaki forumda
özellikle 2 yorumcuyu okumalısın ("#9 : how to store in memory keil" ve "#11 : extern char end asm")

http://www.edaboard.com/thread5666.html


Bu mesaja 1 cevap geldi.
T
15 yıl
Yüzbaşı
Konu Sahibi

quote:

Orijinalden alıntı: ISIS

Error C272 : ASM Requires SRC Directive

Kaynak dosyasında asm-endasm kullanılırsa,
SRC (compiler directive) ile derlemek gerekiyor.
Derleyici asembler kaynak dosyası oluşturuyor.
Bundan sonra asm.kaynak dosyasını kullanabiliyorsunuz..

http://www.keil.com/support/man/docs/c51/c51_c272.htm
===

keil'in "inline asm" özelliğine ilişkin bazı uyarılar var.
Bu yapının biraz hatalı oduğu ama düzeltilebileceği söyleniyor.
Bu yüzden projeni daha fazla ilerletmeden aşağıdaki forumda
özellikle 2 yorumcuyu okumalısın ("#9 : how to store in memory keil" ve "#11 : extern char end asm")

http://www.edaboard.com/thread5666.html


Çok çok teşekkür ederim.
Adres vermekle kalmamış bide oradaki yorumların da işe yarar olanlarını çekip çıkarmışsın resmen :D
akümülatöre veya başka bi kaydediciye nasıl veri itileceğini anlatmış adam.


Tabi sorunları aştıkça yenileri çıkıyor ortaya :)
Başka bi sorum da:

Şimdi yaptığım projede değerini kullanıcının belirleyeceği bazı bilgiler olacak. tabi işlemci beslemesi kesildiğinde kullanıcının belirlediği bu bilgiler tamamen sıfırlanıp default değerlerine geri dönecek.
Misal şimdi yaptığım proje şifreli kilit benzeri bişey olarak düşündüğümüzde kullanıcının sonradan değiştirdiği bu şifreyi nasıl daima saklarız. veya kilitin o zamana kadar kaç kere açılıp kapandığını tutan bi kaydedicimiz varsa. işlemcinin elektriği kesildiğinde bu bilgilerin kaybolmamasını nasıl sağlarız. Hafıza pili benzeri bir durum şart mıdır? yoksa tıpkı flash belleklerimizdeki gibi bi düzenek kurmak mümkün müdür?
Bu konuda yardımcı olabilecek arkadaşlara şimdiden teşekkür ederim.





< Bu mesaj bu kişi tarafından değiştirildi Th3r4p1sT -- 19 Aralık 2010; 19:29:55 >
Bu mesaja 1 cevap geldi.
T
15 yıl
Yüzbaşı
Konu Sahibi

quote:

Orijinalden alıntı: ISIS

Sorularına doğrudan çözüm olur mu emin değilim; paylaşmak istediğim
fikir ve kaynaklar var.

En son 8080 ile okulda uğraşmıştım.
Aradan epey zaman geçti. Şu an bir breadboard ile
joule-thief, TEC, güneş paneli +ledler gibi çok basit deneylerin
dışında elektronikle fazla bir uğraşım yok.

Ama internette istemediğin kadar kaynak var. Hele ingilizcen de
biraz iyiyse; her şey elinin altında.

Ben sana teorik bir kaç bilgi bulup göndermiştim,
ne yazık ki şimdi de öyle yapacağım - umarım yararı olur.

/* bu açıklama alanını okumayabilirsin

Bellek olarak çeşitli ortamları kullanabiliyorsun :
Program segmenti ve harici bellekler. Bunu zaten biliyoruz.
Ben pic ile biraz araştırma yapmıştım; kısıtlı bellek alanı var ve
program kendi kendini değiştirsin istedim (overlay mantığı).
Böylece ana belleğe sığmayan modülleri değiş-tokuş ile
program segmentine yüklemek istedim. Ama bu alanın belli bir yazma
kapasitesi varmış ve vazgeçtim.
Senin projende, yazma sıklığına göre karar vermelisin;
10.000, 100.000 kez yazılabilir bellek türleri var.
Ama yapılan işe göre bu adetler kolayca tükenebilir.
Sözgelimi, bir datalogger, 24 saatlik sinyalleri bu alana sürekli
kaydederse, kısa sürede artık yazamaz hale gelir. Bu durum programdan kaynaklanmıyor,
belleğe fiziksel olarak artık yazılamıyor...
Bir musluğu düşünürsek, aç-kapa yapıldıkça "yalama" oluyor ve
bir süre sonra bozuluyor - bu da onun gibi ne yazık ki.

Kullandığın keil derleyicisi, program alanını "protected" işaretliyor olabilir.
Normalde program ve data segmenti ayrı görünmüyor, ancak bazı okuduğum
notlarda program segmentini "data" olarak kullanıp,
bilgileri kalıcı olarak bu alana kaydetmekle ilgili uyarılar var.
Bunu anlayabiliyorum, ama yazma sırasında bu alana erişim yapılamaz deniliyor...
Bu, program sayacının gösterdiği blokta bir yazma işlemi yapılamayacağı anlamına mı geliyor
tam anlamadım. Çünkü öyleyse, bu çok kısıtlı bir erişime olanak
verir ve asm kodlarıyla çözmen gerekir. Bu da C gibi bir derleyici
kullanarak mikroişlemciyi programlayanlar için olanaksız bir durumdur.
(inline assembler'dan bahsetmiyorum; derleyiciyi "baypas" edip
doğrudan ASM yazmak gerekiyor.)

Bu arada, C derleyicisi, "boot" sırasında değişkenleri sıfırlıyor.
Çünkü örn.elektrik gidip-geldiği zaman eğer devreyi besleyen gerilim
kritik bir süre boyunca belirli bir değerin altına inerse bellekteki veri güvenilmez oluyor.
Derleyiciyi yazanlar, doğrudan sıfırlayarak bunu çözmüşler.
Aslında 3-5 saniyelik kesintide bellek içeriği korunur, hemen silinmez.
Bunu anlamak için (geçerlilik testi için) komutlar var.
C derleyicisi yazanlar ya bunu bilmiyor,
ya da "herşeyi sıfırlama" çözümü işlerine gelmiş - bilmiyorum.
Oysa yeni geliştirilen yarı-iletken teknolojisi ile bu süre
10-30 dakikaya kadar çıkabiliyor, ki bu da örn. pil değiştirmek için
yeterli bir süre demektir (bazı kaynaklar birkaç saate kadar varan sürelerden
bahsediyor ama ne gördüm ne de ayrıntılı bir makale okudum -yalan yok;
eğer doğruysa çok yeni bir ürün olmalı.
Burada, "volatile" yani kalıcı-olmayan-bellekten bahsediyorum).
Bu güzel bir gelişme ama, bir belleğin silinme süresinin uzaması
o alana yazma/okuma süresinin de uzaması anlamına geliyor.
Aradaki dengeyi nasıl koruyacaklar merak ediyorum.

Kullandığın çipe ilişkin dökümanların mutlaka olsun, bazı sorularından
kullanım klavuzu ya da mimari-çizelgesi gibi bir kaynağa sahip olmadığını düşünüyorum..
Yanılıyorsam bağışla.
Ben yeterli döküman olmadan yola çıkmam. Her ne kadar o an için lazım olmasa bile
üşenmeyip tümünü okurum. Hepsini anlar mıyım; hayır.

Son olarak, denemekten çekinme. Biraz da deneme-yanılma yapmak lazım.

*/

Aşağıdaki aramaları yaparsan bir çok kaynak çıkıyor :

"In Application Programming 8051"
- (bootloader http://www.8052.com/forum/read/145532
- toplam 7 tane post var. Aslında 1.soruyu soran kişi
- sonradan yine 1.soruya dönüp düzeltme yapmış;
- kafan karışabilir o yüzden tüm postlara gözatmanı öneririm.)

"8051 persistent memory"
- Forumda 8051/52 için bir kişi çok özet ama yararlı bilgiler vermiş :
- (sram, xram vb.) http://www.cygnal.org/ubb/Forum1/HTML/001648.html
- Yorumlar 2006 yılına ait.
- (Yeni 8051'lerde xram çip içine alınmış ve mimari biraz değişmiş olabilir.)

"keil compiler result"
- Çok fazla sonuç döndü; birçok forum var. Önerim, o forumlara gözatman.
- Bununla ilgili arama yaparken, doğrudan senin projenle ilgili değil ama
- ilginç bir makaleye rastladım;
- "Byte code Interpreter for 8051 Microcontroller"
- (cross-platform yorumlayıcı; bir kez yaz, bütün MCU'larda çalışsın)
- pic yerine mcu hedeflenmiş (risc yerine cisc!).
- www.iaeng.org/publication/IMECS2010/IMECS2010_pp1125-1129.pdf
- Makale 2010 yılına ait. Yakın bir gelecekte bunun benzerlerini görebiliriz...
- Fikir hoşuma gitti, paylaşmak istedim.


Son olarak, 8051 için C derleyicilerine genel bir bakışla ilgili
oldukça yararlı olacağını düşündüğüm bir yazı.
Derleyicilerin o kadar da hatasız olmadıkları, nerelerde programcının
optimizasyon yapması gerektiği gibi önemli noktalar var.

"Optimal C Constructs for 8051 Microcontrollers"
- http://www.netrino.com/node/174


Gösterdiğin ilgi için gerçekten çok teşekkür ederim.
Elimde oldukça fazla kaynak var. hepsine de gözattım konuyla ilgili. hepsi türkçe kaynaklardı tabi.
verdiğin edaboard sitesine de şu andaki problemimi sormak için bi konu açtım orda da yardımcı olan kişiler var. Birisi "The final word on 8051" isimli bi kitap önerdi, buldum bakıyorum. Türkçe kaynaklarda olmayan C notları mevcut. tabi benim sorunuma halen bi çare bulamadım.
Projeyi kodlamayı durdurdum zaten. Elimde şu anda ne 8051 var ne de programlayıcı. sadece proteus ve Keil ile yürütüyodum. tabi orda da dediğin gibi keil her başlangıçta belleği komple temizlemeyi seçiyor.
Yarın okuldaki imkanlarla sorunumu deniycem değişik alanlara(segmentlere) veri atıp, cihazı kapatıp açıp verinin halen oralarda olup olmadıklarını kontrol edicem. hem C de hem de asm de deniycem hepsini. eğer işi C de değil de asm de başarabilirsem C kodlarını aynen asm ye çevirip tüm programa asm ile devam edicem. Bu arada verdiğin kaynaklara da tek tek inceliycem tabiki.

Tabi bu sırada programlamak için bi alet de arıycam. Çok çeşitli programlama cihazları var ama kafama göre bulamadım bi türlü. bunu programlamak pic ler kadar kolay olmuyor anlaşılan :D


Bu mesaja 1 cevap geldi.
DH Mobil uygulaması ile devam edin. Mobil tarayıcınız ile mümkün olanların yanı sıra, birçok yeni ve faydalı özelliğe erişin. Gizle ve güncelleme çıkana kadar tekrar gösterme.