Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ATMega16 + AT45DB16
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Stalker27
Здравствуйте, мне нужна помощь в разработке дипломного проекта. По заданию необходимо разработать и собрать лабораторный стенд. Устройство должно записать аналоговый сигнал, пришедший с генератора Г2-57, затем провести некоторые математические действия над записью и выдать результат с выхода на осциллограф.

Устройство в железе практически готово. В схеме использован микроконтроллер ATMega16 и память AT45DB16 2Mb (без ноги Busy).



Имеется разработанная схема, эмуляция проекта в Proteus и не доделанная прошивка с подробными комментариями. Среда разработки CodeWizardAVR.
В основе проекта лежит статья http://www.gaw.ru/html.cgi/txt/app/Atmel/m...at45_to_avr.htm
и учитываются найденные ошибки в коде http://www.123avr.com/z7.htm

На данный момент необходимо переписать код, учитывая отсутствие ноги Busy у памяти. Уверен, кто-то уже делал подобное и есть готовая отлаженная библиотека на AT45DB16. Сам же пока нашел только это http://balancer.ru/g/p1203759 , не знаю на сколько это правильно. На первом этапе достаточно, чтоб устройство просто записывало сигнал и выдавало его же на выход. При этом необходимо минимально доработать аналоговый вход и выход в схеме устройства.

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


mempfis_
Цитата(Stalker27 @ Jun 13 2012, 12:19) *
На данный момент необходимо переписать код, учитывая отсутствие ноги Busy у памяти. Уверен, кто-то уже делал подобное и есть готовая отлаженная библиотека на AT45DB16.


Кусок из рабочего проекта - ожидание готовности памяти после каждой операции. Вставьте вместо опроса статуса ноги BUSY

CODE
#define STATUS_REGISTER_READ = 0xD7, /**< status register */

//коды ошибок
enum {
DF_NO_ERROR=0,
DF_WAIT_FAIL,
DF_NOT_MATCH,
DF_UNKNOWN_DEVICE
};

/***************************************************************/
//ожидание готовности памяти
unsigned char at45xx_wait(void)
{
unsigned int i = 25000;
unsigned char read_data;

at45xx_init_op(); //активация микросхемы памяти
SPIWriteChar(STATUS_REGISTER_READ); //инициализация опкода

while(i>0)
{
delay_5us(100/5);
read_data = SPIReadChar(); //чтение регистра статуса
if( (read_data & 0x80 ) != 0 ) break;
i--;
}

at45xx_end_op(); //деактивация микросхемы памяти

if (i != 0) return DF_NO_ERROR; //обработка ошибок
else return DF_WAIT_FAIL;
}
/***************************************************************/
Maik-vs
Пара замечаний по схеме.
Конденсаторы около кварца указаны 0.022мкф, а надо 22 пф. Очевидно, просто описка, на такой частоте с 0.022 генератор контроллера просто не начнёт работать.
В блоке питания стоит стабилитрон КС509, очевидно, для защиты от перенапряжения по входу. Тогда нужно добавить предохранитель последовательно с VD1, чтобы он сгорал раньше, чем стабилитрон.
Stalker27
Цитата(mempfis_ @ Jun 13 2012, 13:42) *
Кусок из рабочего проекта - ожидание готовности памяти после каждой операции. Вставьте вместо опроса статуса ноги BUSY

Спасибо. Насколько я понял, задержка идет по 20 мкс? И все же, нет ли этого в виде библиотеки? Готов даже приобрести за разумную цену. Самому отлаживать проблемно, на данный момент нет ни генератора шума, ни осциллографа, чтоб проверить работу устройства.

Цитата(Maik-vs @ Jun 14 2012, 08:33) *
Конденсаторы около кварца указаны 0.022мкф, а надо 22 пф. Очевидно, просто описка, на такой частоте с 0.022 генератор контроллера просто не начнёт работать.

Да, действительно описка, на деле стоит 22пф

Цитата(Maik-vs @ Jun 14 2012, 08:33) *
В блоке питания стоит стабилитрон КС509, очевидно, для защиты от перенапряжения по входу. Тогда нужно добавить предохранитель последовательно с VD1, чтобы он сгорал раньше, чем стабилитрон.

Спасибо, учту в чистовике схемы, при монтаже я правда VD1 вообще не впаивал ))

Подскажите, как лучше реализовать аналоговый вход и выход (на схеме обвел красным), нужно ли ставить какую-либо защиту? Правильно ли я подключил буферную микросхему?
mempfis_
Цитата(Stalker27 @ Jun 14 2012, 10:09) *
Спасибо. Насколько я понял, задержка идет по 20 мкс? И все же, нет ли этого в виде библиотеки?


