Picproje Elektronik Sitesi

DERLEYİCİLER => CCS C => Konuyu başlatan: picmanya - 14 Haziran 2024, 19:19:42

Başlık: Bu tarz bir programlama mümkün mü?
Gönderen: picmanya - 14 Haziran 2024, 19:19:42
Aynı fonksiyon içinde goto - label kullanımından haberim var.
#include <setjmp.h> kütüphanesindeki, LongJmp - SetJmp fonksiyonlarıyla iş göremedim. ( Bu benim beceriksizliğimde olabilir.)
Altdaki koddaki tarzda; Fonksiyonlar arasında sıçrama yapılabiliyor mu? Fonksiyonlar işlemci tanımlı ve kullanıcı tanımlı olabiliyorlar.
Yapmak istediğimi alt da kısaca kod halinde yazmaya çalıştım.  Kodu düzenleyerek göstermeniz mümkünmüdür?

void CN_Interrupt()             // işlemci giriş pin kesmesi interruptu.
{   
   ...kodlar...
   if(şartlar1) Atla_1;
   ...kodlar...            
}

void TIMER1_Interrupt()            // işlemci timer kesmesi interruptu.
{
   ...kodlar...
   if(şartlar2) Atla_2;
   ...kodlar...   
}

void Calis(void)                        // kullanıcı tanımlı yazılan fonksiyon.
{
   ...kodlar...
   if(şartlar3) Atla_3;
   ...kodlar...   
}

int main(void)
{
   ...kodlar...

   while(1)   
   {
      ...kodlar...     
      ...kodlar...
      Atla_1:   
      ...kodlar...     
      ...kodlar...
      Atla_2:
      ...kodlar...     
      ...kodlar...
      Calis();
      ...kodlar...     
      ...kodlar...
      Atla_3:
      ...kodlar...     
      ...kodlar...
   }
}
Başlık: Ynt: Bu tarz bir programlama mümkün mü?
Gönderen: mustafa_cmbz - 14 Haziran 2024, 20:24:33
İki farklı fonksiyon var ve birinde etiket oluşturmuşsun ve o fonksiyon içinde dönsürürken başka bir fonksiyon çağırıp o fonksiyon içinde diğer fpnksiyondaki etiketleri çağırıyorsun. Bu sıkıntı yaratır diye biliyorum.

Bende lcd için Basic ten kalma alışkanlık Bi fonksiyon çağırıp o fonskiyon içinde etiketlere dallanıyorum fakat yanlış hatırlamıyorsam senin yaptığın gibi yapmaya çalıştığımda olmamıştı.

Bu yüzden programı yazarken ona göre akış belirlemelisin
Başlık: Ynt: Bu tarz bir programlama mümkün mü?
Gönderen: picmanya - 14 Haziran 2024, 21:21:33
mustafa_cmbz,
3 farklı fonksiyonum + Main() fonksiyonum var.
3 nün içeriği aynı. Etiket oluşturulan hangisi? Etiket ne?

Başlık: Ynt: Bu tarz bir programlama mümkün mü?
Gönderen: mehmet - 14 Haziran 2024, 22:08:36
İnterrupt ve fonksiyonlar içinde sadece bir/bir kaç değişkenin değerini değiştirin. Ana döngüde de bu değerlere göre diğer fonksiyonlara dallanın.
Durum makinası (state machine) konusunu inceleyiniz.
Başlık: Ynt: Bu tarz bir programlama mümkün mü?
Gönderen: picmanya - 14 Haziran 2024, 22:19:56
işlemci ucuz hafıza - kapasite ve hızı düşük.
dediğiniz tarzda-şekilde kod çok uzuyor, sığmıyor. çok karmaşıklaşıyor. her türlü senaryoya göre kod yazmak gerekiyor.
İyi bildiğiniz gibi; goto label ile aynı fonksiyon içinde istenilen yere dallanılabiliyor. olay karmaşıklaşmadan kolayca halledilebiliyor.
Bana herhangibir fonksiyon içinden, Main() fonksiyonu içindeki While() döngüsü içerisinde herhangibir yere atlayabileceğim bir yapı lazım.
#include <setjmp.h> kütüphanesindeki, LongJmp - SetJmp yapıları bu işi sağlamak içinmi verilmiş? İstediğimi yapabilecek yapılar bunlarmı?
state machine ne de bakarım, ama şimdi yoğunlaşmam gereken yer farklı ise, öncelikle ona bakmak isterim.
Başlık: Ynt: Bu tarz bir programlama mümkün mü?
Gönderen: mehmet - 14 Haziran 2024, 22:26:38
Mesela hangi mcu?
Başlık: Ynt: Bu tarz bir programlama mümkün mü?
Gönderen: picmanya - 14 Haziran 2024, 22:38:42
Microchip 30F2010 ve 30F2011 modelleri,
ucuz olanları, kullanabildiklerim ve minimum donanımları yeterli gelenler bunlar.
işlemi bunlarla yapmak zorundayım.

