Перейти к содержанию
    

Какие есть особенности инициализации UART2 и UART3 в atmega2560?

UART0, UART1 работают, а у второго и третьего каналов прерывания не идут. Инициализирую UART-ы одинаково, только номера меняю. Пример для UART0

 

volatile unsigned char FlagTx_0 = 1;

volatile unsigned char FlagTx_1 = 1;

volatile unsigned char FlagTx_2 = 1;

volatile unsigned char FlagTx_3 = 1;

volatile char Buff[10];

void StartTX_0(void)

{

FlagTx_0 = 0;

 

UCSR0C |= ((1 << UCSZ00) | (1 << UCSZ01));

UBRR0L = 14; // fosc = 13.824 MHz U2X = 0 BR = 57.6k

UBRR0H = 0;

UDR0 = Buff[0];

CountTx_0 = 1;

UCSR0B |= ((1 << TXEN0) | (1 << UDRIE0));

}

 

ISR (USART0_TX_vect)

{

FlagTx_0 = 1;

UCSR0B &=~ ((1 << TXCIE0) | (1 << TXEN0) | (1 << UDRIE0));

}

 

ISR (USART0_UDRE_vect)

{

UDR0 = Buff [CountTx_0];

 

CountTx_0++;

if (CountTx_0 == sizeof(Buff))

{

UCSR0B &=~ (1 << UDRIE0);

UCSR0B |= (1 << TXCIE0);

return;

}

}

Сразу скажу, может не всё запрограммировано строго по правилам, но первые два канала работают, а вторые два нет. Ератта молчит.

Регистры PRR0 и PRR1 проверял.

Что не так делаю. Поделитесь кодом правильной работы с этими каналами.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

UART0, UART1 работают, а у второго и третьего каналов прерывания не идут. Инициализирую UART-ы одинаково, только номера меняю. Пример для UART0

В падло разбираться. :))

Посмотри мой пример.

Работают все КОМы (уже не помню 2 года назад было)

 

 

FOSC - частота кварца :))

Uart_TX_RX.txt

Изменено пользователем Juk1976

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

UART0, UART1 работают, а у второго и третьего каналов прерывания не идут.
Ежели вдруг в AVRStudio их ждёте, то и не пойдут - known issue...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В падло разбираться. :))

Посмотри мой пример.

Работают все КОМы (уже не помню 2 года назад было)

 

 

FOSC - частота кварца :))

Ваш код сейчас попробовать не могу, только вечером, но он очень похож на мой. Проверяю дёрганием пинов.

А Вы для ATMega2560 проверяли?

 

Ежели вдруг в AVRStudio их ждёте, то и не пойдут - known issue...

Да, у меня AVRStudio+WINAVR. Но прерывания не идут не только в Studio, но и на живой плате.

Где про «known issue...» прочитать?

 

Может мне битый китаец попался?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ваш код сейчас попробовать не могу, только вечером, но он очень похож на мой. Проверяю дёрганием пинов.

А Вы для ATMega2560 проверяли?

 

 

Да, у меня AVRStudio+WINAVR. Но прерывания не идут не только в Studio, но и на живой плате.

Где про «known issue...» прочитать?

 

Может мне битый китаец попался?

Я под IARку писал.

Проверка на живом железе :))

1 uart на комп

2,3 - на измерение/управление (дальше rs485)

4 - на плату индикации (тоже RS485)

 

Блок на водоканале стоит

На те времена проще было RS нежели USB

:))

 

P.S.

Ни на одном камне (почти со всеми атмелами где есть uart работал) проблем со связью не было

особенности были но после скуривания соответствующих страниц даташита они уходили :))

Изменено пользователем Juk1976

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня тоже ни когда с этим проблем не было. Предыдущая версия устройства на ATMega128 работает без вопросов и на других камнях тоже без вопросов UART работает. Пришло время расширять функциональность, выбрал ATMega2560, и тут засада, откуда не ждали! И мне уже не важно есть ли прерывания в эмуляторе, лишь бы они в железе были. Для теста все 4 канала инициализирую одинаково, а работают они по разному. Я уж думаю, не попал ли я на левак, но куплены МК в Терре.