Библиотеки нет. Это вообще кусок кода из проекта на ARM.
Если у Вас есть проект, то думаю Вы найдёте там процедуру выбора микросхемы памяти (nCS уводится в 0) - вставте её вместо at45xx_init_op(); Вместо at45xx_end_op(); вставьте процедуру отпускания микросхемы (nCS возвращается в 1). SPIWriteChar()/SPIReadChar(); - думаю тут понятно. Между чтениями регистра статуса стоит некоторая задержка в 20 uS - в CVAVR есть библиотека delay.h в которой можно найти процедуры задержки.
Maik-vs
Цитата(Stalker27 @ Jun 14 2012, 11:09) *
Подскажите, как лучше реализовать аналоговый вход и выход (на схеме обвел красным), нужно ли ставить какую-либо защиту? Правильно ли я подключил буферную микросхему?

Это всё зависит от параметров сигнала и чего бояться. Все входы контроллера подключены через 2 диода к питаню и земле. Ток через эти диоды не должен превышать 1 ма. У вас этот ток ограничивается R3. Если иметь в виду сетевую наводку от прикосновения к XW1, то ничего не сгорит, но входное напряжение АЦП может превысить опорное и результат оцифровки будет непредвиденным. Можно поставить стабилитрон параллельно С4, но его нелинейность будет влиять.
ШИМ должен усредняться фильтром R4C5? Тогда нужно добавить резистор параллельно С5, через который С5 будет разряжаться. Его роль может играть сопротивление нагрузки на XW2, но тогда это сопротивление должно быть известным и приемлемым. Что будет подключено к XW2? Если стрелочный прибор, то решение приемлемое. Если что-то менее инерционное, то плохо отфильтрованная частота ШИМ может давать интересные результаты. Можно увеличивать ёмкость С5, чтобы лучше фильтровать переменку. Тогда возрастёт инерционность, напряжение на С5 будет отставать от быстрых изменений скважности ШИМ (если они есть).
Stalker27
Цитата(Maik-vs @ Jun 14 2012, 15:47) *
Это всё зависит от параметров сигнала и чего бояться.

ATmega16 содержит 10-разрядный АЦП последовательного приближения. Отличительные особенности:
• Время преобразования 65 - 260 мкс.
• Частота преобразования до 15 тыс. преобразований в секунду при максимальном разрешении
• Диапазон входного напряжения АЦП 0…VCC
• 8 мультиплексированных однополярных входов
• 7 дифференциальных входных каналов
• 2 дифференциальных входных канала с опциональным усилением на 10 и 200

Для уменьшения погрешностей АЦП рекомендуется диапазон Твыб=65…260 мкс (Fд=4…15 кГц). Согласно теореме о дискретном представлении (теорема Котельникова), частота дискретизации должна быть, по крайней мере, в два раза большей частоты сигнала. Следовательно максимальная частота сигнала может быть 7,5 кГц.

Для вывода сигнала нужен цап. Здесь я нашел 2 варианта, либо ШИМ либо R2R в виде цепочки резисторов http://www.rlocman.ru/shem/schematics.html?di=69926 . Первый вариант вроде как проще, да и в статье (второй вариант) заявленный выход частоты от 1 МГц до 8 МГц, что мне не подходит (не знаю можно ли R2R воспроизвести кГц'ы). В статье http://www.gaw.ru/html.cgi/txt/app/Atmel/m...at45_to_avr.htm написано "Частота ШИМ должна быть, по крайней мере, в два раза выше, чем частота сигнала. Рекомендуется, чтобы частота ШИМ была, по меньшей мере, в четыре раза выше (в зависимости от выходного фильтра)". Т.е. частота входного сигнала должна быть уже 15/4= 3,75кГц.

Теперь смотрю какие сигналы на выходе генератора шума Г2-57.

• Период тактовой частоты устанавливается от 1; 3,3; 10 мкс до 333 с (18 положении)
• Длина псевдослучайных последовательностей 2 в степени 4 - 2 в степени 21 периодов тактовых импульсов (19 положений)
• Амплитуда фиксированного напряжения на выходе бинарного сигнала ±(10±0,3) В (Rн = 10 Ом. Rн > кОм)
• Эффективное значение фиксированного напряжения на выходе гауссова сигнала 3,16+0,1 В (RH>600 Ом)
• Амплитуда фиксированного напряжения на выходе равновероятного сигнала ±3 В (R > 600 Ом)
• Погрешность установки частоты + 10%
• Полоса частот гауссова сигнала 0 - 1/20 тактовой частоты
• Задержка бинарного сигнала на выходе 0 - 9999 периодов тактовых импульсов
• Пределы напряжения на выходе 0,1 - 1 В (с дискретностью через 0,1 В):
бинарного сигнала: ±10; ±3,16; ±3; ±1 В (амплитуда);
гауссова сигнала: 3,16; 3; 1; В эфф.;
равновероятного сигнала: ±3, ±1 В (амплитуда)

С частотами выходных сигналов я совсем запутался. Минимальную и максимальную частоту я так и не подсчитал.

Исходя из пределов напряжения на выходе, я могу оцифровать только гауссов сигнал 3,16; 3; 1; В. Либо сделать дифференциальный вход АЦП и оцифровывать сигнал -2,5..2,5. Так же тут нужна защита входа АЦП от 10В. В итоге надо либо как то изменять схему либо менять источник ходного сигнала.
GDI
Можно поставить на входе делитель (в простейшем случае) или ОУ и тогда сможете оцифровывать и 10В входной сигнал. Дальше нужно смотреть на необходимую точность с которой нужно оцифровать входной cигнал, т.к. максимальный размах 10В будет оцифровываться с наибольшей разрядностью, т.е. 10бит (1024 уровня квантования), но тогда 1В будет оцифрован лишь на 7 бит (102 уровня квантования), хватит ли такой точности для 1В? Если нет, то тогда придется делать какой то переключение диапазона. Для разнополяртного входного сигнала обычно применяют ОУ со смещением выходного сигнала ОУ на величину опорного напряжения АЦП ( или на половину опорного напряжения АЦП - это зависит от допустимого входного напряжения АЦП). Т.е., к примеру, входной сигнал +/-5В масштабируется ОУ и переносится в диапазон 0-5В, при этом 0В входного сигнала соответствует 2,5В выходного, и это напряжение подается на вход встроенного АЦП микроконтроллера.
По поводу библиотек, выйдите на один уровень выше, а раздел AVR и там есть прикрепленная тема, которая называется "Исходники программ и библиотек" (элементарно, не правда ли?).
Stalker27
GDI, спасибо за ответ.

Цитата(GDI @ Jun 19 2012, 12:51) *
т.к. максимальный размах 10В будет оцифровываться с наибольшей разрядностью, т.е. 10бит (1024 уровня квантования)

Я использую 8 бит ацп по следующей причине:
"Суммарная системная погрешность АЦП в ATmega16 составляет две младшие единицы, т.е. гарантированно точными во всем диапазоне температур и напряжений являются 8 разрядов из 10. Таким образом целесообразнее использовать именно режим 8/10-бит."

Но в принципе этот размах в 10В и не нужен, мне не обязательно использовать все доступные режимы генератора, думаю до ±3В будет за глаза. Но при этом необходимо предусмотреть защиту от высокого напряжения.

Цитата(GDI @ Jun 19 2012, 12:51) *
Т.е., к примеру, входной сигнал +/-5В масштабируется ОУ и переносится в диапазон 0-5В, при этом 0В входного сигнала соответствует 2,5В выходного, и это напряжение подается на вход встроенного АЦП микроконтроллера.

Получится что я потеряю качество сигнала при оцифровке почти в 2 раза? В принципе от ±3В это будет меньше заметно. Можно пример такого ОУ, желательно с формулами его расчета?

Цитата(GDI @ Jun 19 2012, 12:51) *
По поводу библиотек, … (элементарно, не правда ли?).

Если бы было все так просто, в моем варианте нет ноги BUSY, в этом-то вся и проблема…
Сергей Борщ
QUOTE (Stalker27 @ Jun 19 2012, 18:26) *
Если бы было все так просто, в моем варианте нет ноги BUSY, в этом-то вся и проблема…
Если вы прочитаете документацию (а конкретно - абзац про регистр статуса микросхемы памяти), то поймете, что заменить анализ ноги BUSY на чтение регистра статуса и анализ в нем одноименного бита - совсем не сложно. А если внести такое мизерное изменение в готовую программу для вас сложно - то и вся описанная задача вам явно не по зубам. И документацию читать все равно придется - никакие готовые библиотеки без этого работать не будут. Или будут, но не так как вы хотите.
GDI
Цитата(Stalker27 @ Jun 19 2012, 19:26) *
Получится что я потеряю качество сигнала при оцифровке почти в 2 раза? В принципе от ±3В это будет меньше заметно. Можно пример такого ОУ, желательно с формулами его расчета?

