Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 10.01.2014, 02:33  
BossNautilus
Прохожий
 
Регистрация: 10.10.2008
Сообщений: 2
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
BossNautilus на пути к лучшему
По умолчанию Re: WinAVR+switch на таблицах

Привет! А кто мешает сделать таблицу самому ассемблерной вставкой? Адрес PC получаем вызвав функцию, вызывающую стек. А дальше IJMP в помощь с таблицами меток.

Код:
//возвращает в переменной адрес PC следующей команды за вызовом функции (он так же остается в R24:R25
void GetAddressPC(unsigned int* add)	
{
	asm volatile ( "movw	r30,r24\n"	//адрес переменной
					"pop r25\n"			//старший разряд
					"pop r24\n"			//младший разряд
					"push r24\n"		//возврат в стек для правильного
					"push r25\n"		//возврата из подпрограммы
					"std	Z+1, r25\n"	//запоминание в переменной PCH
					"st	Z, r24\n");		//запоминание в переменной PCL
}


#define cmd1 0x30
#define cmd2 0x31
#define cmd14 'A'
#define cmd15 'E'


switch (temp1)
{
unsigned int add;
  case  cmd14:
       //действие
  break;
  case cmd15:
       //действие
  break;
default:
                    if (temp1 ‹ 0x30)  // min command
                    {
                        goto End;
                    }
                    if (temp1 › 0x31)  // max command
                    {
                        goto End;
                    }
				
temp1 -= 0x30;
temp1 *=2;
temp1 += XXXXXX; //смещение к началу таблицы
GetAddressPC(&add);
// вставка ассемблерная с переходами
asm volatile(  
           .... // temp1+ *add= Z
           "IJMP\n"
           // сама таблица переходов
           "RJMP caseCMD1\n"
           "RJMP caseCMD2\n");

caseCMD1:
           //действие
   goto end;
   caseCMD2:
           //действие
   goto end;
end:
   break;
}
с подобным столкнулся в фирмваре PICKIT2 ну и модифицировал для AVR-ки (правда пишу не полный код т.к. сам не дописал)
Реклама:
BossNautilus вне форума  
 

Закладки

Метки
winavr
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подниму тему WinAVR vs IAR oleg110592 Микроконтроллеры, АЦП, память и т.д 5 24.10.2015 14:06
Библиотеки для Xmega под WinAVR harchenko_pavel AVR 21 15.03.2013 23:00
На WinAVR + AVR Studio c CVAVR Vetal-soft Embedd С 87 03.03.2013 20:31
Вопрос winavr wss60 Микроконтроллеры, АЦП, память и т.д 6 09.03.2010 07:33
Оптимизация в WinAVR && GCC igor-k Микроконтроллеры, АЦП, память и т.д 1 30.11.2009 17:37


Часовой пояс GMT +4, время: 23:17.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot