Xmega128A1 SPI stopping the first interrupt

Go To Last Post
7 posts / 0 new
Author
Message
#1
  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

Hello,

I am writing to ask about somebody if have same issue with SPI on MEGA128

I try to write comunication between XMEGA128A1 and IO Expander MAX7301 via SPI

Electrical connections, io pins configurations are ok, because i checked it. Because everything working ok, using pullping. After reconfiguration to interrupt I find out. That program stopping after the interrupt and flag data Packet.complete is never setting to true.

I am using library downloaded from Atmel website.

Below I include my code

If anybody have the same issue or know what it is I will be very grateful :)

 

 


#include "main_header.h"

/*! \brief Number of test data bytes. */
#define NUM_BYTES   2

/* Global variables. */

/*! \brief SPI master on PORT C. */
SPI_Master_t spiMasterC;

/*! \brief SPI slave on PORT D. */
SPI_Slave_t spiSlaveD = {NULL, NULL};

/*! \brief Data packet. */
SPI_DataPacket_t dataPacket;

/*! \brief Test data to send. */
const uint8_t sendData[NUM_BYTES  ] = { 0x04, 0x01};

/*! \brief Buffer for test data reception. */
uint8_t receivedData[NUM_BYTES ];

uint8_t EXP_DataTx[10]={0xC2,0x00,0xCA,0x00,0xD2,0x00,0xDA,0x00,0x00,0x00};
uint8_t EXP_DataRx[10];

/*! \brief Result of the example test. */
bool success;


void cpu_init(void);

int main(void)
{
	cli();
	cpu_init();
	transmision_init();
	//init_max7301();
	
	PORTC.DIRSET = PIN4_bm;
	PORTC.PIN4CTRL = PORT_OPC_WIREDANDPULL_gc;
	/* Set SS output to high. (No slave addressed). */
	PORTC.OUTSET = PIN4_bm;
	
	PORTC.DIRSET = PIN3_bm;
	PORTC.PIN3CTRL = PORT_OPC_WIREDANDPULL_gc;
	/* Set SS output to high. (No slave addressed). */
	PORTC.OUTSET = PIN3_bm;
	
	SPI_MasterInit(&spiMasterC,
	&SPIC,
	&PORTC,
	false,
	SPI_MODE_0_gc,
	SPI_INTLVL_LO_gc,
	false,
	SPI_PRESCALER_DIV16_gc);
	

	PMIC.CTRL |= PMIC_MEDLVLEN_bm | PMIC_LOLVLEN_bm;
	sei();
	
	SPI_MasterCreateDataPacket(&dataPacket,
	sendData,
	receivedData,
	NUM_BYTES + 1,
	&PORTC,
	PIN4_bm);

	DMA_Enable();

	volatile uint8_t status;
	do {
		status = SPI_MasterInterruptTransceivePacket(&spiMasterC, &dataPacket);
	} while (status != SPI_OK);

	/* Wait for transmission to complete. */
	while ( dataPacket.complete == false)
	{
		 ;
	}
	while (1)
	{
		
		SPI_MasterCreateDataPacket(&dataPacket,
		EXP_DataTx,
		EXP_DataRx,
		10,
		&PORTC,
		PIN4_bm);
		
		
		do {
			status = SPI_MasterInterruptTransceivePacket(&spiMasterC, &dataPacket);
		} while (status != SPI_OK);
		/* Wait for transmission to complete. */
		while (dataPacket.complete == false) {

		}
		
		send_uart_d1(EXP_DataRx, 10);
		delay_ms(100);

	}
}

ISR(SPIC_INT_vect)
{
	unsigned char buff = 0xEE;
	SPI_MasterInterruptHandler(&spiMasterC);
		send_uart_d1(&buff, 1);
		delay_ms(100);
}

void cpu_init(void){

	CLKSYS_Enable( OSC_RC32MEN_bm );
	CLKSYS_Prescalers_Config( CLK_PSADIV_1_gc, CLK_PSBCDIV_1_1_gc);
	do {} while ( CLKSYS_IsReady( OSC_RC32MRDY_bm ) == 0 );
	CLKSYS_Main_ClockSource_Select( CLK_SCLKSEL_RC32M_gc );
	CLKSYS_Disable( OSC_RC2MEN_bm );
	CLKSYS_Disable( OSC_XOSCEN_bm );

}

