Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Какие есть особенности инициализации UART2 и UART3 в atmega2560?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Oleg_IT
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 проверял.
Что не так делаю. Поделитесь кодом правильной работы с этими каналами.
Juk1976
Цитата(Oleg_IT @ Feb 23 2011, 23:49) *
UART0, UART1 работают, а у второго и третьего каналов прерывания не идут. Инициализирую UART-ы одинаково, только номера меняю. Пример для UART0

В падло разбираться. sm.gif)
Посмотри мой пример.
Работают все КОМы (уже не помню 2 года назад было)


FOSC - частота кварца sm.gif)
SysRq
Цитата(Oleg_IT @ Feb 23 2011, 23:49) *
UART0, UART1 работают, а у второго и третьего каналов прерывания не идут.
Ежели вдруг в AVRStudio их ждёте, то и не пойдут - known issue...
Oleg_IT
Цитата(Juk1976 @ Feb 24 2011, 00:40) *
В падло разбираться. sm.gif)
Посмотри мой пример.
Работают все КОМы (уже не помню 2 года назад было)


FOSC - частота кварца sm.gif)

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

Цитата(SysRq @ Feb 24 2011, 02:20) *
Ежели вдруг в AVRStudio их ждёте, то и не пойдут - known issue...

Да, у меня AVRStudio+WINAVR. Но прерывания не идут не только в Studio, но и на живой плате.
Где про «known issue...» прочитать?

Может мне битый китаец попался?
Juk1976
Цитата(Oleg_IT @ Feb 25 2011, 13:01) *
Ваш код сейчас попробовать не могу, только вечером, но он очень похож на мой. Проверяю дёрганием пинов.
А Вы для ATMega2560 проверяли?


Да, у меня AVRStudio+WINAVR. Но прерывания не идут не только в Studio, но и на живой плате.
Где про «known issue...» прочитать?

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

Я под IARку писал.
Проверка на живом железе sm.gif)
1 uart на комп
2,3 - на измерение/управление (дальше rs485)
4 - на плату индикации (тоже RS485)

Блок на водоканале стоит
На те времена проще было RS нежели USB
sm.gif)

P.S.
Ни на одном камне (почти со всеми атмелами где есть uart работал) проблем со связью не было
особенности были но после скуривания соответствующих страниц даташита они уходили sm.gif)
Oleg_IT
У меня тоже ни когда с этим проблем не было. Предыдущая версия устройства на ATMega128 работает без вопросов и на других камнях тоже без вопросов UART работает. Пришло время расширять функциональность, выбрал ATMega2560, и тут засада, откуда не ждали! И мне уже не важно есть ли прерывания в эмуляторе, лишь бы они в железе были. Для теста все 4 канала инициализирую одинаково, а работают они по разному. Я уж думаю, не попал ли я на левак, но куплены МК в Терре.
Описание UART-а на все 4 канала одно, ни каких особенностей инициализации по каналам не вижу, может, просто не вижу.
Цитата(Juk1976 @ Feb 25 2011, 23:42) *
особенности были но после скуривания соответствующих страниц даташита они уходили sm.gif)

Я не курящий, но для решения моей проблемы можно и поступитсяsm.gif Подскажите какие страницы в даташите скуривать нужно?
SysRq
Цитата(Oleg_IT @ Feb 26 2011, 10:12) *
Для теста все 4 канала инициализирую одинаково...
Покажите код для 2 и 3 (тег codebox используйте). Может, просто очепятка где...
demiurg_spb
Вспоминается мне один нюанс.
В DS описывается четкая временная последовательность при чтении-записи вроде как регистра UCSRC совмещённого с UBRRH.
Хоть в меге2560 вроде как бита URSEL нет, но может мой опыт кому-нибудь ещё будет полезен...

