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

 
 
> Пару вопросов по AT91SAM7S и IAR от начинающего, делаю лог анализатор, появились вопросы
Handler
сообщение Jul 9 2007, 23:40
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 5-12-06
Пользователь №: 23 156



Решил вот перейти с AVR на ARM7 выбрал плату Olimex на AT91SAM7S256, писать решил под IAR так как под него есть примеры. Сейчас надо написать лог анализатор простейший, чтоб был и, заодно, чтоб научиться, появилось пару вопросов.
Алгоритм анализатора простой, ждем изменения на входе, когда что-то происходит записуем значение входа и время по таймеру в память, потом передаём все по USB на компьютер.
1.Раньше я писал на ассемблере и алгоритм был такой ищу что мне надо в pdf, там же нахожу нужную мне команду и хороший пример, под С я так понимаю все по другому сначала думаешь, что тебе надо потом ищешь в библиотеке нужную функцию, я прав?
вот например надо мне прочитать порты, нашел в библиотеке
/*----------------------------------------------------------------------------
//* \fn AT91F_PIO_GetInput
//* \brief Return PIO input value
//*----------------------------------------------------------------------------
__inline unsigned int AT91F_PIO_GetInput( // \return PIO input
AT91PS_PIO pPio) // \arg pointer to a PIO controller
{
return pPio->PIO_PDSR;
}
как я понял надо примерно так
unsigned int a;
a_in= AT91F_PIO_GetInput(AT91C_BASE_PIOA);
Вопрос, теперь а_in будет значением порта, 32-битным числом?
До этого я так понял надо порты включить и назначить на выход
unsigned int b=0x00000000;
// First, enable the clock of the PIOB
AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_PIOA ) ;
//* to be outputs. No need to set these pins to be driven by the PIO because it is GPIO pins only.
AT91F_PIO_CfgInput( AT91C_BASE_PIOA, b ) ;
2. Тут все говорят про пример BasicUsb, как это ни странно но я нашел только
AT91SAM7S-BasicUSART_USB, под IAR есть вроде только это(а там нет записи, только чтение), или я не прав? есть ещё пример под gcc at91sam7s64_basicusb_20060901_public
там вроде с USB побольше, могу я из него брать куски кода или IAR не поймет?
3. Я не нашел в библиотеке функций отвечающих за таймер TC, мне надо установить частоту и читать значение самого таймера, и ещё есть ли у него функция обнуления, чтоб не боятся переполнения и каждый раз его самому обнулять.
4. Как вообще писать в память и читать из неё, под асм все понятно адреса и до конца(до последнего адреса), а как на С забить все память, какая мне нужна функция?
Ещё после 8 бит на AVR тут, когда вроде можно и 8 и 16 и 32, не совсем все понятно, могу я прочитать только первые 16 бит порта и объединить их с 16-битным таймером в одно двойное слово 32-битное и записать так в память, или как это вообще происходит.
5.В примере для USB передаётся массив
char data[MSG_SIZE];
а у меня вот в памяти будут значения портов и таймера, как мне их подсовывать в
pCDC.Write(&pCDC, data, length); (взято из примера под gcc, я так понимаю сюда надо вставлять данные которые хочешь передать на компьютер.)
6.Я понял, что когда МК с соответствующей прогой подключается к компьютеру, ему(компьютеру) надо дать атмеловский драйвер, а какой прогой получаться сами данные и где взять эту программу? и в каком виду данные появятся на компьютере?
Я понимаю, что мои вопросы дилетантские но все же очень хочется разобраться.
Всем ответившим заранее СПАСИБО.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Сергей Борщ
сообщение Jul 10 2007, 08:11
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Handler @ Jul 10 2007, 02:40) *
под С я так понимаю все по другому сначала думаешь, что тебе надо потом ищешь в библиотеке нужную функцию, я прав?
Конечно нет.
Сначала читаете книгу Кернигана и Ритчи "Язык программирования С". Ее полно в интернете. В процессе чтения понимате, что язык состоит примерно из 30 ключевых слов. И все "Библиотечные функции" написаны с использованием именно этих слов.

Использование приведенных вами функций - лишь один из возможных приемов, но не стоит себя ограничивать только этими функциями (я, например, их вообще не использую), ибо часто написание "в лоб" будет эффективнее.
Цитата(Handler @ Jul 10 2007, 02:40) *
как я понял надо примерно так
Вопрос, теперь а_in будет значением порта, 32-битным числом?
До этого я так понял надо порты включить и назначить на выход
Да, да, да.
Цитата(Handler @ Jul 10 2007, 02:40) *
2. Тут все говорят про пример BasicUsb
не знаю, не работал sad.gif
Цитата(Handler @ Jul 10 2007, 02:40) *
там вроде с USB побольше, могу я из него брать куски кода или IAR не поймет?
Можете, поймет, но не все. Потребуется доработка напильником. Чаще всего очень небольшая. Или сравнительно большая, но в небольшом количестве мест.
Цитата(Handler @ Jul 10 2007, 02:40) *
3. Я не нашел в библиотеке функций отвечающих за таймер TC, мне надо установить частоту и читать значение самого таймера, и ещё есть ли у него функция обнуления, чтоб не боятся переполнения и каждый раз его самому обнулять.
Вот один из минусов использования библиотеки: как только нет готовой функции - сразу же ступор. Функции этой библиотеки просто пишут и читают регистры, оформляя это в удобно проименованные "обертки". Напишите такие функции сами или работайте сразу с регистрами.
Про переполнение - а чего его бояться? В процессе переполнения таймер обнулится и выдаст прерывание - можете считать количество переполнений. Существует режим таймера, когда период обнуления задается в одном из его регистров. Причем и переполение и аппаратное обнуление происходит всегда в строго определенные моменты времени. Сбрасывая таймер программно вы никогда не получите такой же точности.
Цитата(Handler @ Jul 10 2007, 02:40) *
4. Как вообще писать в память и читать из неё, под асм все понятно адреса и до конца(до последнего адреса), а как на С забить все память, какая мне нужна функция?
На С в большинстве случаев вам вообще не нужно вспоминать, что существует такое понятие как "адрес". В С существуют переменные и указатели на эти переменные
Цитата(Handler @ Jul 10 2007, 02:40) *
Ещё после 8 бит на AVR тут, когда вроде можно и 8 и 16 и 32, не совсем все понятно, могу я прочитать только первые 16 бит порта и объединить их с 16-битным таймером в одно двойное слово 32-битное и записать так в память, или как это вообще происходит.
нет-да. Т.е. если порт представляет из себя 32(16, 8) разрядный регистр, то и читать обязательно нужно сразу все 32 (16, 8) бит. Компилятор сам знает (точнее, ему в заголовочном файле указано) какой регистр имеет какой размер и подставляет нужные значения. Дальше вы маскируете ненужные биты операциями "И" или сдвигом. А в памяти точно также может храниться 8, 16, 32, 64 - битное число, поэтому не совсем понятно зачем вам их объединять. но если хотите - маски и сдвиги к вашим услугам. На всякий случай несколько примеров:
Код
#include <stdint.h>
#include <ioAT91SAM7X256.h>
uint32_t a;
struct
{
    uint16_t Inputs;
    uint16_t Timer;
} b;

void test()
{
    a =(uint16_t)(AT91C_BASE_TCB->TCB_TC0.TC_CV << 16) | (AT91C_BASE_PIOA->PDSR & 0xFFFF);
    b.Timer = AT91C_BASE_TCB->TCB_TC0.TC_CV;
    b.Inputs = AT91C_BASE_PIOA->PDSR;
}
Цитата(Handler @ Jul 10 2007, 02:40) *
а у меня вот в памяти будут значения портов и таймера, как мне их подсовывать в pCDC.Write(&pCDC, data, length);
Керниган и Ритчи. Читать про структуры, массивы, указатели, приведение типов, указатель void *.
Цитата(Handler @ Jul 10 2007, 02:40) *
6.Я понял, что когда МК с соответствующей прогой подключается к компьютеру, ему(компьютеру) надо дать атмеловский драйвер, а какой прогой получаться сами данные и где взять эту программу? и в каком виду данные появятся на компьютере?
Искать по форуму. Этот вопрос тут обсуждался много раз.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Handler
сообщение Jul 15 2007, 21:42
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 5-12-06
Пользователь №: 23 156



Цитата(Сергей Борщ @ Jul 10 2007, 11:11) *
Керниган и Ритчи. Читать про структуры, массивы, указатели, приведение типов, указатель void *.

Код
    uint32_t A[ARRAY_SIZE];
     .....
    // Init USB device
    AT91F_USB_Open();
    // Init USB device

    for(i=0;i<ARRAY_SIZE;i++)
    {  // Wait for the end of enumeration
        while (!pCDC.IsConfigured(&pCDC));
        pCDC.Write(&pCDC, (const char *)A[i], 4);
    }

Вот так он будет на комп передавать?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 16 2007, 08:21
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Handler @ Jul 16 2007, 00:42) *
Вот так он будет на комп передавать?
pCDC.Write(&pCDC, (const char *)&A[i], 4); - в остальном похоже на правду


Цитата(Handler @ Jul 13 2007, 22:10) *
Извеняюсь это был вопрос, надо так:
По умолчанию в регистрах те значения, что стоят а в pdf по АТ91 первыми?
В даташите раздел User Interface каждой периферии начинается с таблицы Register mapping. Вот в этой таблице графа Reset State и показывает значение по умолчанию.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Handler   Пару вопросов по AT91SAM7S и IAR от начинающего   Jul 9 2007, 23:40
- - Handler   Спасибо за ответ. ЦитатаНа С в большинстве случаев...   Jul 10 2007, 18:40
|- - Сергей Борщ   Цитата(Handler @ Jul 10 2007, 21:40) да э...   Jul 11 2007, 13:46
- - Handler   uint32_t A[8000]; странно но мой компилятор(IAR) ...   Jul 11 2007, 19:43
|- - Сергей Борщ   Цитата(Handler @ Jul 11 2007, 22:43) стра...   Jul 12 2007, 06:24
- - a3r3   Да.   Jul 11 2007, 20:23
- - Handler   а пример BasicUSB все таки существует под IAR, есл...   Jul 11 2007, 23:27
|- - Calculator   Цитата(Handler @ Jul 12 2007, 05:27) а пр...   Jul 12 2007, 03:39
|- - Handler   Цитата(Calculator @ Jul 12 2007, 07:39) О...   Jul 12 2007, 12:48
- - Handler   По умолчанию в регистрах те значения что стоят а в...   Jul 12 2007, 23:10
|- - Сергей Борщ   Цитата(Handler @ Jul 13 2007, 02:10) По у...   Jul 13 2007, 06:30
|- - Handler   Цитата(Сергей Борщ @ Jul 13 2007, 10:30) ...   Jul 13 2007, 19:10
- - Handler   Странно но у меня пропадает возможность править пр...   Jul 13 2007, 21:16
|- - defunct   Цитата(Handler @ Jul 14 2007, 00:16) тепе...   Jul 14 2007, 23:14
- - Handler   Пытаюсь запустить таймер и как то странно не получ...   Jul 17 2007, 14:03
|- - Сергей Борщ   Цитата(Handler @ Jul 17 2007, 17:03) //до...   Jul 17 2007, 14:48
|- - Handler   Цитата(Сергей Борщ @ Jul 17 2007, 17:48) ...   Jul 18 2007, 22:35
- - Handler   Скажите пожалуйста куда мне копать, если ли такие ...   Jul 19 2007, 17:24


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

 


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


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