Ynt: STM'ye ilk adımlar

Başlatan veliusta, 26 Ocak 2016, 21:10:29

X-Fi

#15
Alıntı yapılan: veliusta - 26 Ocak 2016, 22:46:43
O zaman en iyisi öğrenmemek. Nasılsa para kazanamıyorum.

A. Einstein demişki "Coşku, zekadan daha önemlidir." Bu işlere kafa yorabiliyorsanız yeterince zekisiniz demektir ama görüyorum ki coşku eksik kalmış.

Ben dahil çoğu insan bir dönem pic kullandı sonra arm tarafına geçti ve o yıllarda bende para kazanamadım şimdiyse gömülü yazılım işinden maaş alıyorum.

Ben bu durumu işlemci tercih seçim meselesi olarak görmüyorum. Gömülü yazılım kritiklerini öğrenmenin kolay bir yolu yok. Hiçbir üniversitede bunun eğitimi verilmez. Bana herşeyi öğrettiler gömülü yazılım uzmanıyım diyen varsa tartışmaya açığım. Öğrenmek isteyen kişi deneme yanılma ile belli bir seviyeye gelmek zorunda. Ondan sonra bu konuda eğitici döküman okuyup üzerine proje yapmalı bir süre sonra uzman olunuyor. Tabi bu sürede teknoloji değişiyor gelişiyor. Takip etmiyor yeni şeyler öğrenmiyorsanız 5 sene sonra yine sıfır sayılırsınız.

Şunuda söylemek lazım kendi öngörümüz ile yazdığınız yazılımlar hiçbir ticari önem taşımıyor. Örneğin siz usart modülünü en ince ayrıntısına kadar öğrenmiş olabilirsiniz ama ring buffer metodunu bilmeden kullanırsanız yaptığınız yazılım standartlar çerçevesinde düzgün çalışmaz. Sabahlara kadar sayfalar dolusu kod yazıp para kazanırsınız belki ama uzman birisi sizden kaynak kodunuzu isteyip incelediğinde hakkınızda iyi şeyler söylemez.

Özünde acizane tavsiyem coşkulu ve meraklı olun.

iyi çalışmalar.


http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

Karamel

#16
Hocam siz soyleyince ring buffer i arastirdim. Cok mantikli bir cozummus gercekten. Tesekkur ederim ::) Bunu dma unit ile beraber kullanmak dahada mantikli bir hareket olsa gerek?  ???

mesaj birleştirme:: 27 Ocak 2016, 10:04:08

Birde hocam anladigim kadari ile. Ring basa doner ve ring size kadar okuma yapmazsak. Overwrite oluyor. Read point. Write point i surekli takip ediyor. Bu isin inceligi tam olarak nedir? Ring size i genis tutmak cozum olabilirmi?

PROTECH_

arduino  ide de stm32 programlamanın tek avantajı  atmega serisine göre daha iyi bir hıza; 72mhz ulaşmak + 12bit adc çözünürlüğü elde etmek olur.
DİKKAT EDİLİRSE ATMEGA ile kıyaslıyorum. Çünkü DMA, NVIC, Timer'in gelişmiş özelliklerini kullanmadıktan sonra sadece atmega64 ün daha hızlı versionu olur.   :D
Multi-Core ,RTX,ThreadX, FreeRTOS, MODBUS  RTOS - Electronic-Hardware -- BERLIN

skara1214

CUBEMX kullan sana önerim hiç zorlanmadan istediğini yaparsın
Herkes ölür ama herkes gerçekten yaşamaz

MrDarK

Alıntı yapılan: Karamel - 27 Ocak 2016, 10:01:18
Birde hocam anladigim kadari ile. Ring basa doner ve ring size kadar okuma yapmazsak. Overwrite oluyor. Read point. Write point i surekli takip ediyor. Bu isin inceligi tam olarak nedir? Ring size i genis tutmak cozum olabilirmi?

Yapını overwrite olmayacak şekilde düşünerek kurman lazım. Örneğin her ne şart olursa olsun ben bu datayı 100ms içinde okur Read ve Write Index'leri eşitlerim şeklinde düşünerek array size'ı belirleyebilirsin. Yoksa o arraysize'ın ucu bucağı olmaz. Çok büyük bir data transfer edilecek ve yeterli ram alanın yok ise;

Harici flash kullanır buffer'ını örneğin 500byte açar, her 100 byte'da bir flash içine kayıtlayacak şekilde kurgularsın. 100byte kayıtlanırkenki geçen sürede 500 byte gelmez ise taşma yaşamazsın. Bunun gibi örnekleri kafanda çoğaltabilirsin.
Picproje Eğitim Gönüllüleri ~ MrDarK

Karamel

hocam. benim ring ten anladigim su. (yanlista anlamis olabilirim)

write yaziyor. 1.2.3.4.5.6.7.8.9.....
read okuyor. 1.2.3

write yazmaya devam ediyor. 11.12.13.14...
read okuyor. 4.5.6.7.8.9.10.11.12.13.14

read write i asamiyor. maximum en yeni byte a kadar ulasabilir. ring size i sonunda write basa doner. read ta ring size sonunda basa doner. halka bir tur atar read in uzerinden gecerse overwrite olur. sizinde dediginiz gibi bunu reading time ile ayarlamak mumkun. mesela kabaca hesap yapalim.