C dilinde bu türden bir işi yapabilecek anahtar kelimeler;
#include <setjmp.h> LongJmp - SetJmp mıdır? Araştırmam gereken kısım bunlarmı?
Başkada bir yere çıkan bir cevap bulamadım henüz. Her yerde bunlara atıf yapılmış.
Başlık: Ynt: Bu tarz bir programlama mümkün mü?
Gönderen: mehmet - 14 Haziran 2024, 23:02:26
Hala "state machine" konusunda ısrarcıyım. Bir yere sıçradığınızda geri döneceğiniz yeri bilmezseniz sıkıntılar çıkar. Mutlaka fonksiyon kullanınız.
Başlık: Ynt: Bu tarz bir programlama mümkün mü?
Gönderen: mustafa_cmbz - 14 Haziran 2024, 23:18:58
yukarıda arkadaşların bahsettiği şekilde geri döneceğin yeri belirtmen lasım mantığı var


void main()

{

ok tuşuna basıldı ise fonksiyonu çağır


} // main son



fonksiyon()
{

menu1:   // etiket ( basicten kalma alışkanlık... iki nokta ile belirtilen kısımlara etiket der idik )

çıkış tuşuna basıldı ise exit menuye git ve fonksiyon geldiği yere gitsin

ok tuşuna basıldı ise menu2' ye git gibi

goto menu1


menu2:

goto menu2


exıt_menu:



} // fonksiyon sonu


bende sizinle hem fikirim özellikle lcd lere menu yaparken çok anlaşılır ve pratik oluyor böyle fakat

başka bir fonksiyonda iken başka bir fonksiyon altında tanımladığın etikete dallanır isen orada işler karışıyor...



Başlık: Ynt: Bu tarz bir programlama mümkün mü?
Gönderen: picmanya - 15 Haziran 2024, 00:05:25
mustafa_cmbz,
aynı fonksiyon içinde bir yere sıçramada kullanılan goto label den bahsediyorsunuz.
bundan haberim var ve kullanıyorum.
peki fonksiyonlar arasında sıçrama nasıl olacak.
sizin kodunuz üzerinden ilerlersek;
Void main() içine bir while() döngüsü ve bununda içerisine bir etiket koyalım ve
fonksiyon() adlı fonksiyonunuz içinden bu etikete sıçramaya çalışalım.
Bu iş nasıl olacak? Bunun yöntemi lazım bana.

Alıntı yapılan: mehmet - 14 Haziran 2024, 23:02:26Hala "state machine" konusunda ısrarcıyım. Bir yere sıçradığınızda geri döneceğiniz yeri bilmezseniz sıkıntılar çıkar.
Mutlaka fonksiyon kullanınız.
Hocam fonksiyon kullanmada sıkıntı yok. kullandığım bir yapıdır. fonksiyonla basitce makul şekilde olabilse fonksiyonla yaparım zaten.
fonksiyonun ilave kodların geçmediği kısımlar olabiliyor. Kısaca basit bir sıçrama yapmak gerekebiliyor.

Bilen varsa bir fonksiyon içinden Main() içindeki while() döngüsü içerisine sıçrama yöntemini birisi anlatabilirse sevinirim.
#include <setjmp.h> kütüphanesindeki, LongJmp - SetJmp bu yapıylamı yapılıyor? Başka yöntem varmı?
Başlık: Ynt: Bu tarz bir programlama mümkün mü?
Gönderen: picmanya - 15 Haziran 2024, 12:21:06
Birde bu geri dönme meselesi çıktı, buraya çok takılınılıyor, her yerde yazıyor bu geri dönülecek adres meselesi,
herkesde buna takıyor. 99 bin yerde goto; label; de sıkıntı geri dönülecek adresi tutmak bilmek lazım gibi.
Kullanıpda geri dönenide görmedim hiç. Yada bu tarz bir geri dönüş kullanımı varsada, benim onunla hiç işim yok.
Geri dönmeye çalışan yok. Geri dönüş yok. Hep ileri gitmek var. Arkama bile bakmayacağım.

