Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Расширение памяти у Tiny2313
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
aspID
По поиску нашел, что например, на Мегу можно повесить "сколько угодно внешней" памяти. А можно ли использовать внешнюю память на семействе Tiny, в частности, Tiny2313? Если да - то как. Речь идет именно о памяти SRAM (если ничего не путаю в терминах). Т.е. о той, где хранятся переменные и массивы в момент выполнения программы.

Здесь же хотелось бы попросить помощи - может кто порекомендует ссылку на литературу по оптимизации стеков - какие размеры давать стекам? Как узнать минимально необходимый (для компиляции пользуюсь IAR AVR). По документации то ли перечитал, то ли... каша в голове получилась, что куда "кладется" по умолчанию. На данный момент вся оптимизация заключается в том, что для текстовых данных пользуюсь только одним указателем и весь текст храню в ЕЕПРОМе.

Вопрос оптимизации и расширения памяти встал, когда не смог реализовать простой (как мне кажется) проект - есть табло из двух 7-сегментников, статика через регистры, две ноги - синхроимпульсы регистров. Для вывода информации на сегменты используются функции, в которые передаются указатели на структуры (в структуре хранится массив с упорядоченными данными о порядке следования пинов для корректного отображения информации и собственно адреса порта, к которому подключен регистр). Также задействован USART и 1-wire. Так вот, приходится делать выбор - все вместе работать не желает. И даже не получается сделать некий интерфейс управления (через switch (t) где t - это содержимое регистра UDR) сколько-то полноценным.

Если потребуется, могу приложить схемку и архив с проектом.
jasper
Цитата(aspID @ Jan 20 2008, 09:45) *
По поиску нашел, что например, на Мегу можно повесить "сколько угодно внешней" памяти. А можно ли использовать внешнюю память на семействе Tiny, в частности, Tiny2313? Если да - то как. Речь идет именно о памяти SRAM (если ничего не путаю в терминах). Т.е. о той, где хранятся переменные и массивы в момент выполнения программы.

Как на Мегах, нет. Память подцепить можно, по последовательному порту или даже обычную SRAM с параллельным портом (если ног хватит), но придется писать специальные процедуры для обмена с памятью.
Самое простое для вас – перейти на Мегу, к тому же, если на С пишите.
Семейство Tiny - только для небольших ассемблерных проектов ИМХО.
SasaVitebsk
Например atmega8 (48-168) по площади занимаемой на плате (ai) даже меньше чем t2313. При этом у неё ног на один порт больше, богаче переферия, есть умножитель, больше памяти (1к) и EEPROM. Стоит она даже дешевле чем t2313 за счёт своей массовости. Проекты на Си вполне легко создаются на ней. Причём вполне крупные.

Для Си - инициализация стека не требуется. Распределение памяти, размещение в ней сегментов в том числе и стековых - задача компилятора. В IAR C, к примеру, используется два стека.

ЗЫ: Да кстати ваш проект явно можно уместить и в памяти имеющейся микрухи. Хотите - приложите. Люди помогут. smile.gif
Aesthete Animus
Цитата(aspID @ Jan 20 2008, 07:45) *
По поиску нашел, что например, на Мегу можно повесить "сколько угодно внешней" памяти.

Хм... Где вы такое нашли? Во первых, работать с внешней памятью именно как с памятью можно далеко не на всех мегах, а только на тех, которые имеют внешнюю шину памяти, например мега128. Во всех остальных случаях вы будете работать с памятью просто как с внешним устройством. Если это устраивает, то лучше всего подключить SPI`ную FRAM`ку. Как я понял, тини2313 имеет USI, который можно запустить в режиме SPI, так что, все можно сделать и на этом контроллере.
Qwertty
Цитата(Aesthete Animus @ Jan 20 2008, 17:09) *
Если это устраивает, то лучше всего подключить SPI`ную FRAM`ку. Как я понял, тини2313 имеет USI, который можно запустить в режиме SPI, так что, все можно сделать и на этом контроллере.

Если нужна именно память, то FRAM явно невыгодна - дорогая слишком. Тут проще сам контроллер заменить. Или применить что-то типа N256S0830 - http://www.amis.com/pdf/ulp_memory/serial_...S08xxHDA_ds.pdf Правда ее доступность в России оставляет желать лучшего sad.gif
Aesthete Animus
Может стоит попытаться оптимизировать? Мне к примеру не ясно, зачем вот это:

