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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Пару вопросов по 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
Сергей Борщ
сообщение 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 10 2007, 18:40
Сообщение #3


Участник
*

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



Спасибо за ответ.
Цитата
На С в большинстве случаев вам вообще не нужно вспоминать, что существует такое понятие как "адрес". В С существуют переменные и указатели на эти переменные


да это я понимаю, и Керниган Ричи читал правда года 4 назад, проблема в том что мне надо забить именно всю память, в асм я мог ограничить адрес а что сделать здесь?
и ещё
a =(uint16_t)(AT91C_BASE_TCB->TCB_TC0.TC_CV << 16) | (AT91C_BASE_PIOA->PDSR & 0xFFFF);
вот это строчка, мы получаем значение таймера сдвигаем на 16, значение портов берем только первые 16, потом или, не совсем понятно зачем здесь (uint16_t), и как я понял выполнятся это строка будет весьма долго, тактов 20, это мне для лог анализатора неподходит.
так что мне надо наверное что-то вроде массива указанных вами структур

Сообщение отредактировал Handler - Jul 10 2007, 18:43
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 11 2007, 13:46
Сообщение #4


Гуру
******

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



Цитата(Handler @ Jul 10 2007, 21:40) *
да это я понимаю, и Керниган Ричи читал правда года 4 назад
Повторить никогда не помешает. Даже если бы вы ее прочитали только вчера, сегодня прочтя снова найдете много нового. Я книги читаю раза по 3-4. В первый пропускаю все непонятное, после третьего при необходимости легко нахожу нужную информацию.
Цитата(Handler @ Jul 10 2007, 21:40) *
проблема в том что мне надо забить именно всю память,
Всю память не забъете - как минимум в ней еще должны разместиться стеки. Объявите "ну очень большой" массив и пишите в него. Если вам ну никак не обойтись без абсолютных адресов - воспользуйтесь моим советом из предыдущего сообщения, перечитайте Кернигана и Ритчи, хотя бы раздел про указатели. Но это тупиковый путь чреватый труднонаходимыми ошибками.
Цитата(Handler @ Jul 10 2007, 21:40) *
a =(uint16_t)(AT91C_BASE_TCB->TCB_TC0.TC_CV << 16) | (AT91C_BASE_PIOA->PDSR & 0xFFFF);вот это строчка, мы получаем значение таймера сдвигаем на 16, значение портов берем только первые 16, потом или, не совсем понятно зачем здесь (uint16_t), и как я понял выполнятся это строка будет весьма долго, тактов 20, это мне для лог анализатора неподходит.
Здесь я ошибся, правильно будет a =(AT91C_BASE_TCB->TCB_TC0.TC_CV << 16) | (AT91C_BASE_PIOA->PDSR & 0xFFFF); и выполняться она будет быстро - в отличие от AVR ARM имеет аппаратный сдвигатель и сдвиг на 16 делает за такт. Попробуйте написать и так и эдак, посмотрите во что оно ассемблируется. Подумайте о том, что в варианте такой строчки мы имеем одну операцию записи в память, а в случае структуры - две. Но если оптимизатор компилятора достаточно умный - вы получите одинаковый код с одной операцией записи в обоих случаях. А с точки зрения наглядности программы (а значит и потенциальных ошибок) вариант со структурами предпочтительнее.


--------------------
На любой вопрос даю любой ответ
"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 11 2007, 19:43
Сообщение #5


Участник
*

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



uint32_t A[8000];
странно но мой компилятор(IAR) uint32_t не понимает
Error[Pe020]: identifier "uint32_t" is undefined
unsigned int - вот это в этом случаи будет тем же?
Go to the top of the page
 
+Quote Post
a3r3
сообщение Jul 11 2007, 20:23
Сообщение #6


Частый гость
**

Группа: Новичок
Сообщений: 84
Регистрация: 24-05-07
Пользователь №: 27 947



Да.

Сообщение отредактировал a3r3 - Jul 11 2007, 20:27
Go to the top of the page
 
+Quote Post
Handler
сообщение Jul 11 2007, 23:27
Сообщение #7


Участник
*

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



а пример BasicUSB все таки существует под IAR, если да киньте плиз ссылку
Go to the top of the page
 