Anlatımı çok basit, sıçra komutuna gelindiğinde, sıçranılacak yere gidilecek.
Ve sıçranılan yerden itibaren aşağıya doğru sırası ile komutlar-kodlar işletilecek.
Ne sıçra komutunun olduğu yerden sonraki blok içindeki kodlar, nede sıçranılan yerden önceki komutlar bir seferliğine işletilmeyecek.
geri dönüş olmayacak yani.

Aynen yukarıda mustafa_cmbz nin bahsettiği ve bilenen düz-klasik goto; ve label: ikilisi gibi olmalı.
Yalnız bunlar aynı blok-fonksiyon ({}) işerteleri içinde çalışır bize bunun gelişmiş modeli lazım. Farklı bloklar içinde çalışma ruhsatına sahip olmalı.

Bayram önü son gün, yokmu sevabına el atacak meseleye. Teşrik Tekbirleri sonrası hayır dua ediveririm.
Başlık: Ynt: Bu tarz bir programlama mümkün mü?
Gönderen: Epsilon - 15 Haziran 2024, 12:38:20
CCS den anlamam ama basic de program yazarken GOSUB ile gönderilen alt programda (LABEL da) son satırına RETURN yazdığında  geldiği GOSUB satırının hemen altına gelir oradan devam eder.

