Tiny AVR 1 Serisi Giriş

    Attiny serisini hem küçük hem ucuz olduğu için kullanmış ve birkaç konu hakkında yazmıştım. Aradan geçen zamanda nihayet temin edebildiğim Tiny 1 serisi MCU hakkında yazacağım. Artık klasik olan Atmega328p ve Tiny 0 serisi (13A,45) vb. MCU dan oldukça farklılar. Küçük ve ucuz olmalarının yanında daha önce olmayan çevre birimleri (USART,TWI,SPI) standart olarak var. ADC, DAC ve 16 bit birden fazla zamanlayıcıya sahipler. Bu birimlerin özel pinlerini de değiştirme şansı veren PORTMUX da dahil edilmiş. 

İlk olarak Attiny1614 temin edip çalışmaya başladım sonra üstünde debugger olan ATtiny3217 Curiosity Nano Evaluation Kit alıp kullandım. Burada yazacaklarım ikisinin özelinde olsa da AVR DA-DB, Atmega4809 ve  Tiny 2 (1627vb.) serisi gibi nispeten yeni tüm ürünler için geçerli olacaktır. Datashettleri de aynı olan bu seriler içinde birkaç farklı özellik var. İlk önce nasıl programlayacağımızla başlayalım.

UPDI

Bu seride alıştığımız USBAsp ile programlama şansımız yok. UPDI ismiyle yeni bir protokol kullanılıyor. Bu UPDI pini istenirse reset pini haline getirilebiliyor ama buna gerek yok yalnızca 3 pin (Vcc,Gnd,UPDI) ile işlem yapılırken başka şeyler denemeye gerek yok. Ben o yüzden çok incelemedim ve UPDI protokolüyle nasıl yapıldığına baktım. Bunun için Microchip (Pymcuprog)  Python ile çalışan AVRdude benzeri bir program hazırlamış. İlk olarak bilgisayarınıza Python kurmalısınız. Buradan kurulumu yapabilirsiniz. Dikkat etmeniz gereken son versiyonu kurmamak. Çünkü son versiyonda sorun çıkabilir. Bendeki versiyon 3.11.6 ve sorunsuz kullanıyorum.

Python kurulumu yaptıktan sonra buradan Pymcuprog kurmalısınız. Komut istemine "pip install pymcuprog" yazmanız yeterli kurulum yapılacaktır. Pymcuprog sayfasında gerekli olan bilgiler mevcut ama burada bahsetmem iyi olur. MCU ile PC arasında yapılması gereken bağlantı şekli aşağıda ki gibi basit olacak. Direnci 4.7KOhm yaptığım zaman da sorun çıkmadı.

Ben uzun zamandır FT232R kullanıyorum. Bazı şikayetler okusam da ben yaşamadım. Başka bir USB seri dönüştürücü de kullanılabilir. Sadece bazılarında iç diren kendi üstünde bulunuyormuş buna dikkat etmeniz yeterlidir.

Microchip Studio

Farklı bir IDE kullanabilirsiniz ama benim tercihim Microchip Studio olacak. Burada yazdığımız kodların yüklenmesi için AVRdude gibi external tools ayarlamak gerekiyor.

Fotoğraflarda görüldüğü şekilde yapabilirsiniz. Kullandığınız MCU adına göre ayrıca kaydetmeniz gerekecek. Commands için pymcuprog dizinini seçmeniz gerekir. "C:\Users\haluk\AppData\Local\Programs\Python\Python311\Scripts\pymcuprog.exe"
Arguments için:
"write -d attiny1614 -t uart  -u com11 -f$(TargetDir)$(TargetName).hex --erase --verify"
yazmanız yeterlidir. "-d attiny1614" yazan yere MCU adı yazılacak. "-u com11" yazan yerde de sizin com adresiniz olacak. Diğer komutlar Pymcuprog adresinde açıklanmış.

Led yakma

Ne yazık ki alıştığımız makrolar artık yok. Birçok register ismi değişmiş. Timer birimleri başta olmak üzere sistem tamamen değişmiş. Hazır bir kaynak yok, olanları yetersiz. Mesela I2C için bir örnek buldum sadece yazma var okuma yok. İkisi birden olanda kesme kullanılmamış. Aplikasyon notlar çok karışık ve atmel start ile hazırlanmış. Ne yazık ki ben ona bir türlü alışamadım. Aslında birçok şeyi görsel olarak hazırlıyor ve hazır kütüphaneleri yüklüyor ama işin içeriğini öğreneceksem bana faydalı olmuyor.

Buradan datasheet inceleyebilirsiniz. Flash ve pin sayıları dışında bir fark yok ve ben 3217 içeriğiyle devam edeceğim. Atmega328P de olduğu gibi DIR PORT ve PIN registerleri yine var. PORTD|=(1<<PORTD5) şeklinde yazılmıyor. "iotn3217.h" ve "iotn1614.h" gibi başlık dosyaları içinde tüm registerler ve gerekli makrolar yazılmış. Port pin yönlendirme ve çıkış durum registerleri:

Tabloda görüldüğü gibi fazladan regsiterler var. PORTD|=(1<<PORTD5) şeklinde çıkışı "1" yaparken PORTD&=~(1<<PORTD5) şeklinde "0" yapıyorduk. Artık "1" ve "0" yazmak için SET ve CLR registerleri eklenmiş. Ayrıca çıkışı terslemek için TGL var. Tüm pinleri giriş-çıkış değiştirmek için INVEN, pin kesmeler için ISC biti eklenmiş. Önceden pull up için bir pini giriş yapıp PORTx registeriyle "1" yapmak gerekirdi. Artık PULLUPEN bit değeriyle bunu yapmak mümkün. Pin giriş için IN ve kesme bayrakları için INTFLAGS kullanılıyor.

Bir pinin yönünü çıkış yapmak için: 

"PORTA_DIR|=(1<<3);" 

"PORTA.DIR|=(1<<PIN3_bp);" //PIN3_bp=3.

"PORTA.DIRSET=PIN3_bm;" //PIN3_bm=0x08 yazmak aynı işi görecektir. 

Giriş için:

"PORTA.DIRCLR=(1<<PIN3_bp);" 

"PORTA.DIR&=~0x08;" şeklinde yazılabilir. DIRSET registerine "0" yazmak bir şey değiştirmez. Bu nedenle ya DIR registerine "0" yazılmalı veya DIRCLR registerine "1" yazılarak otomatik olarak DIR değeri değiştirilmelidir. Iotnx.h başlık dosyasında "PORTA_DIR" şeklinde tanımlar dışında "PORTA.DIR" şeklinde kullanmak için tanımlı struct yapıları da tanımlanmış. Hangisi kolay gelirse onu kullanabilirsiniz.

Port yönünde olduğu gibi giriş çıkış durumunu yapıp ilk bölümü burada tamamlayayım.

/*
 * atiny1614_blink.c
 *
 * Created: 19.11.2023 10:59:10
 * Author : haluk
 */ 


#define F_CPU 3333333 // 20MHz / 6 MCLKCTRLB/PEN/PDIV
#include <avr/io.h>
#include <util/delay.h>

int main(void){
    
    PORTA.DIRSET=PIN3_bm;
    while (1){
        PORTA.OUTSET=PIN3_bm;
        _delay_ms(1000);
        PORTA.OUTCLR=PIN3_bm;
        _delay_ms(1000);        
        
    }
}











Hiç yorum yok:

Yorum Gönder