Если речь об AVR, то есть еще AVReal, на мой взгляд один из лучших программаторов для AVR.Marsyk писал(а):Здравствуйте может кто знает, вообще какие есть программы кроме вот этих: PonyProg2000, ProgCode, IC-Prog 1.06.
Мелкие вопросы по МК и ПЛИС.
- Реклама
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18561
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
последнее время запал на avrdude, который в комплекте с WinAVR идет - мощная штука! настроить можно на что угодно, на любую схемку!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Vergilium
- Грызет канифоль
- Сообщения: 260
- Зарегистрирован: Ср фев 13, 2008 14:41:32
- Откуда: Украина, Николаев
Здраствуйте. Подскажите пожалуйста как мне сдвинуть в лево двумерный масив. Вот так вот не совсем коректно работает.
x = str[0][0];
for (i=0;i<=7;i++)
{
for (j=0;j<4;j++)
{
str[j]=str[j+1];
}
str[j]=str[i+1][0];
}
str[7][4]=x;
Может както по иному можно это сделать.
ЗЫ программа на WinAVR для ATmega16.
x = str[0][0];
for (i=0;i<=7;i++)
{
for (j=0;j<4;j++)
{
str[j]=str[j+1];
}
str[j]=str[i+1][0];
}
str[7][4]=x;
Может както по иному можно это сделать.
ЗЫ программа на WinAVR для ATmega16.
Немного нервов и девайс готов
- Synergetik
- Встал на лапы
- Сообщения: 117
- Зарегистрирован: Чт фев 28, 2008 23:54:35
- Откуда: Воскресенск, МО
- Контактная информация:
А вот так не лучше?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
Код: Выделить всё
#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;Код: Выделить всё
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
- Откуда: Украина, Николаев
А вот так не лучше? Код:
for (i=0;i<=7;i++)
{
x=str[0]; //Запоминаем нулевой элемент каждой i-ой строки
for (j=0;j<4;j++)
{
str[j]=str[j+1]; //Доходим до предпоследнего элемента
}
str[j]=x; //Последнему присваиваем значение нулевого
}
В таком случае сдвигатся будут части массива по отдельности, а мне нужно чтоб элемент str[0][0] стал последним элементом всего массива, а не последним первой части(str[0][4]).
Мой алгоритм в принцыпе работает только есть один косяк. Обьяснять долго вот лучше раз увидеть.
- Вложения
-
- scroll_line.rar
- (84.73 КБ) 174 скачивания
Немного нервов и девайс готов
- Yellow Tiger
- Сверлит текстолит когтями
- Сообщения: 1148
- Зарегистрирован: Вт июл 08, 2008 12:24:17
- Yellow Tiger
- Сверлит текстолит когтями
- Сообщения: 1148
- Зарегистрирован: Вт июл 08, 2008 12:24:17
- Synergetik
- Встал на лапы
- Сообщения: 117
- Зарегистрирован: Чт фев 28, 2008 23:54:35
- Откуда: Воскресенск, МО
- Контактная информация:
Извините, неверно понял задачу. Просто для меня сдвиг двумерного массива влево - первый столбец становится нулевым, второй - первым, нулевой - последним.Vergilium писал(а):В таком случае сдвигатся будут части массива по отдельности, а мне нужно чтоб элемент str[0][0] стал последним элементом всего массива, а не последним первой части(str[0][4]).
Мой алгоритм в принцыпе работает только есть один косяк. Обьяснять долго вот лучше раз увидеть.
Хотя уже по строкам:
Код: Выделить всё
x = str[0][0];
...
str[7][4]=x; В вашей программе в строчке str[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)По идее, ваша программа должна правильно работать, за исключением последнего элемента, которому должно присваиваться чёрт те знает что.
- Yellow Tiger
- Сверлит текстолит когтями
- Сообщения: 1148
- Зарегистрирован: Вт июл 08, 2008 12:24:17
Ничего магического, нужно только немного "поработать компилятором"... Итак, предположим программист помещает в тексте программы объявления переменных:Vergilium писал(а):...никак не могу понять указатели, нет что это такое я знаю ну вот использовать не могу.
Код: Выделить всё
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;В языке Си можно завести переменную с типом "указатель на символьный тип", затем присвоить этой переменной адрес нужной строки и передать эту переменную функции (или коду), которая (который) обрабатывает строку. Для случая работы с самой строкой, инструкции ассемблера имели бы такой вид (если в температуру пишется строка '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Код: Выделить всё
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 string1. Для правильного подсчета адресов относительно указателя, компилятор должен знать тип данных на которые он указывает, так как для char смещение указателя на следующий элемент означает увеличение адреса на 1, а для int - уже на 2 (для любого типа данных - на sizeof(тип_данных)).
2. Все массивы располагаются в памяти сплошными блоками и упорядоченно (младшие индексы пишутся последними), то есть, в массиве array[4][7] элемент array[1][0] следует сразу за array[0][6], а раз так, то ко всем элементам можно обратиться как к одномерному массиву, лишь применив другой указатель.
Несколько раз влезь в шкуру компилятора и работа с указателями наладится.
Удачи!
(*) Ассемблер не какой-то конкретный - условный.
- Vergilium
- Грызет канифоль
- Сообщения: 260
- Зарегистрирован: Ср фев 13, 2008 14:41:32
- Откуда: Украина, Николаев
Yellow Tiger
Спасибо за обьяснения, теперь у меня более ясная картина на счет указателей. Буду пробывать на примерах. Но я никак не могу решить проблему того что в моей бегущей строке при сдвиге символы проходят первую матрицу дважды. Может в схеме косяк? Хотя врятли, скорее всего в коде или протеус бочит. Ладно буду искать проблему с помощью дебагера.
Спасибо за обьяснения, теперь у меня более ясная картина на счет указателей. Буду пробывать на примерах. Но я никак не могу решить проблему того что в моей бегущей строке при сдвиге символы проходят первую матрицу дважды. Может в схеме косяк? Хотя врятли, скорее всего в коде или протеус бочит. Ладно буду искать проблему с помощью дебагера.
Немного нервов и девайс готов
- Synergetik
- Встал на лапы
- Сообщения: 117
- Зарегистрирован: Чт фев 28, 2008 23:54:35
- Откуда: Воскресенск, МО
- Контактная информация:
Раз уж зашёл разговор о двумерном массиве, не могу не спросить, на самом деле
Или смысл в том, что компилятор сам обрабатывает такие, запросы, как например, для одномерного массива:
(для одномерного массива получилось коряво, так как создали указатель-дублёр указателя массива, а можно было сразу использовать имя массива как указатель на нулевой элемент)
То есть увеличивая указатель на единицу (оператор m=*(m+sizeof(int)*i) ) компилятор сам перемещает указатель на то место, где находится следующий элемент, а не следующая ячейка в оперативке?
Хотя с точки зрения юзера и тот и другой вариант практически неразличимы, но действительно ли срабатывает хотя бы один из них и можно ли тогда записать так
? Кстати, не совсем понял вот эту операцию: Yellow Tiger, буду очень благодарен, если объясните принцип работы этой строки.
не помогло?
? А если массив не просто большой, а очень большой, а оперативки впритык, да она ещё и фрагментирована, но суммы фрагментов хватит, чтобы разместить массив по частям, то массив не будет размещён, так как нельзя его разместить как непрерывное целое?Yellow Tiger писал(а):все массивы располагаются в памяти сплошными блоками и упорядоченно (младшие индексы пишутся последними),... а раз так, то ко всем элементам можно обратиться как к одномерному массиву, лишь применив другой указатель.
Или смысл в том, что компилятор сам обрабатывает такие, запросы, как например, для одномерного массива:
Код: Выделить всё
int mass[10];
int *m=&mass[0];
for (int i=0; i<10; i++)
temp=m[i];То есть увеличивая указатель на единицу (оператор m=*(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;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
- Откуда: Украина, Николаев
Уррааа! Нашел косяк. Дело в том что в 4х матрицах 8х8 всего 32 столбика, а массив у меня был 7*5=35 столбиков поэтому после 32 столбиков происходит возврат и цикл повторяется далее т.е. еще 3 столбика с начала строки, потому и смешивались символы.
Да и еще хотел спросить как можно опредилять размер массива? Например если через UART данные сохранить в массиве, а потом в цикле выводить то мне нужно знать сколько символов было передано т.е. размер массива. Есть ли какаеть ф-ция которая это определяет? Заранее благодарен.
Да и еще хотел спросить как можно опредилять размер массива? Например если через UART данные сохранить в массиве, а потом в цикле выводить то мне нужно знать сколько символов было передано т.е. размер массива. Есть ли какаеть ф-ция которая это определяет? Заранее благодарен.
Немного нервов и девайс готов
- Yellow Tiger
- Сверлит текстолит когтями
- Сообщения: 1148
- Зарегистрирован: Вт июл 08, 2008 12:24:17
Есть. Если нужно определить размер памяти, отведенной под массив, то так: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. Я бы рекомендовал вам обоим отнестись к моим словам "поработай компилятором" не как к шутке, а как к директиве. Все характеристики всех языков - есть следствие тех или иных решений задач, возникающих перед компиляторами с этих языков.
МК ST7, вопросы
Здравствуйте, уважаемые!
Имеется несколько штук МК от STMicroelectronix семейства ST7. Как с ними работать? С программированием более-менее разобрался, а вот прошивать их чем? Может кто-нибудь посоветовать схему простого программатора для этого типа МК?
И хотелось бы еще какой нибудь рускоязычный ресурс про них, желательно с примерами.
Спасибо за внимание!
Имеется несколько штук МК от STMicroelectronix семейства ST7. Как с ними работать? С программированием более-менее разобрался, а вот прошивать их чем? Может кто-нибудь посоветовать схему простого программатора для этого типа МК?
И хотелось бы еще какой нибудь рускоязычный ресурс про них, желательно с примерами.
Спасибо за внимание!
Цапу крутить надо!!! Ку или не ку?
- Vergilium
- Грызет канифоль
- Сообщения: 260
- Зарегистрирован: Ср фев 13, 2008 14:41:32
- Откуда: Украина, Николаев
Здраствуйте. Вот я и опять стыкнулся с очередной проблемой, а собственно с премом строки по USART. Покопавшись в интернете нашел много вариантов на эту тему но не могу все сложить в кучу и чтоб работало.
Значить вот в чем задача: Принять данные по USART и сохранить в массиве, в принцыпе все пока. Вот что я накалякал.
И собственно присвоение принятого бита массиву. Происходит это в прерывании по окончению приема бита. А далее в основной программе происходит иницыализация УСАРТа и вывод строки на LED матрицу. Все компилется но не фига не работает. Может по прерыванию чтото не так? Или иницыализация не так? Вобщем помогите пожалуйста неопытному.
ЗЫ МК атмега16, среда ВинАВР.
Значить вот в чем задача: Принять данные по USART и сохранить в массиве, в принцыпе все пока. Вот что я накалякал.
И собственно присвоение принятого бита массиву. Происходит это в прерывании по окончению приема бита. А далее в основной программе происходит иницыализация УСАРТа и вывод строки на LED матрицу. Все компилется но не фига не работает. Может по прерыванию чтото не так? Или иницыализация не так? Вобщем помогите пожалуйста неопытному.
ЗЫ МК атмега16, среда ВинАВР.
- Вложения
-
- scroll_line.c
- (5.12 КБ) 341 скачивание
Немного нервов и девайс готов
- Yellow Tiger
- Сверлит текстолит когтями
- Сообщения: 1148
- Зарегистрирован: Вт июл 08, 2008 12:24:17
Вот тут обсуждался аналогичный вопрос.