С чего это? Вы просто промасштабируете входной сигнал. А чтобы не "терять при оцифровке", сигнал подаваемый на АЦП должен иметь размах полного диапазона АЦП, т.е. если диапазон АЦП 0-5В, то и входной сигнал должен иметь размах как можно ближе к 0-5В, тогда получите максимальный динамический диапазон.
А пример ОУ - это обычный инвертирующий усилитель, только на неинвертирующий вход нужно подать постоянное напряжение смещения, равное половине диапазона АЦП. Ну, и промасштабировать выходной сигнал как обычно, подобрав резисторы обратной связи. Вот нашел описание http://cxem.net/beginner/beginner96.php ищите раздел "В) Дифференциальное включение".
Цитата(Stalker27 @ Jun 19 2012, 19:26) *
Если бы было все так просто, в моем варианте нет ноги BUSY, в этом-то вся и проблема…
Поищите по форуму at45db161 и найдете много интересного, в том числе и библиотеки. У меня есть одна библиотека, не помню откуда ее взял, она использует регистр состояния. Но Сергей Борщ Вам правильно сказал - читайте документацию, чтобы понимать как оно работает и что Вы делаете.
Stalker27
Наконец-то появилось время, начал писать свою библиотеку для AT45. За основу взял исходник at45db161.rar от GDI, кусок кода от mempfis_ и исправленную версию кода этого человека http://balancer.ru/g/p1203759. Пока сделал процедуру очистки памяти, если с ней разберусь, то думаю в дальнейшем проблем не должно быть. Посмотрите пожалуйста все ли я так делаю?
CODE
#include <mega16.h>
#include <stdio.h>
#include <delay.h>
#include <at45_defines.h>

#define DF_CHIP_SELECT 0x10 // DataFlash chip select port pin (PB 4)


//коды ошибок
enum {
DF_NO_ERROR=0,
DF_WAIT_FAIL,
DF_NOT_MATCH,
DF_UNKNOWN_DEVICE
};


//::::::::::::::::::::::::::::::::::::::::::::::::::::::
// Активация микросхемы памяти
//::::::::::::::::::::::::::::::::::::::::::::::::::::::
void AT45_Check_ON(void)
{
PORTB &= ~DF_CHIP_SELECT; // {SPI_PORT &= ~( (1<<nSS_AT45DBXX)|(1<<SCK)|(1<<MOSI) );}
}


//::::::::::::::::::::::::::::::::::::::::::::::::::::::
// Деактивация микросхемы памяти
//::::::::::::::::::::::::::::::::::::::::::::::::::::::
void AT45_Check_OFF(void)
{
PORTB |= DF_CHIP_SELECT;
}


//::::::::::::::::::::::::::::::::::::::::::::::::::::::
// Записываем байт
//::::::::::::::::::::::::::::::::::::::::::::::::::::::
void SPI_Write_Byte(unsigned char data)
{
//Start transmission
SPDR = data;
//ожидание завершения передачи
while (!(SPSR & (1<<SPIF))); // while((SPSR & (1<<SPIF)) == 0); while (!(SPSR & 0x80));
}


//::::::::::::::::::::::::::::::::::::::::::::::::::::::
// Читаем байт
//::::::::::::::::::::::::::::::::::::::::::::::::::::::
unsigned char SPI_Read_Byte(void)
{
//Start transmission
SPDR = 0x00;
//ожидание завершения передачи
while (!(SPSR & (1<<SPIF)));
return SPDR;
}


//::::::::::::::::::::::::::::::::::::::::::::::::::::::
// Ожидание готовности памяти
//::::::::::::::::::::::::::::::::::::::::::::::::::::::
unsigned char AT45_Ready_Wait(void)
{
unsigned int i = 25000; //кол-во циклов проверки состояния готовности
unsigned char read_data;

AT45_Check_ON(); //активация микросхемы памяти

SPI_Write_Byte(AT45_OP_STATUS_REGISTER_READ); //инициализация опкода
while(i>0)
{
delay_us(25); //1 мсек = 1000мксек
read_data = SPI_Read_Byte(); //чтение регистра статуса
if( (read_data & 0x80 ) != 0 ) break;
i--;
}

AT45_Check_OFF(); //деактивация микросхемы памяти

if (i != 0) return DF_NO_ERROR; //обработка ошибок
else return DF_WAIT_FAIL;
}


