ATmega4809 Curiosity Nano

Inhaltsverzeichnis

ATmega4809 Curiosity Nano Board Programming

Die tinyAVR®-Familie von Mikrocontrollern von Microchip mit Core Independent Peripherals (CIP), internen Hochgeschwindigkeitsoszillatoren und Ereignissystemen findet große Anerkennung. Die neu eingeführte megaAVR®-MCU-Serie ATmega4809 von Microchip verfügt über eine größere Speicherkapazität und mehr Pins und ist eine Erweiterung der tinyAVR-Serie. Die neue ATmega4809-Serie ist eine ideale Zusatz-MCU für komplexe Systeme mit Mikroprozessoren und eignet sich hervorragend als eigenständiger Prozessor in Steuerungssystemen.

ATmega4809 Funktionen

Als erstes MegaAVR-Gerät, das kernunabhängige Peripheriegeräte (CIP) integriert, führt der ATmega4809 Aufgaben eher in der Hardware als in der Software aus. Außerdem erweitert er die Fähigkeiten von Echtzeit-Steuerungssystemen, indem er intelligente Hardware-Peripheriegeräte mit den energiesparenden Funktionen des AVR®-Kerns kombiniert.

  • 8-Bit-AVR®-CPU mit Hardware-Multiplikator
  • Flash-Speicher bis zu 48 KB
  • Bis zu 16 Kanäle mit schnellem 10-Bit-ADC
  • Konfigurierbare benutzerdefinierte Logik-Peripheriegeräte
  • Integrierter Hochgeschwindigkeits-Analog-Digital-Wandler (ADC)

Dank dieser Eigenschaften eignet sich die neue MegaAVR-Serie von Mikrocontrollern ideal als Begleit-MCU in mikroprozessorbasierten Systemen oder als perfekter eigenständiger Prozessor in Befehls-/Steuerungssystemen.

ATmega4809 Curiosity Nano Schaltplan

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

ATmega4809 Startcode

Erforderliche Werkzeuge

  • Hardware: ATmega4809 Curiosity Nano-Entwicklungsboard
  • Software: MPLAB X IDE v5.5, XC8-Compiler

Einstellungen für Kompilierungsoptionen

Standardmäßig wird in MPLAB der Standard-Startcode (in MicroChip integriert) verwendet. Wenn Sie in Ihrem Projekt einen selbst erstellten Startcode verwenden möchten, müssen Sie die folgenden Kompilierungsoptionen festlegen:

Set compilation options in MPLAB
Set compilation options in MPLAB

Wählen Sie das Projekt aus und öffnen Sie das Projekt-Eigenschaftenfenster. Fügen Sie die Option „-nostartfiles“ unter „Zusätzliche Optionen“ hinzu und speichern Sie die Änderungen.

Verarbeitung der MCU-Interrupt-Funktion

Wenn keine Sprunganweisung vorhanden ist, wird der Code von Anfang an nacheinander ausgeführt. Wenn eine Unterbrechung auftritt, springt das Programm automatisch zur entsprechenden Unterbrechungseingangsadresse, wobei die Unterbrechungseingangsadresse eine fortlaufende Adresse ist. Im Allgemeinen bezeichnen wir diese fortlaufende Unterbrechungseingangsadresse als Unterbrechungsvektortabelle. Da der Speicherplatz, der der Unterbrechungseingangsadresse entspricht, nur 16 Bit (2 Byte) beträgt, kann dieser Speicherplatz unseren Unterbrechungsdienstfunktionscode überhaupt nicht speichern. Daher platzieren wir eine Sprunganweisung an der Interrupt-Eingangsadresse, um zur Eingangsadresse unserer Interrupt-Servicefunktion zu springen und unsere Interrupt-Servicefunktion auszuführen.

Startcode – Assembler-Version

				
					/* 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
				
			

Testcode

Kompilieren Sie den Testcode dieser Startdatei in der Hauptfunktion, um festzustellen, ob der von uns geschriebene Startvorgang in den TCA0-Überlauf-Interrupt eintreten kann.

				
					#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-Entwicklungsgehäuse – GPIO-Ausgang

Erforderliche Werkzeuge

  • Hardware: ATmega4809 Curiosity Nano-Entwicklungsboard
  • Software: Microchip Studio 7

Neues Projekt erstellen

Erstellen Sie ein neues Projekt in Microchip Studio 7 und fügen Sie einen neuen Ordner hinzu.
Wählen Sie das Projekt aus, klicken Sie mit der rechten Maustaste darauf und wählen Sie „Hinzufügen >> Neuer Ordner“.

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

Fügen Sie Dateien zum Ordner hinzu, wählen Sie die C-Datei aus und geben Sie den Namen der C-Datei VPORT.c ein.

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

Gehen Sie genauso vor, um eine neue VPORT.h-Datei zu erstellen.

Legen Sie den Pfad zur Header-Datei fest.

Öffnen Sie das Fenster „Projekteinstellungen“ und klicken Sie auf die Projekteinstellungen, um den Pfad der Header-Datei festzulegen:

Set header file path
Set header file path

Schreiben Sie den Code

Wir verwenden Strukturen, um Peripheriegeräte zu betreiben. Da die von der Struktur belegte Speicheradresse wie das Array zusammenhängend ist und wir beim Nachschlagen im Chip-Handbuch feststellen, dass auch die Adresse der VPORTF-Peripherie-Registergruppe zusammenhängend ist, können wir die VPORF-Register-Basisadresse dem Strukturzeiger zuweisen.

				
					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)
				
			

Pin-Header-Datei in der Datei 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)
     {
     }
}
				
			

LED-Lichtsteuerungscode:

Überprüfen Sie anhand des Schaltplans, ob der mit dem LED-Pin verbundene IO-Port PF5 ist. Da der Pluspol der LED an die Stromversorgung angeschlossen ist, leuchtet die LED, wenn der Minuspol der LED auf Low steht. Andernfalls erlischt die LED.

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

Code debuggen

Wie in der Abbildung unten gezeigt, konfigurieren Sie das Projekt als Simulator und verwenden Sie den Simulations-Debugger für die Code-Fehlersuche.

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

Öffnen Sie die I/O-Ansicht, um den Status des Pin-Registers anzuzeigen.

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

Abonnieren

Tragen Sie sich in unsere Abonnentenliste ein, um monatliche Blog-Updates, Technologie-News und Fallstudien zu erhalten. Wir versenden niemals Spam, und Sie können sich jederzeit wieder abmelden.

Nach oben scrollen

Instant Quote