8051'de Cokluislem (Multitasking) nasil yapilir??

Başlatan nusyil, 24 Mayıs 2012, 20:05:45

nusyil

Herkese Merhaba,

8051 tabanli islemcilerde coklu-islem nasil yapilabilir? Bu isin mantigini aciklayabilirmisiniz?? Basit bir ornek verirsek, Port1'in 1.pinine bagli bir led, mesela 1 saniyede bir yanip-sonerken ayni anda program Port 2'nin 1.pinini surekli gozetleyecek gibi. Ya da baska altyordamlari yurutecek vb.

Google'da biraz arastirdim. Birkac yabanci kaynakta Timer kullanilarak her tasma (veya kesme) urettiginde islemler arasinda gidip-gelme yaparak cok kisa araliklarla her iki islemi yurutmek gibi bir mantiktan bahsediliyor. Ancak tam olarak kavrayamadim. Her seferinde programin kaldigi yerin adresini Yigin'a(Stack) atip diger islemden donuste Yigindan geri yukleyip isleme kaldigi yerden devam etmesi gibi bir seyler sanirim.

Bu konu ile ilgili olarak diger bir seyi daha sormak istiyorum: Programin herhangi bir yerinde iken o andaki PC (Program Counter) daki adresi Yigina nasil kaydedebiliriz? Jmp veya Call komutlarindan once islemci bunu otomatik olarak kendi yapiyor. Benim sorum bunu manuel olarak istedigimiz anda yapabilirmiyiz ?

Cevaplariniz icin simdiden tesekkurler..

ilhan_mkp

http://www.mcselec.com/index.php?option=com_content&task=view&id=55&Itemid=57
hocam 8051 için basic örneği linkte var ama siz asm ile örnek arıyorsunuz biraz araştırayım asm örneği bulursam eklerim

nusyil

Alıntı yapılan: ilhan_mkp - 24 Mayıs 2012, 21:26:58
http://www.mcselec.com/index.php?option=com_content&task=view&id=55&Itemid=57
hocam 8051 için basic örneği linkte var ama siz asm ile örnek arıyorsunuz biraz araştırayım asm örneği bulursam eklerim

sagolun hocam bekliyorum..

Kabil ATICI

Yığına veri atmak  ve almak için (asm için)
push ve pull komutlarını kullanabilirsin. Yalnız bu konuda dikkatli olman gerekir.  Eğer her yerde verilerini kullanmak istiyorsan doğrudan ram alanını kullan. Eğer sıralı (dizi) verin varsa dolaylı adresleme ile (r0,r7 üzerinden) verileri dizilerine erişebilirsin. (doğrudan adreslemede her adresi tek tek erişmeniz gerekir).

ilk konu zaten direkt kesmeler konusuna girer. Bu konuyu dikkatlice incelemen gerekiyor.  Kesmelerin bayraklarını incele. Bu senin işini kolaylaştıracaktır.

kolay gelsin...
ambar7

nusyil

@ambar7: Cevabiniz icin tesekkurler hocam.

Bu push ve pop komutlarini Program Counter'in o anki adresini yigina atmak icin kullanabilecegimiz bir yontem var mi?? Ornegin  "Push ACC" gecerli iken "Push PC" gecersiz bir komut.

Benim yapmak istedigim su : Program calisirken herhangi bir anda elektrik kesilirse, o anda programi durdurup, islemekte oldugu komutun adresini hafizaya (EEPROM) yazmak. Daha sonra elektrik geldigi anda bu adres bilgisini EEPROM'dan geri cagirip, programi kaldigi yerden devam ettirmek.

Kolay gelsin...

Kabil ATICI

program counter 8 bitlik bir sayaç değildir, 16 bitlik bir sayactır. işlemlerini ona göre yönlerdir...
eğer program counter 8 bitlik bir sayaç olsaydı 8051 sadece 256 bayt olurdu... (tüm çevre birimleri ile)
ambar7

z

Alıntı yapılan: nusyil - 25 Mayıs 2012, 16:36:17
@ambar7: Cevabiniz icin tesekkurler hocam.

Bu push ve pop komutlarini Program Counter'in o anki adresini yigina atmak icin kullanabilecegimiz bir yontem var mi?? Ornegin  "Push ACC" gecerli iken "Push PC" gecersiz bir komut.

