Страница 3 из 8

Re: MSP430G2452 и SD карта

Добавлено: Сб июн 22, 2013 20:06:09
GreatDrek
Вообще к чему вся эта тема, в конце (не обязательно на этом МК) хочу подключить к нему экран кнопки, написать примитивную игру, а Flash нужен что бы там хранить например какие то игровые достижения.
Почему именно это? Просто всегда хотел сделать свое устройство, полностью запрограммированное мной на котором можно будет поиграть :))

Re: MSP430G2452 и SD карта

Добавлено: Сб июн 22, 2013 20:23:23
Ser60
GreatDrek писал(а):Просто не удобно что нельзя очистить один байт из сегмента
Если у Вас в программе имеется интенсивная работа с записью во флеш, попробуйте семейство MSP430FRxxx с ферро-магнитной памятью. Там для записи байта/слова в память не надо стирать весь блок и специальной процедуры записи не надо. В С прото операции присваивания с синтаксисом записи в RAM записывают в любое место FRAM. Красота! Не говоря уже о том, что FRAM выдерживает на несколько порядков больше перезаписей чем FLASH. Кстати, любопытно, что последний писк фирмы - модель MSP430FR5969 семейства Wolverine можно заказать на настоящий момент только в России через Compel ! Их серийный выпуск намечен позже в этом году, а пока все остальные страны могут попробовать их через семплы. Я, помню, долго охотился за ними - семплы появляются и их тут-же все растребывают - это не контроллеры а "полный атас". Но в Росии, похоже, ни у кого к ним интереса пока нет, 10 штук через Compel доступны уже несколько месяцев.

GreatDrek - Ваше стремление похвально. Шаг за шагом к реализации игры и придете. Кстати, игру уже выбрали?

Re: MSP430G2452 и SD карта

Добавлено: Сб июн 22, 2013 22:33:39
GreatDrek
GreatDrek - Ваше стремление похвально. Шаг за шагом к реализации игры и придете. Кстати, игру уже выбрали?
Логический платформер с генерацией карты, мало кода надо, мало места занимать будет, ведь еще надо будет написать работу с экраном и т.д.

Re: MSP430G2452 и SD карта

Добавлено: Сб июн 22, 2013 22:46:45
Ser60
Я про такую не слышал. Это что-то типа этого?
http://gamer.livejournal.com/388189.html
Как я понял, Вы пока "тренируетесь на кошках", т.к. сдается мне что такая игра не под F2452.

Re: MSP430G2452 и SD карта

Добавлено: Сб июн 22, 2013 23:03:03
GreatDrek
Представим что у нас экран 20 на 20 пикселей(это для удобства объяснения), герой у нас к примеру пиксель которого мы передвигаем вперед, можем прыгать к примеру и т.д.
Так вод есть двадцать пикселей с низу экрана, герой наш на самом деле всегда стоит на месте, то есть по центру экрана, а вот если мы говорим пройти в перед на один шаг в перед ( на один пиксель) то те 20 которые у нас были сдвигаются в лево, остается 19 из двадцати которые были, а новый пиксель который должен появиться может рандомно появиться на разной высоте, к примеру в трех разных пикселях по высоте, это делается в коде так--- к примеру делаем таймер который каждые 100мс обнуляется, по кругу до 100 и снова в 0, делим 100мс на 4, получаем по 25 мс, и говорим что если в тот момент когда вы нажали переместиться таймер был <25 то на высоте 1 появиться пиксель, если >25 && <50 то на высоте 2 пикселя, >50 && <75 3пиксель, ну а >75 && <100 то вообще не создавать пиксель, всю логику до конца я не продумывал так как пока не будет экрана и всего нет смысла придумывать полностью игру, надо работать уже с теми вещами что у меня буду и выжимать из них максимум.
Пиксель это абстрактно, на практике же нарисовать человечка и разнообразней ландшафт и добавить логический элемент, чтото на подобии надо переместить кубики так что бы можно было пройти дальше а не окончательно завалить проход.

Кстати я сейчас под G2553 программирую.