and link to library

 

http://www.atmel.com/images/AVR1309.zip

  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

merxx wrote:

ISR(SPIC_INT_vect) { 
unsigned char buff = 0xEE; 
SPI_MasterInterruptHandler(&spiMasterC); 
send_uart_d1(&buff, 1); 
delay_ms(100); 
}

 

I don't know what SPI_MasterInterruptHandler does, but what I do know is that usually you have to reset the Interrupt flag manually on the xmegas, otherwise the ISR will be immediately called again after control returned to the main loop. This causes the main loop to get almost no CPU time, which in turn might look like the CPU is hanging.

 

I once lost an hour to find out about this. It seesms the compiler automatically inserts code that resets the flags on the mega and tiny devices, but not on xmegas. Can someone maybe confirm or disprove this?

 

Cheers

-Patrick

"Some people die at 25 and aren't buried until 75." -Benjamin Franklin

 

What is life's greatest illusion?"  "Innocence, my brother." -Skyrim

 

  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

It seesms the compiler automatically inserts code that resets the flags on the mega and tiny devices

News to me.

 

$ cat spi_vect_test.c
#include <avr/io.h>
#include <avr/interrupt.h>

ISR(SPI_STC_vect) {
}

int main(void) {
  while(1);
}

$ avr-gcc -Wall -g -O1 -mmcu=atmega328p spi_vect_test.c -o spi_vect_test.elf
$ avr-objdump -S spi_vect_test.elf

spi_vect_test.elf:     file format elf32-avr

Disassembly of section .text:

00000000 <__vectors>:
   0:	0c 94 34 00 	jmp	0x68	; 0x68 <__ctors_end>
   4:	0c 94 3e 00 	jmp	0x7c	; 0x7c <__bad_interrupt>
   8:	0c 94 3e 00 	jmp	0x7c	; 0x7c <__bad_interrupt>
   c:	0c 94 3e 00 	jmp	0x7c	; 0x7c <__bad_interrupt>
  10:	0c 94 3e 00 	jmp	0x7c	; 0x7c <__bad_interrupt>
  14:	0c 94 3e 00 	jmp	0x7c	; 0x7c <__bad_interrupt>
  18:	0c 94 3e 00 	jmp	0x7c	; 0x7c <__bad_interrupt>
  1c:	0c 94 3e 00 	jmp	0x7c	; 0x7c <__bad_interrupt>
  20:	0c 94 3e 00 	jmp	0x7c	; 0x7c <__bad_interrupt>
  24:	0c 94 3e 00 	jmp	0x7c	; 0x7c <__bad_interrupt>
  28:	0c 94 3e 00 	jmp	0x7c	; 0x7c <__bad_interrupt>
  2c:	0c 94 3e 00 	jmp	0x7c	; 0x7c <__bad_interrupt>
  30:	0c 94 3e 00 	jmp	0x7c	; 0x7c <__bad_interrupt>
  34:	0c 94 3e 00 	jmp	0x7c	; 0x7c <__bad_interrupt>
  38:	0c 94 3e 00 	jmp	0x7c	; 0x7c <__bad_interrupt>
  3c:	0c 94 3e 00 	jmp	0x7c	; 0x7c <__bad_interrupt>
  40:	0c 94 3e 00 	jmp	0x7c	; 0x7c <__bad_interrupt>
  44:	0c 94 40 00 	jmp	0x80	; 0x80 <__vector_17>
  48:	0c 94 3e 00 	jmp	0x7c	; 0x7c <__bad_interrupt>
  4c:	0c 94 3e 00 	jmp	0x7c	; 0x7c <__bad_interrupt>
  50:	0c 94 3e 00 	jmp	0x7c	; 0x7c <__bad_interrupt>
  54:	0c 94 3e 00 	jmp	0x7c	; 0x7c <__bad_interrupt>
  58:	0c 94 3e 00 	jmp	0x7c	; 0x7c <__bad_interrupt>
  5c:	0c 94 3e 00 	jmp	0x7c	; 0x7c <__bad_interrupt>
  60:	0c 94 3e 00 	jmp	0x7c	; 0x7c <__bad_interrupt>
  64:	0c 94 3e 00 	jmp	0x7c	; 0x7c <__bad_interrupt>

