delaysız pic kodu

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

Mr.Thinking

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.
ego=1/Knowledge

power20

Bunların bazi türleri, PIC içerisindeki ADCyi kullanmak zor geldiği veya beceremediği için hariçten ADC entegresi takar.

Epsilon

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?
 

Mr.Thinking

#18
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
ego=1/Knowledge

power20

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.

Mr.Thinking

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?
ego=1/Knowledge

power20

ö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)

Epsilon

#22
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

Tagli

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.
Gökçe Tağlıoğlu

fahri-

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

sigmoid

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;
}

Tagli

#26
@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.


Gökçe Tağlıoğlu