Мелкие вопросы по МК и ПЛИС.

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
smac
Мучитель микросхем
Сообщения: 459
Зарегистрирован: Вс июн 01, 2008 12:16:38

Сообщение smac »

Marsyk писал(а):Здравствуйте может кто знает, вообще какие есть программы кроме вот этих: PonyProg2000, ProgCode, IC-Prog 1.06.

Если речь об AVR, то есть еще AVReal, на мой взгляд один из лучших программаторов для AVR.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

последнее время запал на avrdude, который в комплекте с WinAVR идет - мощная штука! настроить можно на что угодно, на любую схемку!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Vergilium
Грызет канифоль
Сообщения: 260
Зарегистрирован: Ср фев 13, 2008 14:41:32
Откуда: Украина, Николаев

Сообщение Vergilium »

Здраствуйте. Подскажите пожалуйста как мне сдвинуть в лево двумерный масив. Вот так вот не совсем коректно работает.

x = str[0][0];
for (i=0;i<=7;i++)
{
for (j=0;j<4;j++)
{
str[i][j]=str[i][j+1];
}
str[i][j]=str[i+1][0];
}
str[7][4]=x;

Может както по иному можно это сделать.


ЗЫ программа на WinAVR для ATmega16.
Немного нервов и девайс готов
Аватара пользователя
Synergetik
Встал на лапы
Сообщения: 117
Зарегистрирован: Чт фев 28, 2008 23:54:35
Откуда: Воскресенск, МО
Контактная информация:

Сообщение Synergetik »

Vergilium писал(а):Здраствуйте. Подскажите пожалуйста как мне сдвинуть в лево двумерный масив. Вот так вот не совсем коректно работает.

А вот так не лучше?

Код: Выделить всё

for (i=0;i<=7;i++)
  {
    x=str[i][0];   //Запоминаем нулевой элемент каждой i-ой строки

    for (j=0;j<4;j++)
      {
        str[i][j]=str[i][j+1]; //Доходим до предпоследнего элемента
      }

    str[i][j]=x; //Последнему присваиваем значение нулевого
}
Аватара пользователя
Yellow Tiger
Сверлит текстолит когтями
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

Код: Выделить всё

#define ROWS    4
#define COLS    7
int     i, tmp, *iptr, array[ROWS][COLS];

        iptr = (int *)array;
        tmp = *iptr;
        for (i=0; i<ROWS*COLS-1; ++i)
                iptr[i] = iptr[i+1];
        iptr[i] = tmp;
Из вот этого (взял массив 4х4):

Код: Выделить всё

1,2,3,4,
5,6,7,8,
9,10,11,12,
13,14,15,16
сделает вот это:

Код: Выделить всё

2, 3, 4, 5
6, 7, 8, 9
10, 11, 12, 13
14, 15, 16, 1
Аватара пользователя
Vergilium
Грызет канифоль
Сообщения: 260
Зарегистрирован: Ср фев 13, 2008 14:41:32
Откуда: Украина, Николаев

Сообщение Vergilium »

А вот так не лучше? Код:
for (i=0;i<=7;i++)
{
x=str[i][0]; //Запоминаем нулевой элемент каждой i-ой строки

for (j=0;j<4;j++)
{
str[i][j]=str[i][j+1]; //Доходим до предпоследнего элемента
}

str[i][j]=x; //Последнему присваиваем значение нулевого
}


В таком случае сдвигатся будут части массива по отдельности, а мне нужно чтоб элемент str[0][0] стал последним элементом всего массива, а не последним первой части(str[0][4]).

Мой алгоритм в принцыпе работает только есть один косяк. Обьяснять долго вот лучше раз увидеть.
Вложения
scroll_line.rar
(84.73 КБ) 174 скачивания
Немного нервов и девайс готов
Аватара пользователя
Yellow Tiger
Сверлит текстолит когтями
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

Vergilium писал(а):...мне нужно чтоб элемент str[0][0] стал последним элементом всего массива, ...
Повторить решение ещё раз? Изображение
Аватара пользователя
Vergilium
Грызет канифоль
Сообщения: 260
Зарегистрирован: Ср фев 13, 2008 14:41:32
Откуда: Украина, Николаев

Сообщение Vergilium »

Повторить решение ещё раз?


Нет, ваш пример работает так же как и мой но более компактней так что буду использовать его, ну теперь я не могу понять в чем косяк с индикацией на 1й матрице.
Немного нервов и девайс готов
Аватара пользователя
Yellow Tiger
Сверлит текстолит когтями
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

