Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => Microchip PIC => Konuyu başlatan: yuzarsif - 19 Nisan 2024, 02:57:40

Başlık: delaysız pic kodu
Gönderen: yuzarsif - 19 Nisan 2024, 02:57:40
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;
  }
}
Başlık: Ynt: delaysız pic kodu
Gönderen: sifirzero - 01 Mayıs 2024, 20:00:40
delay_ms(1000); mili saniye
delay_us(1000); mikro saniye

Gibimi birsey ariyorsun.
Başlık: Ynt: delaysız pic kodu
Gönderen: power20 - 01 Mayıs 2024, 20:20:46
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

Başlık: Ynt: delaysız pic kodu
Gönderen: Tagli - 01 Mayıs 2024, 20:21:53
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ı (https://www.youtube.com/watch?v=o3eyz1gEqGU&list=PLPW8O6W-1chytjkg63-tM7MI0BvGxxPIP) 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.
Başlık: Ynt: delaysız pic kodu
Gönderen: tunayk - 01 Mayıs 2024, 23:50:51
İş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.   
Başlık: Ynt: delaysız pic kodu
Gönderen: Mr.Thinking - 02 Mayıs 2024, 16:42:44
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
Başlık: Ynt: delaysız pic kodu
Gönderen: uzaylivolkan - 02 Mayıs 2024, 17:09:22
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 (https://simple-circuit.com/pic16f877a-timer2-module-interrupt/)
// 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
}
Başlık: Ynt: delaysız pic kodu
Gönderen: Epsilon - 02 Mayıs 2024, 17:15:14
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)

