ATtiny düşük güç modu özellikleri, projelerinizin pil ömrünü ciddi şekilde uzatır ve geri dönüşü zor ya da sürekli erişimi güç senaryolarda hayat kurtarır. ATtiny projelerinde güç tüketimini neredeyse yarı yarıya azaltabileceğinizi söylesek, ATtiny’e olan ilginiz artar mı?
ATtiny uygulamaları, genelde diğer mikroişlemciler ve geliştirme kartları ile yapılan uygulamalardan epey farklı olur. Bu farkın başlıca sebebi, ATtiny mikroişlemcilerinin küçük yapıda olmalarına rağmen oldukça yetenekli olmalarıdır.
Bu içerikte, ATtiny85 ve ATtiny402 mikroişlemcileri kullanılarak işlemler yapılacaktır. Fakat elinizde aşağıdaki listede olan bir ATtiny mikroişlemcisi varsa, doğrudan belirtilen kısımda olan işlemleri aynı şekilde yapabilirsiniz.
ATtiny85 için olan bölüm: ATtiny25, ATtiny25V, ATtiny45, ATtiny45V, ATtiny85, ATtiny85V uyumludur.
ATtiny402 için olan bölüm: ATtiny202 uyumludur.
ATtiny85 Düşük Güç Modu Uygulaması
Öncelikle, kullanacağımız ATtiny85 mikroişlemcisine gerekli testleri yapabilmek ve program kodunu yüklemek için bir programlayıcıya ihtiyacımız var. Bu konuda istediğiniz yolu izleyebilirsiniz; öneri olarak USB-AVR ya da doğrudan ATtiny85 geliştirme kartlarında bulunan programlayıcı kısmını kullanabilirsiniz.
Ayrıca daha önceki ATtiny85 içeriğimizde Arduino IDE desteğini ve nasıl program yüklendiğini anlattık; buradan detaylara bakabilirsiniz.
Mikro USB ve Type-C girişli ATtiny geliştirme kartları doğrudan programlamayı destekler; bu yüzden herhangi bir harici programlayıcıya ihtiyaç duymazsınız.
Bu program kodu yani senaryo için ATtiny85 oldukça yeterli bir mikroişlemcidir, 8 pinli olan bu mikroişlemci, 5 I/O pini sayesinde bir çok uygulamanın altından kalkabilir.
Program kodunu basit olması için şöyle yapalım; 15 dakikalık bir sayaç oluşturalım ve sayaç çalışırken her 2 saniyede LED’i yakalım ve 15 dakikalık süre bitince alarmı çalalım. Ayrıca reset sinyali geldiği zaman programı başa alıp tekrar başlatalım.
Devre Şeması

Kurulu Devre Görüntüsü

