roboforum.ru

Технический форум по робототехнике.

ARM

Re: ARM

yak-40 » 05 апр 2009, 20:45

Doniak писал(а):тоисть 0<<4 можно было записать и так: 0b00000000000000000000000000001000

Нет, вот так:
1<<4 равно 0b00010000

Re: ARM

avr123.nm.ru » 05 апр 2009, 20:46

Doniak писал(а):
так наглядно видно ЧЕЛОВЕКУ в какой позиции будет 1.

тоисть 0<<4 можно было записать и так: 0b00000000000000000000000000001000


Нихт ! вот так 1<<3 ведь правый бит НУЛЕВОЙ а не первый.

Почитайте пожалуйста "Язык Си для микроконтроллеров" - ДЛЯ ВАС написано.

Re: ARM

Doniak » 05 апр 2009, 21:00

не внимательно писал. Ошибку понял, спасибо.

Re: ARM

avr123.nm.ru » 05 апр 2009, 21:08

Можно несколько бит двигать сразу

(1<<12)|(1<<7)|(1<<4)|(1<<2)

А можно "названия битов" из даташита использовать если компилятор позволяет или есть соотв. заголовок .h

(1<<название_бита)|(1<<название_бита)|(1<<название_бита)

Re: ARM

Сергей » 05 апр 2009, 21:18

а еще их можно самому определить с помощью #define

Re: ARM

Doniak » 06 апр 2009, 17:48

Пытаюсь прошить МК H-FLASHERom вылетает вот такая ошибка
Destination flash address is out of range

как с этим бороться?

Re: ARM

Doniak » 08 апр 2009, 15:06

С этим разобрался.
Программатор распознает кристалл, заливает прогу, считывает всё нормально, а вот МК не запускается оО поидее должен светодиодами мигать а у него на всех выходах PA выс. лог. уровень и молчит. Может я где-то ошибся в обвязке кристалла.
Модератор blindman:Не цитируйте предыдущий пост
Последний раз редактировалось blindman 08 апр 2009, 15:13, всего редактировалось 1 раз.
Причина: Излишнее цитирование!

Re: ARM

avr123.nm.ru » 08 апр 2009, 15:07

Может быть ...

Re: ARM

Doniak » 09 апр 2009, 12:48

NRST ногу нужно дёргать после програмирования?

Модератор "Digit":Последнее китайское предупреждение!!! :evil: Хватит цитировать предыдущее сообщение!
В случае рецидивов - влепим уже далеко не устное предупреждение.
Последний раз редактировалось Digit 09 апр 2009, 13:21, всего редактировалось 1 раз.
Причина: Излишнее цитирование!!!! >:-E

Re: ARM

uuu2 » 10 фев 2010, 02:26

Подскажите, люди добрые!

Задача - передать 1 байт по UART с демо-платы на терминал (PUTTY).

Код: Выделить всёРазвернуть
 
init_serial();
// Loop forever
  for (;;) {
if ((AT91C_BASE_PIOA->PIO_PDSR & SW1) == 0) {                   /* Check if SW1 is pressed */
     AT91C_BASE_PIOA->PIO_CODR = LED2;                /* Turn On LED1 */
    //sprintf('A\n');
    sendchar('A');
   } else {
     AT91C_BASE_PIOA->PIO_SODR = LED2;                /* Turn Off LED1 */
   }
}


Код процедур:

Код: Выделить всёРазвернуть
AT91S_USART * pUSART = AT91C_BASE_US0;      /* Global Pointer to USART0 */


void init_serial (void) {                   /* Initialize Serial Interface */

  *AT91C_PIOA_PDR = AT91C_PA5_RXD0 |        /* Enable RxD0 Pin */
                    AT91C_PA6_TXD0;         /* Enalbe TxD0 Pin */

  pUSART->US_CR = AT91C_US_RSTRX |          /* Reset Receiver      */
                  AT91C_US_RSTTX |          /* Reset Transmitter   */
                  AT91C_US_RXDIS |          /* Receiver Disable    */
                  AT91C_US_TXDIS;           /* Transmitter Disable */

  pUSART->US_MR = AT91C_US_USMODE_NORMAL |  /* Normal Mode */
                  AT91C_US_CLKS_CLOCK    |  /* Clock = MCK */
                  AT91C_US_CHRL_8_BITS   |  /* 8-bit Data  */
                  AT91C_US_PAR_NONE      |  /* No Parity   */
                  AT91C_US_NBSTOP_1_BIT;    /* 1 Stop Bit  */

  pUSART->US_BRGR = BRD;                    /* Baud Rate Divisor */

  pUSART->US_CR = AT91C_US_RXEN  |          /* Receiver Enable     */
                  AT91C_US_TXEN;            /* Transmitter Enable  */
}


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?