Описание UART-а на все 4 канала одно, ни каких особенностей инициализации по каналам не вижу, может, просто не вижу.

особенности были но после скуривания соответствующих страниц даташита они уходили :))

Я не курящий, но для решения моей проблемы можно и поступится:) Подскажите какие страницы в даташите скуривать нужно?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для теста все 4 канала инициализирую одинаково...
Покажите код для 2 и 3 (тег codebox используйте). Может, просто очепятка где...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вспоминается мне один нюанс.

В DS описывается четкая временная последовательность при чтении-записи вроде как регистра UCSRC совмещённого с UBRRH.

Хоть в меге2560 вроде как бита URSEL нет, но может мой опыт кому-нибудь ещё будет полезен...

 

Я наткнулся на эти грабли когда делал универсальный модуль для работы с UARTами.

Я делал всё через хендлы-дескрипторы (структуры с указателями на регистры проще говоря) и вдруг всё перестало работать.

Причина - косвенная адресация. Нарушилась временная последовательность и аля-улю...

Решил я это путём кеширования регистра UCSRC в дескрипторе порта.

К чему это я всё говорю. В вашем случае может быть (а может и не быть) схожая ситуация, порождённая тем, что регистры 2-го и 3-го UART'ов находятся в более старших адресах RAMы где возможно применяются другие asm-инструкции.

Вы просто смёржите два asm-листинга вашей программы.

Может моя догадка верна...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Покажите код для 2 и 3 (тег codebox используйте). Может, просто очепятка где...

Код, как он есть

#include "PortDefine.h"	 
#include "InitIO.h"
#include <string.h>


volatile unsigned char CountTx_0 = 0;
volatile unsigned char CountTx_1 = 0;
volatile unsigned char CountTx_2 = 0;
volatile unsigned char CountTx_3 = 0;

volatile unsigned char FlagTx_0 = 1;
volatile unsigned char FlagTx_1 = 1;
volatile unsigned char FlagTx_2 = 1;
volatile unsigned char FlagTx_3 = 1;
volatile char Buff[10];
void StartTX_0(void)
{
	PORTF |= (1 << 0);

FlagTx_0 = 0;

UCSR0C	  |= ((1 << UCSZ00) | (1 << UCSZ01));
UBRR0H	  = 0;
UBRR0L	  = 14; // fosc = 13.824 MHz U2X = 0 BR = 57.6k
UDR0		= Buff[0];
CountTx_0   = 1;
UCSR0B	  |= ((1 << TXEN0) | (1 << UDRIE0));
}

ISR (USART0_TX_vect)
{
FlagTx_0 = 1;
UCSR0B &=~ ((1 << TXCIE0) | (1 << TXEN0) | (1 << UDRIE0));
}


ISR (USART0_UDRE_vect)
{
PORTF &=~ (1 << 0);

UDR0 = Buff [CountTx_0];

CountTx_0++;
if (CountTx_0 == sizeof(Buff))
{
	UCSR0B &=~ (1 << UDRIE0);
	UCSR0B |= (1 << TXCIE0);
	return;
}
}

void StartTX_1(void)
{
FlagTx_1 = 0;

UCSR1C	  |= ((1 << UCSZ10) | (1 << UCSZ11));
UBRR1H	  = 0;
UBRR1L	  = 14; // fosc = 13.824 MHz U2X = 0 BR = 57.6k
UDR1		= Buff[0];
CountTx_1   = 1;
UCSR1B	  |= ((1 << TXEN1) | (1 << UDRIE1));
}

ISR (USART1_TX_vect)
{
FlagTx_1 = 1;

UCSR1B &=~ ((1 << TXCIE1) | (1 << TXEN1) | (1 << UDRIE1));
}