Kodda aksi belirtilmediği sürece, ATtiny85 varsayılan olarak 1 MHz saat hızını kullanır. Ayrıca isterseniz 8 MHz dahili saati de seçebilirsiniz. Bu seçimi doğrudan Arduino IDE üzerinden yapabilirsiniz. Ancak 8 MHz saati kullanmak için şu adımları uygulamanız gerekir: Kart ayarlarından 8 MHz saat hızını seçip, Araçlar menüsünden “Önyükleyici Yazdır (Burn Bootloader)” seçeneğine basmanız gerekir. Bu işlem gerçekte bir önyükleyici yazmaz; yalnızca fuse ayarlarını 8 MHz için günceller.
Düşük Güç Modu(Uyku Modu)
ATtiny85, düşük güç uyku modunu destekler, bu uyku zamanında, saat durur, ADC ve I/O kısmına harcanan akım sınırlanır ve güç tasarrufu sağlanmış olur.
Mikroişlemciyi uyku modundan uyandırmanın dört yolu vardır:
- Reset pini (0) kesmesi(interrupt) ile.
- Pin değişim kesmesi(interrupt) ile.
- Watchdog Timer(Güvenlik Zamanlayıcı) kesmesi(interrupt) ile.
- Universal Serial Interface (USI) ile başlatma komutu vererek.
Bu uygulamada uyandırmayı reset sinyali ile yapacağız; bunu bir anlamda pin 0 kesmesi gibi düşünebilirsiniz. Üstteki dört farklı yöntemi diğer uygulamalarda da kullanıp ayrıca ele alacağız.
Kullanmak istediğimiz uyku modunu bu şekilde tanımlıyoruz:
Uyku modunu aktifleştirmek için bu komutları kullanıyoruz:
Uyku Modunu Optimize Etmek
Eğer yaptığınız projede bazı fonksiyonlar ve özellikler kullanılmıyorsa, bu kısımları uyku modunda ya da programın ilgili bölümünde tamamen kapatabilirsiniz. ATtiny85’in veri sayfasına (datasheet) göre aşağıdaki özellikleri kapatabilirsiniz:
- Analog to Digital Converter (ADC) = Analog Dijital Dönüştürücü
- Analog Comparator = Analog Karşılaştırıcı
- Brown-out Detector
- Watchdog Timer = Güvenlik Zamanlayıcısı
- Pin Outputs = Pin Çıkışları
- Analog Input Buffer = Analog Giriş Tamponu
Yukarıdaki özelliklerden varsayılan olarak yalnızca ADC aktiftir. Bu özellik tek başına uyku modunda yaklaşık 320µA tüketebilir ve bu değer, siz herhangi bir ADC özelliği ya da kodu kullanmasanız bile görülebilir.
Aşağıdaki kod ile ADC özelliğini kolayca devre dışı bırakabilirsiniz. Bu kodu setup() bölümünde kullanmalısınız.
adc_disable();
Analog Comparator, Brown-out Detector ve Watchdog Timer ve Analog Input Buffer varsayılan olarak etkinleştirilmemiştir, dolayısıyla bunları devre dışı bırakmanın bir avantajı yoktur.
Giriş ve çıkış pinlerini (I/O) uyku fonksiyonundan önce doğru tanımlamanız, programın ve projenin kararlılığı için önemli bir adım olabilir. Bu kısmı tüm senaryolarda testleyebileceğimiz bir ortam oluşturamadık; ancak bu yaklaşım pratikte daha güvenli bir tercih sunar.
Sonuçlar
3V Saat pili ile yapılan testlerde uyku esnasında anlık olarak 0.2µA güç tüketimi gerçekleşti.

Bu pilin (CR2032) yaklaşık kapasitesini 200 mAh olarak kabul edersek, hesaplamalar teorik olarak neredeyse 40 yıllık bir pil ömrüne işaret eder.
3V ve 5V voltajlarda, 1 Mhz ve 8 Mhz saat hızlarında ölçülen değerler:
| 5V | 3V | |||
| 1 Mhz | 8 Mhz | 1 Mhz | 8 Mhz | |
| Çalışma Esnasında | 2.5 mA | 8 mA | 0.7 mA | 3.6 mA |
| Uyku Modunda | 0.5 µA | 0.5 µA | 0.2 µA | 0.2 µA |
Program Kodu
/* ATtiny85 Düşük Güç Uygulaması */ #include <avr/sleep.h> // Utility macro #define adc_disable() (ADCSRA &= ~(1<<ADEN)) // ADC kapatma // constants const int buzzer = 1; // buzzer pini const int LED = 0; // led pini const unsigned long Alarm = 900000; // alarm süresi - 15 dakika unsigned long BaslamaZamani = 0; // başlama zamanı void setup () { pinMode(LED, OUTPUT); pinMode(buzzer, OUTPUT); pinMode(2, INPUT_PULLUP); pinMode(3, INPUT_PULLUP); pinMode(4, INPUT_PULLUP); adc_disable(); // ADC uses ~320uA set_sleep_mode(SLEEP_MODE_PWR_DOWN); } void uykuModu (void) { sleep_enable(); sleep_cpu(); } void bipSesi (void) { for (int i=0; i < 500; i++) { digitalWrite(buzzer, HIGH); delay(1); digitalWrite(buzzer, LOW); delay(1); } } void LedYakma (int wait) { digitalWrite(LED, HIGH); delay(wait); digitalWrite(LED, LOW); } // Ana Döngü ---------------------------------------------- void loop () { // uzun led LedYakma(125); delay(125); LedYakma(125); do { // led yakma kısmı LedYakma(1); delay(2000); } while (millis() - BaslamaZamani < Alarm); // Alarm sesi bipSesi(); uykuModu(); // Sıfırlamadan sonra devam }
ATtiny402 Düşük Güç Uygulaması
ATtiny402, ATmel’in geliştirdiği ATtiny serisi mikroişlemcilerin yeni bir üyesi olduğunu belirtebiliriz. ATtiny ve ATmega mikroişlemci serisinde yapılan büyük güncelleme ile, adlandırılma ve özellikler oldukça değişti.
Bu değişim ve güncellemeye buradaki yazımızdan erişebilirsiniz.
ATtiny402, yeni isimlendirmeye göre 0-serisi olarak geçmekte, bu mikroişlemciyi özellikle tercih etme sebebimiz sıklıkla kullandığımız ATtiny85’e oldukça benzemesidir.
ATtiny85 ile yaptığımız projenin aynısını bu mikroişlemci içinde uygulayacağız, yani:
15 dakikalık bir sayaç oluşturalım ve sayaç çalışırken her 2 saniyede LED’i yakalım ve 15 dakikalık süre bitince alarmı çalalım. Ayrıca reset sinyali geldiği zaman programı başa alıp tekrar başlatalım.
Devre Şeması