Benim yapmak istedigim su : Program calisirken herhangi bir anda elektrik kesilirse, o anda programi durdurup, islemekte oldugu komutun adresini hafizaya (EEPROM) yazmak. Daha sonra elektrik geldigi anda bu adres bilgisini EEPROM'dan geri cagirip, programi kaldigi yerden devam ettirmek.

Kolay gelsin...

Malesef olay bu kadar basit değil. Tüm CPU registerlerini hatta çevrebirimi registerlerini de saklamalısınız.
Elektrik kesildiğinde int üreten bir mekanizma kurarsınız. Elektrik kesildiğinde int oluşur ve interrupt rutinine girersiniz.
İnt rutininde SP değerinden yola çıkarak RAM'ı istediğiniz gibi okuyarak stack' atılmıs PC değerini okursunuz.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

nusyil

Alıntı yapılan: z - 25 Mayıs 2012, 18:09:55
Malesef olay bu kadar basit değil. Tüm CPU registerlerini hatta çevrebirimi registerlerini de saklamalısınız.
Elektrik kesildiğinde int üreten bir mekanizma kurarsınız. Elektrik kesildiğinde int oluşur ve interrupt rutinine girersiniz.
İnt rutininde SP değerinden yola çıkarak RAM'ı istediğiniz gibi okuyarak stack' atılmıs PC değerini okursunuz.



Hocam bu dediginizi yapabilmek icin elektrik kesintisinden once SP'yi de yedeklemeliyim anladigim kadariyla? Bunu yapabilecek cok basit bir kod ornegi verebilirmisiniz ? SP'nin o anki icerigini herhangi bir yere nasil kopyalayabiliriz mesela??

Saygilar...

z

Elektrik kesildiğinde int üreten devre CPU yu tetikleyecekö bu esnada besleme devresindeki kapasitörlerlerden dolayı CPU bir süre daha çalışacak. Kapasitörlerdeki enerjisi tükenmeden önce CPU gerekli saklama işlemlerini bitirecek.

Bunun için besleme katını biraz daha titiz tasarlaman ve gerekiyorsa yüksek kapasiteler kullanman gerekiyor. Elektriğin kesildiğini DC beslemeden değil AC tarafa bakarak anlayacaksın. 20ms civarında bir geçikme ile elektriğin kesildiğini anlayabilirsin. Bunun için opamplı yada transistörlü bir devre yapman gerekecek.

8051'i terkedeli 20 yıl olmuştur. Şu anda kod yazacak durumda değilim. Hiç cevap gelmezse bakarız.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

JOKERAS

Selam;"z" ustadım bu büyük kapasite yerine işlemciyi,AC kesildiği anda
işlemcinin beslendiği noktaya transistör'lü bir siviç devresi ile  bağlanmış olan
mini şarzlı veya normal bir batarya kullanılsa, işlemci elektrik kesintisinden
etkilenmeden sadece interrupt'a girerek işlemciyi sleep moda alsa daha iyi
bir yöntem olmazmı?
Böylece PC adresini saklamak ve onun için yazılım tasarlamadan iş daha kolaylaşmazmı?


z

Elbette batarya kullanmak işin garantili şekilde yapılmasını sağlar. Fakat bataryasız yapılabiliyorsa sadelik açısından tercih edilir. Projenin bir benzerini PIC işlemci ile yapmıştım. Elektrik kesilmesi durumunda bazı değişkenleri E2 ye yazdırmada  2200uF gibi bir kapasite yeterli olmuştu.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

JOKERAS

"z" üstadım dediğinizi anladım,ama sizin PİC ile EEproma yazdığınız veri çok uzun değildi sanırım
çünkü daha uzun veri yazmada bu kapasitenin dejarzı yetmeyebilir diye düşünüyorum.
Sonuçta Rom tipi hafızalar Write işlemine maruz kaldığında bu external yada internal olabilir
bu verileri yazmak için içlerinde bulunan boost devrelerini aktif etmek zorunda.
Bu durumda işlemci daha fazla akım çekeceği için kapasite çok daha çabuk boşalır.
Ama sizinde dediğiniz gibi sadece bir iki üç beş baytlık  data yazmak için yeterli olacaktır.
Bunu en kısa zamanda denemem gerek.
Saygı ve Teşekkürler...