ISR (USART1_UDRE_vect)
{
UDR1 = Buff [CountTx_1];

CountTx_1++;
if (CountTx_1 == sizeof(Buff))
{
	UCSR1B &=~ (1 << UDRIE1);
	UCSR1B |= (1 << TXCIE1);
	return;
}
}

void StartTX_2(void)
{
FlagTx_2 = 0;

PRR1		&=~ (1 << PRUSART2);
UCSR2C	  |= ((1 << UCSZ20) | (1 << UCSZ21));
UBRR2H	  = 0;
UBRR2L	  = 14; // fosc = 13.824 MHz U2X = 0 BR = 57.6k
UDR2		= Buff[0];
CountTx_2   = 1;
UCSR2B	  |= ((1 << TXEN2) | (1 << UDRIE2));
}

ISR (USART2_TX_vect)
{
FlagTx_2 = 1;

UCSR2B &=~ ((1 << TXCIE2) | (1 << TXEN2) | (1 << UDRIE2));
}

ISR (USART2_UDRE_vect)
{
UDR2 = Buff [CountTx_2];

CountTx_2++;
if (CountTx_2 == sizeof(Buff))
{
	UCSR2B &=~ (1 << UDRIE2);
	UCSR2B |= (1 << TXCIE2);
	return;
}
}

void StartTX_3(void)
{
	PORTF |= (1 << 0);

FlagTx_3 = 0;

PRR1		&=~ (1 << PRUSART3);
UCSR3C	  |= ((1 << UCSZ30) | (1 << UCSZ31));
UBRR3H	  = 0;
UBRR3L	  = 14; // fosc = 13.824 MHz U2X = 0 BR = 57.6k
UDR3		= Buff[0];
CountTx_3   = 1;
UCSR3B	  |= ((1 << TXEN3) | (1 << UDRIE3));
}

ISR (USART3_TX_vect)
{
FlagTx_3 = 1;

UCSR3B &=~ ((1 << TXCIE3) | (1 << TXEN3) | (1 << UDRIE3));
}

ISR (USART3_UDRE_vect)
{
	PORTF &=~ (1 << 0);

UDR3 = Buff [CountTx_3];

CountTx_3++;
if (CountTx_3 == sizeof(Buff))
{
	UCSR3B &=~ (1 << UDRIE3);
	UCSR3B |= (1 << TXCIE3);
	return;
}
}

 

Ещё ассемблер гляну, сравню 0 и 3.

Может моя догадка верна...

Принимаю и отрабатываю любые предложения.

Изменено пользователем IgorKossak
Бездумное оформление кода

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Прошу прощение за объёмы кода.

 

Ассемблер код инициализации UART0 и прерываний.