Цитата(aspID @ Jan 20 2008, 07:45) *
Для вывода информации на сегменты используются функции, в которые передаются указатели на структуры (в структуре хранится массив с упорядоченными данными о порядке следования пинов для корректного отображения информации и собственно адреса порта, к которому подключен регистр).

Не поясните, какие структуры и зачем они нужны?
aspID
Цитата(Aesthete Animus @ Jan 20 2008, 22:42) *
Может стоит попытаться оптимизировать?

Стоит, хотя бы для того, чтобы научится smile.gif Но ест сомнения, что все уместится на самом деле sad.gif
Цитата(Aesthete Animus @ Jan 20 2008, 22:42) *
Мне к примеру не ясно, зачем вот это:
Не поясните, какие структуры и зачем они нужны?

Удобный пережиток, если можно так сказать smile.gif Пользовался 7-сегментниками, которые были распинованы по-разному, но вешал их на одну шину. Пришлось писать структуру, в которую просто в нужном порядке передавались ноги. Тогда с помощью функции можно было в любой разряд записать любой символ.

Выглядело это примерно так:

Код
#define SEG_7_UP        0 //Верхний сегмент
#define SEG_7_MID       1 //Серединка
#define SEG_7_BOT       2 //Нижний сегмент
#define SEG_7_UPLEFT    3 //Верхний левый
#define SEG_7_UPRIGHT   4 //Верхний правый
#define SEG_7_BOTLEFT   5 //Нижний левый
#define SEG_7_BOTRIGHT  6 //Нижний правый
#define SEG_7_DOT       7 //Точка (минус)
//#define SEG_7_SYNCBIT  

typedef struct
{
  unsigned char volatile * p_ucPort;     //Адрес порта
  unsigned char volatile * p_ucPulsePin; //Куда выдавать импульс синхронизации
//  char cPulseBit;                        //маска
  unsigned char volatile Data[8];
} seg7;


Также существовали
void Seg7_Init( seg7 & Segment,
unsigned char volatile * p_ucPort,
char * p_cSegArr, //Массив, где по порядку сложены биты сегментов
);
и
void Seg7_Echo(char cSymbol, bool dot, seg7 & Segment);

Далее можно было использоват
Seg7_Echo ( 'A', 0, &seg[0]);

Болшим код становится из-за доволно громоздкого Seg7_Echo(), в котором внутри просто стоит switch. Иначе не смог придумать вывода на 7-сегментники sad.gif а далше просто ползовался тем, что уже было smile.gif
Aesthete Animus
2aspID
Вы и в самом деле теряете слишком много памяти на переменных, которые никогда не будут изменяться. На одну только seg7 тратится 8 байт... В вашем случае достаточно сделать массив масок, размещенный во флеше и функцию вывода маски на порт. Плюс, придется еще потратить два байта (а можно и одним обойтись), в которых будут храниться текущие символы индикатора.

Я делал так
Код
// Маски сегментов (Специфичны для Вашего устройства)
#define seg_a 0x40
#define seg_b 0x02
#define seg_c 0x80
#define seg_d 0x20
#define seg_e 0x01
#define seg_f 0x08
#define seg_g 0x04
#define seg_dot 0x10

// Маски цифр индикатора
const uint8_t indct_data[] =
{    
    seg_b | seg_c | seg_d | seg_e | seg_f |seg_g, // 0
    seg_b | seg_c, // 1
    seg_g | seg_b | seg_a | seg_e |seg_d, // 2
    seg_g | seg_b | seg_a | seg_c |seg_d, // 3
    seg_f | seg_a | seg_b | seg_c, // 4
    seg_g | seg_f | seg_a | seg_c | seg_d, // 5
    seg_g | seg_f | seg_e | seg_d | seg_c | seg_a, // 6
    seg_b | seg_c | seg_g, // 7
    seg_a | seg_b | seg_c | seg_d | seg_e | seg_f | seg_g , // 8
    seg_a | seg_b | seg_c | seg_d | seg_f | seg_g //9
};


Далее, используя indct_data[], выводите нужную маску на порт.
aspID
Aesthete Animus
Я с Вами совершенно согласен. Но что делать, если по шине разводка такова, что seg_a у первого 7-сегментника - это, к примеру, вторая нога, а у второго - четвертая. У третьего - первая, а у четвертого - как и у первого, вторая... Тут по тексту-то путаться начинаешь, а в схеме... Да, согласен, что по правильному было бы развести схемно так, чтобы они совпадали... Но так получилось sad.gif