Re: ARM

boez » 10 фев 2010, 13:28

1. прочитать хелп по sprintf и понять сколько ей нужно аргументов, какого они типа и куда она девает результат.
2. почитать чем в си отличаются одиночные и двойные кавычки.

Это что касается строки с sprintf. А с уартом непонятно, ковырять надо - почему он статус "передатчик свободен" не дает. Явных багов не заметно.

Re: ARM

uuu2 » 11 фев 2010, 01:29

Код: Выделить всёРазвернуть
 #include "lib_AT91SAM7S64.h"

...

AT91F_US0_CfgPIO();
  AT91F_US0_CfgPMC();

  AT91F_US_EnableIt(US_PORT, AT91C_US_RXBUFF | AT91C_US_TIMEOUT);
  AT91F_US_Configure(US_PORT, MCK, AT91C_US_ASYNC_MODE, BR , 0);
                                                               //USART_BAUD_RATE
  AT91F_US_ResetRx(US_PORT);
  AT91F_US_ResetTx(US_PORT);

  // Loop forever
  for (;;) {

   AT91C_BASE_PIOA->PIO_CODR = LED1; // Clear 1 (= Save 0) to PA17
   wait();
   AT91C_BASE_PIOA->PIO_SODR = LED1; // Save 1 to PA17
   wait();

   if ((AT91C_BASE_PIOA->PIO_PDSR & SW1) == 0) {      /* Check if SW1 is pressed */
     AT91C_BASE_PIOA->PIO_CODR = LED2;                /* Turn On LED2 */
    wait();
    //printf('A\n');
    while (!AT91F_US_TxReady(US_PORT));
     AT91F_US_PutChar(US_PORT,'A');

   } else {
     AT91C_BASE_PIOA->PIO_SODR = LED2;                /* Turn Off LED2 */
    wait();
   }

   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();

   } else {
     AT91C_BASE_PIOA->PIO_SODR = LED2;                /* Turn Off 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 (на макетной плате к МК линии не подсоединены). Но с другой стороны, вероятно, плату тестировали? Т.е. всё должно работать.

Re: ARM

boez » 11 фев 2010, 12:54

Я думаю, что для того чтобы работало Detect Carrier Loss, надо подключить конкретно линию Data Carrier Detect ;)

А код неправильный на прием - ты ж проверяешь всего 1 раз, нет ли символа - и сразу бегом 'F' передавать. Вот так должно получиться:

Код: Выделить всёРазвернуть
    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. Курсор терминала при передаче символа не двигается если не включено локальное эхо.

Re: ARM

uuu2 » 11 фев 2010, 20:37

boez, cпасибо работает!

Правда, есть глюк. Если я нажимаю на кнопку SW2 (перевожу МК в режим ожидания символа), потом ввожу в терминал 1 символ - то на терминал возвращается тот же символ. Это правильно.

А теперь я ввожу в терминал несколько символов. Мне возвращатся первый символ. Потом я ещё раз нажимаю на кнопку SW2, предполагая, что вернётся второй символ. Но МК почему-то виснет (приходится опять вводить в терминале символ).

Почему так? Неужели у ARM нет никакого буфера (хотя бы самого маленького)?

Ну, и вопрос по кнопке - я так понял, что на кнопки надо вешать прерывания? Чтобы обходиться без цикла while (т.е. чтобы МК не вис)?

Re: ARM

boez » 11 фев 2010, 23:42

Да прерывание пожалуй надо не на кнопку, а на прием. А вообще есть у нас тут такой DiHalt, мне понравилось как у него расписаны типы организации программ на МК, хотя похоже там еще не все дописано. Но флаговый автомат есть, а его в подавляющем большинстве случаев хватает.
http://easyelectronics.ru/avr-uchebnyj- ... gramm.html

А буфера выходит нету (вообще стоило написать какой у тебя МК, чтобы не догадываться по исходнику что это SAM7S). Потому как ARM-это настолько общее название, что оно ни о чем не говорит. К примеру у филипсовских армов буфер уарта есть (они туда вообще честный 16550 запихнули с 16-байтным фифо буфером). Зато у sam7s я смотрю есть какой-то DMA, наверное если его изучить и настроить - можно организовать прием данных в буфер в ОЗУ без участия проца.


Rambler\'s Top100 Mail.ru counter