Да кстати вспомнил, что такого типа игру я уже делал но только с светодиодной матрицей, у меня лежали светодиоды, скрутил я их на матрицу 5 на 5, но 5 светодиодов очень мало для понимания что происходит на экране если не ты написал там происходящее :))
Единственное что нормально на той матрице выглядело - это синусоида и эквалайзер, но за то на примере той матрицы я понял как работает развертка в мониторах.

Re: MSP430G2452 и SD карта

Добавлено: Сб июн 22, 2013 23:16:42
Ser60
Ясно. Я из-за любопытства спросил. Единственная игра, в проект которой я был вовлечен когда-то - эта:
http://mcs.uwsuper.edu/sb/327/Projects/2008/Race/
Может и Вам чего-то попроще выбрать для начала.

Re: MSP430G2452 и SD карта

Добавлено: Сб июн 22, 2013 23:20:42
GreatDrek
Ser60 писал(а):Ясно. Я из-за любопытства спросил. Единственная игра, в проект которой я был вовлечен когда-то - эта:
http://mcs.uwsuper.edu/sb/327/Projects/2008/Race/
Может и Вам чего-то попроще выбрать для начала.
Да кстати вспомнил, что такого типа игру я уже делал но только с светодиодной матрицей, у меня лежали светодиоды, скрутил я их на матрицу 5 на 5, но 5 светодиодов очень мало для понимания что происходит на экране если не ты написал там происходящее
Единственное что нормально на той матрице выглядело - это синусоида и эквалайзер, но за то на примере той матрицы я понял как работает развертка в мониторах.
Дописал уже после вашего ответа :)

Re: MSP430G2452 и SD карта

Добавлено: Сб июн 22, 2013 23:26:08
Ser60
Тогда удачи! Будут вопросы по 430 - поможем.

Re: MSP430G2452 и SD карта

Добавлено: Сб июн 22, 2013 23:30:10
GreatDrek
Ser60 писал(а):Тогда удачи! Будут вопросы по 430 - поможем.
Спасибо, сейчас разбираю синтаксис IAR, все таки переубедили отбросить Energia :))

Re: MSP430G2452 и SD карта

Добавлено: Вс июн 23, 2013 11:22:22
YS
отбросить Energia
И правильно. Energia - для детей и девочек. :) Хотя сам GCC, который там используется, вполне хорош, его можно прикрутить, например, к Code::Blocks. Но это уже другая история. :)
Спасибо, сейчас разбираю синтаксис IAR
В IAR нет какого-то совсем особого синтаксиса. Единственно только объявления прерываний:

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

#pragma vector = <название вектора, объявленное в заголовочнике для МК и указанное в доках>
__interrupt void <название функции-обработчика, какое Вам больше нравится>(void)
И еще, переменные, которые должны быть положены как константы во флеш (не то, что Вы там писать в рантайме будете, а безусловные константы; ну там, массивы какие-нибудь типа картинок), объявляются через __ro_placement (стр. 210).

А если Вы, например, хотите, чтобы линкер сразу поместил Вашу структуру, например, с сейвами игры, в нужный сегмент, сделать это можно через #pragma location. Указываете адрес, куда положить, - и все, оно будет там.

Все. Остальное - стандартный ANSI C. Боже упаси Вас писать под МК на C++ и заводить объекты!

Re: MSP430G2452 и SD карта

Добавлено: Вс июн 23, 2013 12:31:03
GreatDrek
Понял, не пытаться делать объектно ориентированное программирование на МК :))

Re: MSP430G2452 и SD карта

Добавлено: Вс июн 23, 2013 14:54:54
YS
Ну, тут разговор не столько об ООП вообще, сколько о его конкретной реализации. Но вообще да, ООП - вотчина систем с гигабайтами памяти и гигагерцами вычислительной мощности. Порождение объекта, да еще, не приведи Господь, динамического, отжирает кучу памяти и требует кучу ненужной возни процессора.

Да, тип float/double тоже не надо использовать там, где нет FPU. Софтовые манипуляции с плавающей точкой страшно все замедляют и раздувают код.

