С этим разобрался. Программатор распознает кристалл, заливает прогу, считывает всё нормально, а вот МК не запускается оО поидее должен светодиодами мигать а у него на всех выходах PA выс. лог. уровень и молчит. Может я где-то ошибся в обвязке кристалла.
Модератор blindman:Не цитируйте предыдущий пост
Последний раз редактировалось blindman 08 апр 2009, 15:13, всего редактировалось 1 раз.
Причина:Излишнее цитирование!
Модератор "Digit":Последнее китайское предупреждение!!! Хватит цитировать предыдущее сообщение! В случае рецидивов - влепим уже далеко не устное предупреждение.
Последний раз редактировалось Digit 09 апр 2009, 13:21, всего редактировалось 1 раз.
Причина:Излишнее цитирование!!!! >:-E
int sendchar (int ch) { /* Write character to Serial Port */
if (ch == '\n') { /* Check for CR */ while (!(pUSART->US_CSR & AT91C_US_TXRDY)); /* Wait for Empty Tx Buffer */ pUSART->US_THR = '\r'; /* Output CR */ } while (!(pUSART->US_CSR & AT91C_US_TXRDY)); /* Wait for Empty Tx Buffer */ return (pUSART->US_THR = ch); /* Transmit Character */ }
Результат - программа виснет при нажатии кнопки. Как я понимаю, на цикле while. На терминале ничего не появляется.
А если закомменнтировать "sendchar('A');" и откомментировать "sprintf", то ничего не виснет, но на терминале тоже ничего не появляется. Только я не понял, куда должны отправляться символы по процедуре sprintf?
1. прочитать хелп по sprintf и понять сколько ей нужно аргументов, какого они типа и куда она девает результат. 2. почитать чем в си отличаются одиночные и двойные кавычки.
Это что касается строки с sprintf. А с уартом непонятно, ковырять надо - почему он статус "передатчик свободен" не дает. Явных багов не заметно.
if ((AT91C_BASE_PIOA->PIO_PDSR & SW2) == 0) { /* Check if SW2 is pressed */ if (AT91F_US_RxReady(US_PORT)) { c = AT91F_US_GetChar(US_PORT);} else {c = 'F';}
while (!AT91F_US_TxReady(US_PORT)); AT91F_US_PutChar(US_PORT,c);
AT91C_BASE_PIOA->PIO_CODR = LED2; /* Turn On LED2 */ wait();
Вот этот код символы передаёт. По нажатию на кнопку №1 на терминале появляется символ 'A'.
Однако обратная передача (с терминала на МК) не работает. По нажатию на кнопку №2 (должно происходить чтение символа и возвращение его на обратно на терминал) возвращается 'F'. И вообще, такое ощущение, что PUTTY ничего не передаёт (судя по курсору).
HyperTerminal тоже ведет себя странно. Он подключается, только когда снята галка "Detect Carrier Loss". В этом случае при нажатии кнопок №1 и №2 символы 'А' и 'F' появляются. А если галку поставить, то пишет "Unable to Open COM18. Please check your port settings".
Есть версия, что это из-за не подсоединённых RTS и CTS (на макетной плате к МК линии не подсоединены). Но с другой стороны, вероятно, плату тестировали? Т.е. всё должно работать.
while (!AT91F_US_RxReady(US_PORT)); c = AT91F_US_GetChar(US_PORT);}
while (!AT91F_US_TxReady(US_PORT)); AT91F_US_PutChar(US_PORT,c);
Это не идеальный код (оно тут зависнет навсегда, пока не получит символ с приемника) - но если все подключено, должен работать. Хотя и твой код должен работать, если сначала передать с терминала символ, а потом нажать кнопку 2. Курсор терминала при передаче символа не двигается если не включено локальное эхо.
Правда, есть глюк. Если я нажимаю на кнопку SW2 (перевожу МК в режим ожидания символа), потом ввожу в терминал 1 символ - то на терминал возвращается тот же символ. Это правильно.
А теперь я ввожу в терминал несколько символов. Мне возвращатся первый символ. Потом я ещё раз нажимаю на кнопку SW2, предполагая, что вернётся второй символ. Но МК почему-то виснет (приходится опять вводить в терминале символ).
Почему так? Неужели у ARM нет никакого буфера (хотя бы самого маленького)?
Ну, и вопрос по кнопке - я так понял, что на кнопки надо вешать прерывания? Чтобы обходиться без цикла while (т.е. чтобы МК не вис)?
Да прерывание пожалуй надо не на кнопку, а на прием. А вообще есть у нас тут такой DiHalt, мне понравилось как у него расписаны типы организации программ на МК, хотя похоже там еще не все дописано. Но флаговый автомат есть, а его в подавляющем большинстве случаев хватает. http://easyelectronics.ru/avr-uchebnyj- ... gramm.html
А буфера выходит нету (вообще стоило написать какой у тебя МК, чтобы не догадываться по исходнику что это SAM7S). Потому как ARM-это настолько общее название, что оно ни о чем не говорит. К примеру у филипсовских армов буфер уарта есть (они туда вообще честный 16550 запихнули с 16-байтным фифо буфером). Зато у sam7s я смотрю есть какой-то DMA, наверное если его изучить и настроить - можно организовать прием данных в буфер в ОЗУ без участия проца.