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

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

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

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

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

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

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

 
Опции темы

WinAVR+switch на таблицах

Непрочитано 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, время: 17:08.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.