00000068 <__ctors_end>:
  68:	11 24       	eor	r1, r1
  6a:	1f be       	out	0x3f, r1	; 63
  6c:	cf ef       	ldi	r28, 0xFF	; 255
  6e:	d8 e0       	ldi	r29, 0x08	; 8
  70:	de bf       	out	0x3e, r29	; 62
  72:	cd bf       	out	0x3d, r28	; 61
  74:	0e 94 4a 00 	call	0x94	; 0x94 <main>
  78:	0c 94 4b 00 	jmp	0x96	; 0x96 <_exit>

0000007c <__bad_interrupt>:
  7c:	0c 94 00 00 	jmp	0	; 0x0 <__vectors>

00000080 <__vector_17>:
#include <avr/io.h>
#include <avr/interrupt.h>

ISR(SPI_STC_vect) {
  80:	1f 92       	push	r1
  82:	0f 92       	push	r0
  84:	0f b6       	in	r0, 0x3f	; 63
  86:	0f 92       	push	r0
  88:	11 24       	eor	r1, r1
}
  8a:	0f 90       	pop	r0
  8c:	0f be       	out	0x3f, r0	; 63
  8e:	0f 90       	pop	r0
  90:	1f 90       	pop	r1
  92:	18 95       	reti

00000094 <main>:

int main(void) {
  94:	ff cf       	rjmp	.-2      	; 0x94 <main>

00000096 <_exit>:
  96:	f8 94       	cli

00000098 <__stop_program>:
  98:	ff cf       	rjmp	.-2      	; 0x98 <__stop_program>

 

$ cat spi_vect_xmega_test.c
#include <avr/io.h>
#include <avr/interrupt.h>

ISR(SPIC_INT_vect) {
}

int main(void) {
  while(1);
}

$ avr-gcc -Wall -g -O1 -mmcu=atxmega64d3 spi_vect_xmega_test.c -o spi_vect_xmega_test.elf
$ avr-objdump -S spi_vect_xmega_test.elf

spi_vect_test.elf:     file format elf32-avr

Disassembly of section .text:

00000000 <__vectors>:
   0:	0c 94 e4 00 	jmp	0x1c8	; 0x1c8 <__ctors_end>
   4:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
   8:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
   c:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
  10:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
  14:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
  18:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
  1c:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
  20:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
  24:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
  28:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
  2c:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
  30:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
  34:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
  38:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
  3c:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
  40:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
  44:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
  48:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
  4c:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
  50:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
  54:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
  58:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
  5c:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
  60:	0c 94 f0 00 	jmp	0x1e0	; 0x1e0 <__vector_24>
  64:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
  68:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
  6c:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
  70:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
  74:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
  78:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
  7c:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
  80:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
  84:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
  88:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
  8c:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
  90:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
  94:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
  98:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
  9c:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
  a0:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
  a4:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
  a8:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
  ac:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
  b0:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
  b4:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
  b8:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
  bc:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
  c0:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
  c4:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
  c8:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
  cc:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
  d0:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
  d4:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
  d8:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
  dc:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
  e0:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
  e4:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
  e8:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
  ec:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
  f0:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
  f4:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
  f8:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
  fc:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
 100:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
 104:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
 108:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
 10c:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
 110:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
 114:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
 118:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
 11c:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
 120:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
 124:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
 128:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
 12c:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
 130:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
 134:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
 138:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
 13c:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
 140:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
 144:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
 148:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
 14c:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
 150:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
 154:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
 158:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
 15c:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
 160:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
 164:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
 168:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
 16c:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
 170:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
 174:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
 178:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
 17c:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
 180:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
 184:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
 188:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
 18c:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
 190:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
 194:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
 198:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
 19c:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
 1a0:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
 1a4:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
 1a8:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
 1ac:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
 1b0:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
 1b4:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
 1b8:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
 1bc:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
 1c0:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>
 1c4:	0c 94 ee 00 	jmp	0x1dc	; 0x1dc <__bad_interrupt>

000001c8 <__ctors_end>:
 1c8:	11 24       	eor	r1, r1
 1ca:	1f be       	out	0x3f, r1	; 63
 1cc:	cf ef       	ldi	r28, 0xFF	; 255
 1ce:	cd bf       	out	0x3d, r28	; 61
 1d0:	df e2       	ldi	r29, 0x2F	; 47
 1d2:	de bf       	out	0x3e, r29	; 62
 1d4:	0e 94 fa 00 	call	0x1f4	; 0x1f4 <main>
 1d8:	0c 94 fb 00 	jmp	0x1f6	; 0x1f6 <_exit>

000001dc <__bad_interrupt>:
 1dc:	0c 94 00 00 	jmp	0	; 0x0 <__vectors>

000001e0 <__vector_24>:
#include <avr/io.h>
#include <avr/interrupt.h>

ISR(SPIC_INT_vect) {
 1e0:	1f 92       	push	r1
 1e2:	0f 92       	push	r0
 1e4:	0f b6       	in	r0, 0x3f	; 63
 1e6:	0f 92       	push	r0
 1e8:	11 24       	eor	r1, r1
}
 1ea:	0f 90       	pop	r0
 1ec:	0f be       	out	0x3f, r0	; 63
 1ee:	0f 90       	pop	r0
 1f0:	1f 90       	pop	r1
 1f2:	18 95       	reti

000001f4 <main>:

int main(void) {
 1f4:	ff cf       	rjmp	.-2      	; 0x1f4 <main>

000001f6 <_exit>:
 1f6:	f8 94       	cli

000001f8 <__stop_program>:
 1f8:	ff cf       	rjmp	.-2      	; 0x1f8 <__stop_program>

EDIT: copy/paste error in avr-gcc command line for xmega

"Experience is what enables you to recognise a mistake the second time you make it."

"Good judgement comes from experience.  Experience comes from bad judgement."

"When you hear hoofbeats, think horses, not unicorns."

"Fast.  Cheap.  Good.  Pick two."

"Read a lot.  Write a lot."

"We see a lot of arses on handlebars around here." - [J Ekdahl]

 

Last Edited: Sat. Feb 18, 2017 - 05:32 PM
  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

Thank you, this is very interesting.

I just looked at my old projects for the mega1284p. I never cleared any interrupt flag in the C code, and yet this was never a problem. On the Xmega, it HAS to be done or the ISR gets called again and again.

 

Could it be that this is not a matter of code but of the hardware? The Xmegas have a multi level interrupt controller, the megas do not. Also, the peripherals are all slightly different.

So maybe you don't have to clear the flags on the megas and it still works? Maybe they do it automatically in hardware when the interrupt vector is called?

 

-Patrick

"Some people die at 25 and aren't buried until 75." -Benjamin Franklin

 

What is life's greatest illusion?"  "Innocence, my brother." -Skyrim

 

  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

To my knowledge there is no difference between mega/tiny and xmega in that regard.

 

mega:

 

xmega (D3):

 

However, I've not worked with xmega, so someone may be along to set us straight.

"Experience is what enables you to recognise a mistake the second time you make it."

"Good judgement comes from experience.  Experience comes from bad judgement."

"When you hear hoofbeats, think horses, not unicorns."

"Fast.  Cheap.  Good.  Pick two."

"Read a lot.  Write a lot."

"We see a lot of arses on handlebars around here." - [J Ekdahl]

 

  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

Just my 2 cents, I've been using a lot of different interrupts on a XMEGA256A3U and the interrupt flags are cleared by the hardware.

  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

I found out why I believed that interrupt flags need to be reset by software on the Xmega.

The one interrupt I use the most, which is the timer overflow, is actually not reset by hardware. I could confirm this both in the actual hardware and the simulator on the Xmega32e5. And the datasheet also doesn't say it is.

So I guess the lesson learned here is that it's always a good idea to look that up each time in the datasheet.

-Patrick

"Some people die at 25 and aren't buried until 75." -Benjamin Franklin

 

What is life's greatest illusion?"  "Innocence, my brother." -Skyrim