nusyil

Alıntı yapılan: JOKERAS - 25 Mayıs 2012, 20:35:49
Selam;"z" ustadım bu büyük kapasite yerine işlemciyi,AC kesildiği anda
işlemcinin beslendiği noktaya transistör'lü bir siviç devresi ile  bağlanmış olan
mini şarzlı veya normal bir batarya kullanılsa, işlemci elektrik kesintisinden
etkilenmeden sadece interrupt'a girerek işlemciyi sleep moda alsa daha iyi
bir yöntem olmazmı?
Böylece PC adresini saklamak ve onun için yazılım tasarlamadan iş daha kolaylaşmazmı?



@ jokeras,

Harici batarya isin en kolay yolu. Batarya kullansam bircok sIkIntI zaten kendinden ortadan kalkacak. Ancak uzerinde calistigim cihaz sehir merkezlerinden uzak yerlere monte edileceginden, mumkun oldugunca "Monte et-unut" mantigina uygun olarak minimum bakim gerektirecek sekilde tasarlamaya calisiyorum. Batarya kullanimi tasarim ve yazilim acisindan buyuk kolaylik saglasa da, sonrasinda herhangi bir anda bitecek batarya'yi degistirmek amaciyla yapilacak bir servis icin harcanacak zaman,emek hele hele benzin :) dusunuldugunde neden batarya kullanmayi tercih etmek istemedigim konusunda bana hak verirsin zannederim :)

Kendimi bildim bileli hep sahada servis teknisyenligi yaptigimdan bazen cok basit ve inanilmaz seyler icin bile yuzlerce kilometre yol yaptigimi hatirliyorum. Hatta hic unutmam bir seferinde musterim telefonda cihazinin  calismadigini, elektrik gelmedigini telefonda bildirdiginde once ona on-off dugmesinin acik olup-olmadigini sormus ve "evet acik ama cihaz yine de calismiyor, acil gelin,islerim yarim kaldi ,zaten garantisi daha bitmedi vs." seklinde feryat-figan cevap almistim. E musteri bu sekilde avaz avaz ortaligi yikinca "musteri memnuniyeti" :) ilkesinden dolayi butun isimi birakip 40km yol gitmis ve cihazin On-off dugmesine basip cihazi calistirip sorunu cozmustum :) Musteri kizarip-bozardi, mahcup oldu vs. ama olan benim zamanima ve harcadigim benzine olmustu :)

Lafi biraz uzattigimin  farkindayim ama butun bu tecrubelerden sonra bende su dusunce olustu : "Bir is icin bastan harcanacak fazladan  zaman ve emek, daha sonra bakim, servis veya ariza icin harcayacaklarinin  yaninda denizde bir kum gibi olacaktir"

Saygilarimla..

nusyil

Alıntı yapılan: z - 25 Mayıs 2012, 19:59:56
Elektrik kesildiğinde int üreten devre CPU yu tetikleyecekö bu esnada besleme devresindeki kapasitörlerlerden dolayı CPU bir süre daha çalışacak. Kapasitörlerdeki enerjisi tükenmeden önce CPU gerekli saklama işlemlerini bitirecek.

Bunun için besleme katını biraz daha titiz tasarlaman ve gerekiyorsa yüksek kapasiteler kullanman gerekiyor. Elektriğin kesildiğini DC beslemeden değil AC tarafa bakarak anlayacaksın. 20ms civarında bir geçikme ile elektriğin kesildiğini anlayabilirsin. Bunun için opamplı yada transistörlü bir devre yapman gerekecek.

8051'i terkedeli 20 yıl olmuştur. Şu anda kod yazacak durumda değilim. Hiç cevap gelmezse bakarız.

Hocam sagol, aradigim mantik tam da bu !! Inan harfi harfine aynisini dusunmustum ama daha once boyle birseyi yapmadigimdan veya yapildigindan haberdar olmadigimdan emin degildim. Simdi emin oldum. Hatta ben soyle dusunmustum: Trafonun AC cikisindan yarim dalga dogrultucu ile optokuploru tetikleyip, cikisindaki kare dalgayi saydirip AC kesildiginde kare dalga da kesileceginden bir kesme urettirip islemciye elektrik kesildigini bildirmek. Benim kurdugum mantik buydu. Siz de daha once boyle birsey yaptiginizi soylediginize gore bu yolda calismalarimi devam ettirecegim. Fikri katkiniz icin cok tesekkurler !!