//::::::::::::::::::::::::::::::::::::::::::::::::::::::
// Стирание блока
//::::::::::::::::::::::::::::::::::::::::::::::::::::::
void AT45_Block_Erase(int block_counter)
{
AT45_Check_ON(); //активация микросхемы памяти

SPI_Write_Byte(AT45_OP_BLOCK_ERASE);
SPI_Write_Byte((char)(block_counter>>3)); // 0x3F&(u8_t)(block>>6));
SPI_Write_Byte((char)(block_counter<<5));
SPI_Write_Byte(0x00);

AT45_Check_OFF(); //деактивация микросхемы памяти

if (AT45_Ready_Wait != 0) //по ДШ от 45 до 100 мсек
{
//если ошибка
}
}


//::::::::::::::::::::::::::::::::::::::::::::::::::::::
// Полное стирание FLASH
//::::::::::::::::::::::::::::::::::::::::::::::::::::::
void AT45_Full_Erase(void)
{
unsigned int block_counter = 0;

while (block_counter<AT45_NUM_BLOCKS)
{
AT45_Block_Erase(block_counter);
block_counter++;
};
}


Теперь несколько глупых вопросов:
1.Возможно стоит использовать активацию и деактивацию памяти (AT45_Check_ON/OFF) только в AT45_Full_Erase перед и после while, а в AT45_Block_Erase и в AT45_Ready_Wait убрать их? Или тут принципиально?

2.Как найти оптимальную задержку delay_us в AT45_Ready_Wait? Или ее стоит убрать вообще как в at45db161.rar?

3.0x80 и 1<<SPIF одно и то же? Если да то сточку read_data & 0x80 можно так же записать read_data & (1<<SPIF) ?

4.В каком случае правильнее активируется память?
SPI_PORT &= ~(1<<DF_CHIP_SELECT);
SPI_PORT &= ~( (1<<DF_CHIP_SELECT)|(1<<SCK)|(1<<MOSI) );

5.В AT45_Block_Erase нашел отличия в исходниках в одной строчке (стоит коммент) 0x3F&(u8_t)(block>>6). Это правильно?

6.В файле at45_defines.h из архива at45db161.rar реализовано 2 варианта кодов, как воспользоваться этим SPI_MODE_0_3 ?
mempfis_
Откопал старый 100% рабочий проектик в котором использовалась at45 память.
Может поможет в освоении. Нужно будет переназначить пины управления памятью. Проект писался под atmega64 но если мне не изменяет память то в SPI отличий не должно быть.
GDI
Судя по Вашим вопросам, Вы не разобрались в работе АТ45, потому что все ответы есть в даташите. И теперь, не разобравшись, Вы пытаетесь написать "свою" библиотеку путем копи-паста из нескольких чужих библиотек. С моей точки зрения, если Вам не хочется разбираться досконально, то надо просто использовать одну из готовых билиотек. А если уж Вы хотите написать что то своё, то надо пересилить себя и прочитать даташиты (на АТ45, на контроллер, а может еще и на интерфейс SPI), а некоторые его места прочитать по нескольку раз, до полного понимания.
Нежелание разобраться в вопросе - это порок, потому я буду жёсток.
Цитата(Stalker27 @ Jul 10 2012, 08:55) *
1.Возможно стоит использовать активацию и деактивацию памяти (AT45_Check_ON/OFF) только в AT45_Full_Erase перед и после while, а в AT45_Block_Erase и в AT45_Ready_Wait убрать их? Или тут принципиально?
Тут наблюдается полное непонимание принципов работы интерфейса SPI. В отсутствие активного сигнала CS, все выходы подчиненного устройства переводятся в 3е состояние, т.е. устройство полностью отключается от шины. Думаю дальше не нужно объяснять?
Цитата(Stalker27 @ Jul 10 2012, 08:55) *
2.Как найти оптимальную задержку delay_us в AT45_Ready_Wait? Или ее стоит убрать вообще как в at45db161.rar?
А зачем её искать? Попробуйте понять что будет в результате выполнения функции AT45_Ready_Wait и как тоже самое реализовано в at45db161.rar.
Цитата(Stalker27 @ Jul 10 2012, 08:55) *
3.0x80 и 1<<SPIF одно и то же? Если да то сточку read_data & 0x80 можно так же записать read_data & (1<<SPIF) ?
Проверьте, что такое SPIF и что такое read_data & 0x80. Может быть число получится и одинаковое, но легко ли будет понять что делает этот кусок кода? Здесь более уместной будет подобная запись read_data & (1<<AT45_STATUS_FLAG_BUSY), не правда ли, из такой записи и без комментариев понятно, что мы ожидаем получить?. Учитесь писать самодокументируемый код.
Цитата(Stalker27 @ Jul 10 2012, 08:55) *
4.В каком случае правильнее активируется память?
SPI_PORT &= ~(1<<DF_CHIP_SELECT);
SPI_PORT &= ~( (1<<DF_CHIP_SELECT)|(1<<SCK)|(1<<MOSI) );
Если Вы используете аппаратный SPI, то однозначно надо использовать первый вариант. Не знаю, откуда Вы второй взяли? Могу предположить что он используется в варианте программной реализации SPI.
Цитата(Stalker27 @ Jul 10 2012, 08:55) *
5.В AT45_Block_Erase нашел отличия в исходниках в одной строчке (стоит коммент) 0x3F&(u8_t)(block>>6). Это правильно?
Вот тут надо не различия искать, а прочитать в даташите, как же правильно сделать.
Цитата(Stalker27 @ Jul 10 2012, 08:55) *
6.В файле at45_defines.h из архива at45db161.rar реализовано 2 варианта кодов, как воспользоваться этим SPI_MODE_0_3 ?
Тут тоже пробел в Ваших знаниях. Интерфейс SPI может работать в 4х режимах, которые называются не затейливо, режимы 0, 1, 2 и 3. Режим устанавливается при настройке мастера SPI. АТ45 может работать только в 0 и 3 и автоматически определает который используется в данный момент. Соответствено, после настройки мастера Вы должны указать библиотеке, какой же режим Вы настроили, для этого и используется этот дефайн.