+Quote Post
Calculator
сообщение Jul 12 2007, 03:39
Сообщение #8


Участник
*

Группа: Свой
Сообщений: 45
Регистрация: 19-04-07
Пользователь №: 27 172



Цитата(Handler @ Jul 12 2007, 05:27) *
а пример BasicUSB все таки существует под IAR, если да киньте плиз ссылку

Он на DVD распространялся, основное вот здесьПрикрепленный файл  src.zip ( 8.82 килобайт ) Кол-во скачиваний: 199
Прикрепленный файл  PC.zip ( 39.5 килобайт ) Кол-во скачиваний: 173
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 12 2007, 06:24
Сообщение #9


Гуру
******

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



Цитата(Handler @ Jul 11 2007, 22:43) *
странно но мой компилятор(IAR) uint32_t не понимает Error[Pe020]: identifier "uint32_t" is undefined
А ведь я не зря в самом начале примера написал #include <stdint.h>....
Цитата(Handler @ Jul 11 2007, 22:43) *
unsigned int - вот это в этом случаи будет тем же?
Help->C/C++ Compiler->Compiler reference->Basic data types


--------------------
На любой вопрос даю любой ответ
"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 12 2007, 12:48
Сообщение #10


Участник
*

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



Цитата(Calculator @ Jul 12 2007, 07:39) *
Он на DVD распространялся, основное вот здесьПрикрепленный файл  src.zip ( 8.82 килобайт ) Кол-во скачиваний: 199
Прикрепленный файл  PC.zip ( 39.5 килобайт ) Кол-во скачиваний: 173

а где бы полный проект найти, я просто на его основе все сделать хочу.
Всем огромное спасибо за ответы, наконец-то появляется какая-то ясность.
Go to the top of the page
 
+Quote Post
Handler
сообщение Jul 12 2007, 23:10
Сообщение #11


Участник
*

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



По умолчанию в регистрах те значения что стоят а в pdf по АТ91 первыми, как мне например узнать частоту таймера и ядра по умолчанию.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 13 2007, 06:30
Сообщение #12


Гуру
******

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



Цитата(Handler @ Jul 13 2007, 02:10) *
По умолчанию в регистрах те значения что стоят а в pdf по АТ91 первыми
Вот эти значения и показывают, что по умолчанию таймер стоит, а ядро тактируется от SLCLK. SLCLK равна 32768 Гц плюс-минус лапоть, точнее лапоть можно уточнить в даташите.


--------------------
На любой вопрос даю любой ответ
"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 13 2007, 19:10
Сообщение #13


Участник
*

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



Цитата(Сергей Борщ @ Jul 13 2007, 10:30) *
Вот эти значения и показывают, что по умолчанию таймер стоит, а ядро тактируется от SLCLK. SLCLK равна 32768 Гц плюс-минус лапоть, точнее лапоть можно уточнить в даташите.

Извеняюсь это был вопрос, надо так:
По умолчанию в регистрах те значения, что стоят а в pdf по АТ91 первыми?

И все таки где взять полные проект BasicUSB, госпада у кого есть скиньте на мыло
(olyfan(бобик)mail.ru) или выложите куда-нить, буду очень благодарен.
Go to the top of the page
 
+Quote Post
Handler
сообщение Jul 13 2007, 21:16
Сообщение #14


Участник
*

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



Странно но у меня пропадает возможность править предыдущие посты, это нормально?
Пример я таки нашел, на ftp://efo.ru теперь вопрос какие файлы надо поменять в проекте, при переходе с S64 на S256,как это прощё сделать имея
AT91SAM7S256-BasicTools-IAR4_30A-1_21
AT91SAM7S64-BasicUSB-IAR4_30A-1_2
надо понятно USB под S256
Go to the top of the page
 
+Quote Post
defunct
сообщение Jul 14 2007, 23:14
Сообщение #15


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(Handler @ Jul 14 2007, 00:16) *
теперь вопрос какие файлы надо поменять в проекте, при переходе с S64 на S256,

В грамотно написанном проекте - ни одного.
S256 и S64, это также как из AVR-ок M32 и M16. Один в один только памяти разное количество.
Go to the top of the page
 
+Quote Post

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

 


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


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