Свежие обсуждения
Микроконтроллеры

Работа с массивами в PIC на языке С

1 2

Народ, помогите найти информацию, как работать с одномерными массивами в С с PICами, где это поподробней описано?
Проблема в том что та информация которую я нашел, хоть и описывает основные понятия, не дает полного представления для начинающего. Например я сейчас читаю как это делается в С++ но для ББ, так вот там синтаксис другой, но это пол беды, в принципе не сильна разница ,разберусь.
Интересует такая простая вещь как перенос в массив из регистра ADRES, нужен пример.
То есть как это всё объявляется понятно, но вот нет уверенности в связи конкретно регистра и массива.

#define SAMPLES 7 // размерность

bank1 char sampl_U[SAMPLES]; // где и ЧТО находится

sampl_U[s] = ADRES; // а вот здеся не понятно - правильно или нет

У-ф-ф.. написал....

 

Да нормально написал, вроде.
А вообще - книгу по ANSI C и документацию на твой компилятор тебе в помощь. Этого должно быть достаточно.

 

Я делал так:
#define FIFOsizemax 32 // Для удобства
unsigned char FIFObuffer[FIFOsizemax]; // Объявляем массив на "FIFOsizemax" элементов

....
дальше пользуемся массивом:
while (i<FIFOsizemax) { FIFObuffer[i]=ReadData(); }/i>

kkol: sampl_U[s] = ADRES; // а вот здеся не понятно - правильно или нет
да, правильно. Элементу № "s" масива "sampl_U" присваивается значение "ADRES".

 

rfc: книгу по ANSI C и документацию на твой компилятор тебе в помощь
Спасибо, почитаю.

Сергей К: Элементу № "s" масива "sampl_U" присваивается значение "ADRES".
Тааак.... появилась уверенность что на правильном пути.

Теперь продолжу глупые вопросы, если позволите.

В sampl_U теперь есть столбец из 7 значений, считанных из регистра ADRES.

Эти значения пишутся когда GODONE станет 0 ? Правильно?
Потому что я пишу : GODONE = 1;
while (GODONE); // То есть пока не сменится на 0. Так?

Теперь если после этого я напишу:
adc_result = max sampl_U [s]; // то получу (вычислю) элемент [s] в массиве с максимальным значением ?
Я не уверен в функции max, я это услышал в разговоре с нашим системным администратором. Или надо писать отдельную функцию выборки максимального значения в массиве?

 

kkol: adc_result = max sampl_U [s]; // то получу (вычислю) элемент [s] в массиве с максимальным значением ?

Не не работает.... проверил.

 

функцию поиска максимального значения в массиве, пожалуй, написать придется самому. Видать не входит она в стандартную поставку компилятора
И при передаче массива функции в виде параметра передается только указатель. Так что позаботься, чтобы ф-я знала, где массив кончается.

 

rfc: Так что позаботься, чтобы ф-я знала, где массив кончается.
Ну.у.у.... это конечно же, для меня это как два пальца. Вот только найду как это делается, и сделаю. Изверги(щютка)......

 

Ну, конкретно в твоем частном случае, у тебя размерность массива в дефайне прописана. Конечто не очень хорошо глобальные константы как параметр функции использовать, но иногда можно

char max(char * data)
{
char maxdata,i;
maxdata = 0;// если char unsigned
for (i=0;i<SAMPLES-1;i++) {
if (*(data+i) >maxdata)
{ maxdata = *(data+i); }
}
return (maxdata);
}

спать хочу. мог накосячить в мелочах.
ну и вызов: adc_result = max(sampl_U);

 

Хотя конкретно максимальное/минимальное значение искать куда проще в процессе выборки. т.е. кода ты очередное значение с АЦП в массив сохранил, тут и сравнивай его с максимально/минимально зафиксированным. Если сравнение не в пользу старого, то обнови исторический экстремум
Да и среднее, имхо, в боьшинстве случаев, проще в процессе выборки интегрировать, если скорости позволяют. Процесс более ровный во времени получается.

 

Посмотри здесь http://regionbook.ru/dir.php?id=174
может что из книг и выберешь.