delaysız pic kodu

Başlatan yuzarsif, 19 Nisan 2024, 02:57:40

yuzarsif

Merhabalar pic programlamaya yeni başladım. 18f877a ve ccs c kullanıyorum. Delay kullanmanın programı beklemeye sokmasından dolayı delaysız kod  yazmak istiyorum bunu nasıl yapabileceğimi bilmiyorum. Arduino kullanırken millis() fonksiyonu kullanıyordum. picde de bu tarz bir yöntem var mı nasıl bir yol izlemeliyim yardımcı olabilirseniz sevinirim.

arduinoda bu işlev için kullandığım kod bloğu(kodda hata olabilir eski projelerimden çektim)

void setup() 
{
  unsigned long firstTime = 0;
  unsigned long lastTime = 0; 
}
void loop() 
{
  lastTime = millis();
  if(lastTime - firstTime >= 20) 
  {
     //çalıştırılacak fonksiyon
     firstTime = lastTime;
  }
}

sifirzero

delay_ms(1000); mili saniye
delay_us(1000); mikro saniye

Gibimi birsey ariyorsun.
sifirzero.blogspot.com [email]sifirrzero@gmail.com[/email] iman hem nurdur hem kuvvettir

power20

Gecikmesiz zaman kontrolü timer kesmesiyle olur.

Örneğin 1ms aralıklı kesme ayarlayalım 
Her kesme olduğunda
Zaman değişkeni 1 artsın.


Ana programımızda   gecikme kontrolü için

if zaman=1000 ...
gibi 
kontrol yapılır.
https://electronics.stackexchange.com/questions/664366/using-timer-interrupts-instead-of-delays-in-pic-microcontroller


Tagli

Doğru, ideal bir gömülü yazılım kodunda bekleme olmamalı. RTOS varsa bekleme sadece bir task'i kilitleyeceğinden çok sorun olmayabilir ama yine de doğru bir mimari değil.

İşin en doğrusu olay tabanlı bir mimari kurmak, ancak farklı bir düşünce şekli gerekiyor ve alışması biraz zaman alabilir. Bu konuda öncelikli olarak Miro Samek'in videlarını izlemek ve kitabına hiç değilse şöyle bir göz atmak gerekiyor.

Olay tabanlı bir sistemi 8-bit PIC gibi ilkel bir işlemcide kurmak mümkün olsa da biraz sıkıntılı (ben denemiştim). Ben açıkçası bu devirde ARM Cortex M0'dan aşağısı ile uğraşmayı çok doğru bulmuyorum.
Gökçe Tağlıoğlu

tunayk

İşe uygun işlemci seçmek ve işin gereğine ve işlemci kabiliyetine göre program yazmak yeterlidir. Her işte illa RTOS ile çalışmak durumunda değiliz. Dış dünya ile etkileşimi olmayan ve tüm işi periyodik olarak bişeyleri açıp kapatan bir uygulamada pekala delay kullanabilirsiniz. Adamın biryere yetişmek gibi bir kaygısı yok , zaten bekleyecek ister ana döngüyü turlasın, ister iki satırı. Sonuç aynıdır. :) 

Dış dünya ile etkileşim (Haberleşme, analog ölçümler, veri kaydı vb.) olduğunda işler değişir. Önemli olan sistemin gerektirdiği en hızlı tepki süresinin altında koşuyorsa sistem sorun kalmaz.  Doğru planlanmamış olaylarda boğulan bir sistem de çare değil. 100ms altında bir tepki gerekmeyen yerde 100us lik timer olayları ile zamanlama yapmaya çalışmak gereksiz yük olacaktır.   

Mr.Thinking

#5
Pic i ve 8 biti kötülediklerinde şahsıma hakaret edilmiş gibi sinirleniyor ve üzülüyorum.
Tamam gelişime açığım ama, bir-iki adc okuyup birkaç röle çektirmek içinde Cortex m0 mu kullanalım yani.
https://koddefteri.net/ccs-c/ccs-c-donguler.html
ego=1/Knowledge

uzaylivolkan

Arduino da milis() functionu ile yaptığın işlemleri pic serisi işlemcilerle de yapabilirsin. Timer interrupt konularına bakman gerekir. Linkini verdiğim sitede ccs dili ile yazilmiş timer interrupt örneği var.
timer interrupt örneği
// PIC16F877A Timer2 interrupt
// Timer2 is used to interrupt every 49.93ms
http://simple-circuit.com/

