16 bit B tipinde olan bu birim birçok modelde iki adettir. Frekans, PWM ve giriş sinyal yakalama gibi özellikleri vardır.
TCB
Sayaç saat kaynağı olarak sistem saati kullanılacağı gibi direk TCA ile senkron çalışabilir. Event (olay) sistem ile harici bir kaynak da kullanılabilir. Saat seçimi ve prescaler CTRLA registeriyle belirlenir. TCB biriminde MAX değer 0xFFFF ve BOTTOM 0x0000 . Saat kaynağına ve prescalere göre artan CNT, CCMP eşleşmesiyle seçilen moda göre değişik işlemler yapar. Her bir TCB birimine bağlı bir çıkış WOx bulunur. PORTMUX ile alternatif diğer pin seçilebilir. Bu birimde sekiz farklı mod bulunur.
Periyodik Kesme Modu
TCBx CNT sayacı sıfırdan TOP (CCMP) ye kadar artar. Eşleşme olduğunda kesme (CAPT) oluşur ve sıfırlanır. Bu birimde buffer olmadığı için TOP değer sayaç değerinden daha düşük bir değerle değişirse CNT max değere kadar çıkar ve sıfırlanarak döngüye devam eder.Sayaç Kontrol Modu
Event (olay) sistemi içinde ayarlanan bir giriş sinyaliyle CNT saymaya başlar ve Sonraki sinyal ile durur. Event sistemde bu sinyalin yükselen/alçalan kenar durumu ayarlanır. EVCTRL biti "0" olursa yükselen kenarda işlem yapılır. CCMP ile eşleşmede kesme oluşur.
Olay Modu Giriş Yakalama
CNT sıfırdan yukarı sürekli olarak artar. Event sistem ile belirlenen kenarda sinyal geldiğinde kesme oluşur ve CNT sayaç değeri CCMP registerine kopyalanır. CCMPL okunduğunda kesme bayrağı silinir.
Giriş Yakalama Frekans Ölçüm Modu
CNT sıfırdan yukarı doğru sürekli artar. Event sistem ile belirlenen kenarda sinyal geldiğinde kesme oluşur ve CNT sayaç değeri CCMP registerine kopyalanır. Diğer moddan farklı olarak belirlenen kenarda CNT sıfırlanır. CCMPL okunduğunda kesme bayrağı silinir.Giriş Yakalama PWM Ölçüm Modu
CNT sayacı Event sistem giriş sinyalinin yükselen kenarında artmaya başlar. Düşen kenarda kesme oluşur ve CNT sayaç değeri CCMP registerine kopyalanır. CCMPL okunduğunda kesme bayrağı silinir.Giriş Yakalama Frekans ve PWM Ölçüm Modu
CNT sayacı yükselen kenarda artmaya başlar, düşen kenarda CNT sayaç değeri CCMP registerine kopyalanır. Sonraki yükselen kenarda kesme oluşur ve durur. CCMPL okunduğunda kesme bayrağı silinir ve sonraki yükselen kenarda sayaç sıfırlanarak tekrar artmaya başlar. Bu nedenle kesme oluşunca CNT değeri CCMP değerinden önce okunmalıdır. Burada CNT değeri periyodu CNT/CCMP oranı duty oranını bulmak için kullanılır.Tek Çekim Modu
Event sistem ile belirli bir kenar algılandığında CCMP değeri kadar çıkış verir ve kesme oluşur. Bu çıkış süresince gelen sinyaller önemsizdir. CCMP değerine ulaşınca çıkış "0" olur ve sonraki kenar gelene kadar sayaç sıfırda bekler.8 Bit PWM
CCMP registerinin CCMPL ve CCMPH farklı karşılaştırma değeri olarak kullanıldığı bir PWM moddur. CCMPL değeri TOP değeri ve periyodu/frekansı belirler. CCMPH ise çıkış oranını belirler.
TCB de çıkış seviyesi seçilen moda göre belirlenir. CTRLB registeri CNTMODE biti mode seçiminde kullanılır. Tekli modda event sisteminden gelen sinyalle direk olarak çıkış verme şansı vardır (asenkron mod)
Event sistemle bağlantılı modlarda sinyalleri dijital bir filtreden geçirmek mümkündür. EVCTRL registeri FILTER biti 1 yapıldığında gelen dört sinyal işlenir ardışık bu sinyaller eşitse sisteme kenar bilgisi olarak verilir.Event sistem kenar seçimi yine EVCTRL registeri EDGE biti ile ayarlarnır.
Uygulama
8 Bit PWM modu: TCB1 biriminin WO pin PA3 kullanıldı. CCMPEN biti "1" yapıldığında pini otomatik çıkış olarak ayarlar. Elle girilen Port "1" "0" değerleri geçersiz olur.
/*
* attiny1614_tcb.c
*
* Created: 14.03.2024 15:00:28
* Author : haluk
*/
#define F_CPU 416666
#include <avr/io.h>
#include <util/delay.h>
uint8_t period=207;
int main(void){
CPU_CCP=CCP_IOREG_gc;//korumalı bölümlere yazmak için gerekli kod
CLKCTRL.MCLKCTRLB=CLKCTRL_PEN_bm|CLKCTRL_PDIV_48X_gc;//20mhz ana saati/48
TCB1.CTRLB|=TCB_CCMPEN_bm|TCB_CNTMODE_PWM8_gc;//ccmp çıkış açık, 8bit pwm mode
TCB1.CTRLA|=TCB_CLKSEL_CLKDIV2_gc|TCB_ENABLE_bm;//sistem saati/2, enable
//tcb1 frek 208333Hz olur
TCB1.CCMPL=period;//frekansı belirler CCMPL=(TCB1clk/PWMfreq)-1
//CCMPL=(208333/1000)-1=207
TCB1.CCMPH=0x00;//duty cycle belirler
while (1) {
for (uint8_t i=0;i<period;i++){
TCB1.CCMPH=i;
_delay_ms(5);
}
for (uint8_t i=period;i>0;i--){
TCB1.CCMPH=i;
_delay_ms(5);
}
}
}
Hiç yorum yok:
Yorum Gönder