58:	   {
+000003E7:   9A88		SBI	 0x11,0		   Set bit in I/O register
61:		   FlagTx_0 = 0;
+000003E8:   92100226	STS	 0x0226,R1		Store direct to data space
63:		   UCSR0C	  |= ((1 << UCSZ00) | (1 << UCSZ01));
+000003EA:   ECE2		LDI	 R30,0xC2		 Load immediate
+000003EB:   E0F0		LDI	 R31,0x00		 Load immediate
+000003EC:   8180		LDD	 R24,Z+0		  Load indirect with displacement
+000003ED:   6086		ORI	 R24,0x06		 Logical OR with immediate
+000003EE:   8380		STD	 Z+0,R24		  Store indirect with displacement
64:		   UBRR0H	  = 0;
+000003EF:   921000C5	STS	 0x00C5,R1		Store direct to data space
65:		   UBRR0L	  = 14; // fosc = 13.824 MHz U2X = 0 BR = 57.6k
+000003F1:   E08E		LDI	 R24,0x0E		 Load immediate
+000003F2:   938000C4	STS	 0x00C4,R24	   Store direct to data space
66:		   UDR0		= Buff[0];
+000003F4:   91800857	LDS	 R24,0x0857	   Load direct from data space
+000003F6:   938000C6	STS	 0x00C6,R24	   Store direct to data space
67:		   CountTx_0   = 1;
+000003F8:   E081		LDI	 R24,0x01		 Load immediate
+000003F9:   93800246	STS	 0x0246,R24	   Store direct to data space
68:		   UCSR0B	  |= ((1 << TXEN0) | (1 << UDRIE0));
+000003FB:   ECE1		LDI	 R30,0xC1		 Load immediate
+000003FC:   E0F0		LDI	 R31,0x00		 Load immediate
+000003FD:   8180		LDD	 R24,Z+0		  Load indirect with displacement
+000003FE:   6288		ORI	 R24,0x28		 Logical OR with immediate
+000003FF:   8380		STD	 Z+0,R24		  Store indirect with displacement
69:	   }
+00000400:   9508		RET					  Subroutine return
@00000401: __vector_27
72:	   {
+00000401:   921F		PUSH	R1			   Push register on stack
+00000402:   920F		PUSH	R0			   Push register on stack
+00000403:   B60F		IN	  R0,0x3F		  In from I/O location
+00000404:   920F		PUSH	R0			   Push register on stack
+00000405:   B60B		IN	  R0,0x3B		  In from I/O location
+00000406:   920F		PUSH	R0			   Push register on stack
+00000407:   2411		CLR	 R1			   Clear Register
+00000408:   938F		PUSH	R24			  Push register on stack
+00000409:   93EF		PUSH	R30			  Push register on stack
+0000040A:   93FF		PUSH	R31			  Push register on stack
73:		   FlagTx_0 = 1;
+0000040B:   E081		LDI	 R24,0x01		 Load immediate
+0000040C:   93800226	STS	 0x0226,R24	   Store direct to data space
74:		   UCSR0B &=~ ((1 << TXCIE0) | (1 << TXEN0) | (1 << UDRIE0));
+0000040E:   ECE1		LDI	 R30,0xC1		 Load immediate
+0000040F:   E0F0		LDI	 R31,0x00		 Load immediate
+00000410:   8180		LDD	 R24,Z+0		  Load indirect with displacement
+00000411:   7987		ANDI	R24,0x97		 Logical AND with immediate
+00000412:   8380		STD	 Z+0,R24		  Store indirect with displacement
75:	   }
+00000413:   91FF		POP	 R31			  Pop register from stack
+00000414:   91EF		POP	 R30			  Pop register from stack
+00000415:   918F		POP	 R24			  Pop register from stack
+00000416:   900F		POP	 R0			   Pop register from stack
+00000417:   BE0B		OUT	 0x3B,R0		  Out to I/O location
+00000418:   900F		POP	 R0			   Pop register from stack
+00000419:   BE0F		OUT	 0x3F,R0		  Out to I/O location
+0000041A:   900F		POP	 R0			   Pop register from stack
+0000041B:   901F		POP	 R1			   Pop register from stack
+0000041C:   9518		RETI					 Interrupt return
@0000041D: __vector_26
79:	   {
+0000041D:   921F		PUSH	R1			   Push register on stack
+0000041E:   920F		PUSH	R0			   Push register on stack
+0000041F:   B60F		IN	  R0,0x3F		  In from I/O location
+00000420:   920F		PUSH	R0			   Push register on stack
+00000421:   B60B		IN	  R0,0x3B		  In from I/O location
+00000422:   920F		PUSH	R0			   Push register on stack
+00000423:   2411		CLR	 R1			   Clear Register
+00000424:   938F		PUSH	R24			  Push register on stack
+00000425:   93EF		PUSH	R30			  Push register on stack
+00000426:   93FF		PUSH	R31			  Push register on stack
80:		   PORTF &=~ (1 << 0);
+00000427:   9888		CBI	 0x11,0		   Clear bit in I/O register
82:		   UDR0 = Buff [CountTx_0];
+00000428:   91E00246	LDS	 R30,0x0246	   Load direct from data space
+0000042A:   E0F0		LDI	 R31,0x00		 Load immediate
+0000042B:   5AE9		SUBI	R30,0xA9		 Subtract immediate
+0000042C:   4FF7		SBCI	R31,0xF7		 Subtract immediate with carry
+0000042D:   8180		LDD	 R24,Z+0		  Load indirect with displacement
+0000042E:   938000C6	STS	 0x00C6,R24	   Store direct to data space
84:		   CountTx_0++;
+00000430:   91800246	LDS	 R24,0x0246	   Load direct from data space
+00000432:   5F8F		SUBI	R24,0xFF		 Subtract immediate
+00000433:   93800246	STS	 0x0246,R24	   Store direct to data space
85:		   if (CountTx_0 == sizeof(Buff))
+00000435:   91800246	LDS	 R24,0x0246	   Load direct from data space
+00000437:   308A		CPI	 R24,0x0A		 Compare with immediate
+00000438:   F451		BRNE	PC+0x0B		  Branch if not equal
87:			   UCSR0B &=~ (1 << UDRIE0);
+00000439:   918000C1	LDS	 R24,0x00C1	   Load direct from data space
+0000043B:   7D8F		ANDI	R24,0xDF		 Logical AND with immediate
+0000043C:   938000C1	STS	 0x00C1,R24	   Store direct to data space
88:			   UCSR0B |= (1 << TXCIE0);
+0000043E:   918000C1	LDS	 R24,0x00C1	   Load direct from data space
+00000440:   6480		ORI	 R24,0x40		 Logical OR with immediate
+00000441:   938000C1	STS	 0x00C1,R24	   Store direct to data space
91:	   }
+00000443:   91FF		POP	 R31			  Pop register from stack
+00000444:   91EF		POP	 R30			  Pop register from stack
+00000445:   918F		POP	 R24			  Pop register from stack
+00000446:   900F		POP	 R0			   Pop register from stack
+00000447:   BE0B		OUT	 0x3B,R0		  Out to I/O location
+00000448:   900F		POP	 R0			   Pop register from stack
+00000449:   BE0F		OUT	 0x3F,R0		  Out to I/O location
+0000044A:   900F		POP	 R0			   Pop register from stack
+0000044B:   901F		POP	 R1			   Pop register from stack
+0000044C:   9518		RETI					 Interrupt return

 

 