Vergilium писал(а):ваш пример работает ... более компактней ...
Ага, и быстрее.
Аватара пользователя
Vergilium
Грызет канифоль
Сообщения: 260
Зарегистрирован: Ср фев 13, 2008 14:41:32
Откуда: Украина, Николаев

Сообщение Vergilium »

Ага, и быстрее.


Согласен. Просто я никак не могу понять указатели, нет что это такое я знаю ну вот использовать не могу. :cry:
Немного нервов и девайс готов
Аватара пользователя
Synergetik
Встал на лапы
Сообщения: 117
Зарегистрирован: Чт фев 28, 2008 23:54:35
Откуда: Воскресенск, МО
Контактная информация:

Сообщение Synergetik »

Vergilium писал(а):В таком случае сдвигатся будут части массива по отдельности, а мне нужно чтоб элемент str[0][0] стал последним элементом всего массива, а не последним первой части(str[0][4]).

Мой алгоритм в принцыпе работает только есть один косяк. Обьяснять долго вот лучше раз увидеть.

Извините, неверно понял задачу. Просто для меня сдвиг двумерного массива влево - первый столбец становится нулевым, второй - первым, нулевой - последним.

Хотя уже по строкам:

Код: Выделить всё

x = str[0][0];
...
str[7][4]=x;

Должен был сообразить. Но увы, только со второго раза.

В вашей программе в строчке str[i][j]=str[i+1][0]; происходит переполнение по строке, когда вычисляем str[i+1][0], а там может находится что угодно, так как эта ячейка не принадлежит массиву. В этом случае нужно делать проверку:

Код: Выделить всё

if(i<7)                //Пока не достигли самой последний строки
    str[i][j]=str[i+1][0]; //Последний элемент каждой i-й строки
  else               //Достигли самого последнего элемента, так как
    str[i][j]=x;   //и по i, и по j максимум (7 и 4)

Тогда самую последнюю строку str[7][4]=x; можно исключить.

По идее, ваша программа должна правильно работать, за исключением последнего элемента, которому должно присваиваться чёрт те знает что.
Аватара пользователя
Yellow Tiger
Сверлит текстолит когтями
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

Vergilium писал(а):...никак не могу понять указатели, нет что это такое я знаю ну вот использовать не могу. :cry:
Ничего магического, нужно только немного "поработать компилятором"... Итак, предположим программист помещает в тексте программы объявления переменных:

Код: Выделить всё

int     i;
int     tmp;
char    *s = "Temp= xxx°C";
int     j;
компилятор отводит в сегменте данных место под хранение этих переменных(*):

Код: Выделить всё

        .DATA
0x0000        dw  ?   ;int     i;
0x0002        dw  ?   ;int     tmp;
0x0004        db  'Temp= xxx°C',0 ;char *s=...;
0x0010        dw  ?   ;int     j;
Далее программист хочет написать код, который вписывает текущее значение температуры в заготовленное в строке место (" = xxx") - как? В приведенном примере просто - достаточно вписать три символа в s[6], s[7], и s[8]. А что, если строк будет несколько разных, а процедура - одинаковая для всех? Писать под каждый случай свой код? Неразумно... вот тут-то и нужны указатели. Если функция одна на все строки, то ей необходимо каким-то образом сообщить, где в сегменте данных расположена нужная строка; но каким образом(?), ведь нам неизвестно, что адреса переменных в сегменте данных - 0h, 2h, 4h и 10h - это знает только компилятор...
В языке Си можно завести переменную с типом "указатель на символьный тип", затем присвоить этой переменной адрес нужной строки и передать эту переменную функции (или коду), которая (который) обрабатывает строку. Для случая работы с самой строкой, инструкции ассемблера имели бы такой вид (если в температуру пишется строка '020'):

Код: Выделить всё

put_3chr:
      lds   si,strOff          ; DS:SI points to static string
      mov   [si+6],'0'         ; put 1st char to string
      mov   [si+7],'2'         ; put 2nd char to string
      mov   [si+8],'0'         ; put 3rd char to string
а для двух строк, обрабатываемых через указатели char *strptr1 и char *strptr2, такой:

Код: Выделить всё

