Arama butonu
Bu konudaki kullanıcılar: 1 misafir
10
Cevap
1193
Tıklama
0
Öne Çıkarma
Tiny85 PWM
L
4 yıl
Binbaşı
Konu Sahibi

Arkadaşlar,
tiny85'de değişken pwm çıkışı nasıl yapılır ?


frekansını ve duty oranını potansiyometre ile nasıl değiştirebilirim ?
Bunun standart kodlarla yapılamayacağını öğrendim,
işlemcinin datasheet dosyasını okuyarak bunu yapabilmem neredeyse imkansız,
arduino uno'da pwm.h kütüphanesi ile, derin kodlara girmeden kolayca yapabiliyorduk
ama bu kütüphane tiny85'de çalışmıyor, var mı yardımcı olabilecek ?
Yada, şu dersleri öğrenirsen yaparsın diyebileceğiniz bir kaynak var mı ?
İnternette araştırınca tccr, tccr, cs, wgm gibi özel kısaltmalarla yazılmış tuhaf kodlar görüyorum, deniyorum çalışmıyor.

Attiny85 Datasheet





< Bu mesaj bu kişi tarafından değiştirildi limbesh -- 25 Mart 2020; 16:9:38 >

S
4 yıl
Binbaşı

E
4 yıl
Yüzbaşı

Diğer işlemleri arduino fonksiyonları ile mi yapıyorsun?
Osilatör dahili mi yoksa kristal mi? Kaç mhz?
AnalogRead() çalışıyor mu?


Bu mesaja 1 cevap geldi.
L
4 yıl
Binbaşı
Konu Sahibi

Dahili, default 8mhz osilatör evet analogRead çalışıyor,
tüm işlemlerimi hep arduino fonksiyonları ile yapıyordum.

Aslında pot kullanmamın sebebi sürecek olduğum trafonun ideal frekansını bulmak,
arduino uno'da bunu buldum aslında, 3khz %32 duty cycle,
işlemci değiştiği için aynı kodlar farklı frekans üretebilir diye tekrar frekans bulacaktım,
pot bağlamadan sürekli yeni kod yazmak suretiyle de ideal frekansı bulabilirim,
tek sorunum pwm frekansını ayarlıyamıyor olmam, duty cyccle standart kodlarla ayarlanıyor analogWrite(1, 32) diye.





< Bu mesaj bu kişi tarafından değiştirildi limbesh -- 25 Mart 2020; 21:11:29 >


Bu mesajda bahsedilenler: @EmuDev @symbolcu , @symbolcü
L
4 yıl
Binbaşı
Konu Sahibi

Saniyede 5000 defa,
digitalWrite HIGH > delayH > girişKontrol > digitalWrite LOW > delayL > girişKontrol
yapsa saçma mı olur ?
bir nevi yazılımsal pwm..





< Bu mesaj bu kişi tarafından değiştirildi limbesh -- 25 Mart 2020; 21:43:46 >

E
4 yıl
Yüzbaşı

Yazılımsal pwm yaparsan başka işlem yapamazsın. Ayrıca hem ayarlaması zor olur hem hassas olmaz.

Şimdi OSC 8 mhz, ihtiyaç duyulan pwm frekansı ~3 khz demişsin. Buna göre bir konfigurasyon hazırladım. Pwm çıkışı PB4 pininden alınacak. Aşağıdaki kodu setup() içine koy.

PLLCSR = 0;
DDRB |= _BV(4);
GTCCR = _BV(PWM1B) | _BV(COM1B1);
TCCR1 = _BV(CS13) | _BV(CS11) | _BV(CS10);

--------------------------------------
Pot ile frekans ayarlamak için analogRead() ile okuduğun değeri 4'e bölüp OCR1C register'ına yazacaksın. Bu değer ne kadar küçükse frekans o kadar yüksek olur. Duty cycle ayarı içinse analogRead() ile okuduğun başka bir pot değerini yine 4'e bölüp OCR1B register'ına yazacaksın. Bu değer OCR1C'den küçük olmalı. Eğer eşit ya da daha büyük olursa duty cycle %100 olur.

Yukarıdaki konfigurasyona göre frekans 30 hz .. 7,8 Khz arasında olacak.


Bu mesaja 1 cevap geldi.
L
4 yıl
Binbaşı
Konu Sahibi