Чтобы писать хорошие программы, надо сперва читать документацию. Я надеюсь, что из Вам помогут мои советы.
Stalker27
Цитата(mempfis_ @ Jul 10 2012, 11:41) *
Откопал старый 100% рабочий проектик в котором использовалась at45 память.

Спасибо, это пригодится.

Цитата(GDI @ Jul 10 2012, 11:48) *
все ответы есть в даташите.

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

Цитата(GDI @ Jul 10 2012, 11:48) *
если Вам не хочется разбираться досконально, то надо просто использовать одну из готовых

Это мне подходит, о чем я просил и раньше. Проблема в том, что нет у меня пока ни одной библиотеки, которую не пришлось бы доработать. А чтобы поправить готовую библиотеку под себя, надо ее всю перелопатить и понять что к чему.

Цитата(GDI @ Jul 10 2012, 11:48) *
Вы пытаетесь написать "свою" библиотеку путем копи-паста

Так и есть, собственно вытекает из выше сказанного. Все равно лопатить надо, заодно и сделаю максимально под себя.

Цитата(GDI @ Jul 10 2012, 11:48) *
Попробуйте понять что будет в результате выполнения функции AT45_Ready_Wait и как тоже самое реализовано в at45db161.rar

По сути тоже самое, только в at45db161.rar просто зацикливание происходит, а в AT45_Ready_Wait еще и с некоторой задержкой. Для меня спорный вопрос что лучше и меньше ресурсов жрет.

Цитата(GDI @ Jul 10 2012, 11:48) *
Соответствено, после настройки мастера Вы должны указать библиотеке, какой же режим Вы настроили, для этого и используется этот дефайн.

С этим у меня проблема возникла.

Цитата(GDI @ Jul 10 2012, 11:48) *
Я надеюсь, что Вам помогут мои советы.

Безусловно, помогли, как и предыдущие, огромное спасибо.

Собственно из всего выше сказанного назревает вопрос, может ли кто-нибудь взяться за реализацию проекта не безвозмездно. Готов рассмотреть такой вариант за разумную цену. Думаю опытному специалисту здесь на пару вечеров работы.
GDI
Вот теперь уже у Вас есть две 100%-но работающих библиотеки, так почему же Вы все еще хотите написать свою? Конечно чужой код надо поправить, надо пару дефайнов переопределить под своё железо. Вы сэкономите себе много времени, если вдумчиво прочитаете даташит, понимаю, это трудно, самому бывает лень делать такое, но опыт показывает что надо читать.
Цитата
По сути тоже самое, только в at45db161.rar просто зацикливание происходит, а в AT45_Ready_Wait еще и с некоторой задержкой. Для меня спорный вопрос что лучше и меньше ресурсов жрет.
А какие ресурсы Вы имеете в виду? Энергопотребление? На мой взгляд AT45_Ready_Wait выполнена более здраво, но при некоторых обстоятельствах она будет давать задержку до 1мс по сравнению тем что сделано в at45db161.rar, но вместе с тем использование этой функции может предотвратить зависание программы, если что-то произошло с АТ45, т.е. у нее есть таймаут после которого мы однозначно выйдем из функции и сможем выполнить какие то действия, например зажечь красный светодиод как индикатор аварии, в отличие от бесконечного цикла в at45db161.rar где программа просто остановится навсегда в ожидании.