Re: MSP430G2452 и SD карта

Добавлено: Вс июн 23, 2013 15:48:13
GreatDrek
Я понимаю что вопрос тупой :) Но все же перед окончательным уходом от Energia хочу понять что не так то.
Есть код
static char drek[][1]= {'a','b','c','d','e'};
...
for(int i=0; i<5; ++i){
Flash.write(flash+key, (unsigned char*) drek ,1);
++key;
}
...

Вот если я так пишу то в память записывается abcde

Но если я возьму и приму с uart букву 'c' к примеру, а ее код из
inByte = Serial.read();
равен 99 и напишу в проге
Flash.write(flash+key, (unsigned char*) inByte ,1);
то при чтении я получаю не 99 а 135 вроде и не понятный символ :)
Мне просто интересно понять почему не правильно записывается информация с uart в память.

Re: MSP430G2452 и SD карта

Добавлено: Пн июн 24, 2013 17:38:56
GreatDrek
В общем если не тяжело будет ответьте пожалуйста.

Re: MSP430G2452 и SD карта

Добавлено: Пн июн 24, 2013 17:49:01
YS
почему не правильно записывается информация с uart в память.
UART не при чем, это магия указателей.

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

static char drek[][1]= {'a','b','c','d','e'};
Здесь drek - указатель на начало массива. И потому когда мы его разыменовываем, например - (unsigned char *)drek[0], мы получаем элемент по нулевому смещению от указателя на массив байт, то есть 'а'.

Во втором случае

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

inByte = Serial.read();
inByte - ЧИСЛО. И запись (unsigned char *)inByte заставляет интерпретировать его, как указатель. Т.е., здесь

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

Flash.write(flash+key, (unsigned char*) inByte ,1);
в память пишется то число, которое находится по адресу, равному значению inByte, но не in Byte.

Правильно было бы

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

Flash.write(flash+key, inByte ,1);

Re: MSP430G2452 и SD карта

Добавлено: Пн июн 24, 2013 18:37:30
GreatDrek
Стало понятно, но только так как вы сказали было бы правильно нельзя записать, так как программа ругается и говорит что перед записью в ячейку значение надо перевести в char.

Re: MSP430G2452 и SD карта

Добавлено: Пн июн 24, 2013 18:43:52
Ser60
Если функции write() нужен поинтер на char, попробуйте так:

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

Flash.write(flash+key, (unsigned char*) &inByte ,1);

Re: MSP430G2452 и SD карта

Добавлено: Пн июн 24, 2013 18:50:25
YS
перед записью в ячейку значение надо перевести в char
Э, а какого типа inByte изначально?
Если функции write() нужен поинтер на char
Похоже все же не поинтер, а само число, ибо там идет обращение к элементу массива:

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

(uint8_t *)array[i]
Разыменовываем указатель, получаем значение.

Re: MSP430G2452 и SD карта

Добавлено: Пн июн 24, 2013 20:28:15
GreatDrek
inByte у меня типа Byte, но я делал его и типа char и типа unsigned char толку ноль, unsigned я так понял из типа убирает все возможные результаты с минусом, тоесть если байт значения от -128 до 127 то unsigned byte будет от 0 до 255, в общем все то что выписали не помагает я все перепробывал уже, я еще делал так,

char test[][1]={};
...
test[1]=inByte;
...
Flash.write(flash+key, (unsigned char*) test[1] ,1);
...

и толку ноль.
В общем не понятно.

Re: MSP430G2452 и SD карта

Добавлено: Пн июн 24, 2013 20:42:40
YS
char test[][1]={};
В чем смысл такой записи? Почему не char test[1]={} ?
test[1]=inByte;
Ошибка. Элемента с номером 1 в массиве с одним элементом нет. Нумерация начинается с нуля.

Правильно:

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

uint8_t test[1];
...
test[0]=inByte;
...
Flash.write(flash+key,test[0] ,1);
...
А вообще - нафига нужен массив из одного элемента? :))