реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Какие есть особенности инициализации UART2 и UART3 в atmega2560?
Oleg_IT
сообщение Feb 23 2011, 20:49
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709



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 проверял.
Что не так делаю. Поделитесь кодом правильной работы с этими каналами.
Go to the top of the page
 
+Quote Post
Juk1976
сообщение Feb 23 2011, 21:40
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 1-08-05
Из: Украина Винница
Пользователь №: 7 258



Цитата(Oleg_IT @ Feb 23 2011, 23:49) *
UART0, UART1 работают, а у второго и третьего каналов прерывания не идут. Инициализирую UART-ы одинаково, только номера меняю. Пример для UART0

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


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


Сообщение отредактировал Juk1976 - Feb 23 2011, 21:43
Прикрепленные файлы
Прикрепленный файл  Uart_TX_RX.txt ( 15.88 килобайт ) Кол-во скачиваний: 133
 
Go to the top of the page
 
+Quote Post
SysRq
сообщение Feb 23 2011, 23:20
Сообщение #3


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



Цитата(Oleg_IT @ Feb 23 2011, 23:49) *
UART0, UART1 работают, а у второго и третьего каналов прерывания не идут.
Ежели вдруг в AVRStudio их ждёте, то и не пойдут - known issue...
Go to the top of the page
 
+Quote Post
Oleg_IT
сообщение Feb 25 2011, 10:01
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709



Цитата(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...» прочитать?

Может мне битый китаец попался?
Go to the top of the page
 
+Quote Post
Juk1976
сообщение Feb 25 2011, 20:42
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 1-08-05
Из: Украина Винница
Пользователь №: 7 258



Цитата(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)

Сообщение отредактировал Juk1976 - Feb 25 2011, 20:47
Go to the top of the page
 
+Quote Post
Oleg_IT
сообщение Feb 26 2011, 07:12
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709



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

Я не курящий, но для решения моей проблемы можно и поступитсяsm.gif Подскажите какие страницы в даташите скуривать нужно?
Go to the top of the page
 
+Quote Post
SysRq
сообщение Feb 26 2011, 12:13
Сообщение #7


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



Цитата(Oleg_IT @ Feb 26 2011, 10:12) *
Для теста все 4 канала инициализирую одинаково...
Покажите код для 2 и 3 (тег codebox используйте). Может, просто очепятка где...
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 26 2011, 13:37
Сообщение #8


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Вспоминается мне один нюанс.
В DS описывается четкая временная последовательность при чтении-записи вроде как регистра UCSRC совмещённого с UBRRH.
Хоть в меге2560 вроде как бита URSEL нет, но может мой опыт кому-нибудь ещё будет полезен...

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


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Oleg_IT
сообщение Feb 26 2011, 15:26
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709



Цитата(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) *
Может моя догадка верна...

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

Сообщение отредактировал IgorKossak - Feb 27 2011, 15:19
Причина редактирования: Бездумное оформление кода
Go to the top of the page
 
+Quote Post
Oleg_IT
сообщение Feb 26 2011, 19:48
Сообщение #10


Знающий
****

Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709



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

Ассемблер код инициализации 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

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

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

Сообщение отредактировал IgorKossak - Feb 27 2011, 15:20
Причина редактирования: Бездумное оформление кода
Go to the top of the page
 
+Quote Post
SysRq
сообщение Feb 26 2011, 21:47
Сообщение #11


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



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

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

PS: тег codebox же.
Go to the top of the page
 
+Quote Post
Oleg_IT
сообщение Feb 27 2011, 09:16
Сообщение #12


Знающий
****

Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709



Цитата(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.

Go to the top of the page
 
+Quote Post
SysRq
сообщение Feb 27 2011, 10:07
Сообщение #13


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



AVCC к питанию подключен? PORTF питается от него, наличие прерываний по импульсам на PF0 проверяете?..
Go to the top of the page
 
+Quote Post
Oleg_IT
сообщение Feb 27 2011, 13:38
Сообщение #14


Знающий
****

Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709



AVCC через LC (рекомендованный) фильтр подключен к питанию. PORTF используя как порт OUT, 0 и 1 пины использую для контроля возникновения прерываний.
Go to the top of the page
 
+Quote Post
xelax
сообщение Feb 28 2011, 10:26
Сообщение #15


Местный
***

Группа: Свой
Сообщений: 370
Регистрация: 7-11-06
Пользователь №: 22 035



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

То есть прерывания есть, но в обработчики, которые вне тела прерывания(в супер петле, ну или что там вы используете) вы не попадаете.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th June 2025 - 21:28
Рейтинг@Mail.ru


Страница сгенерированна за 0.0154 секунд с 7
ELECTRONIX ©2004-2016