(https://i.ibb.co/Jk77YTH/voyager-n-beyni.png) (https://imgbb.com/)
(https://i.ibb.co/frPMwpY/voyager-ucu-bilsisayar-s-stemi.png) (https://ibb.co/8PSMZ5D)
Başlık: Ynt: delaysız pic kodu
Gönderen: Mucit23 - 02 Mayıs 2024, 18:34:54
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.
Başlık: Ynt: delaysız pic kodu
Gönderen: Tagli - 02 Mayıs 2024, 20:51:16
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.
Başlık: Ynt: delaysız pic kodu
Gönderen: mr.engineer - 02 Mayıs 2024, 22:05:09
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?
Başlık: Ynt: delaysız pic kodu
Gönderen: power20 - 03 Mayıs 2024, 14:14:08
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. 
Başlık: Ynt: delaysız pic kodu
Gönderen: Epsilon - 03 Mayıs 2024, 14:50:35
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.

Başlık: Ynt: delaysız pic kodu
Gönderen: Epsilon - 03 Mayıs 2024, 15:15:08
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.
Başlık: Ynt: delaysız pic kodu
Gönderen: M.Salim GÜLLÜCE - 03 Mayıs 2024, 15:17:09
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.
Başlık: Ynt: delaysız pic kodu
Gönderen: Mr.Thinking - 03 Mayıs 2024, 15:24:04
Alıntı yapılan: power20 - 03 Mayıs 2024, 14:14:08Hala 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.
Yaw he he deyip kabalaşacağım.
Bir tasarımda aranan en büyük özellik nedir. Uzun yıllardır sorunsuz çalışmış mı çalışmamış mı? Yeni bir işlemcinin ne yapacağını tecrübe ettiniz mi. Hadi siz geçin o zaman yeni işlemciye. Yeni işlemciye geçenlerin tasarımlarındaki sorunları görüyoruz. Ortalık hurda kart kauynıyor.
Başlık: Ynt: delaysız pic kodu
Gönderen: power20 - 03 Mayıs 2024, 16:29:42
Bunların bazi türleri, PIC içerisindeki ADCyi kullanmak zor geldiği veya beceremediği için hariçten ADC entegresi takar.
Başlık: Ynt: delaysız pic kodu
Gönderen: Epsilon - 03 Mayıs 2024, 17:01:16
Alıntı yapılan: power20 - 03 Mayıs 2024, 16:29:42Bunların bazi türleri, PIC içerisindeki ADCyi kullanmak zor geldiği veya beceremediği için hariçten ADC entegresi takar.

Yaw ADC yi kullanmak PIC basicde bile en çok 10 satırla, örneğin bir voltaj okunur diplaye'de  yazdırılır.
Adam ADC yi bile bilmiyorsa ne programı yazacak ? Siz programlama biliyorda mı konuşuyorsunuz?
 
Başlık: Ynt: delaysız pic kodu
Gönderen: Mr.Thinking - 03 Mayıs 2024, 17:04:13
Alıntı yapılan: power20 - 03 Mayıs 2024, 16:29:42Bunların bazi türleri, PIC içerisindeki ADCyi kullanmak zor geldiği veya beceremediği için hariçten ADC entegresi takar.
Haricten adc çipi işlemci ile nasıl iletişiyor acaba? I2c ile mi, ne ile? Yani o nasıl oluyor? adc nin çıkışı high yada low olup işlemcide bunu mu okuyorlar? Anlamadım. Enteresan.
Adam adc yazılımını bilmiyor ama I2C yi biliyor ha. Enteresan
Başlık: Ynt: delaysız pic kodu
Gönderen: power20 - 03 Mayıs 2024, 17:04:48
evet programlama biiyor da konuşuyorum, burada gördüğümüz vakalar bunlar. şaka değil.
Alıntı yapılan: Epsilon - 03 Mayıs 2024, 17:01:16Siz programlama biliyorda mı konuşuyorsunuz?
 
evet programlama biiyor da konuşuyorum, burada gördüğümüz vakalar bunlar. şaka değil.
Başlık: Ynt: delaysız pic kodu
Gönderen: Mr.Thinking - 03 Mayıs 2024, 17:13:25
Alıntı yapılan: power20 - 03 Mayıs 2024, 17:04:48evet programlama biiyor da konuşuyorum, burada gördüğümüz vakalar bunlar. şaka değil.evet programlama biiyor da konuşuyorum, burada gördüğümüz vakalar bunlar. şaka değil.
Hariçten adc çipi bazen çözünürlüğü yükseltmek için kullanılır. Bunu da biliyorsun değil mi?
Başlık: Ynt: delaysız pic kodu
Gönderen: power20 - 03 Mayıs 2024, 17:15:44
öyle bir avantaj yoktu. kendisine izah etmiştim. dahili adc gayet yeterliydi. neyse boşverin şahısları eleştimeyelim. zor gelmiştir saygı duyalım. (harici adc kullanmak da kolay değil ya neyse)
Başlık: Ynt: delaysız pic kodu
Gönderen: Epsilon - 03 Mayıs 2024, 17:24:36
Alıntı yapılan: power20 - 03 Mayıs 2024, 17:15:44neyse boşverin şahısları eleştimeyelim. zor gelmiştir saygı duyalım.
Öyle diyorsunuz da gördüğüm kadarıyla forumda bazılarına inceden giydirmekten de vazgeçmiyorsunuz.
Eskiden t2 diye bir arkadaş vardı .Onunda uslübu böyleydi .Yoksa o sizmisiniz?
Malum çok fazla  nick değiştirmişsiniz.Birkaç gün önce konusu geçmişti
Başlık: Ynt: delaysız pic kodu
Gönderen: Tagli - 03 Mayıs 2024, 18:11:07
Genel olarak klasik bekleme döngülerinden kaçınmak gerektiğini ve bunun da en etkili yolunun durum makinesi ve olay tabanlı mimari olduğunu vurgulamak istemiştim. Ancak bu mimariyi geçmişte PIC18'de uygulamaya çalışırken karşılaştığım zorluklara değinince konuyu istemeden çok başka bir yere çekmiş oldum. Özür dilerim.

Orijinal soruya dönecek olursak, aslında @power20 ilk mesajda çözümü anlatmış. Soruyu soran arkadaşın aradığı da bu. Bu yöntemi ben de kendi sistemimde bir system tick oluşturmak için kullanıyorum. Ancak burada dikkat edilmesi gereken birkaç nokta var:

 1) System tick değerini tutmak için 8 bitlik bir değişken yetmeyecek, muhtemelen en az 16, belki de 32 bit bir sayaç kullanmak uygun olacak. Ancak 8 bitlik bir işlemcinin bu sayacı atomik olarak okuması mümkün değil. Bu okumayı doğru bir şekilde yapmanın en kolay yolu, değişkeni okurken kesmeleri geçici olarak kapatmak. Ayrıca değişkenin volatile olarak tanımlanması da gerekecektir.

 2) 8 bit PIC'lerde hatırladığım kadarıyla STM32'lerdeki TIM->ARR register'ına denk bir register çoğu timer'da olmuyor. Bir tek TMR2'de PR register'ı var. Yeni modellerde durum nedir bilmiyorum tabi, epeydir takip etmedim. Bu sebeple eğer TMR2 müsait değilse, örneğin 1 ms'lik bir periyod tanımlamak zorlaşıyor. Bu durumda kesme içinde timer'a bir ön değer yüklemesi yapmak lazım. Ancak bunu yaparken de bu yükleme işleminin kendisinin ne kadar zaman alacağını da hesaplayıp ona göre işlem yapmak gerekiyor, eğer çok hassas bir zamanlama isteniyorsa. Pis bir iş yani. Ancak Microchip'in bununla ilgili uygulama notu vardı diye hatırlıyorum.