Ассемблер код инициализации UART3 и прерываний.

159:	  {
+0000051A:   9A88		SBI	 0x11,0		   Set bit in I/O register
162:		  FlagTx_3 = 0;
+0000051B:   92100229	STS	 0x0229,R1		Store direct to data space
164:		  UCSR3C	  |= ((1 << UCSZ30) | (1 << UCSZ31));
+0000051D:   E3E2		LDI	 R30,0x32		 Load immediate
+0000051E:   E0F1		LDI	 R31,0x01		 Load immediate
+0000051F:   8180		LDD	 R24,Z+0		  Load indirect with displacement
+00000520:   6086		ORI	 R24,0x06		 Logical OR with immediate
+00000521:   8380		STD	 Z+0,R24		  Store indirect with displacement
165:		  UBRR3H	  = 0;
+00000522:   92100135	STS	 0x0135,R1		Store direct to data space
166:		  UBRR3L	  = 14; // fosc = 13.824 MHz U2X = 0 BR = 57.6k
+00000524:   E08E		LDI	 R24,0x0E		 Load immediate
+00000525:   93800134	STS	 0x0134,R24	   Store direct to data space
167:		  UDR3		= Buff[0];
+00000527:   91800857	LDS	 R24,0x0857	   Load direct from data space
+00000529:   93800136	STS	 0x0136,R24	   Store direct to data space
168:		  CountTx_3   = 1;
+0000052B:   E081		LDI	 R24,0x01		 Load immediate
+0000052C:   9380024E	STS	 0x024E,R24	   Store direct to data space
169:		  UCSR3B	  |= ((1 << TXEN3) | (1 << UDRIE3));
+0000052E:   E3E1		LDI	 R30,0x31		 Load immediate
+0000052F:   E0F1		LDI	 R31,0x01		 Load immediate
+00000530:   8180		LDD	 R24,Z+0		  Load indirect with displacement
+00000531:   6288		ORI	 R24,0x28		 Logical OR with immediate
+00000532:   8380		STD	 Z+0,R24		  Store indirect with displacement
170:	  }
+00000533:   9508		RET					  Subroutine return
@00000534: __vector_56
173:	  {
+00000534:   921F		PUSH	R1			   Push register on stack
+00000535:   920F		PUSH	R0			   Push register on stack
+00000536:   B60F		IN	  R0,0x3F		  In from I/O location
+00000537:   920F		PUSH	R0			   Push register on stack
+00000538:   B60B		IN	  R0,0x3B		  In from I/O location
+00000539:   920F		PUSH	R0			   Push register on stack
+0000053A:   2411		CLR	 R1			   Clear Register
+0000053B:   938F		PUSH	R24			  Push register on stack
+0000053C:   93EF		PUSH	R30			  Push register on stack
+0000053D:   93FF		PUSH	R31			  Push register on stack
174:		  FlagTx_3 = 1;
+0000053E:   E081		LDI	 R24,0x01		 Load immediate
+0000053F:   93800229	STS	 0x0229,R24	   Store direct to data space
176:		  UCSR3B &=~ ((1 << TXCIE3) | (1 << TXEN3) | (1 << UDRIE3));
+00000541:   E3E1		LDI	 R30,0x31		 Load immediate
+00000542:   E0F1		LDI	 R31,0x01		 Load immediate
+00000543:   8180		LDD	 R24,Z+0		  Load indirect with displacement
+00000544:   7987		ANDI	R24,0x97		 Logical AND with immediate
+00000545:   8380		STD	 Z+0,R24		  Store indirect with displacement
177:	  }
+00000546:   91FF		POP	 R31			  Pop register from stack
+00000547:   91EF		POP	 R30			  Pop register from stack
+00000548:   918F		POP	 R24			  Pop register from stack
+00000549:   900F		POP	 R0			   Pop register from stack
+0000054A:   BE0B		OUT	 0x3B,R0		  Out to I/O location
+0000054B:   900F		POP	 R0			   Pop register from stack
+0000054C:   BE0F		OUT	 0x3F,R0		  Out to I/O location
+0000054D:   900F		POP	 R0			   Pop register from stack
+0000054E:   901F		POP	 R1			   Pop register from stack
+0000054F:   9518		RETI					 Interrupt return
@00000550: __vector_55
180:	  {
+00000550:   921F		PUSH	R1			   Push register on stack
+00000551:   920F		PUSH	R0			   Push register on stack
+00000552:   B60F		IN	  R0,0x3F		  In from I/O location
+00000553:   920F		PUSH	R0			   Push register on stack
+00000554:   B60B		IN	  R0,0x3B		  In from I/O location
+00000555:   920F		PUSH	R0			   Push register on stack
+00000556:   2411		CLR	 R1			   Clear Register
+00000557:   938F		PUSH	R24			  Push register on stack
+00000558:   93EF		PUSH	R30			  Push register on stack
+00000559:   93FF		PUSH	R31			  Push register on stack
181:			  PORTF &=~ (1 << 0);
+0000055A:   9888		CBI	 0x11,0		   Clear bit in I/O register
183:		  UDR3 = Buff [CountTx_3];
+0000055B:   91E0024E	LDS	 R30,0x024E	   Load direct from data space
+0000055D:   E0F0		LDI	 R31,0x00		 Load immediate
+0000055E:   5AE9		SUBI	R30,0xA9		 Subtract immediate
+0000055F:   4FF7		SBCI	R31,0xF7		 Subtract immediate with carry
+00000560:   8180		LDD	 R24,Z+0		  Load indirect with displacement
+00000561:   93800136	STS	 0x0136,R24	   Store direct to data space
185:		  CountTx_3++;
+00000563:   9180024E	LDS	 R24,0x024E	   Load direct from data space
+00000565:   5F8F		SUBI	R24,0xFF		 Subtract immediate
+00000566:   9380024E	STS	 0x024E,R24	   Store direct to data space
186:		  if (CountTx_3 == sizeof(Buff))
+00000568:   9180024E	LDS	 R24,0x024E	   Load direct from data space
+0000056A:   308A		CPI	 R24,0x0A		 Compare with immediate
+0000056B:   F451		BRNE	PC+0x0B		  Branch if not equal
188:			  UCSR3B &=~ (1 << UDRIE3);
+0000056C:   91800131	LDS	 R24,0x0131	   Load direct from data space
+0000056E:   7D8F		ANDI	R24,0xDF		 Logical AND with immediate
+0000056F:   93800131	STS	 0x0131,R24	   Store direct to data space
189:			  UCSR3B |= (1 << TXCIE3);
+00000571:   91800131	LDS	 R24,0x0131	   Load direct from data space
+00000573:   6480		ORI	 R24,0x40		 Logical OR with immediate
+00000574:   93800131	STS	 0x0131,R24	   Store direct to data space
192:	  }
+00000576:   91FF		POP	 R31			  Pop register from stack
+00000577:   91EF		POP	 R30			  Pop register from stack
+00000578:   918F		POP	 R24			  Pop register from stack
+00000579:   900F		POP	 R0			   Pop register from stack
+0000057A:   BE0B		OUT	 0x3B,R0		  Out to I/O location
+0000057B:   900F		POP	 R0			   Pop register from stack
+0000057C:   BE0F		OUT	 0x3F,R0		  Out to I/O location
+0000057D:   900F		POP	 R0			   Pop register from stack
+0000057E:   901F		POP	 R1			   Pop register from stack
+0000057F:   9518		RETI					 Interrupt return