P.S. структура 7-сегментника в программе хранилась во флеше. Просто выдергивал дома из старой версии - она оказалась далеко не последней да еще и с багами smile.gif
ae_
Цитата(aspID @ Jan 21 2008, 13:00) *
Aesthete Animus
Я с Вами совершенно согласен. Но что делать, если по шине разводка такова, что seg_a у первого 7-сегментника - это, к примеру, вторая нога, а у второго - четвертая. У третьего - первая, а у четвертого - как и у первого, вторая...

Нужно разместить во флеше столько таблиц соответствия "дес. число"=>"7-ми сегм. образ", сколько есть несовпадающих вариантов подключения индикаторов. Затем, при выводе в конкретное знакоместо, пользоваться соответствующей этому знакоместу таблицей. Всего по +10 байт на каждый "по своему" подключенный индикатор (это если на индикатор выводятся только цифры).
Индикаторы, совпадающие по распайке, можно ссылать на одну таблицу, а можно сделать свою таблицу на каждое знакоместо (если разрядов мало).
Aesthete Animus
Цитата(aspID @ Jan 21 2008, 07:00) *
Aesthete Animus
Я с Вами совершенно согласен. Но что делать, если по шине разводка такова, что seg_a у первого 7-сегментника - это, к примеру, вторая нога, а у второго - четвертая. У третьего - первая, а у четвертого - как и у первого, вторая...

Для этого надо подсоединить оба индикатора к одному порту и коммутировать общий катод по таймеру. Тем самым решите проблемы неправильной развоодки и сэкономите ножки для других нужд.
aspID
Цитата(Aesthete Animus @ Jan 21 2008, 13:21) *
Для этого надо подсоединить оба индикатора к одному порту и коммутировать общий катод по таймеру. Тем самым решите проблемы неправильной развоодки и сэкономите ножки для других нужд.

Мсье, Вы, кажется, меня не поняли - индикация статическая, через регистры. Регистры - на одной шине, зедействовано 8 ног (плюс генерация синхроимпульсов). А вот разводка от регистров до 7-сегментников - сам *** ногу сломит :-/
=VRA=
Цитата
А вот разводка от регистров до 7-сегментников - сам *** ногу сломит :-/
Ну наконец-то и до меня дошло, об чем весь сыр-бор! smile.gif

Раз так, то имею единственный вопрос - за что же вы, робяты, так возненавидели свою профессию, что приглючили такого монстрика?sad.gif
Aesthete Animus
Цитата(aspID @ Jan 21 2008, 21:48) *
Мсье, Вы, кажется, меня не поняли - индикация статическая, через регистры. Регистры - на одной шине, зедействовано 8 ног (плюс генерация синхроимпульсов). А вот разводка от регистров до 7-сегментников - сам *** ногу сломит :-/

Ну тогда просто делаете два массива во флеше и будем Вам счастье smile.gif
aspID
Цитата
Ну тогда просто делаете два массива во флеше

Не понял... Два массива под что именно Вы имели сейчас в виду?
Aesthete Animus
Цитата(aspID @ Jan 22 2008, 00:00) *
Не понял... Два массива под что именно Вы имели сейчас в виду?

Два массива масок портов, для получения нужных цифр, наподобее моего indct_data.
Сергей Борщ
Цитата(Aesthete Animus @ Jan 21 2008, 23:12) *
Два массива масок портов
Точнее, наверное, двумерный массив. Одна размерность - все отображаемые символы, вторая - знакоместа. Или наоборот smile.gif
aspID
Цитата
наверное, двумерный массив.

Сергей, у Вас дар Учителя smile.gif порой двух слов от Вас достаточно. Спасибо!
SasaVitebsk
Цитата(aspID @ Jan 22 2008, 07:13) *
Сергей, у Вас дар Учителя smile.gif порой двух слов от Вас достаточно. Спасибо!

Тоже поддерживаю. Его помощь - просто неоценима. Максимально кратко и всегда по существу. beer.gif
Different
Цитата(Qwertty @ Jan 20 2008, 18:52) *
Если нужна именно память, то FRAM явно невыгодна - дорогая слишком. Тут проще сам контроллер заменить. Или применить что-то типа N256S0830 - http://www.amis.com/pdf/ulp_memory/serial_...S08xxHDA_ds.pdf Правда ее доступность в России оставляет желать лучшего sad.gif

Как раз наоборот. В отличие от запада, в России сейчас можно купить эту замечательную SPI SRAM-память в розницу: http://www.terraelectronica.ru/catalog.php...e=2&PageS=1
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.