Core Independent Peripherals (CIP) özelliği, yüksek hızlı dahili osilatörler ve olay sistemlerine sahip Microchip’in tinyAVR® mikrodenetleyici ailesi, geniş çapta beğeni topladı. Microchip'in yeni piyasaya sürdüğü megaAVR® MCU – ATmega4809 serisi, daha büyük depolama kapasitesine ve daha fazla pime sahiptir ve tinyAVR serisinin bir uzantısıdır. Bu yeni ATmega4809 serisi, mikroişlemciler kullanan karmaşık sistemler için ideal bir yardımcı MCU'dur ve komuta-kontrol sistemi tasarımlarında mükemmel bir bağımsız işlemci haline gelebilir.
ATmega4809 Özellikleri
Çekirdekten bağımsız çevre birimlerini (CIP) entegre eden ilk megaAVR cihazı olan ATmega4809, görevleri yazılım yerine donanım düzeyinde yerine getirir. Ayrıca, akıllı donanım çevre birimlerini AVR® çekirdeğinin düşük güç tüketimi özellikleriyle birleştirerek gerçek zamanlı kontrol sistemlerinin yeteneklerini genişletir.
- Donanım çarpanına sahip 8 bit AVR® CPU
- 48 KB'a kadar Flash bellek
- 16 kanala kadar yüksek hızlı 10 bit ADC
- Yapılandırılabilir özel mantık çevre birimleri
- Entegre yüksek hızlı analog-dijital dönüştürücü (ADC)
Bu özellikler, yeni megaAVR mikrodenetleyici serisini mikroişlemci tabanlı sistemlerde yardımcı MCU olarak veya komuta/kontrol sistemi tasarımlarında mükemmel bir bağımsız işlemci olarak kullanım için ideal hale getirir.
ATmega4809 Curiosity Nano Şeması

ATmega4809 Başlangıç Kodu
Gerekli araçlar
- Donanım: ATmega4809 Curiosity Nano geliştirme kartı
- Yazılım: MPLAB X IDE v5.5, XC8 derleyici
Derleme seçeneği ayarları
MPLAB'da varsayılan olarak (MicroChip'e yerleşik) varsayılan başlatma kodu kullanılır. Projenizde kendi hazırladığınız başlatma kodunu kullanmak istiyorsanız, aşağıdaki derleme seçeneklerini ayarlamanız gerekir:

Projeyi seçin ve proje özellikleri panelini açın. "Ek Seçenekler" bölümüne "-nostartfiles" seçeneğini ekleyin ve değişiklikleri kaydedin.
MCU kesme işlevi işleme
Atlama ifadesi bulunmadığında, kod baştan itibaren tek tek çalıştırılır. Bir kesme oluştuğunda, program otomatik olarak ilgili kesme giriş adresine atlar ve bu kesme giriş adresi kesintisiz bir adrestir. Genellikle bu kesintisiz kesme giriş adresine kesme vektör tablosu adını veririz. Kesme giriş adresine karşılık gelen bellek alanı yalnızca 16 bit (2 bayt) olduğundan, bu alan kesme hizmet fonksiyonu kodumuzu hiçbir şekilde barındıramaz. Bu nedenle, kesme hizmet fonksiyonumuzu yürütmek için kesme giriş adresine bir atlama ifadesi yerleştirerek kesme hizmet fonksiyonumuzun giriş adresine atlayacağız.
Başlatma kodu - assembler sürümü
/* This file uses not the AVRASM2.exe assembler but the gnu assembler as - the GNU assembler */
/* Replace the rjmp command with jmp */
#include
.extern main; refers to the main function in the Main.c file
/* Interrupt vector table. Place jump instructions. When an interrupt occurs, jump to the corresponding interrupt service function to execute the interrupt function */
.section .vectors
jmp __ctors_end;
jmp CRCSCAN_NMI
jmp BOD_VLM
jmp RTC_CNT_MEGA4809
jmp RTC_PIT
jmp CCL_CCL
jmpPORTA_PORT
jmp TCA0_OVF_vect
/* Code storage area that runs before the main function is run */
.section .init2
clr r1; Clear r1 register. Some compilers require this
clr r16; Clear SREG status register
out SREG, r16
; Init the STACK Pointer. Initialization stack. Used for calling sub-functions
ldi r16,(RAMEND & 0xff); initialize
out CPU_SPL,r16; stack pointer.
ldi r16,(RAMEND >> 8) ; to RAMEND
out CPU_SPH,r16
.section .init9
rcall main ; jump to main function
jmp 0x00; Function executed after the main function ends. Jump directly to 0x00 to reset the MCU
// code space
.section .text
//interrupt service function
.weak CRCSCAN_NMI; Use the .weak directive to define the function. When this function is defined externally, the externally defined function is used
.globalCRCSCAN_NMI
CRCSCAN_NMI:
reti
.weak BOD_VLM
.global BOD_VLM
BOD_VLM:
reti
.weak RTC_CNT_MEGA4809
.global RTC_CNT_MEGA4809
RTC_CNT_MEGA4809:
reti
.weak RTC_PIT
.globalRTC_PIT
RTC_PIT:
reti
.weak CCL_CCL
.global CCL_CCL
CCL_CCL:
reti
.weakPORTA_PORT
.globalPORTA_PORT
PORTA_PORT:
reti
.end
Test kodu
Yazdığımız başlangıç dosyasının TCA0 taşma kesintisine girebilip giremediğini tespit etmek için bu başlangıç dosyasının test kodunu ana işlevde derleyin.
#include "mcc_generated_files/mcc.h"
volatile uint8_t flag = 0;
int main(void)
{
/* Initializes MCU, drivers and middleware */
SYSTEM_Initialize();
/* Replace with your application code */
// protected_write_io(&(CLKCTRL.MCLKCTRLB),IO_KEY,0x01);
PORTF.DIR = 0x20;
TCA0.SINGLE.PERH = 0x4C;
TCA0.SINGLE.PERL = 0x4B;
TCA0.SINGLE.CTRLA = 0x0D;
TCA0.SINGLE.INTCTRL = 0x01;
ENABLE_INTERRUPTS();
while(1)
{
if(flag==1)
{
flag = 0;
PORTF.OUTTGL = 0x20;
}
}
}
ISR(TCA0_OVF_vect)
{
flag = 1;
TCA0.SINGLE.INTFLAGS = 0x01;//??????
}
ATmega4809 Geliştirme Kutusu - GPIO Çıkışı
Gerekli araçlar
- Donanım: ATmega4809 Curiosity Nano geliştirme kartı
- Yazılım: Microchip Studio 7
Yeni bir proje oluştur
Microchip Studio 7'de yeni bir proje oluşturun ve bu projeye yeni bir klasör ekleyin.
Projeyi seçin, ardından sağ tıklayın ve Ekle >> Yeni Klasör seçeneğini seçin

