|
Расширение памяти у Tiny2313, Возможно ли? Помогите начинающему |
|
|
|
Jan 20 2008, 04:45
|

Местный
  
Группа: Свой
Сообщений: 343
Регистрация: 24-01-07
Из: Новосибирск
Пользователь №: 24 714

|
По поиску нашел, что например, на Мегу можно повесить "сколько угодно внешней" памяти. А можно ли использовать внешнюю память на семействе Tiny, в частности, Tiny2313? Если да - то как. Речь идет именно о памяти SRAM (если ничего не путаю в терминах). Т.е. о той, где хранятся переменные и массивы в момент выполнения программы.
Здесь же хотелось бы попросить помощи - может кто порекомендует ссылку на литературу по оптимизации стеков - какие размеры давать стекам? Как узнать минимально необходимый (для компиляции пользуюсь IAR AVR). По документации то ли перечитал, то ли... каша в голове получилась, что куда "кладется" по умолчанию. На данный момент вся оптимизация заключается в том, что для текстовых данных пользуюсь только одним указателем и весь текст храню в ЕЕПРОМе.
Вопрос оптимизации и расширения памяти встал, когда не смог реализовать простой (как мне кажется) проект - есть табло из двух 7-сегментников, статика через регистры, две ноги - синхроимпульсы регистров. Для вывода информации на сегменты используются функции, в которые передаются указатели на структуры (в структуре хранится массив с упорядоченными данными о порядке следования пинов для корректного отображения информации и собственно адреса порта, к которому подключен регистр). Также задействован USART и 1-wire. Так вот, приходится делать выбор - все вместе работать не желает. И даже не получается сделать некий интерфейс управления (через switch (t) где t - это содержимое регистра UDR) сколько-то полноценным.
Если потребуется, могу приложить схемку и архив с проектом.
|
|
|
|
|
Jan 20 2008, 06:28
|

Народный чинитель
  
Группа: Участник
Сообщений: 415
Регистрация: 15-07-05
Пользователь №: 6 811

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

Местный
  
Группа: Свой
Сообщений: 222
Регистрация: 9-06-07
Пользователь №: 28 317

|
Цитата(aspID @ Jan 20 2008, 07:45)  По поиску нашел, что например, на Мегу можно повесить "сколько угодно внешней" памяти. Хм... Где вы такое нашли? Во первых, работать с внешней памятью именно как с памятью можно далеко не на всех мегах, а только на тех, которые имеют внешнюю шину памяти, например мега128. Во всех остальных случаях вы будете работать с памятью просто как с внешним устройством. Если это устраивает, то лучше всего подключить SPI`ную FRAM`ку. Как я понял, тини2313 имеет USI, который можно запустить в режиме SPI, так что, все можно сделать и на этом контроллере.
|
|
|
|
|
Jan 20 2008, 15:52
|
Местный
  
Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527

|
Цитата(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 Правда ее доступность в России оставляет желать лучшего
|
|
|
|
|
Jan 20 2008, 16:42
|

Местный
  
Группа: Свой
Сообщений: 222
Регистрация: 9-06-07
Пользователь №: 28 317

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

Местный
  
Группа: Свой
Сообщений: 343
Регистрация: 24-01-07
Из: Новосибирск
Пользователь №: 24 714

|
Цитата(Aesthete Animus @ Jan 20 2008, 22:42)  Может стоит попытаться оптимизировать? Стоит, хотя бы для того, чтобы научится  Но ест сомнения, что все уместится на самом деле Цитата(Aesthete Animus @ Jan 20 2008, 22:42)  Мне к примеру не ясно, зачем вот это: Не поясните, какие структуры и зачем они нужны? Удобный пережиток, если можно так сказать  Пользовался 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-сегментники  а далше просто ползовался тем, что уже было
|
|
|
|
|
Jan 20 2008, 18:50
|

Местный
  
Группа: Свой
Сообщений: 222
Регистрация: 9-06-07
Пользователь №: 28 317

|
2 aspIDВы и в самом деле теряете слишком много памяти на переменных, которые никогда не будут изменяться. На одну только 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[], выводите нужную маску на порт.
|
|
|
|
|
Jan 21 2008, 04:00
|

Местный
  
Группа: Свой
Сообщений: 343
Регистрация: 24-01-07
Из: Новосибирск
Пользователь №: 24 714

|
Aesthete AnimusЯ с Вами совершенно согласен. Но что делать, если по шине разводка такова, что seg_a у первого 7-сегментника - это, к примеру, вторая нога, а у второго - четвертая. У третьего - первая, а у четвертого - как и у первого, вторая... Тут по тексту-то путаться начинаешь, а в схеме... Да, согласен, что по правильному было бы развести схемно так, чтобы они совпадали... Но так получилось  P.S. структура 7-сегментника в программе хранилась во флеше. Просто выдергивал дома из старой версии - она оказалась далеко не последней да еще и с багами
|
|
|
|
|
Jan 21 2008, 07:12
|
Участник
  
Группа: Свой
Сообщений: 462
Регистрация: 2-04-07
Из: Иркутск
Пользователь №: 26 695

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

|
Цитата А вот разводка от регистров до 7-сегментников - сам *** ногу сломит :-/ Ну наконец-то и до меня дошло, об чем весь сыр-бор!  Раз так, то имею единственный вопрос - за что же вы, робяты, так возненавидели свою профессию, что приглючили такого монстрика?
Сообщение отредактировал =VRA= - Jan 21 2008, 19:02
|
|
|
|
|
Jan 21 2008, 21:00
|

Местный
  
Группа: Свой
Сообщений: 343
Регистрация: 24-01-07
Из: Новосибирск
Пользователь №: 24 714

|
Цитата Ну тогда просто делаете два массива во флеше Не понял... Два массива под что именно Вы имели сейчас в виду?
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|