CCL pinlere, olay sistemine veya diğer çevre birimlerine bağlanabilen programlanabilen mantık birimidir. İşlemciden bağımsız çalışır.
CCL iki adet dizi arama tablosu LUT içerir. LUT üç giriş ve bunlara bağlı programlı bir çıkış bulundurur.LUT için bağlı girişlerin olasılıkları ve karşılık gelen TRUTH bu şekildedir. LUT için girişler INSEL biti ile ayarlanır. Bu ayarlamayla G/Ç pinler seçilebilir. Olay sistemi ile bağlanabilir. FEEDBACK ile bir LUT çıkışı diğeri için giriş olabilir. Zamanlayıcılar gibi diğer çevre birimlerine bağlanabilir.
CCL üç girişin bağlı olduğu ve AND kapısı olarak çalışmasını istediğimiz zaman TRUTH=0B 1000 0000 olmalıdır. Aynı şekilde OR için TRUTH=0B 1111 1110 olur. Bu şekilde istenen çıkış ayarlanabilir. Ayrıca istenirse girişler maskelenebilir ve iki giriş olarak kullanılabilir. Bütün bunları yapmak için ilgili registerler:
CTRLA RUNSTDBY ile uyku modunda çalışması ayarlanırken ENABLE ile CCL çalıştırılır. CCL içindeki registerler ENABLE "1" olduğunda yazmaya karşı korumalıdır. Değişiklik yapmak için "0" olmalıdır.
SEQCTRL
LUT çıkışları sıralı bir bloğa bağlanır. İçinde flip flop ve latch içerir.LUTCTRLA
LUTCTRLA ile ilgili LUT için ayarlamalar yapılır. Buradaki ENABLE o LUT için geçerlidir. OUTEN LUTx çıkışını açar.
FILTSEL girişe uygulanan filtre seçimi yapılır. CLKSRC ile sistem saati veya giriş ikiye bağlanacak harici saat seçimi yapılır. EDGEGET ile yükselen kenarda bir darbe oluşturur.
Uygulama
İlk olarak basit bir uygulama yaparak nasıl çalıştığını öğrenmeye çalıştım. Üç adet giriş ve bu girişleri AND kapısı olarak ayarlı CCL birimine bağladım. Bu girişlerin durumuna göre çıkış olarak bağlı bir LED var.
/*
* attiny1614_ccl_and.c
*
* Created: 29.03.2024 11:13:24
* Author : haluk
*/
#include <avr/io.h>
int main(void){
PORTC.DIRSET=PIN3_bm|PIN4_bm|PIN5_bm;// lUT1 girişleri
CCL.TRUTH1=0x80;// LUT table: and için truth(7) biti "1" diğerleri "0"
CCL.LUT1CTRLB|=CCL_INSEL0_IO_gc|CCL_INSEL1_IO_gc;//LUT 1 pinleri bağlandı
CCL.LUT1CTRLC|=CCL_INSEL2_IO_gc;//LUT 1 pinleri bağlandı
CCL.LUT1CTRLA|=CCL_ENABLE_bm|CCL_OUTEN_bm;//LUT1 çıkışı ve LUT1 açıldı
CCL.CTRLA|=CCL_ENABLE_bm;//ccl açıldı
while (1)
{
}
}
/*
* attiny1614_manchester.c
*
* Created: 29.03.2024 14:39:03
* Author : haluk
*/
#include <avr/io.h>
#include "tiny1_uart.h"
#include "tiny1_spi_master.h"
#include <util/delay.h>
int main(void){
CPU_CCP=CCP_IOREG_gc;
CLKCTRL_MCLKCTRLB=CLKCTRL_PDIV_10X_gc|CLKCTRL_PEN_bm;//f_cpu 2MHz
uart_basla(19200);
spi_basla();
CCL.TRUTH1=0x09;//IEEE 802.3 LUT table sck ve mosi XOR
//CCL.TRUTH1=0x06;//G. E. Thomas
CCL.LUT1CTRLB=CCL_INSEL0_SPI0_gc|CCL_INSEL1_SPI0_gc;//spi mosi ve spi sck lut1 girişi yapıldı
CCL.LUT1CTRLC=CCL_INSEL2_MASK_gc;//giriş maskelendi
CCL.LUT1CTRLA=CCL_OUTEN_bm|CCL_FILTSEL_SYNCH_gc|CCL_ENABLE_bm;//LUT1 çıkış açık filtre açık
CCL.CTRLA=CCL_ENABLE_bm;
while (1) {
if (uart_gelen()){//UART ile gelen bir veri spi ile gönderilirken LUT1 (PA7) manchester çıkışı
spi_data(uart_oku());
_delay_us(50);
}
}
}
Hiç yorum yok:
Yorum Gönder