Dosyaları klasöre ekleyin, C dosyasını seçin ve C dosyasının adını VPORT.c olarak girin

Aynı yöntemi izleyerek yeni bir VPORT.h dosyası oluşturun.
Başlık dosyası yolunu ayarla
Proje ayarları penceresini açın, başlık dosyası yolunu ayarlamak için proje ayarlarına tıklayın:

Kodu yazın
Çevre birimlerini çalıştırmak için yapılar kullanırız. Yapının kapladığı bellek adresi dizi gibi kesintisiz olduğundan ve yonga kılavuzuna baktığımızda VPORTF çevre birimi kayıt grubunun adresinin de buna bağlı olduğunu görürüz. Bu nedenle, VPORTF kayıtlarının başlangıç adresini yapı işaretçisine atayabiliriz.
typedef struct VPin_x_Jack{
uint8_t PIT_0: 1;
uint8_t PIN_1: 1;
uint8_t PIN_2: 1;
uint8_t PIN_3: 1;
uint8_t PIN_4: 1;
uint8_t PIN_5: 1;
uint8_t PIN_6: 1;
uint8_t PIN_7: 1;
}VPINx_Jack_TypeDef;
typedef struct VPort_x_Jack{
VPINx_Jack_TypeDef DIR;
VPINx_Jack_TypeDef OUT;
VPINx_Jack_TypeDef IN;
VPINx_Jack_TypeDef INTFLAGS;
}VPORTx_Jack_TypeDef;
#define VPORTA_Jack (*(VPORTx_Jack_TypeDef *)0x0000)
#define VPORTB_Jack (*(VPORTx_Jack_TypeDef *)0x0004)
#define VPORTC_Jack (*(VPORTx_Jack_TypeDef *)0x0008)
#define VPORTD_Jack (*(VPORTx_Jack_TypeDef *)0x000C)
#define VPORTE_Jack (*(VPORTx_Jack_TypeDef *)0x0010)
#define VPORTF_Jack (*(VPORTx_Jack_TypeDef *)0x0014)
main.c dosyasına başlık dosyasını ekle
#include
#include "VPORTx.h"
extern protected_write_io(void *addr, uint8_t KEY,uint8_t value);
static inline void System_Clock_Setting(void *addr,uint8_t value)
{
protected_write_io(addr,0xD8,value);
}
void LED_Init(void)
{
VPORTF_Jack.DIR.PIN_5 = 1; // PF5 output
VPORTF_Jack.OUT.PIN_5 = 1; // LED off
}
int main(void)
{
//Configure the system clock to 10MHZ
System_Clock_Setting((void *)&(CLKCTRL.MCLKCTRLB),CLKCTRL_PDIV_2X_gc | 1 << CLKCTRL_PEN_bp);
//Initialize LED port
LED_Init();
while (1)
{
}
}
LED ışık kontrol kodu:
Devre şemasını kontrol ederek LED pinine bağlı IO portunun PF5 olduğunu doğrulayın. LED'in pozitif ucu güç kaynağına bağlı olduğundan, LED'in negatif ucu düşük olduğunda LED yanar. Aksi takdirde LED söner.
VPORTF_Jack.OUT.PIN_5 = 1; // LED off
VPORTF_Jack.OUT.PIN_5 = 0; // LED is on
Kodda hata ayıklama
Aşağıdaki şekilde gösterildiği gibi, projeyi Simülatör olarak yapılandırın ve kod hata ayıklama işlemleri için simülasyon hata ayıklayıcısını kullanın.

Pim kayıt defterinin durumunu görüntülemek için I/O Görünümü'nü açın.




