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
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
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
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 registerler 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