Alıntı yapılan: mr.engineer - 02 Mayıs 2024, 22:05:09dsPIC'ler için görüşünüz nedir?
STM32'lerle tanışmadan önce, sene 2013 falan gibi, BLDC motor sürücü yapmak için dsPIC30F2010 kullanmıştım. Özellikle encoder okumak ve ADC - PWM senkronizasyonu için donanım desteği olması benim için tercih sebebi olmuştu. O dönem severek kullanmıştım, ama bugün kullanmam.
Başlık: Ynt: delaysız pic kodu
Gönderen: fahri- - 06 Mayıs 2024, 11:24:31
Yeni piclere çok özellikler eklendi.

8 bit timerlar yetmiyorsa

SMT - Signal Measurement Timer
The Signal Measurement Timer (SMT) is a 24-bit counter with advanced clock and gating logic, which can be
configured for measuring a variety of digital signal parameters such as pulse width, frequency and duty cycle, and the
time difference between edges on two signals.
Features of the SMT include:
• 24-Bit Timer/Counter
• Two 24-Bit Measurement Capture Registers
• One 24-Bit Period Match Register
• Multi-Mode Operation, Including Relative Timing Measurement
• Interrupt-on-Period Match and Acquisition Complete
• Multiple Clock, Signal and Window Sources
Başlık: Ynt: delaysız pic kodu
Gönderen: sigmoid - 06 Mayıs 2024, 23:13:52
Malesef yazıların çoğunu okuma fırsatım olmadı. Kendi yöntemimi söyleyeyim. Resimli anlatamayacağım için üzgünüm. Derleyici olarak XC8 kullanıyorum. Mantığı kurarsanız CCSC içinde gerekli kodu sizde yazabilirsiniz.

öncelikle Timerlardan birini 1ms de bir kesme oluşturacak şekilde ayarlıyorum. bu kesmenin adını tiktak() da koyabilirsiniz. Sonra global unsigned long tipinde bir zaman değişkeni oluşturup. volatile derleyiciye bu değişkeni optimize etmemesini söylüyor. Çünkü değişken değeri kesme içerisinde her an değişebilir. Kesme içinde kullandığım değişkenlere genelde volatile olarak tanımlamayı tercih ediyorum. Basit fakat hayat kurtaran bir özellik.

volatile unsigned long zaman=0;

void tiktak(){
   zaman++;
}

bu yukarıdaki fonksiyon kesme tarafından otomatik 1ms de bir çağırılacak. sonrada zaman değişkeninin değerini okumak için ise millis()
 fonksiyonu oluşturuyorum.

unsigned long millis()
{
   return zaman;
}
Başlık: Ynt: delaysız pic kodu
Gönderen: Tagli - 07 Mayıs 2024, 15:16:38
@sigmoid , yukarıda anlattığım sebepten dolayı volatile yapmak gerekli, ancak yeterli değil.

unsigned long millis()
{
    unsigned long zaman_kopya;
    uint8_t gie_yedek = (INTCONbits.GIE) ? 1 : 0; // Mevcut kesme durumu yedekleniyor
    INTCONbits.GIE = 0; // Kesmeleri kapat
    zaman_kopya = zaman;
    INTCONbits.GIE = (gie_yedek) ? 1 : 0; // Kesme izni eski haline getiriliyor
    return zaman_kopya;
}

şeklinde okunması gerekir. Yoksa okunan değerin bozuk gelme ihtimali var. PIC'te kesmelerin nasıl açılıp kapatılacağını yanlış hatırlıyor olabilirim, veya model ve konfigürasyona göre değişiyor olabilir. Kodu genel fikir vermesi için yazdım.

Bu arada ben olsam unsigned long yerine uint16_t veya uint32_t kullanırdım, daha açık olurdu.

Düzeltme: Kodun kesmeler zaten kapalı iken çağrılması duruma karşı bir kontrol eklendi. Yine de bu şekliyle normal koddan değil de başka bir kesme içinden çağrılırsa ne olur emin değilim. Üzerinde düşünüp araştırmak gerekli.