use_ptr_twice:
      mov   si,strptr1         ; DS:SI points to string 1
      mov   [si+6],'0'         ; put 1st char to string
      mov   [si+7],'2'         ; put 2nd char to string
      mov   [si+8],'0'         ; put 3rd char to string
      mov   si,strptr2         ; DS:SI points to string 2
      mov   [si+6],'0'         ; put 1st char to string
      mov   [si+7],'2'         ; put 2nd char to string
      mov   [si+8],'0'         ; put 3rd char to string

Остается только напомнить две вещи:
1. Для правильного подсчета адресов относительно указателя, компилятор должен знать тип данных на которые он указывает, так как для char смещение указателя на следующий элемент означает увеличение адреса на 1, а для int - уже на 2 (для любого типа данных - на sizeof(тип_данных)).
2. Все массивы располагаются в памяти сплошными блоками и упорядоченно (младшие индексы пишутся последними), то есть, в массиве array[4][7] элемент array[1][0] следует сразу за array[0][6], а раз так, то ко всем элементам можно обратиться как к одномерному массиву, лишь применив другой указатель.
Несколько раз влезь в шкуру компилятора и работа с указателями наладится. :)))
Удачи!

(*) Ассемблер не какой-то конкретный - условный. :wink:
Аватара пользователя
Vergilium
Грызет канифоль
Сообщения: 260
Зарегистрирован: Ср фев 13, 2008 14:41:32
Откуда: Украина, Николаев

Сообщение Vergilium »

Yellow Tiger
Спасибо за обьяснения, теперь у меня более ясная картина на счет указателей. Буду пробывать на примерах. Но я никак не могу решить проблему того что в моей бегущей строке при сдвиге символы проходят первую матрицу дважды. Может в схеме косяк? Хотя врятли, скорее всего в коде или протеус бочит. Ладно буду искать проблему с помощью дебагера.
Немного нервов и девайс готов
Аватара пользователя
Synergetik
Встал на лапы
Сообщения: 117
Зарегистрирован: Чт фев 28, 2008 23:54:35
Откуда: Воскресенск, МО
Контактная информация:

Сообщение Synergetik »

Раз уж зашёл разговор о двумерном массиве, не могу не спросить, на самом деле
Yellow Tiger писал(а):все массивы располагаются в памяти сплошными блоками и упорядоченно (младшие индексы пишутся последними),... а раз так, то ко всем элементам можно обратиться как к одномерному массиву, лишь применив другой указатель.
? А если массив не просто большой, а очень большой, а оперативки впритык, да она ещё и фрагментирована, но суммы фрагментов хватит, чтобы разместить массив по частям, то массив не будет размещён, так как нельзя его разместить как непрерывное целое?

Или смысл в том, что компилятор сам обрабатывает такие, запросы, как например, для одномерного массива:

Код: Выделить всё

int mass[10];
int *m=&mass[0];
for (int i=0; i<10; i++)
  temp=m[i];

(для одномерного массива получилось коряво, так как создали указатель-дублёр указателя массива, а можно было сразу использовать имя массива как указатель на нулевой элемент)

То есть увеличивая указатель на единицу (оператор m[i]=*(m+sizeof(int)*i) ) компилятор сам перемещает указатель на то место, где находится следующий элемент, а не следующая ячейка в оперативке?

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

Код: Выделить всё

iptr = &array[0][0];
tmp = *iptr;
for (i=0; i<ROWS*COLS-1; ++i)
  iptr[i] = iptr[i+1];
iptr[i] = tmp;

? Кстати, не совсем понял вот эту операцию:

Код: Выделить всё

iptr = (int *)array;
Yellow Tiger, буду очень благодарен, если объясните принцип работы этой строки.



Vergilium писал(а):Но я никак не могу решить проблему того что в моей бегущей строке при сдвиге символы проходят первую матрицу дважды. Может в схеме косяк?

Vergilium, вот это

Код: Выделить всё

if(i<7)                //Пока не достигли самой последний строки
    str[i][j]=str[i+1][0]; //Последний элемент каждой i-й строки
  else               //Достигли самого последнего элемента, так как
    str[i][j]=x;   //и по i, и по j максимум (7 и 4)
не помогло?
Аватара пользователя
Vergilium
Грызет канифоль
Сообщения: 260
Зарегистрирован: Ср фев 13, 2008 14:41:32
Откуда: Украина, Николаев

Сообщение Vergilium »

Уррааа! Нашел косяк. Дело в том что в 4х матрицах 8х8 всего 32 столбика, а массив у меня был 7*5=35 столбиков поэтому после 32 столбиков происходит возврат и цикл повторяется далее т.е. еще 3 столбика с начала строки, потому и смешивались символы.

Да и еще хотел спросить как можно опредилять размер массива? Например если через UART данные сохранить в массиве, а потом в цикле выводить то мне нужно знать сколько символов было передано т.е. размер массива. Есть ли какаеть ф-ция которая это определяет? Заранее благодарен.
Немного нервов и девайс готов
Аватара пользователя
Yellow Tiger
Сверлит текстолит когтями
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

Vergilium писал(а):...как можно опредилять размер массива? ... Есть ли какаеть ф-ция которая это определяет?
Есть. Если нужно определить размер памяти, отведенной под массив, то так:

Код: Выделить всё

int     array[7][5], arr_size;
        arr_size = sizeof(array);
а если количество элементов в массиве, то так:

Код: Выделить всё

int     array[7][5], arr_len;
        arr_len = sizeof(array) / sizeof(array[0][0]);


Synergetik писал(а):1. А если ... оперативки впритык, да она ещё и фрагментирована
2. То есть увеличивая указатель на единицу ... компилятор сам перемещает указатель на то место, где находится следующий элемент, а не следующая ячейка в оперативке?
3. ...с точки зрения юзера и тот и другой вариант практически неразличимы
Я ведь всё это уже описал выше. Во всяком случае я написал всё, что можно было написать за то время, которым я располагал - стремился дать основу. Остальное будет правильнее изучить самостоятельно, вооружившись хорошей книгой, компилятором (хорошо бы, чтобы он выдавал ассемблерный листинг) и терпением. Вот если в книге попадутся непреодолимые места, тогда нужно звать на помощь "зал". :)
Synergetik писал(а):...буду очень благодарен, если объясните принцип работы этой строки
"Принцип" прост - адрес начала массива помещается в указатель, а чтобы компилятор понимал, как работать с этим указателем, приходится насильно приводить тип данных из двумерного массива в одномерный (ведь дальнейшая работа с данными будет вестись именно как с одномерным массивом).

P.S. Я бы рекомендовал вам обоим отнестись к моим словам "поработай компилятором" не как к шутке, а как к директиве. Все характеристики всех языков - есть следствие тех или иных решений задач, возникающих перед компиляторами с этих языков.
Аватара пользователя
Vergilium
Грызет канифоль
Сообщения: 260
Зарегистрирован: Ср фев 13, 2008 14:41:32
Откуда: Украина, Николаев

Сообщение Vergilium »

Большое спасибо всем. Я только начинающий и еще много чему нужно научится.
Немного нервов и девайс готов
Аватара пользователя
Igor_67
Электрический кот
Сообщения: 1051
Зарегистрирован: Вт окт 21, 2008 11:46:23
Откуда: Барнаул

МК ST7, вопросы

Сообщение Igor_67 »

Здравствуйте, уважаемые!
Имеется несколько штук МК от STMicroelectronix семейства ST7. Как с ними работать? С программированием более-менее разобрался, а вот прошивать их чем? Может кто-нибудь посоветовать схему простого программатора для этого типа МК?
И хотелось бы еще какой нибудь рускоязычный ресурс про них, желательно с примерами.
Спасибо за внимание!
Цапу крутить надо!!! Ку или не ку?
Аватара пользователя
Vergilium
Грызет канифоль
Сообщения: 260
Зарегистрирован: Ср фев 13, 2008 14:41:32
Откуда: Украина, Николаев

Сообщение Vergilium »

Здраствуйте. Вот я и опять стыкнулся с очередной проблемой, а собственно с премом строки по USART. Покопавшись в интернете нашел много вариантов на эту тему но не могу все сложить в кучу и чтоб работало.
Значить вот в чем задача: Принять данные по USART и сохранить в массиве, в принцыпе все пока. Вот что я накалякал.

И собственно присвоение принятого бита массиву. Происходит это в прерывании по окончению приема бита. А далее в основной программе происходит иницыализация УСАРТа и вывод строки на LED матрицу. Все компилется но не фига не работает. Может по прерыванию чтото не так? Или иницыализация не так? Вобщем помогите пожалуйста неопытному.

ЗЫ МК атмега16, среда ВинАВР.
Вложения
scroll_line.c
(5.12 КБ) 341 скачивание
Немного нервов и девайс готов
Аватара пользователя
Yellow Tiger
Сверлит текстолит когтями
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

Вот тут обсуждался аналогичный вопрос.
Ответить

Вернуться в «Разные вопросы по МК»