Для объявлений с предложением работы есть специальный раздел.

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

P.S. кстати, посмотрел по ссылке http://balancer.ru/g/p1203759, там речь идел об 45DB161D, а у Вас микросхема с индексом B, а у них есть отличия, я уже не помню точно какие, но есть, можете на сайте Атмела посмотреть соответствующий Appnote.
Stalker27
Цитата(GDI @ Jul 10 2012, 14:50) *
Вы учитесь на программиста микроконтроллеров


В том то и дело, что я не на программиста микроконтроллеров учусь, а на автоматизированные системы и ПО вычислительной техники. В жизни работаю системным администратором, максимум программистом на ПК. С дипломом мне не повезло похоже, возможно даже специальность не много не ту выбрал. Теперь тяжело сразу две сферы деятельности тянуть.
GDI
Умение читать и понимать документацию поможет и в работе системного администратора, и в работе программиста ПК. Ну, а тему диплома можно и свою придумать, которая будет соответствовать Вашим представлением о будущей работе, и согласовать ее в руководителем. В конце концов это Ваш диплом, Вы и должны суетиться, а не тупо выбирать из тем предложенных руководителем. Да, это трудно. Но представьте ситуацию, приходят устраиваться на работу сисадмином два выпускника, у одного диплом "Стенд на микроконтроллере", а у второго " Исследование устойчивости к атакам 'Slow HTTP POST' серверов WinServer2008 и UNIX". Как Вы думаете, кого при прочих равных предпочтет работодатель?
Stalker27
Цитата(GDI @ Jun 20 2012, 16:52) *
Вот нашел описание http://cxem.net/beginner/beginner96.php ищите раздел "В) Дифференциальное включение".

Сделал расчет ОУ. Предположим на вход подается +-5В, на выходе надо получить 0-5В (0В на входе соответствует 2,5В на выходе), ИОН АЦП равен 5В. К GB2 подключается ИОН, а к GB1 исследуемый сигнал. Rвх2=Rвх1=2кОм, Rоос=R1=1кОм. Тогда получается таблица соответствия:

Uвх / Uвых
-5В = 5В
-4В = 4,5В
-3В = 4В
-2В = 3,5В
-1В = 3В
0В = 2,5В
1В = 2В
2В = 1,5в
3В = 1В
4В = 0,5В
5В = 0В

Получилось правда все значения на выходе в зеркале, думаю в прошивке учесть придется. Либо на GB1 (???) подать отрицательный ИОН, что сложнее.

Нужно ли делать RC связку и какую-нибудь защиту от высокого напряжения? Как правильно выбрать элемент ОУ?
GDI
Естественно, это инверсное включение. Можно на выходе поставить еще один ОУ как инвертор напряжения или вторую половину, если использовать сдвоенный ОУ. Но проще учесть в прошивке.
А что Вы называете "RC связкой"? Защиту от высокого я бы сделал, но надо реализовать её так чтобы она не вносила нелинейность на входе. ОУ выбирается исходя из необходимых частотых характеристик, питающего напряжения. Этот вопрос лучше обсудить с руководителем дипломного проекта. Следует иметь в виду что обычные ОУ не могут измерять напряжения близкие к напряжению питания. Если, всё же нужны такие измерения, то можно применить Rail-to-rail ОУ.
Stalker27
Цитата(GDI @ Jul 12 2012, 11:40) *
А что Вы называете "RC связкой"?

У меня в схеме на входе АЦП и выходе ШИМа стоят аналоговые ФНЧ в виде RC-фильтра. На выходе ФНЧ удаляет несущую высокую частоту ШИМ. Нужен ли подобный фильтр на входе?

Цитата(GDI @ Jul 12 2012, 11:40) *
Защиту от высокого я бы сделал, но надо реализовать её так чтобы она не вносила нелинейность на входе.

А как это сделать? Может есть какой-нибудь пример?

На счет выбора ОУ. Нашел такую таблицу (нужно промотать вниз):
http://www.analog.com/ru/all-operational-a...ucts/index.html

Small Signal Bandwidth - это как раз таки пропускная частота? АЦП у меня 15Мгц, соответственно эта цифра должна быть больше 15...