Muhtemelen aynı konuyu anlatan CCS ile ilgili :Bu forumdaki linki (https://www.picproje.org/index.php?topic=31938.0)
Başlık: Ynt: Bu tarz bir programlama mümkün mü?
Gönderen: picmanya - 15 Haziran 2024, 13:26:37
Yok sizde geri dönmeniz gereken yerin 1 satır altına döndünüz. Bir nevi alt programa git gel yaptınız. Geri dönmeye çalıştınız.

C de o işi donanım kesmeleri, yazılım kesmesi ve gerektiğinde kullanılan, kullanıcının yazdığı-oluşturduğu fonksiyonlar yapıyorlar.

Benim dediğimde geri dönüş yok. Aslında sanıyorum herhangibirşeyi çağırmakda yok denebilir galiba.
En azından C de yazılımda ben birşeyi çağırmayacağım, geri planda ben görmeden bir şey çağrılıyorsa bilemem.

Çok basit-sade şekilde, bir kelime ile yönlendirilip, direkt yönlendirilen yere git ve ordan program satırlarını koşturmaya devam et.
Anlatması çok basit. Ama henüz yapamadım.
Başlık: Ynt: Bu tarz bir programlama mümkün mü?
Gönderen: mehmet - 15 Haziran 2024, 14:07:44
Switch-case ile şartlarınıza göre ana döngünüzü yazın. Gerekli değişkeni de; interrupt, harici girişlerle değiştirirsiniz. Buna göre kodlar istediğiniz şekilde çalışır.
Başlık: Ynt: Bu tarz bir programlama mümkün mü?
Gönderen: sadogan - 15 Haziran 2024, 16:04:04
Interrut rutininden veya subritinden return kullanmadan ayrıldığınızda
stack taşması olur.
Başlık: Ynt: Bu tarz bir programlama mümkün mü?
Gönderen: papsukkal - 15 Haziran 2024, 16:06:40
Ben bu tarz işlem gerektiğinde genelde byte cinsinden bayraklar tanımıyorum. Farklı fonksiyonlara da gitse bayrağa bakıp işlem yapıyorum.
Başlık: Ynt: Bu tarz bir programlama mümkün mü?
Gönderen: picmanya - 15 Haziran 2024, 22:39:34
Alıntı yapılan: mehmet - 15 Haziran 2024, 14:07:44Switch-case ile şartlarınıza göre ana döngünüzü yazın. Gerekli değişkeni de; interrupt, harici girişlerle değiştirirsiniz. Buna göre kodlar istediğiniz şekilde çalışır.

Böyle çalışır zaten, buna itiraz edemem. Bir şekilde yapılır edilir çalıştırılır. Yalnız ben bu şekilde yapmak istemiyorum.
Yada geçici olarak mecburen bu tarz klasik yöntemlerle yapsamda. Asıl olarak anlattığım tarzda nasıl yapıldığınıda öğrenip yapmak isterim.

Alıntı yapılan: sadogan - 15 Haziran 2024, 16:04:04Interrut rutininden veya subritinden return kullanmadan ayrıldığınızda stack taşması olur.

Bunların önlemini alıpda öyle sıçramayı planlıyorum. Yapmak istediğimle direkt alakalı olmadığından bu konuya girilmedi.
Donanımsal kesme interrupt-fonksiyonlarında çözüm çok kolay olur. İlgili flağı sıfırlar çıkarız. Kullanıcı tanımlı fonksiyonlarda ise gereken önlemler alınırdı. Fonksiyon ona göre tasarlanırdı.
Olmadı global değişkenlerle iş kotarılırdı. Öncelikli amaç önce yapmak istediğim kısım, sonrasında arıza çıkaran yerlere ayrıca bakılır.

Çözümü henüz bulamadık. Herkese Hayırlı Bayramlar Dilerim. Hoşcakalın.
Başlık: Ynt: Bu tarz bir programlama mümkün mü?
Gönderen: mehmet - 15 Haziran 2024, 22:59:12
C ile yazacaksanız Basic kodlama mantığını bırakmanız gerekmekte. Özellikle interrupt fonksiyonundan elinizi kolunuzu sallayarak çıkamazsınız.
Başlık: Ynt: Bu tarz bir programlama mümkün mü?
Gönderen: mustafa_cmbz - 16 Haziran 2024, 02:52:52
Alıntı yapılan: mehmet - 15 Haziran 2024, 22:59:12C ile yazacaksanız Basic kodlama mantığını bırakmanız gerekmekte. Özellikle interrupt fonksiyonundan elinizi kolunuzu sallayarak çıkamazsınız.

Aynen öyle c de klasik bir durum var goto komutunu sevmez derler c ile yazanlar.

Ben Basic ten uzun yıllar sonra geçin ce epey sıkıntı yaşadım daha yeni yeni alışıyorum.

C de fonksiyon lar çok esnek kullanımı çok hoş hatta proton son versiyonların da da eklemişler fakat bir fonksiyon çağırdığını da başka bir fonksiyona yada fonksiyon altındaki etikete goto ile dallanıp işlem yapamıyorsun.

Çünki bir fonksiyonu çağırdığında iki parantez içindeki işlemi yapıp işlem bittiğinde geri parantez sonunda otomatik geri dönmesi bekleniyor. Sen o fonksiyon içinde başka bir fonksiyona dallanıp o dallandığın yerde işlem bittiğinde main'e nasıl dönecektim ben ya diyor anladığım kadarıyla bu gittiğin ve döneceğin yer burada ortaya çıkıyor işte.
Başlık: Ynt: Bu tarz bir programlama mümkün mü?
Gönderen: picmanya - 16 Haziran 2024, 12:29:36
Alıntı yapılan: mehmet - 15 Haziran 2024, 22:59:12C ile yazacaksanız Basic kodlama mantığını bırakmanız gerekmekte. Özellikle interrupt fonksiyonundan elinizi kolunuzu sallayarak çıkamazsınız.
İnterrupt fonksiyonunu içindeyken; fonksiyonun tam olarak kendiliğinden bitmesine müsade etmeden, yarım bırakıp nasıl çıkılabilir?
Başlık: Ynt: Bu tarz bir programlama mümkün mü?
Gönderen: sadogan - 16 Haziran 2024, 12:35:24
 return; ile .
Başlık: Ynt: Bu tarz bir programlama mümkün mü?
Gönderen: picmanya - 16 Haziran 2024, 13:37:34
return ifadesiyle çıkılır çıkılmasına ama;
sıçrama yapmadan önce ve sonra, sanıyorum return iş görmez gibi duruyor.
sıçrama ve return ifadesi; ikisi peş peşe ve aynı anda kullanılamayacaktır.

Alıntı yapılan: mehmet - 15 Haziran 2024, 22:59:12C ile yazacaksanız Basic kodlama mantığını bırakmanız gerekmekte. Özellikle interrupt fonksiyonundan elinizi kolunuzu sallayarak çıkamazsınız.

bu kısmın tercümesini ben şöyle anladım;
interrupt fonksiyonu içindeki herhangibir yerden,
while() döngüsü içerisine, çok sert bir şekilde direkt olarak sıçrama yaparken;
hem düzgün bir şekilde intterrupt fonksiyonundan çıkılmalı, hemde yapılmak istenilen sıçrama işlemi layıkıyla yapılabilmeli.

Bu nasıl olacak peki? Henüz sıçrama faaliyetinin nasıl yapılacağı ortada yokken.  Önce bir sıçrasaydık sonradan çıkacak problemlere bakılabilirdi.

SIÇRAMANIN NASIL YAPILDIĞINI, BEN ÖNCELİKLİ OLMAK ÜZERE, HENÜZ BİLEN ORTAYA KOYAN YOK.

sıçrama yapılabileceğide kesin değil gerçi.
Başlık: Ynt: Bu tarz bir programlama mümkün mü?
Gönderen: sadogan - 16 Haziran 2024, 15:18:58
Rutin içinde sıçrama yapabilirsiniz ancak
RUTIN DIŞINA ÇIKMANIZA C İZİN VERMEZ.
Başlık: Ynt: Bu tarz bir programlama mümkün mü?
Gönderen: mehmet - 16 Haziran 2024, 16:04:02
break, continue komutları incelenebilir.

https://www.kadifeli.com/fedon/stdcprtr.php
Başlık: Ynt: Bu tarz bir programlama mümkün mü?
Gönderen: picmanya - 16 Haziran 2024, 17:39:37
Bu kısıma forum içi aratma ile ulaşamamıştım. Aratma kriterlerim yetersizde kalmış olabilir. webde aratınca karşılaştım.
https://www.picproje.org/index.php/topic,46931.45.html
Burada;

Z
nin sorduğu bir soruya,
bluekid
in verdiği cevapla,
mufitsozen
in de katkılarıyla,

Aradığım tarzda çözüme ulaştım. Kendilerine çok teşekkür ederim.

Daha öncesindeki aramalarımdada aynı ipucuna ulaşıyordum.

Bu konu benim açımdan kapanmıştır.
Başlık: Ynt: Bu tarz bir programlama mümkün mü?
Gönderen: SERRO EFE - 17 Haziran 2024, 20:08:14
Yeri değil ama; çözüm üretenlerin ismini okuduğumda yokluklarına bir kere daha üzüldüm. Gerçekten foruma ekstra değer katan kendi alanlarında bilgi ve foruma destekleri ile yeri doldurulamayan üyelerdi. Yoklukları gerçekten üzücü :'(
Başlık: Ynt: Bu tarz bir programlama mümkün mü?
Gönderen: Epsilon - 18 Haziran 2024, 15:03:53
OG,Müfit Sözen çok bilgili forum üyeleri idi Allah(C.C) onlara rahmet etsin.
Gerbay yine  muazzam C ve elektronik bilgisine sahipti.Yazılım konusunda çok iddialı değilim ama onun yazdığı ufak bir kodu görünce ne kadar bilgili olduğunu hemen daha ilk satırlardan anlayabiliyordunuz.Bildiğim kadarıyla forumdan tüm mesajlarını silerek ayrılmıştı.Ne kadar büyük bir kayıp.
Yinede arada bir foruma şöyle bir bakıyordur sanırım .

Bülent Hoca da çok bilgili idi, yalnız biraz cümleleri karşıdakinin yanlış anlamasına sebep olabiliyordu. Şimdilerde mekatronik.org sitesine takılıyor.

Yine o forumda @czorgormez in bu forumda da üye olduğunu ama topu topu 3-5 mesajının olduğunu gördüm.Diğer forumda 7-8 ayda 900 e yakın mesajı olmasına rağmen burada o kadar senede 3-5 mesajının olmasına sebep belli bir mesaj  sayısına kadar yayınlanması için onay beklemesi olabilir
Yine mesela o  forumda  clc nickli yine çok bilgili bir başka arkadaş da var .Büyük bir firmanın AR-GE sinde çalışıyordu.

@czorgormez gibi elektronik bilgisi  çok üst seviyelerdeki kişilerden onaylama zorunluluğunu kaldırılabiliyorsa kaldırılmalı bence