İçindekiler:

Kütüphanesiz veya Seri Fonksiyonlu (Kesintili) Arduino Ton Üreteci: 10 Adım
Kütüphanesiz veya Seri Fonksiyonlu (Kesintili) Arduino Ton Üreteci: 10 Adım

Video: Kütüphanesiz veya Seri Fonksiyonlu (Kesintili) Arduino Ton Üreteci: 10 Adım

Video: Kütüphanesiz veya Seri Fonksiyonlu (Kesintili) Arduino Ton Üreteci: 10 Adım
Video: Her Şeyden Bir Şey Yapanlar, Maker 101 2024, Kasım
Anonim
Kütüphanesiz veya Seri Fonksiyonlu Arduino Ton Üreteci (Kesintili)
Kütüphanesiz veya Seri Fonksiyonlu Arduino Ton Üreteci (Kesintili)

Bu normalde ders verebileceğim bir şey değil, metal işimi tercih ederim, ancak elektrik mühendisliği öğrencisi olduğum ve mikrodenetleyiciler (Gömülü Sistemler Tasarımı) üzerine bir ders almam gerektiği için bir ders verebilirim diye düşündüm. projelerimden biri. Projeyi ve diğerlerini bu sınıf için ilk yaptığımda, arduino kütüphane işlevlerini veya seri işlevleri kullanmayan çok az öğretici olduğunu veya hiç öğretici olmadığını gördüm, bu da bunun iyi bir öğretilebilir olacağını düşünmemin başka bir nedeni.

Bu kod Atmega 2560 mikrodenetleyici için tasarlanmıştır, bu nedenle başka bir kartta uygulamak istiyorsanız, denetleyicinizin kullanım kılavuzuna göre koddaki adres kayıtlarını değiştirmeniz gerekir. Kodun arkasındaki temel fikir, klavyede seri monitöre bir tuş girdiğinizde, arduino mega'nın "q" sıfırlayarak hangi tuşa bastığınıza bağlı olarak belirli bir frekans çıkışı vermesidir. "a"nın A düz frekansını ve "A"nın A keskin frekansını, "b" B düzünü, "c"yi C düzünü, "C"yi C keskinini vb. verecek şekilde yaptım. Sonunda tam kod yüklenir, ancak her adım kodu parçalara ayırır, böylece açıklama daha kolay olur.

Adım 1: Kayıt Adreslerini Tanımlama

Kayıt Adreslerinin Tanımlanması
Kayıt Adreslerinin Tanımlanması

Bu adım kolaydır, eğer atmega 2560 kullanıyorsanız, benim kullandığım adresleri kullanmanız yeterlidir, ancak farklı bir çipe sahip bir kart kullanıyorsanız, bu kayıtların her birinin adreslerini bulmanız gerekecektir. cips kullanım kılavuzu. En üstteki tanımlar sadece daha sonra fonksiyonlarımız için kullanılacak sabitlerdir. Adresleri volatile unsigned olarak belirtiyoruz çünkü derleyicinin bunlarla uğraşmasını istemiyoruz.

Adım 2: Diziler ve Global Değişkenler

Diziler ve Global Değişkenler
Diziler ve Global Değişkenler
Diziler ve Global Değişkenler
Diziler ve Global Değişkenler
Diziler ve Global Değişkenler
Diziler ve Global Değişkenler

Burada, her tuşun vermesi gereken tüm frekansları içerecek olan Frekans dizisini tanımlamak istiyoruz. Bu değerler gerçek nota frekanslarından hesaplanıyor ve dürüst olmak gerekirse onları nasıl aldığımı unuttum ama emin olmak için bir osiloskopta test ettiğim için doğru değerler bunlar. Ayrıca her ton için basılacak tüm tuşları içeren nota dizisini ve sonraki fonksiyonlarımız için ihtiyaç duyacağımız değişkenleri tanımlıyoruz.

Adım 3: "serial.begin" İşlevi

NS
NS

"serial.begin" işlevini U0init() kopyalayan özel işlevimizi çağıracağız. Girdi olarak istenilen baud hızını alır ve o baud hızında seri portu başlatır.

Adım 4: "serial.available" İşlevi

NS
NS

"serial.available" U0kbhit()'i taklit eden işlevi çağıracağız. Girdi almaz, bunun yerine RDA durum bitini kullanarak klavyede bir değişiklik yapılıp yapılmadığını algılar ve bir değişiklik algılandığında true değerini döndürür.

Adım 5: "serial.read" İşlevi

NS
NS

UDR0 yazmacında saklanan klavyede yapılan herhangi bir değişiklik ne olursa olsun giriş ve çıkış almayan "serial.read" işlevini U0getchar() taklit eden işlevi çağıracağız.

Adım 6: "seri.write" İşlevi

NS
NS

Bir değişiklik algılanıp depolanırken UDR0 kaydından veri alan ve seri monitöre geri dönen çıktıları alan "serial.write" U0putchar()'ı taklit eden işlevi çağıracağız.

7. Adım: Kurulum İşlevi

Kurulum İşlevi
Kurulum İşlevi

Bu, seri portu başlatmak için bizim "serial.begin" taklidimizi kullanacak ve zamanlayıcı kayıtları için bit ayarlarımızı başlatacak ve tonlarımızı çıkarmak için PB6'yı ayarlayacak temel kurulum işlevidir.

Adım 8: Döngü ve ISR İşlevleri

Döngü ve ISR İşlevleri
Döngü ve ISR İşlevleri

Döngü şu şekilde çalışır: "seri. kullanılabilir" işlevimizle bir değişiklik algılanırsa, "seri.oku" işlevimiz bu değişikliği saklar ve "seri.yazma" işlevimiz bu değişikliği seri monitöre koyar. Bir değişken i, frekans dizisinin boyutundan küçük olduğu sürece, çıkışı o dizideki i'nin konumu olacak şekilde ayarlayacak ve bu konumdaki frekansı çıkaracaktır. ISR, sıfırlama işlevi görür, burada frekans dizisi konumu 0'a eşit değilse (başka bir deyişle "q" tuşuna basılmazsa), frekansı verir, ancak "q" tuşuna basıldığında sıfırlanır. Lütfen dikkat: bu kod kesintileri kullanır, ancak kesintiler devre dışı bırakılarak yapılabilir. Herhangi bir istek alırsam, kodu kesinti olmadan yayınlayacağım, sadece kesme sürümünün daha eğlenceli olduğunu düşünüyorum.

Adım 9: Kablolama

kablolama
kablolama

Bu kodun kablolaması son derece kolaydır, sadece PB6'dan bir devre tahtasına bir çıkış kablosu koyun, bununla seri olarak bir buzzer veya hoparlör bağlayın ve tekrar toprağa bağlayın. Not: Hoparlör kullanıyorsanız, hoparlörün önüne küçük bir direnç koyun. Sadece çıkışı görmek istiyor ama duymuyorsanız, PB6'yı bir osiloskopun kırmızı ucuna ve siyah ucu da toprağa bağlayın.

Adım 10: Hepsini Bir Araya Getirmek

Kodun tamamını önceki adımlarda anlattığım için bu adıma ekledim. Sadece farklı frekanslar için bir klavye girişi alır ve bu frekansı PB6'ya verir. IDE ile kodlamanın farklı bir yolunu okumaktan keyif aldığınızı umuyoruz!

Ayrıca lütfen Mikrodenetleyici yarışmasında buna oy verin:D

Önerilen: