Tiny AVR 1 Serisi- CCL

 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.

LUTCTRLB, LUTCTRLC



Aşağıdaki tabloda belirtilenler arasından giriş seçimi yapılır. INSEL0 IN0, INSEL1 IN1 ve INSEL2 IN2. Bu tablolarda SPI ve USART girişleri aynı değildir.

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) 
    {
    }
}
Microchip uygulama örneklerinde gördüğüm bir uygulamayı kullandığım MCU ya göre değiştirdiğim bir örnek. Manchester kodu uygulaması. Bu konuyla ilgili bilgiyi internette bulabilirsiniz.
/*
 * 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);
    }
    }
}
Lojik analizörde manchester ayarları.
Lojik analizörde UART,SPI ve Manchester çıkışlarının durumu.

Hiç yorum yok:

Yorum Gönder