Oleg_IT 0 23 февраля, 2011 Опубликовано 23 февраля, 2011 · Жалоба 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 0 23 февраля, 2011 Опубликовано 23 февраля, 2011 (изменено) · Жалоба UART0, UART1 работают, а у второго и третьего каналов прерывания не идут. Инициализирую UART-ы одинаково, только номера меняю. Пример для UART0 В падло разбираться. :)) Посмотри мой пример. Работают все КОМы (уже не помню 2 года назад было) FOSC - частота кварца :)) Uart_TX_RX.txt Изменено 23 февраля, 2011 пользователем Juk1976 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
NullPointer 0 23 февраля, 2011 Опубликовано 23 февраля, 2011 · Жалоба UART0, UART1 работают, а у второго и третьего каналов прерывания не идут.Ежели вдруг в AVRStudio их ждёте, то и не пойдут - known issue... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Oleg_IT 0 25 февраля, 2011 Опубликовано 25 февраля, 2011 · Жалоба В падло разбираться. :)) Посмотри мой пример. Работают все КОМы (уже не помню 2 года назад было) FOSC - частота кварца :)) Ваш код сейчас попробовать не могу, только вечером, но он очень похож на мой. Проверяю дёрганием пинов. А Вы для ATMega2560 проверяли? Ежели вдруг в AVRStudio их ждёте, то и не пойдут - known issue... Да, у меня AVRStudio+WINAVR. Но прерывания не идут не только в Studio, но и на живой плате. Где про «known issue...» прочитать? Может мне битый китаец попался? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Juk1976 0 25 февраля, 2011 Опубликовано 25 февраля, 2011 (изменено) · Жалоба Ваш код сейчас попробовать не могу, только вечером, но он очень похож на мой. Проверяю дёрганием пинов. А Вы для ATMega2560 проверяли? Да, у меня AVRStudio+WINAVR. Но прерывания не идут не только в Studio, но и на живой плате. Где про «known issue...» прочитать? Может мне битый китаец попался? Я под IARку писал. Проверка на живом железе :)) 1 uart на комп 2,3 - на измерение/управление (дальше rs485) 4 - на плату индикации (тоже RS485) Блок на водоканале стоит На те времена проще было RS нежели USB :)) P.S. Ни на одном камне (почти со всеми атмелами где есть uart работал) проблем со связью не было особенности были но после скуривания соответствующих страниц даташита они уходили :)) Изменено 25 февраля, 2011 пользователем Juk1976 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Oleg_IT 0 26 февраля, 2011 Опубликовано 26 февраля, 2011 · Жалоба У меня тоже ни когда с этим проблем не было. Предыдущая версия устройства на ATMega128 работает без вопросов и на других камнях тоже без вопросов UART работает. Пришло время расширять функциональность, выбрал ATMega2560, и тут засада, откуда не ждали! И мне уже не важно есть ли прерывания в эмуляторе, лишь бы они в железе были. Для теста все 4 канала инициализирую одинаково, а работают они по разному. Я уж думаю, не попал ли я на левак, но куплены МК в Терре. Описание UART-а на все 4 канала одно, ни каких особенностей инициализации по каналам не вижу, может, просто не вижу. особенности были но после скуривания соответствующих страниц даташита они уходили :)) Я не курящий, но для решения моей проблемы можно и поступится:) Подскажите какие страницы в даташите скуривать нужно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
NullPointer 0 26 февраля, 2011 Опубликовано 26 февраля, 2011 · Жалоба Для теста все 4 канала инициализирую одинаково...Покажите код для 2 и 3 (тег codebox используйте). Может, просто очепятка где... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 26 февраля, 2011 Опубликовано 26 февраля, 2011 · Жалоба Вспоминается мне один нюанс. В DS описывается четкая временная последовательность при чтении-записи вроде как регистра UCSRC совмещённого с UBRRH. Хоть в меге2560 вроде как бита URSEL нет, но может мой опыт кому-нибудь ещё будет полезен... Я наткнулся на эти грабли когда делал универсальный модуль для работы с UARTами. Я делал всё через хендлы-дескрипторы (структуры с указателями на регистры проще говоря) и вдруг всё перестало работать. Причина - косвенная адресация. Нарушилась временная последовательность и аля-улю... Решил я это путём кеширования регистра UCSRC в дескрипторе порта. К чему это я всё говорю. В вашем случае может быть (а может и не быть) схожая ситуация, порождённая тем, что регистры 2-го и 3-го UART'ов находятся в более старших адресах RAMы где возможно применяются другие asm-инструкции. Вы просто смёржите два asm-листинга вашей программы. Может моя догадка верна... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Oleg_IT 0 26 февраля, 2011 Опубликовано 26 февраля, 2011 (изменено) · Жалоба Покажите код для 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. Может моя догадка верна... Принимаю и отрабатываю любые предложения. Изменено 27 февраля, 2011 пользователем IgorKossak Бездумное оформление кода Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Oleg_IT 0 26 февраля, 2011 Опубликовано 26 февраля, 2011 (изменено) · Жалоба Прошу прощение за объёмы кода. Ассемблер код инициализации 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 Не вижу я тут ни чего особенного. В дебагере видно, что регистры всех каналов инициализированы одинаково. Может это только в дебагере? Изменено 27 февраля, 2011 пользователем IgorKossak Бездумное оформление кода Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
NullPointer 0 26 февраля, 2011 Опубликовано 26 февраля, 2011 · Жалоба Bug 47696 - [AVR] Compilation for atmega2560 produces incomplete interrupt vector table (USART2,3) Проверьте таблицу векторов прерываний. Bug свежепойманный, в WinAVR 2010 присутствует вроде бы... ...хм, посмотрел *.lss. Всё есть, и правильно, вроде бы. PS: тег codebox же. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Oleg_IT 0 27 февраля, 2011 Опубликовано 27 февраля, 2011 · Жалоба 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
NullPointer 0 27 февраля, 2011 Опубликовано 27 февраля, 2011 · Жалоба AVCC к питанию подключен? PORTF питается от него, наличие прерываний по импульсам на PF0 проверяете?.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Oleg_IT 0 27 февраля, 2011 Опубликовано 27 февраля, 2011 · Жалоба AVCC через LC (рекомендованный) фильтр подключен к питанию. PORTF используя как порт OUT, 0 и 1 пины использую для контроля возникновения прерываний. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xelax 0 28 февраля, 2011 Опубликовано 28 февраля, 2011 · Жалоба Может дело не в uart'е? Вы же не зря атмегу2560 выбрали, вам известно что у gcc по дефолту проблемы с использованием кода в старших 128к? Без заморочек с trampoline секцией, вызовы функций(находящихся в старших 128к) по указателю приводит к попаданию на левые адреса. Я не утверждаю что проблема в этом, но как вариант проверить стоит. То есть прерывания есть, но в обработчики, которые вне тела прерывания(в супер петле, ну или что там вы используете) вы не попадаете. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться