ATmega4809 Curiosity Nano

Índice

ATmega4809 Curiosity Nano Board Programming

A família tinyAVR® de microcontroladores da Microchip, com periféricos independentes do núcleo (CIP), osciladores internos de alta velocidade e sistemas de eventos, tem sido amplamente admirada. O recém-lançado MCU megaAVR® da Microchip – série ATmega4809 tem maior capacidade de armazenamento e mais pinos, sendo uma expansão da série tinyAVR. Esta nova série ATmega4809 é um MCU auxiliar ideal para sistemas complexos que utilizam microprocessadores e pode tornar-se um excelente processador autónomo em projetos de sistemas de comando e controlo.

Recursos do ATmega4809

Como o primeiro dispositivo megaAVR a integrar periféricos independentes do núcleo (CIP), o ATmega4809 executa tarefas em hardware em vez de software. Ele também amplia os recursos dos sistemas de controle em tempo real, combinando periféricos de hardware inteligentes com os recursos de baixo consumo de energia do núcleo AVR®.

  • CPU AVR® de 8 bits com multiplicador de hardware
  • Memória flash de até 48 KB
  • Até 16 canais de ADC de 10 bits de alta velocidade
  • Periféricos lógicos personalizáveis
  • Conversor analógico-digital (ADC) integrado de alta velocidade

Essas características tornam a nova série megaAVR de microcontroladores ideal para uso como MCUs complementares em sistemas baseados em microprocessadores ou como um processador autônomo perfeito em projetos de sistemas de comando/controle.

Esquema do ATmega4809 Curiosity Nano

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

Código de inicialização do ATmega4809

Ferramentas necessárias

  • Hardware: Placa de desenvolvimento ATmega4809 Curiosity Nano
  • Software: MPLAB X IDE v5.5, compilador XC8

Configurações das opções de compilação

Por padrão, o código de inicialização padrão (integrado ao MicroChip) é usado no MPLAB. Se você deseja usar o código de inicialização DIY em seu projeto, é necessário definir as seguintes opções de compilação:

Set compilation options in MPLAB
Set compilation options in MPLAB

Selecione o projeto e abra o painel de propriedades do projeto. Adicione a opção "-nostartfiles" em Opções adicionais e salve as alterações.

Processamento da função de interrupção da MCU

Quando não há instrução de salto, o código é executado um por um desde o início. Quando ocorre uma interrupção, o programa salta automaticamente para o endereço de entrada de interrupção correspondente, e o endereço de entrada de interrupção é um endereço contínuo. Geralmente, chamamos esse endereço de entrada de interrupção contínuo de tabela de vetores de interrupção. Como o espaço de memória correspondente ao endereço de entrada de interrupção é de apenas 16 bits (2 bytes), esse espaço não pode salvar nosso código de função de serviço de interrupção. Portanto, colocaremos uma instrução de salto no endereço de entrada da interrupção para saltar para o endereço de entrada da nossa função de serviço de interrupção e executar nossa função de serviço de interrupção.

Código de inicialização - versão 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
				
			

Código de teste

Compile o código de teste deste arquivo de inicialização na função principal para detectar se a inicialização que escrevemos pode entrar na interrupção de estouro 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;//??????
}
				
			

Caixa de desenvolvimento ATmega4809 - Saída GPIO

Ferramentas necessárias

  • Hardware: Placa de desenvolvimento ATmega4809 Curiosity Nano
  • Software: Microchip Studio 7

Criar um novo projeto

Crie um novo projeto no Microchip Studio 7 e adicione uma nova pasta a ele.
Selecione o projeto, clique com o botão direito do mouse e selecione Adicionar >> Nova pasta.

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

Adicione arquivos à pasta, selecione o arquivo C e insira o nome do arquivo C VPORT.c

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

Siga o mesmo método para criar um novo arquivo VPORT.h.

Defina o caminho do arquivo de cabeçalho

Abra a janela de configurações do projeto, clique nas configurações do projeto para definir o caminho do arquivo de cabeçalho:

Set header file path
Set header file path

Escreva o código

Usamos estruturas para operar periféricos. Como o endereço de memória ocupado pela estrutura é contínuo como a matriz, e quando verificamos o manual do chip, também descobrimos que o endereço do grupo de registros periféricos VPORTF também está conectado. Portanto, podemos atribuir o endereço base do registro VPORF ao ponteiro da estrutura.

				
					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)
				
			

Arquivo de cabeçalho de pino no arquivo 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)
     {
     }
}
				
			

Código de controle da luz LED:

Verifique o diagrama do circuito para confirmar que a porta IO conectada ao pino LED é PF5. Como o terminal positivo do LED está conectado à fonte de alimentação, quando o terminal negativo do LED está baixo, o LED acende. Caso contrário, o LED apaga.

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

Depuração de código

Conforme mostrado na figura abaixo, configure o projeto como Simulador e use o depurador de simulação para depurar o código.

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

Abra a Visualização de E/S para ver o status do registro de pinos.

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

Inscreva-se

Inscreva-se na nossa lista de assinantes para receber atualizações mensais do blog, notícias sobre tecnologia e estudos de caso. Nunca enviaremos spam e você pode cancelar a assinatura a qualquer momento.

Sobre o autor

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.

Compartilhar

Postagem recomendada

Precisa de ajuda?

Rolar para cima

Instant Quote