Kurulu Devre Görüntüsü

ATtiny402 sadece SOIC kılıfında mevcut, bu yüzden DIP olarak kullanmak için bu şekilde lehimlemek gerekiyor.
Düşük Güç Modu(Uyku Modu)
Tıpkı ATtiny85’te olduğu gibi bu mikroişlemcide 3 farklı uyku modunu destekler; boşta(idle), bekleme(standby) ve güç kapalı(power-down). Güç kapalı uyku modu en düşük güç tüketimini sağlar; bu, işlemciyi ve RTC’nin watchdog zamanlayıcısı (WDT) ve Periyodik Aralık Zamanlayıcısı (PIT) kısmı dışındaki tüm çevre birimlerini kapatır.
İşlemciyi uyku modundan uyandırmanın üç yolu vardır:
- SENSE pini kesmesi(interrupt) ile.
- TWI adres eşleşmesi ile.
- Periodic Interval Timer(PIT) (Periyodik Aralık Zamanlayıcısında) bir zaman aşımı oluşturarak.
ATtiny85 bölümünde reset pini ile güç modundan uyandırma işlemi yapmıştık fakat yeni ATtiny mikroişlemcilerinde reset pini bulunmuyor bu yüzden pin-sense kesmesi kullanarak bu işlemi yapacağız.
Kullanmak istediğimiz uyku modunu bu şekilde tanımlıyoruz:
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_enable();
Uyku modunu aktifleştirmek için bu komutları kullanıyoruz:
sleep_cpu();
Pin-Sense Interrupt(Kesmesi)
Yeni AVR mikroişlemcileri her pinde dört tür kesmeyi destekler: Her iki kenarı algıla (BOTHEDGES), yükselen kenarları algıla (RISING), düşen kenarları algıla (FALLING) ve düşük seviyeyi algıla (LEVEL).
Ancak, bu kullanımda doğrudan bir komplikasyon olabiliyor. Asenkron pinler olarak adlandırılan bazı pinler, bu dört giriş türünden herhangi biriyle işlemciyi uyku modundan çıkarabilir; ATtiny402’de bu asenkron pinler PA2 ve PA6’dır.
Diğer pinler sadece BOTHEDGES ve LEVEL kesmelerinde işlemciyi uykudan uyandırabilir. Basit olması için, belirli bir pin seçme ihtiyacını ortadan kaldıran bir LEVEL kesmesini PA3 pini üzerinde kullandık. Her I/O pininde, giriş çekme ve kesme algılama tipini yapılandırmak için ayrı bir pin kontrol portu bulunur. PA3 için pin kontrol portu PORTA.PIN3CTR‘dir ve PA3’te bir pullup ve bir LEVEL kesme algısı yapılandırma ifadesi şudur:
PORTA.PIN3CTRL = PORT_PULLUPEN_bm | PORT_ISC_LEVEL_gc;
Farklı bir sense türü istiyorsanız, LEVEL kelimesini BOTHEDGES, RISING veya FALLING ile uygun şekilde değiştirebilirsiniz.
Ayrıca bir kesme hizmeti rutini sağlamamız gerekiyor, ancak kesmeyi yalnızca işlemciyi uyku modundan çıkarmak için kullandığımız için bunun PA3 kesme bayrağını temizlemekten başka bir şey yapmasına gerek yok:
ISR(PORTA_PORT_vect) {
PORTA.INTFLAGS = PORT_INT3_bm;
}
Doğruluk
Zamanlayıcı süresi, milisaniye cinsinden şu ifadeyle belirtilir:
const unsigned long Alarm = 900000;
Bu zamanlayıcı, zamanlaması için işlemci saatini kullanır, bu nedenle doğruluk, dahili sistem saatinin doğruluğuna bağlıdır.
Bu projenin orijinal versiyonunda kullanılan ATtiny85’te, dahili RC osilatörünün fabrika kalibrasyonu ±%10 olarak derecelendirilmiştir. OSCCAL kaydını kullanarak özel bir kalibrasyon yaparak bunu ±%1’e kadar yükseltebilirsiniz veya harici bir kristal bağlayabilirsiniz.
ATtiny402’deki dahili RC osilatörünün fabrika kalibrasyonu çok daha doğrudur, ±%2. Ancak, harici bir kristal bağlama seçeneğiniz yoktur.
Uyku Modunu Optimize Etmek
Uyku modundayken güç tüketimini en aza indirmek için I/O hatlarını boş girişler olarak bırakmamak önemlidir; aksi takdirde salınım(osilasyon) yaparak güç tüketebilirler. setup() ‘da üzerlerinde giriş pullup’larını etkinleştirerek bundan kaçınabiliriz :
pinMode(Kullanılmayan2, INPUT_PULLUP);
pinMode(Kullanılmayan3, INPUT_PULLUP);
pinMode(Kullanılmayan5, INPUT_PULLUP);
Alternatif olarak bunları çıktı olarak tanımlayabilirsiniz.
ATtiny85’te ADC’yi devre dışı bırakmak önemliydi, aksi takdirde bu uykuda önemli ölçüde güç çekerdi. Yeni ATtiny’lerde ADC otomatik olarak devre dışı bırakıldığından bu işlem burada gerekli değildir.
İşlemci saat hızı, işlemci çalışırken güç tüketimini etkilese de, işlemci daha sonra durdurulduğundan uyku akımıyla ilgisi yoktur.
Sonuçlar
3V Saat pili ile yapılan testlerde uyku esnasında anlık olarak 0.1 µA güç tüketimi gerçekleşti.