Tekrar teşekkürler hocam, sayenizde çalıştı yine.

Bu şekilde programlamayı öğrenmek kaçınılmaz bir son olacak gibi.
Aynı zamanda kodları inceleyip, datasheet'ten öğrenmeye çalışıyorum da,
*PLLCSR adrsinin 0, 1 olmasına göre, TIMER1 senkron yada asenkron olarak çalışıyormuş
*DDRB adresi çıkış yönlendirmesi yani interrupt'ın PB4 pinine yönlendirilmesi galiba
*GTCCR genel TIMER kontrol adresiymiş, PWM1B biti OCR1B'ye göre şekil alıp OCR1C'ye göre de sıfırlanıyormuş,
COM1B1 biti de PB4 piniyle ilgili birşeyler yapıyor.
*TCCR1 adresindeki CS13, CS12, CS11 ve CS10 isimli bitleri de işlemci saykıllarını bölmeye yarıyormuş,
(siz 64'e böldünüz, ben de hepsini 1 yaparak 1024'e böldüm ve çalıştığını, sisteme bağlamadan gözle görebildim)

Bir miktar öğrendim ama bu öğrenme tarzı ezberci öğrenim gibi oldu, hiçbirşey net değil.
Derslerde, "yeni başlayan birine teknik kelime sunulmaması" hassasiyetine uyulmadan bodoslama anlatım yapılıyor genelde.
Sizce daha net öğrenmek için için ne yapmalıyım ? Önerebileceğiniz bir site veya yotube dersleri olur mu ?

Bir de siz (1 << CS13) yazmak yerine _BV(CS13) yazdınız,
yeni öğrenen biri açısından bu çeşitlilik çok kafa karıştırıcı oluyor,
bu şekilde farklı yazım çeşitleri çok var mı ?




Bu mesajda bahsedilenler: @EmuDev
E
4 yıl
Yüzbaşı

Ben zaten 1024'e bölmüştüm. Hepsini 1 yaparsan 16384'e böler.

O koddaki sözcüklerin hiçbiri C diline ait değil, hepsi mikrodenetleyiciye özel sembolik isimler. Amaçları kodu daha anlaşılabilir hale getirmekten ibaret. C dilindeki "macro" özelliği ile karmaşık ifadeleri daha akılda kalıcı ifadelerle değiştirmek mümkün oluyor.
https://nongnu.org/avr-libc/user-manual/group__avr__sfr.html

Şu linkte birkaç tanımlanmış macroya bakabilirsin. Gördüğün gibi _BV(bit) macrosu derlenmeden önce (1 << (bit)) şeklinde açılıyor. Bu hem okunabilirliği arttırır hem de bazı hataları önler.

TCCR1 = _BV(CS13) | _BV(CS11) | _BV(CS10); ifadesini
TCCR1 = 11;
şeklinde yazarak ta geçebilirdik. Ama koda 3 gün sonra bakınca ne anlama geldiğini hatırlayamazdık.

Öğrenme konusunda şunu söyleyeyim. Burada 2 ana başlık var. Birisi C prog. dili, diğeri mikrodenetleyici. Öncelikle bilgisayarda C çalışmanı tavsiye ederim. Öğrendiklerinin %99'u mikrodenetleyicilerde de geçerli olacak.


Bu mesaja 1 cevap geldi.
L
4 yıl
Binbaşı
Konu Sahibi

Teşekkürler, sağolun. Ben bunu öğreneceğim, m.denetleyicin çok rahat yapabileceği şeyleri bile programlayamamak hiç hoş olmuyor benim açımdan.




Bu mesajda bahsedilenler: @EmuDev
E
4 yıl
Yüzbaşı

https://murtuzayevsahil.files.wordpress.com/2013/03/c_kitap.pdf

Bunu öneririm. Yazarı konusunda uzmandır ve C programcıları derneğinde eğitimcidir.



< Bu ileti mobil sürüm kullanılarak atıldı >
Bu mesaja 1 cevap geldi.
L
4 yıl
Binbaşı
Konu Sahibi

İndirdim okuyacağım hocam sağol.




Bu mesajda bahsedilenler: @EmuDev
DH Mobil uygulaması ile devam edin. Mobil tarayıcınız ile mümkün olanların yanı sıra, birçok yeni ve faydalı özelliğe erişin. Gizle ve güncelleme çıkana kadar tekrar gösterme.