9600 baud rate te 1 byte yaklasik 1mili sec. da geliyor. 100mili sec. da okuyorsak. 100 byte tan biraz fazla memory allocate(Turkcede buna ne diyorlar bilmiyorum) yapmak mantikli. ama ya okuyamazsak? mesela ring overwrite oldugunda baska bir interrupt ile bunu tetikleyip.(bu nasil olacaksa?) ringi bosaltsak?

cunku bu kisim hataya acik gibi duruyor. olurda 100 mili sec. dan daha fazla sure okumazsak. sistemin hata yapmasina sebebiyet verebiliriz?  :-\ hata olmasin diyede 10 kat fazla memory allocate edemeyiz?  :-\

Gökhan BEKEN

#21
Interrupt rutinine if koy, eğer veriyi zamanında okumadıysan overwrite olmaması için ya hiç eklemesin, ya da ekli olanları kaydırsın vs.
DMA'da zaten circular seçili olduğu zaman işi bitince başa dönüyor, okumadıysan çöp oluyor. "Okusaydın kardeşim" diyor.
Bu tip durumlarda okuma fırsatı için half interrupt kullanılır.
Mesela 1000byte lık bir diziyi doldurmak üzere DMA'yı görevlendirdin. 500 olunca sana bir kesme veriyor, "ben yarısını doldurdum, diğer yarısını doldurana kadar al bu verileri ne yapıyorsan yap" diyor. Sonra 1000. byte'ı aldıktan sonra bir kesme daha geliyor "ben ikinci kısmı doldurdum, yeni parti mal gelene kadar 500-1000 arası verileri ne yapıyorsan yap" diyor.
Özel mesaj okumuyorum, lütfen göndermeyin.

X-Fi

@MrDarK ve @Gökhan BEKEN Ring Buffer mekanizmasını yanlış kullanıyorsunuz demekki yanlış anlamışsınız.

STM32 örneklerinden USB virtual com port uygulamasındaki rollback mekanizmasını incelemenizi öneririm. 2k ram ile DMA kullanmaya gerek kalmadan nasıl ring buffer yapıldığını anlayabilirsiniz.

iyi çalışmalar.
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

Gökhan BEKEN

Hocam Ring Buffer terimini bilmiyorum, karamel'in en son sorduğu soruya bakarak yazmıştım.
VCP'nin alt fonksiyonlarını biraz kurcalamıştım ama bana biraz karışık gelmişti, tabiki dma da kullanıyordu.

Sistem ne olursa olsun, gerekli okuma yapılmazsa illaki bir veri kaybı olacaktır, ya yeni verileri almayacak ya eskiler silinecek, bunun aksi bence mümkün değil.
Bu konuda bilgim dışında bir ayrıntı varsa öğrenmek isterim.
Özel mesaj okumuyorum, lütfen göndermeyin.

CoşkuN

Ring buffer'ı bir musluktan akan suyu geçici olarak doldurduğumuz kova olarak düşünebilirsiniz:
Bir musluk var ,sürekli su akıyor. Sizin de bir bardağınız var. Musluktan su alıp başka bir yere aktarıyorsunuz. Siz musluktan bardağı çekip diğer tarafa götürene kadar su yere akacaktır. Bunun için bir kova koyup bardağı çektiğinizde geçici olarak kovaya dolmasını sağlıyorsunuz. Kovanın da sizin bardağı diğer tarafa götürüp gelinceye kadar akacak suyu alacak büyüklükte olması lazım. Yani ya kovanız iyice büyük olacak ya da daha hızlı gidip geleceksiniz.
Şurada biraz animasyonla anlatmışlar, örnek kodlar da var:
http://hackaday.com/2015/10/29/embed-with-elliot-going-round-with-circular-buffers/

X-Fi

Gökhan hocam ilk mesajına istinaden yazıyorum Ring Buffer da temizleme ya da kaydırma diye bişey olmaz okuma ve yazma pointerları sürekli artar birbirine eşitlenirse buffer olduğu halde bekler.

Veri parça parça değil bir bir bütün halinde buffer sonundan devrederek saklanır. Okuma işlemi ise FİFO mantığında yapılır yani ilk giren ilk okunur.

iyi çalışmalar.
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

veliusta



İlk STM8 denemem ve Çalıştı.
IAR Kullandım iyi midir?

z

STM8'de clock ayarlamaları falan gerekmiyormu?


-------------------------------

Ring buffer:

Halka şeklindeki pistte tavşan kaçar, tazı da tavşanı tutmaya çalışır.

Tazı tavşanı yakalarsa yada tavşan tazının önüne geçerse tazı tavşanı yer. O yüzden tavşan her zaman tazının önünde ama aslında arkasında olması lazım.

Tazıdan %50 mesafede olması güzel olur.

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

veliusta


X-Fi

STM serisi mikrodenetleyiciler clock ayarı yapmazsanız default ayarlarıyla başlar. STM8 ler içerisinde 16 Mhz HSI RC osilatör bulunuyor clock divider default olarak HSI/8 ayarlıdır yani değiştirmedikçe 2 Mhz HSI ile koşacak demektir.
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)