06.10.2012, 10:01
|
#911
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Уроки СИ для AVR микроконроллеров
Сообщение от ut1wpr
|
3. "Увидеть" изменение аналоговой величины можно ТОЛЬКО имея АЦП включенным.
|
Если использовать связку АЦП-ЦАП одной разрядности с общей опорой и два компаратора на дельта- и дельта+, то можно именно увидеть эту дельту во сне.
OFF. Каким кофе пользуетесь для определения чужой задачи?
|
|
|
|
06.10.2012, 18:47
|
#912
|
Почётный гражданин KAZUS.RU
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: Уроки СИ для AVR микроконроллеров
Сообщение от omercury
|
Если использовать связку АЦП-ЦАП одной разрядности с общей опорой и два компаратора на дельта- и дельта+, то можно именно увидеть эту дельту во сне.
|
Эк куда занесло. Кто ж против такой схемы возражает? Удобно. Если ЦАП внешний и будет держать пороги на время сна МК. ![Улыбка](images/smilies/icon_smile.gif) Меня тут вроде одернули Мегой изначально автором оговоренной, мол не выдумывай про иные МК. Я и отошел. А тут... Два компаратора! Фиксация опоры после каждого измерения! Круто! Как раз для этой Меги.
Цитата:
|
OFF. Каким кофе пользуетесь для определения чужой задачи?
|
Дык без кофе шаманим. Казус (вернее отдельные его мемберы) нас всех постепенно ясновидящими делает.
__________________
С уважением,
Vic / ut1wpr
|
|
|
|
06.10.2012, 19:03
|
#913
|
Временная регистрация
Регистрация: 08.01.2007
Сообщений: 92
Сказал спасибо: 17
Сказали Спасибо 9 раз(а) в 9 сообщении(ях)
|
Re: Уроки СИ для AVR микроконроллеров
Вообщем понятно что дело дрянь((
Соль задачи и вправду экономить акум, ...
и пробудится при изменении положения обьекта, среагировать на движение.
Нашол статейку о цифровых ACC с микропотреблением и способностью генерировать преривание, тоисть с сигнальным выводом при начале движения, может кто подскажет чего о этом звере
MMA8450Q
нашол в продаже, и что то у него не большая разница с тем что я думал юзать
ADXL325JCP
Судя по прикидках могу уснуть, предварительно запрограмировав по I2c, и пробудится от внешнего преривания
Может кто с таким зверем работал, Может и библиотечка завалялась))
|
|
|
|
06.10.2012, 19:38
|
#914
|
Почётный гражданин KAZUS.RU
Регистрация: 10.01.2007
Сообщений: 3,412
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
|
Re: Уроки СИ для AVR микроконроллеров
Сообщение от papa_n
|
Вообщем понятно что дело дрянь((
|
Зачем так торопиться с выводами? Объясните, что за задача? Транспортное средство? Хотите отловить начало движения или именно "изменение положения"? Решения-то разные.
Если задача - отловить начало движения, то какое ускорение нужно отловить? Каковы требования к точности отлова координат и времени начала движения? Не космические же там точности нужны...
__________________
There's always more than one way to skin a cat.
|
|
|
|
08.10.2012, 11:15
|
#915
|
Временная регистрация
Регистрация: 08.01.2007
Сообщений: 92
Сказал спасибо: 17
Сказали Спасибо 9 раз(а) в 9 сообщении(ях)
|
Re: Уроки СИ для AVR микроконроллеров
Задача определить начало движения.
Но, будет 2 режима, первый это в активном состоянии отслеживать есть или нету движения, и второй когда устройство выключается полностью, а МК спит, нужна максимальная экономия аккумулятора.
|
|
|
|
08.10.2012, 17:49
|
#916
|
Почётный гражданин KAZUS.RU
Регистрация: 10.01.2007
Сообщений: 3,412
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
|
Re: Уроки СИ для AVR микроконроллеров
Сообщение от papa_n
|
Задача определить начало движения.
|
И какие ускорения ожидаются? Это автомобиль, ракета, велосипед?
__________________
There's always more than one way to skin a cat.
|
|
|
|
09.10.2012, 12:10
|
#917
|
Временная регистрация
Регистрация: 08.01.2007
Сообщений: 92
Сказал спасибо: 17
Сказали Спасибо 9 раз(а) в 9 сообщении(ях)
|
Re: Уроки СИ для AVR микроконроллеров
Сообщение от tempora
|
И какие ускорения ожидаются? Это автомобиль, ракета, велосипед?
|
Надо универсальное устройство: и человек и автомобиль и возможно и велосипед)
Завтра должон получить цифровой ACC MMA8450, хотя в устройстве думаю юзать 8453, но увы это будет через неделю... сейчас собираю библиотеку для этого девайса.
У него есть 2 выхода для формирования прерывания, которые можно запрограммировать через I2c.
Если у кого есть библиотека для работы с такими "зверями", поделитесь пожалуйста)
Мерси боку!
|
|
|
|
30.11.2012, 23:15
|
#918
|
Гражданин KAZUS.RU
Регистрация: 03.07.2010
Сообщений: 843
Сказал спасибо: 156
Сказали Спасибо 378 раз(а) в 190 сообщении(ях)
|
Re: Уроки СИ для AVR микроконроллеров
Доброго времени суток. Продолжаю крутить проект Mega32+3’TFT+SD за основу работы с SD картой взят проект http://www.radiolocman.com/shem/sche....html?di=65357
Инициализация проходит, читает 512байтные сектора. Сейчас стоит вопрос работы с FAT. И вот при обработки прочитанных данных Boot сектора возникают проблемы. Сами байты читаются правильно, в процедуре разделения на переменные типа: firstDataSector, rootCluster, totalClusters, bytesPerSector, sectorPerCluster, reservedSectorCount и.т.д. часть переменных присваивается правильно, часть нет, хотя объявлены в одной строчке. В частности правильно присваевается количество байтов на сектор, не правильно количество секторов на кластер, количество резервных секторов, следовательно и дальше неработают процедуры с root.
Переменные объявляются во внешнем хидере:
Код:
|
//************* external variables *************
volatile unsigned long firstDataSector, rootCluster, totalClusters;
volatile unsigned int bytesPerSector, sectorPerCluster, reservedSectorCount;
unsigned long unusedSectors, appendFileSector, appendFileLocation, fileSize, appendStartCluster;
//global flag to keep track of free cluster count updating in FSinfo sector
unsigned char freeClusterCountUpdated; |
Процедура чтения Boot сектора:
Код:
|
unsigned char getBootSectorData (void)
{
struct BS_Structure *bpb; //mapping the buffer onto the structure
struct MBRinfo_Structure *mbr;
struct partitionInfo_Structure *partition;
unsigned long dataSectors;
unusedSectors = 0;
SD_readSingleBlock(0);
bpb = (struct BS_Structure *)buffer;
if(bpb-›jumpBoot[0]!=0xE9 && bpb-›jumpBoot[0]!=0xEB) //check if it is boot sector
{
transmitString_F (PSTR("not found EB"));
TX_NEWLINE;
mbr = (struct MBRinfo_Structure *) buffer; //if it is not boot sector, it must be MBR
if(mbr-›signature != 0xaa55) return 1; //if it is not even MBR then it's not FAT32
partition = (struct partitionInfo_Structure *)(mbr-›partitionData);//first partition
unusedSectors = partition-›firstSector; //the unused sectors, hidden to the FAT
SD_readSingleBlock(partition-›firstSector);//read the bpb sector
bpb = (struct BS_Structure *)buffer;
if(bpb-›jumpBoot[0]!=0xE9 && bpb-›jumpBoot[0]!=0xEB) return 1;
}
bytesPerSector = bpb-›bytesPerSector;
transmitString_F (PSTR("bytesPerSector ="));
transmitHex(INT, bytesPerSector); transmitByte(' ');//
sectorPerCluster = bpb-›sectorPerCluster;
transmitString_F (PSTR("sectorPerCluster ="));
transmitHex(CHAR, sectorPerCluster); transmitByte(' ');//
reservedSectorCount = bpb-›reservedSectorCount;
transmitString_F (PSTR("reservedSectorCount ="));
transmitHex(INT, reservedSectorCount); transmitByte(' ');//
rootCluster = bpb-›rootCluster;// + (sector / sectorPerCluster) +1;
transmitString_F (PSTR("rootCluster ="));
transmitHex(LONG, rootCluster); transmitByte(' ');//
if (bpb-›FATsize_F16 !=0)
firstDataSector = bpb-›hiddenSectors + reservedSectorCount + (bpb-›numberofFATs * bpb-›FATsize_F16);
else
firstDataSector = bpb-›hiddenSectors + reservedSectorCount + (bpb-›numberofFATs * bpb-›FATsize_F32);
transmitString_F (PSTR("firstDataSector ="));
transmitHex(LONG, firstDataSector); transmitByte(' ');//
dataSectors = bpb-›totalSectors_F32
- bpb-›reservedSectorCount
- ( bpb-›numberofFATs * bpb-›FATsize_F32);
transmitString_F (PSTR("dataSectors ="));
transmitHex(LONG, dataSectors); transmitByte(' ');//
totalClusters = dataSectors / sectorPerCluster;
transmitString_F (PSTR("totalClusters ="));
transmitHex(LONG, totalClusters); transmitByte(' ');//
if((getSetFreeCluster (TOTAL_FREE, GET, 0)) › totalClusters) //check if FSinfo free clusters count is valid
freeClusterCountUpdated = 0;
else
freeClusterCountUpdated = 1;
return 0;
} |
Скажите, что может быть не так. Почему часть переменных объявленные даже в одной строчке работает, часть нет. В том числе даже если присвоить неработающим переменным в процедуре 0. Затем в этой процедуре же прочитать, то нуля уже не будет, а будет какое-то левое значение, хотя и постоянное при каждом запуске МК. Пока не смелюсь грешить на компилятор.
|
|
|
|
30.11.2012, 23:51
|
#919
|
Почётный гражданин KAZUS.RU
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: Уроки СИ для AVR микроконроллеров
Я б проверил выход за размеры массива, не "шутит ли где" #pragma pack c выравниванием структур.
|
|
|
|
01.12.2012, 01:12
|
#920
|
Гражданин KAZUS.RU
Регистрация: 03.07.2010
Сообщений: 843
Сказал спасибо: 156
Сказали Спасибо 378 раз(а) в 190 сообщении(ях)
|
Re: Уроки СИ для AVR микроконроллеров
Да вроде нет, со структуры читается верно, если переменную объявить внутри процедуры, далее этой переменной присваивать значение элемента структуры. Но вот если использовать задуманные автором переменные, то вместо sectorPerCluster =0x08 получается = 0x09 при присваивание этой переменной, типа
sectorPerCluster = 0x00;
считывается 0x01. Т.е. как будто проблема с переменными, а не структурами, как их правильно глобально объявить?
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 22:30.
|
|