#include <16F877A.h>
#use delay(crystal=4000000)

byte i;
#INT_TIMER2
void timer2_isr(void)
{
   clear_interrupt(INT_TIMER2);
   i++;
   if(i > 9)
   {
   i = 0;
   output_toggle(PIN_B0);
   }
}
void main()
{
   setup_timer_2 (T2_DIV_BY_16, 0xF0, 13 );  // Timer2 prescaler 16, Preload value 0xF0 and postoscaler 13
   clear_interrupt(INT_TIMER2);              // Clear Timer2 interrupt flag bit
   enable_interrupts(INT_TIMER2);            // Enable Timer2 interrupt
   enable_interrupts(GLOBAL);                // Enable global interrupts
   output_low(PIN_B0);

   while(TRUE) ;                             // Endless loop
}

Epsilon

#7
8 bit MCU ilk defa 1972 de kullanılmış.
Voyager I de bile kullanılmamış olabilir.Ama bu araç  -270 derece ortamda ,saatde 61500 km lik hızla uzaklaşmasına  ve çok yüksek manyetik Radyoaktif ortamlardan geçmesine rağmen kırk iki yıldır  hala çalışıyor.Şu anda yaklaşık 24,3 milyar km uzakta
Önemli olan tasarımın mükemmel olması.Pekçok şeyin düşünülmesi ve önlem alınması.

Ha parçacık hızlandırıcısında bilmem kaç nano saniyelik olayın bilgisini alman gerekiyor o zaman 128 bit MCU kullan  :) 
(128 bitlik MCU yok sanırım)
MCU yazılımı konusunda çok bilgili değilim ama zaten donanımlarda bu delay(Bekleme ) komutları özellikle isteniyor diye biliyorum.
(Displaylerin kendine gelmesi için bekleme süresi vs)
Fotoğralar:
Voyagerın "Elektronik Beyni"
Voyager ın  Ucuş alt  sistem bilgisayarı(Altta)

voyager-n-beyni" border="0
voyager-ucu-bilsisayar-s-stemi" border="0

Mucit23

RTOS olmasa da öğrenmeniz gereken en temel şey State Machine Yapısı.

En basitinden bir Timer kurup Timer Eventi ile main içerisinde durum değişkenleri ile işlem yapabilmelisiniz. Bu sayede program delaylara takılmaksızın yazdığınız döngüdeki işlemleri yerine getirir.

Tagli

Alıntı yapılan: Mucit23 - 02 Mayıs 2024, 18:34:54RTOS olmasa da öğrenmeniz gereken en temel şey State Machine Yapısı

Aynı fikirdeyim. RTOS kullanmanın artıları ve eksileri var. Ama genel görüşüm preemption şart değilse - ki genelde şart olmuyor - RTOS'a pek de gerek kalmadığı yönünde. State machine'ler bir event dağıtım mekanizması ile birleştiğinde çok güçlü oluyorlar. Artık tüm uygulamalarımı bu yapıyla tasarlıyorum.

Duraksamalar bazen yazılım akışında gerekli olabiliyor. Burada önemli olan, bu tür bir duraksama sırasında işlemcinin başka işler de yapabiliyor olmasıdır. Duraklama da state machine içinde bir durumdur aslında. Süresi dolan bir timer, kesme mekanizmasını kullanarak, bekleme durumundaki bir bileşene bir event atar ve bekleme durumu sona erer, sonrasında sırada ne varsa o yapılır. Ana mantık bu.

Zaman içinde projelerimin alt yapısında kullanmak üzere bir çeşit framework oluşturdum ve bunu da C++ ile yazdım. Haliyle, çok zorlayıcı bir neden olmadığı sürece C++ derleyicisi olmayan bir işlemciye geri dönmek istemiyorum. Zamanında ben de elektroniğe ve gömülü yazılıma PIC16F84A ile başlamıştım ve sanırım 2017 yılına kadar da sadece PIC (8 ve 16 bit) kullandım. Ama günümüzde PIC'ler ile aynı fiyata, hatta çok daha ucuza çok daha yetenekli Cortex M0 işlemciler bulunabilirken PIC kullanmak için bir sebep kalmadı benim bakış açıma göre.
Gökçe Tağlıoğlu

mr.engineer

Alıntı yapılan: Tagli - 02 Mayıs 2024, 20:51:16Aynı fikirdeyim. RTOS kullanmanın artıları ve eksileri var. Ama genel görüşüm preemption şart değilse - ki genelde şart olmuyor - RTOS'a pek de gerek kalmadığı yönünde. State machine'ler bir event dağıtım mekanizması ile birleştiğinde çok güçlü oluyorlar. Artık tüm uygulamalarımı bu yapıyla tasarlıyorum.