V Span Min V Span Max - это максимум и минимум на выходе или питание?
GDI
У Вас столько вопросов, их все надо задавать руководителю диплома, а не на форуме.
Цитата
АЦП у меня 15Мгц
Это имеет лишь косвенное отношение к делу. Я имел ввиду диапазон частот входного сигнала, от него же будет зависеть частота сэмплирования АЦП и не факт что Вам понадобится на 15МГц его оцифровывать. С другой стороны, такой поток AVR никогда не обработает.
Я сейчас пытаюсь ответить на вопросы о сферическом коне в вакууме. Все ответы зависят от входных условий задачи, которых не было озвучено, да и не надо. Руководитель должен знать ответы, это его работа и его стенд.
Dikoy
Вот тут есть рабочая библиотека http://www.dikoy44.narod.ru/projects/pyroavtopilot.htm
Только под другие модели памяти надо скорректировать размеры страниц и т.п.
Stalker27
Здравствуйте, закончил с адаптацией библиотеки AT45 под свой проект, проверил в железе, все работает. Возможно я уже всем надоел, но вопрос с аналоговым входом все еще остался. Наткнулся на специализированные драйверы АЦП типа INA159 и AD8275 (в приложении на рис. а и б), подходят мне идеально, вот только проблема в том, что в магазинах их нет. Привлекло в них, что внутренние резисторы идут с лазерной подгонкой и ОУ не требуется отдельного источника питания. Возможно, кто-то знает доступные аналоги?

Если ни чего подобного найти не смогу, буду делать по схеме (на рис. д) с диф. включением ОУ. Опять же не могу понять, какой ОУ использовать. От всех параметров голова кругом, помогите пожалуйста. Распространенного LM358 достаточно? Или лучше что-то более прецизионное поставить? Как определить частоту среза RC фильтра?

В принципе можно сделать еще с вариантом диф. АЦП (на рис. в), не знаю есть ли смысл?

Так же нашел вариант защиты от высокого напряжения (на рис. г), опять же есть ли смысл? Вроде как лишние искажения, а ОУ и так защитит вход АЦП.
Dikoy
фильтр http://analogiu.ru/6/6-5-2-1.html
Детально можно промоделировать в микрокапе и получить аж график: http://s017.radikal.ru/i443/1112/c5/e33d12defe41.png
Вот тут много умных мыслей: http://forum.ixbt.com/topic.cgi?id=48:10377
А тут их продукт http://www.dikoy44.narod.ru/projects/Vibrotester.htm , как пример.

Защита в данном случае не нужна.

АЦП контроллерный, как я понимаю? Тогда любой ОУ пойдёт. Задача не ясна... Если превратить переменку в постоянку, так вот http://dikoy44.narod.ru/projects/vkr11.htm
GDI
Analog Devices высылает сэмплы своих микросхем, по 2 штуки и до 3х наименований в одном заказе, так что если нужно не много, то это вариант их достать, причем бесплатно.
Stalker27
Спасибо за ответы.

Цитата(Dikoy @ Jul 29 2012, 09:30) *

Я имею ввиду ни как рассчитать RC, а как узнать какая частота среза должна быть?

Цитата(GDI @ Jul 30 2012, 12:10) *
Analog Devices высылает сэмплы своих микросхем, по 2 штуки и до 3х наименований в одном заказе, так что если нужно не много, то это вариант их достать, причем бесплатно.

А реально заказать если нет корпоративной почты и сайта?
GDI
Цитата(Stalker27 @ Jul 30 2012, 21:12) *
А реально заказать если нет корпоративной почты и сайта?
Так Вы попробуйте, попытка не пытка (как говорил товарищ Берия). Я давно заказывал, тогда корпоративный ящик не требовался и сайт вовсе не нужен был. Но после этого прошло много времени, лет 10, так что все могло поменяться. В любом случае, там есть поле для Вашего комментария или для описания проекта, напишите там что это для диплома, я думаю, Вам пойдут на встречу.
Dikoy
Цитата(Stalker27 @ Jul 30 2012, 20:12) *
Я имею ввиду ни как рассчитать RC, а как узнать какая частота среза должна быть?
**
А реально заказать если нет корпоративной почты и сайта?

Ну, в тупом случае х2 частоты самплирования. А вообще надо смотреть что там за шумы и что именно надо резать. Например, помеху от ИБП или чего подобного.
И я бы рекомендовал использовать LC.

Ti прекрасно шлёт самплы и ОУ у них хорошие. Аналог козлится.
Изучай. http://forum.ixbt.com/topic.cgi?id=48:5326
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.