Tiny AVR 1 Serisi - UART

 Atmega serisi ve eski attiny MCU için donanım ve yazılım tabanlı UART konusu yazmıştım. Bu nedenle bu seri için çok hızlı bir şekilde direk kullanıma yönelik bilgileri aktarmaya çalışacağım. Aslında TCD biriminden sonra bu konuya geçecektim ama yaptığım uygulamalarda kullanmak zorunda kaldım. 

USART

Daha önce bildiğim bir MCU serisi olmasa da TinyAVR 1 ve Atmega yapı olarak çok farklı değiller. Blok şemalarında register isimlerinde ve BAUD hesaplamalarında farklılıklar var. Atmega için yazdığım kütüphanede sadece bu kısımları değiştirmek yeterli oldu demeyi çok isterdim ama bazı küçük sıkıntılar yaşadım.

Blok şemasında göze çarpan ilk fark gelen ve giden için farklı kayıtlar var. RS485 standartı için XDIR eklenmiş. USART birimi saat kaynağı olarak çevresel saati kullanır. BAUD hesaplamak için seçilen hıza göre iki farklı formül vardır. Atmega sersinde olduğu gibi 2X hızlı olduğu belirtilmelidir. BAUD için kayıt registeri kesirli hesap yapmaya uygundur. Daha önce bazı değerlerde sistem saatinin tam bölünmemesi nedeniyle oluşan farklar burada olmaz.

S normal mod için 16 hızlı mod için 8 değerini alıyor. BAUD registeri en küçük 64 en büyük 65535 olabiliyor. Yüksek frekansta (20MHz) düşük BAUD (2400) ve düşük frekansta (2MHz) yüksek BAUD (230400) seçmedikçe bu sınırlar dışına çıkmıyor. Sorun olmaması için 19200 ve altı normal mod, üst değerleri hızlı mod olarak hesaplıyorum. Formülü düzenlersek hızlı mod BAUD=(64*Fper)/(8*Fbaud)=(Fper*8)/Fbaud=(Fper<<3)/Fbaud olur. Virgül sonrası kısmı yukarı yuvarlamak için +0.5 ekliyorum.

TX ve RX pinlerini çıkış/giriş olarak yapılandırmak gerekiyor. CTRL registerlerine gerekli ayarlamaları yaptıktan sonra kalan kısımda Atmega serisiyle aynı fonksiyonları kullanıyorum. Bunda bir fark TX kesmesinde TX bayrağı otomatik temizlenmiyor. RS485 için ilerde bir deneme yapacağım.

Kütüphane dosyaları: TinyAVR-1/tiny1_uart at main · haluks/TinyAVR-1 (github.com)

/*
 * attiny1614_uart.c
 *
 * Created: 2.10.2023 16:36:59
 * Author : haluk
 */ 

#include <avr/io.h>
#include "tiny1_uart.h"
#include <util/delay.h>

int main(void){
  CPU_CCP=CCP_IOREG_gc;
  CLKCTRL.MCLKCTRLB=(0<<CLKCTRL_PEN_bp)|CLKCTRL_PDIV_6X_gc;//prescaler iptal 20MHz
    uart_basla(Bd230400);
    while (1) {    
    uart_gonder('A');
    uart_gonder('\n');    
    uart_gonder('B');
    uart_gonder('\n');
    uart_dizi("TinyAVR\n");
    _delay_ms(1000);
    }
}



Hiç yorum yok:

Yorum Gönder