Bu pilin (CR2032) yaklaşık kapasitesini 200 mAh kabul edersek, teorik hesapta neredeyse 200 yıllık bir pil ömrü görünür.
| 5V | 3V | |
| ATtiny402 | 0.11µA | 0.10µA |
| ATtiny85 | 0.47µA | 0.17µA |
Sonuç olarak, ATtiny402’nin uykuda, özellikle 5V besleme voltajında, eski ATtiny85’ten önemli ölçüde daha düşük akım kullanmasıdır.
Pratik Değerlendirme ve Gerçekçi Pil Ömrü
Buradaki pil ömrü hesapları, yalnızca ideal laboratuvar koşullarında ölçülen ortalama akım değerlerine dayanan teorik sonuçlardır. Gerçek kullanımda pilin kendi kendine deşarjı, sıcaklık değişimi, LED/buzzer gibi yüklerin anlık akım çekişi ve devrenin beklenmeyen uyandırmaları toplam süreyi düşürebilir.
- Pil ömrünü öngörürken yalnızca uyku akımını değil, aktif çalışma döngüsünü de hesaplayın.
- Güç bütçesi çıkarırken pil datasheet’indeki sıcaklık ve deşarj eğrilerini dikkate alın.
- Uzun süreli saha uygulamalarında en az %30–%50 güvenlik payı bırakın.
Detaylı düşük güç tasarımı için Microchip AVR uygulama notları ve ilgili cihazın resmi datasheet dokümanı birlikte incelenmelidir.
ATtiny402 Programı Derlemek
ATtiny402 programını SpenceKonde isimli GitHub kullanıcısının oluşturduğu megaTiny Core’unu kullanarak derleyebilirsiniz. Board menüsünde megaTinyCore başlığı altında bulunan ATtiny412/402/212/202 seçeneğini seçin. Sonraki seçeneklerin aşağıdaki gibi ayarlanıp ayarlanmadığını kontrol edin (diğer seçenekleri göz ardı edin):
Çip: ” ATtiny402 “
Saat Hızı: “5MHz”
Programcı: “jtag2updi (megaTinyCore)”
Ardından programı bir UPDI programlayıcı kullanarak ATtiny402’ye yükleyebilirsiniz. Make UPDI Programmer’da açıklandığı gibi bir herhangi bir Arduino kartını UPDI programlayıcıya çevirebilirsiniz.
“Açıklamada flash ve önyükleme bellekleri bulunamıyor” hatasını görmezden gelebilirsiniz.
Program Kodu
Yorum yapma özelliği, forum tarafından gelen istek sebebiyle kapatılmıştır. Lütfen tartışmalar ve sorularınız için topluluk forumumuza katılın.