Duraksamalar bazen yazılım akışında gerekli olabiliyor. Burada önemli olan, bu tür bir duraksama sırasında işlemcinin başka işler de yapabiliyor olmasıdır. Duraklama da state machine içinde bir durumdur aslında. Süresi dolan bir timer, kesme mekanizmasını kullanarak, bekleme durumundaki bir bileşene bir event atar ve bekleme durumu sona erer, sonrasında sırada ne varsa o yapılır. Ana mantık bu.

Zaman içinde projelerimin alt yapısında kullanmak üzere bir çeşit framework oluşturdum ve bunu da C++ ile yazdım. Haliyle, çok zorlayıcı bir neden olmadığı sürece C++ derleyicisi olmayan bir işlemciye geri dönmek istemiyorum. Zamanında ben de elektroniğe ve gömülü yazılıma PIC16F84A ile başlamıştım ve sanırım 2017 yılına kadar da sadece PIC (8 ve 16 bit) kullandım. Ama günümüzde PIC'ler ile aynı fiyata, hatta çok daha ucuza çok daha yetenekli Cortex M0 işlemciler bulunabilirken PIC kullanmak için bir sebep kalmadı benim bakış açıma göre.


dsPIC'ler için görüşünüz nedir?

power20

Alıntı yapılan: Tagli - 02 Mayıs 2024, 20:51:16... hatta çok daha ucuza çok daha yetenekli Cortex M0 işlemciler bulunabilirken PIC kullanmak için bir sebep kalmadı benim bakış açıma göre.
Hala pic kullanan kişinin kendince önemli sebepleri vardır. 3..4  maliyeti kabullenmek için ciddi sebep ne olabilir? Hatta pici bile değiştiremez. Yarı fiyatına daha yetenekli pic çıkmış fakat bildiği kurulu düzen ide vs değişmesin diyerek donmuş kalmıştır. Bunlar PIC6f877a, pic16f628A  sevicilerdir. Yanlış olmasın "A" modeli olacak. 

Epsilon

#12
Adam yıllarca proton basic le kod yazmışsa yaşıda 50-55 olmuşsa yazdığı kodlar işinide görüyorsa ayda da 500-1000 kart satıyorsa gerek duymaz . Çok fazla kart/cihaz satıyorsa ihracat da yapıyosa ya kendi öğrenir yada bilen birini işe alır yeni MCU lara göre yazdırır.
Eskilerin bir lafı vardır "Bekara kadın boşamak kolaydır" diye bir dili öğrenmek bir seviyeye getirmek nereden baksan 2 yıl.


Epsilon

Bu arada STM32 ye kod yazan arkadaşlara sorsam desemki "Bende C öğrenmek STM32 lerle kod yazmak istiyorum hangi IDE yı kurmalıyım " desem muhtemelen  çok farklı tavsiyeler gelecek.

M.Salim GÜLLÜCE

#14
Açıkçası alışkanlıklar ağır basar mcu seçiminde.
PIC serisinde çok çeşit kullanmaktayım.
Üretimimiz temelde onunla başladığı için ve oturmuş bir yazılıma sahip olduğu için dsPIC ile baba sistemimiz devam etmekte.
PIC32MK..MC (100 Pin 12 ch PWM) serisini de yeni sistem için tasarladım. % 100 üretime geçmedik henüz.
Bir PCB revizyonu daha geçirip hem IGBT hem SCR kontrolü yapabilen esnek bir sisteme dönüştüreceğim.

Deselerki ARM üzerine çalışmaya başla..
Bunca katettiğim yoldan çıkıp arm üzerine yürümem mümkün değil. Ötesi karanlık bir macera olur benim için.
Zira oturmuş yazılımları onun sistemine adapte etmek kendi başına bambaşka bir dert.

03 Mayıs 2024, 15:18:04
Alıntı yapılan: Epsilon - 03 Mayıs 2024, 15:15:08Bu arada STM32 ye kod yazan arkadaşlara sorsam desemki "Bende C öğrenmek STM32 lerle kod yazmak istiyorum hangi IDE yı kurmalıyım " desem muhtemelen  çok farklı tavsiyeler gelecek.

Genelde Cube üzerine yürüyor STM32 serisi.
Ben çok sevemedim.