ATmega4809 Curiosity Nano

Indice

ATmega4809 Curiosity Nano Board Programming

La famiglia tinyAVR® di microcontrollori di Microchip con Periferiche Indipendenti dal Core (CIP), oscillatori interni ad alta velocità e sistemi di eventi è stata ampiamente apprezzata. Il nuovo MCU megaAVR® di Microchip – serie ATmega4809 ha una maggiore capacità di archiviazione e più pin, ed è un’espansione della serie tinyAVR. Questa nuova serie ATmega4809 è un MCU ausiliario ideale per sistemi complessi che utilizzano microprocessori e può diventare un eccellente processore autonomo nella progettazione di sistemi di comando e controllo.

Caratteristiche di ATmega4809

Come primo dispositivo megaAVR a integrare periferiche indipendenti dal core (CIP), l’ATmega4809 esegue attività in hardware anziché in software. Estende inoltre le capacità dei sistemi di controllo in tempo reale combinando periferiche hardware intelligenti con le caratteristiche a basso consumo del core AVR®.

  • CPU AVR® a 8 bit con moltiplicatore hardware
  • Memoria Flash fino a 48 KB
  • Fino a 16 canali di ADC a 10 bit ad alta velocità
  • Periferiche logiche personalizzabili configurabili
  • Convertitore analogico-digitale (ADC) integrato ad alta velocità

Queste caratteristiche rendono la nuova serie di microcontrollori megaAVR ideale per l’uso come MCU complementari in sistemi basati su microprocessori, o come processore autonomo perfetto nella progettazione di sistemi di comando/controllo.

Schema ATmega4809 Curiosity Nano

Schematic Diagram of ATmega4809 Curiosity Nano Board
Schematic Diagram of ATmega4809 Curiosity Nano Board

Codice di avvio ATmega4809

Strumenti richiesti

  • Hardware: scheda di sviluppo ATmega4809 Curiosity Nano
  • Software: MPLAB X IDE v5.5, compilatore XC8

Impostazioni delle opzioni di compilazione

Per impostazione predefinita, il codice di avvio predefinito (integrato in MicroChip) viene utilizzato in MPLAB. Se si desidera utilizzare un codice di avvio fai-da-te nel progetto, è necessario impostare le seguenti opzioni di compilazione:

Set compilation options in MPLAB
Set compilation options in MPLAB

Seleziona il progetto e apri il pannello delle proprietà del progetto. Aggiungi l’opzione “-nostartfiles” in Opzioni aggiuntive e salva le modifiche.

Elaborazione della funzione di interrupt MCU

Quando non c’è un’istruzione di salto, il codice viene eseguito uno per uno dall’inizio. Quando si verifica un’interruzione, il programma salterà automaticamente all’indirizzo di ingresso dell’interruzione corrispondente e l’indirizzo di ingresso dell’interruzione è un indirizzo continuo. Generalmente, chiamiamo questo indirizzo di ingresso dell’interruzione continuo una tabella vettoriale di interruzione. Poiché lo spazio di memoria corrispondente all’indirizzo di ingresso dell’interruzione è solo di 16 bit (2 byte), questo spazio non può salvare affatto il nostro codice della funzione di servizio di interruzione. Quindi posizioneremo un’istruzione di salto all’indirizzo di ingresso dell’interruzione per saltare all’indirizzo di ingresso della nostra funzione di servizio di interruzione per eseguire la nostra funzione di servizio di interruzione.

Codice di avvio - versione assembly

				
					/* This file uses not the AVRASM2.exe assembler but the gnu assembler as - the GNU assembler */
/* Replace the rjmp command with jmp */

     #include <xc.h>

     .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
				
			

Codice di test

Compila il codice di test di questo file di avvio nella funzione principale per rilevare se l’avvio che abbiamo scritto può entrare nell’interrupt di overflow TCA0.

				
					#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;//??????
}
				
			

Caso di sviluppo ATmega4809 - Uscita GPIO

Strumenti richiesti

  • Hardware: scheda di sviluppo ATmega4809 Curiosity Nano
  • Software: Microchip Studio 7

Crea un nuovo progetto

Crea un nuovo progetto in Microchip Studio 7 e aggiungi una nuova cartella ad esso.
Seleziona il progetto, quindi fai clic con il pulsante destro del mouse e seleziona Aggiungi >> Nuova cartella

Add a Folder to ATmega4809 Project
Add a Folder to ATmega4809 Project

Aggiungi file alla cartella, seleziona il file C e inserisci il nome del file C VPORT.c

Add C File to ATmega4809 Project
Add C File to ATmega4809 Project

Segui lo stesso metodo per creare un nuovo file VPORT.h.

Imposta il percorso del file di intestazione

Apri la finestra delle impostazioni del progetto, fai clic sulle impostazioni del progetto per impostare il percorso del file di intestazione:

Set header file path
Set header file path

Scrivi il codice

Usiamo le strutture per operare sulle periferiche. Poiché lo spazio di memoria occupato dalla struttura è continuo come l’array e quando controlliamo il manuale del chip, troveremo anche che l’indirizzo del gruppo di registri periferici VPORTF è anche connesso. Quindi possiamo assegnare l’indirizzo di base del registro VPORF al puntatore della struttura.

				
					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)
				
			

File di intestazione pin nel file main.c

				
					#include <avr/io.h>
#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)
     {
     }
}
				
			

Codice di controllo della luce LED:

Controlla lo schema elettrico per confermare che la porta IO collegata al pin LED sia PF5. Poiché il terminale positivo del LED è collegato all’alimentazione, quando il terminale negativo del LED è basso, il LED si accende. Altrimenti, il LED si spegne.

				
					VPORTF_Jack.OUT.PIN_5 = 1; // LED off
VPORTF_Jack.OUT.PIN_5 = 0; // LED is on
				
			

Codice di debug

Come mostrato nella figura seguente, configura il progetto come Simulatore e utilizza il debugger di simulazione per il debug del codice.

Configure the debugging (programming) tool as Simulator
Configure the debugging (programming) tool as Simulator

Apri la visualizzazione I/O per visualizzare lo stato del registro pin.

Check the status of pin register in I O Virtual Ports
Check the status of pin register in I O Virtual Ports

Iscriviti

Unisciti alla nostra lista di iscritti per ricevere aggiornamenti mensili sul blog, notizie tecnologiche, casi di studio. Non invieremo mai spam e potrai annullare l’iscrizione in qualsiasi momento.

Informazioni sull'autore

Picture of Aidan Taylor
Aidan Taylor

I am Aidan Taylor and I have over 10 years of experience in the field of PCB Reverse Engineering, PCB design and IC Unlock.

Hai bisogno di aiuto?

Torna in alto

Instant Quote