Я наткнулся на эти грабли когда делал универсальный модуль для работы с UARTами.
Я делал всё через хендлы-дескрипторы (структуры с указателями на регистры проще говоря) и вдруг всё перестало работать.
Причина - косвенная адресация. Нарушилась временная последовательность и аля-улю...
Решил я это путём кеширования регистра UCSRC в дескрипторе порта.
К чему это я всё говорю. В вашем случае может быть (а может и не быть) схожая ситуация, порождённая тем, что регистры 2-го и 3-го UART'ов находятся в более старших адресах RAMы где возможно применяются другие asm-инструкции.
Вы просто смёржите два asm-листинга вашей программы.
Может моя догадка верна...
Oleg_IT
Цитата(SysRq @ Feb 26 2011, 15:13) *
Покажите код для 2 и 3 (тег codebox используйте). Может, просто очепятка где...

Код, как он есть
CODE
#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.
Цитата(demiurg_spb @ Feb 26 2011, 16:37) *
Может моя догадка верна...

Принимаю и отрабатываю любые предложения.
Oleg_IT
Прошу прощение за объёмы кода.

Ассемблер код инициализации UART0 и прерываний.
CODE
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 и прерываний.
CODE
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

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

В дебагере видно, что регистры всех каналов инициализированы одинаково. Может это только в дебагере?
SysRq
Bug 47696 - [AVR] Compilation for atmega2560 produces incomplete interrupt vector table (USART2,3)

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

PS: тег codebox же.
Oleg_IT
Цитата(SysRq @ Feb 27 2011, 00:47) *
Bug 47696 - [AVR] Compilation for atmega2560 produces incomplete interrupt vector table (USART2,3)

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

PS: тег codebox же.

Ни чего плохого в таблице прерываний не нахожу.
Привожу её полностью.
CODE
+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
CODE
@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.

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

То есть прерывания есть, но в обработчики, которые вне тела прерывания(в супер петле, ну или что там вы используете) вы не попадаете.
Oleg_IT
Цитата(xelax @ Feb 28 2011, 13:26) *
Может дело не в uart'е? Вы же не зря атмегу2560 выбрали, вам известно что у gcc по дефолту проблемы с использованием кода в старших 128к? Без заморочек с trampoline секцией, вызовы функций(находящихся в старших 128к) по указателю приводит к попаданию на левые адреса. Я не утверждаю что проблема в этом, но как вариант проверить стоит.

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

Не судите строго, но я уже перестаю чего-либо понимать. Размер адреса у UART2 и UART3 по размерности такие же, как и у UART0 и UART1 (в моём случае UART0 - 0000041E, UART1 - 00000484, UART2 - 000004EE, UART3 - 00000554).
Ставил точки прерывания в таблице адресов прерывания, на все строки. Та же картина, UART0 и UART1 остановы есть, UART2 и UART3 остановов нет. Ладно, переход из таблицы прерываний не туда (куда? и если не туда, то невероятно, что программа не рушится), но должна же программа прийти в таблицу прерывания
Ни когда не работал с trampoline секцией. Где об этом почитать, поисковики куда-то ни туда направляют.
xelax
Вот здесь кое что обсуждалось

Так же в документации на gcc линкер можно почитать.

Но раз у вас даже на вектор прерывания не попадает, то проблема не в этом.

Хотя при написании кода под 2560 всё равно с этой проблемой столкнётесь, когда за 128к перевалите.
Oleg_IT
Цитата(xelax @ Feb 28 2011, 19:24) *
Вот здесь кое что обсуждалось

Так же в документации на gcc линкер можно почитать.

Но раз у вас даже на вектор прерывания не попадает, то проблема не в этом.

Хотя при написании кода под 2560 всё равно с этой проблемой столкнётесь, когда за 128к перевалите.

С 128к это я учту, но тут проблема явно не та, объём кода меньше 3,5к.
Чего ещё проверить можно, нужно?
SysRq
Цитата(Oleg_IT @ Mar 1 2011, 10:17) *
Чего ещё проверить можно, нужно?
Выкладывайте весь проект, урезав до минимума, в котором проявляется проблема. Отметём хотябы программную часть.
Oleg_IT
Цитата(SysRq @ Mar 1 2011, 10:39) *
Выкладывайте весь проект, урезав до минимума, в котором проявляется проблема. Отметём хотябы программную часть.

Минимальный вариант проекта.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.