Saygilarimla...

JOKERAS

Alıntı yapılan: nusyil - 25 Mayıs 2012, 22:05:27
@ jokeras,

Harici batarya isin en kolay yolu. Batarya kullansam bircok sIkIntI zaten kendinden ortadan kalkacak. Ancak uzerinde calistigim cihaz sehir merkezlerinden uzak yerlere monte edileceginden, mumkun oldugunca "Monte et-unut" mantigina uygun olarak minimum bakim gerektirecek sekilde tasarlamaya calisiyorum. Batarya kullanimi tasarim ve yazilim acisindan buyuk kolaylik saglasa da, sonrasinda herhangi bir anda bitecek batarya'yi degistirmek amaciyla yapilacak bir servis icin harcanacak zaman,emek hele hele benzin :) dusunuldugunde neden batarya kullanmayi tercih etmek istemedigim konusunda bana hak verirsin zannederim :)

Kendimi bildim bileli hep sahada servis teknisyenligi yaptigimdan bazen cok basit ve inanilmaz seyler icin bile yuzlerce kilometre yol yaptigimi hatirliyorum. Hatta hic unutmam bir seferinde musterim telefonda cihazinin  calismadigini, elektrik gelmedigini telefonda bildirdiginde once ona on-off dugmesinin acik olup-olmadigini sormus ve "evet acik ama cihaz yine de calismiyor, acil gelin,islerim yarim kaldi ,zaten garantisi daha bitmedi vs." seklinde feryat-figan cevap almistim. E musteri bu sekilde avaz avaz ortaligi yikinca "musteri memnuniyeti" :) ilkesinden dolayi butun isimi birakip 40km yol gitmis ve cihazin On-off dugmesine basip cihazi calistirip sorunu cozmustum :) Musteri kizarip-bozardi, mahcup oldu vs. ama olan benim zamanima ve harcadigim benzine olmustu :)

Lafi biraz uzattigimin  farkindayim ama butun bu tecrubelerden sonra bende su dusunce olustu : "Bir is icin bastan harcanacak fazladan  zaman ve emek, daha sonra bakim, servis veya ariza icin harcayacaklarinin  yaninda denizde bir kum gibi olacaktir"

Saygilarimla..
Selam;Sizin yapacağınız devredeki bu olumsuzlukarı  bilemediğimiz için sadece fikir vermekti amaç.
Sizin yapmaya çalıştığınız şeyi anladım,ama kapasitenin deşarzına ne kadar güvenebilirzki?
Siz  elektrik kesildiğinde interrupt yapıp PC'nin o an bulunduğu adresini EEprom'a yazıp
Elektrik geldiğindede EEprom'u okuyup PC'yi o an okuduğu adrese dallandırmak.
Her elektrik gidişinde bu durum tekrarlanacak,birde şöyle düşün elektrik üzerinde
olabilecek anlık kesilmeler,ripiller,titremeler esnasında sizin opto ile verdiğiniz AC referansında
karasızlık oluşturup false interrupt oluşturacak işlemci elektrik gittiğini sanıp EEprom'a yazma rutinini çalıştırıp
yazma işlemi tam bitmeden elektrik tekrar gelecek sonuç itibarı ile EEproma yazmak istediğimiz
veri yanlış yazılmış olacak,bu sefer çok daha vahim bir sonuç ortaya çıkmış olacak belki sistem hiç
çalışmayacak belki PC öyle alaksız bir yere gidip kendi Rom'undaki yazılımı bozacak.
Bu tip durumlarda işlemcilerin kendi yazılımlarını bozduğu çok rastlanan bir durumdur,hatırlatırım.
Batarya yöntemi bence en sağlıklı yöntem,bir şarzlı batarya 1-2 sene çok rahat dayanır.
1-2 sene sonundada 40km yol gidip bir gezinti yapmak hiçte fena olmaz ::)
Diye düşünüyorum.