Не вижу я тут ни чего особенного.

 

В дебагере видно, что регистры всех каналов инициализированы одинаково. Может это только в дебагере?

Изменено пользователем IgorKossak
Бездумное оформление кода

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Bug 47696 - [AVR] Compilation for atmega2560 produces incomplete interrupt vector table (USART2,3)

 

Проверьте таблицу векторов прерываний.

Bug свежепойманный, в WinAVR 2010 присутствует вроде бы... ...хм, посмотрел *.lss. Всё есть, и правильно, вроде бы.

 

PS: тег codebox же.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Bug 47696 - [AVR] Compilation for atmega2560 produces incomplete interrupt vector table (USART2,3)

 

Проверьте таблицу векторов прерываний.

Bug свежепойманный, в WinAVR 2010 присутствует вроде бы... ...хм, посмотрел *.lss. Всё есть, и правильно, вроде бы.

 

PS: тег codebox же.

Ни чего плохого в таблице прерываний не нахожу.

Привожу её полностью.

 +00000000:   940C0072    JMP     0x00000072       Jump
+00000002:   940C0093    JMP     0x00000093       Jump
+00000004:   940C0093    JMP     0x00000093       Jump
+00000006:   940C0093    JMP     0x00000093       Jump
+00000008:   940C0093    JMP     0x00000093       Jump
+0000000A:   940C0093    JMP     0x00000093       Jump
+0000000C:   940C0093    JMP     0x00000093       Jump
+0000000E:   940C0093    JMP     0x00000093       Jump
+00000010:   940C0093    JMP     0x00000093       Jump
+00000012:   940C0093    JMP     0x00000093       Jump
+00000014:   940C0093    JMP     0x00000093       Jump
+00000016:   940C0093    JMP     0x00000093       Jump
+00000018:   940C0093    JMP     0x00000093       Jump
+0000001A:   940C0093    JMP     0x00000093       Jump
+0000001C:   940C0093    JMP     0x00000093       Jump
+0000001E:   940C0093    JMP     0x00000093       Jump
+00000020:   940C0093    JMP     0x00000093       Jump
+00000022:   940C0093    JMP     0x00000093       Jump
+00000024:   940C0093    JMP     0x00000093       Jump
+00000026:   940C0093    JMP     0x00000093       Jump
+00000028:   940C0093    JMP     0x00000093       Jump
+0000002A:   940C0119    JMP     0x00000119       Jump
+0000002C:   940C0093    JMP     0x00000093       Jump
+0000002E:   940C0093    JMP     0x00000093       Jump
+00000030:   940C0093    JMP     0x00000093       Jump
+00000032:   940C0093    JMP     0x00000093       Jump
+00000034:   940C041E    JMP     0x0000041E       Jump
+00000036:   940C0402    JMP     0x00000402       Jump
+00000038:   940C0093    JMP     0x00000093       Jump
+0000003A:   940C010A    JMP     0x0000010A       Jump
+0000003C:   940C0093    JMP     0x00000093       Jump
+0000003E:   940C0093    JMP     0x00000093       Jump
+00000040:   940C0093    JMP     0x00000093       Jump
+00000042:   940C0093    JMP     0x00000093       Jump
+00000044:   940C0093    JMP     0x00000093       Jump
+00000046:   940C0093    JMP     0x00000093       Jump
+00000048:   940C0093    JMP     0x00000093       Jump
+0000004A:   940C0484    JMP     0x00000484       Jump
+0000004C:   940C0468    JMP     0x00000468       Jump
+0000004E:   940C0093    JMP     0x00000093       Jump
+00000050:   940C0093    JMP     0x00000093       Jump
+00000052:   940C0093    JMP     0x00000093       Jump
+00000054:   940C0093    JMP     0x00000093       Jump
+00000056:   940C0093    JMP     0x00000093       Jump
+00000058:   940C0093    JMP     0x00000093       Jump
+0000005A:   940C0093    JMP     0x00000093       Jump
+0000005C:   940C0093    JMP     0x00000093       Jump
+0000005E:   940C0093    JMP     0x00000093       Jump
+00000060:   940C0093    JMP     0x00000093       Jump
+00000062:   940C0093    JMP     0x00000093       Jump
+00000064:   940C0093    JMP     0x00000093       Jump
+00000066:   940C0093    JMP     0x00000093       Jump
+00000068:   940C04EE    JMP     0x000004EE       Jump
+0000006A:   940C04D2    JMP     0x000004D2       Jump
+0000006C:   940C0093    JMP     0x00000093       Jump
+0000006E:   940C0554    JMP     0x00000554       Jump
+00000070:   940C0538    JMP     0x00000538       Jump

Первые строки обработчиков прерываний UDRE

 @0000041E: __vector_26
80:       {
+0000041E:   921F        PUSH    R1               Push register on stack

@00000484: __vector_37
115:      {
+00000484:   921F        PUSH    R1               Push register on stack

@000004EE: __vector_52
149:      {
+000004EE:   921F        PUSH    R1               Push register on stack

@00000554: __vector_55
184:      {
+00000554:   921F        PUSH    R1               Push register on stack

 

Возможно это то самый баг, который Вы указали, но как его обойти в WinAVR-20100110 не знаю. Рекомендации даны для gcc.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

AVCC к питанию подключен? PORTF питается от него, наличие прерываний по импульсам на PF0 проверяете?..

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

AVCC через LC (рекомендованный) фильтр подключен к питанию. PORTF используя как порт OUT, 0 и 1 пины использую для контроля возникновения прерываний.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может дело не в uart'е? Вы же не зря атмегу2560 выбрали, вам известно что у gcc по дефолту проблемы с использованием кода в старших 128к? Без заморочек с trampoline секцией, вызовы функций(находящихся в старших 128к) по указателю приводит к попаданию на левые адреса. Я не утверждаю что проблема в этом, но как вариант проверить стоит.

 

То есть прерывания есть, но в обработчики, которые вне тела прерывания(в супер петле, ну или что там вы используете) вы не попадаете.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...