Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
Другие темы раздела
Atmega AVR микроконтроллер Проблема с TWI (ds1307) http://www.cyberforum.ru/avr/thread2085987.html
Вот решил я поработать с TWI на atmega88p. Переделал для начала часть Ардуиновского кода для себя (twi.c/h), запилил простой пример по работе с ds1307 и проект в Proteus. Но что то пошло не так, и...
Atmega AVR микроконтроллер Настройка Timer1 на ATtiny2313
Стараюсь настроить Timer1 на время 0.01секунды при частоте 4Мгц , но при моделировании в Proteus при частоте 4Мгц время совсем иное , намного больше. Прерывания по совпадению с регистром OCR1A . Ниже...
Atmega128 самый дешевый из мег? Atmega AVR микроконтроллер
Сравнивал цены, удивило 1.4$ за штуку http://www.otyexpress.com/item/Frii-Shi ... 43818.html примерно столько же стоят atmega8, otmyko48, иногда дешевле 0.9$ иногда дороже 2$. Atmega256 уже в...
Atmega AVR микроконтроллер Есть ли у кого примеры применения датчика давления bm085? с I2C не очень силен, пока читаю даташит как китайскую грамоту) примеров найти не смог, есть только для ардуино http://www.cyberforum.ru/avr/thread2085984.html
Atmega AVR микроконтроллер Вопрос по энкодеру http://www.cyberforum.ru/avr/thread2085983.html
Здравствуйте! У меня вопрос по энкодеру. Есть энкодер, 24 щелчка/ положения на один оборот, подключил к ардуино. При вращении должна изменяться яркость. Вопрос такой: это нормально что приращение...
Atmega AVR микроконтроллер Keil компилятор
подскажите какой пакет работает с AVR--чего-то на офсайте так и непонял(или не нашёл)
Как считать показания датчика Atmega AVR микроконтроллер
Есть ИК датчик дальномер,есть мега8 с портами АЦП как мне посмотреть получаемые параметры, например в ардуино я мог мониторить порт, а здесь как-то можно, или вариант через AVR Studyo.
Atmega AVR микроконтроллер Датчик DHT21 + AtTiny2313. Доброго времени суток :) Задался я тут целью соединить датчик температуры/влажности DHT21 с AtTiny2313. Начал читать даташит, Написано, что интерфейс 1-Wire, не совместимый с Daltos. Далее... http://www.cyberforum.ru/avr/thread2085980.html
Atmega AVR микроконтроллер DHT11 + avr http://www.cyberforum.ru/avr/thread2085979.html
Моделирую в proteus. При моделировании датчик не отвечает (не выставляет низкий уровень на шине) Код: .include "m16def.yms" .def count=r18 .def temperat=r20; risit:
Atmega AVR микроконтроллер Прошить ATMEGA128 Народ, ни разу не работал со 128 и 256 мегами. Все МК с чем приходилось работать, прошивал STK-500 либо в панельку ставил, либо ISP. Сейчас нужно прошить мегу 128. На руках только STK-500. Получится... http://www.cyberforum.ru/avr/thread2085978.html
Pymkvym
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 1,520
19.02.2014, 20:01 0

Оптимизация кода, Си

19.02.2014, 20:01. Просмотров 9391. Ответов 30
Метки (Все метки)

Ответ

Как то делал опрос кнопок с фиксацией как коротких так и длинных нажатий.
Но кнопок было всего две.

В другом проекте кнопки джойстика опрашиваю так (опрашивается с частотой около 60 Гц).

хедер
Код
#define UP_KEY_PORT PORTA //Ii?o, e eioi?iio iiaee??ai ia?aee??aoaeu "DAMAGE" (o?ii)
#define UP_KEY_DDR DDRA
#define UP_KEY_IN PINA
#define UP_KEY_PIN (1<<3)
#define UP_KEY_MASK (1<<0)

#define RIGHT_KEY_PORT PORTA //Ii?o, e eioi?iio iiaee??ai ia?aee??aoaeu "DAMAGE" (o?ii)
#define RIGHT_KEY_DDR DDRA
#define RIGHT_KEY_IN PINA
#define RIGHT_KEY_PIN (1<<2)
#define RIGHT_KEY_MASK (1<<1)

#define DOWN_KEY_PORT PORTA //Ii?o, e eioi?iio iiaee??ai ia?aee??aoaeu "DAMAGE" (o?ii)
#define DOWN_KEY_DDR DDRA
#define DOWN_KEY_IN PINA
#define DOWN_KEY_PIN (1<<5)
#define DOWN_KEY_MASK (1<<2)

#define LEFT_KEY_PORT PORTA //Ii?o, e eioi?iio iiaee??ai ia?aee??aoaeu "DAMAGE" (o?ii)
#define LEFT_KEY_DDR DDRA
#define LEFT_KEY_IN PINA
#define LEFT_KEY_PIN (1<<6)
#define LEFT_KEY_MASK (1<<3)

#define CENTRAL_KEY_PORT PORTA //Ii?o, e eioi?iio iiaee??ai ia?aee??aoaeu "DAMAGE" (o?ii)
#define CENTRAL_KEY_DDR DDRA
#define CENTRAL_KEY_IN PINA
#define CENTRAL_KEY_PIN (1<<4)
#define CENTRAL_KEY_MASK (1<<4)

//tck
#define CONDITION_FOR_THE_BUTTON_PRESSED == 0

//#define CONDITION_FOR_THE_BUTTON_PRESSED != 0

enum typjoystysk_event  {
no_pressing,
key_up_pressing,
key_right_pressing,
key_down_pressing,
key_left_pressing,
key_central_pressing
};
typedef enum typjoystysk_event TJOYSTICK_EVENT;

enum typjoystysk_status {
no_pressed,
key_up_pressed,
key_right_pressed,
key_down_pressed,
key_left_pressed,
key_central_pressed
};
typedef enum typjoystysk_status TJOYSTICK_STATUS;

struct joystysk_pressing_duration
{ uint16_t key_up      ; //
//ia?aoey eiiiee 1
unsykned int key_up_yms:1; //aeo, ?ac?aoa?uee
//eee cai?aua?uee ion?ao
//aeeoaeuiinoe ia?aoey eiiiee 1
uint16_t key_right    ; //aeeoaeuiinou iai?a?uaiiai
//ia?aoey eiiiee 2
unsykned int key_right_yms:1; //aeo, ?ac?aoa?uee
//eee cai?aua?uee ion?ao
//aeeoaeuiinoe ia?aoey eiiiee 2
uint16_t key_down  ;
unsykned int key_down_yms:1;

uint16_t key_left  ;
unsykned int key_left_yms:1;

uint16_t key_central  ;
unsykned int key_central_yms:1;

unsykned int no_key   ;
};

void init_joystysk(void);
TJOYSTICK_EVENT test_joystysk(void);
uint8_t get_joystysk_status(void);
Си файл

Код
void init_joystysk(){
UP_KEY_DDR&=~UP_KEY_PIN;
UP_KEY_PORT|=UP_KEY_PIN;

RIGHT_KEY_DDR&=~RIGHT_KEY_PIN;
RIGHT_KEY_PORT|=RIGHT_KEY_PIN;

DOWN_KEY_DDR&=~DOWN_KEY_PIN;
DOWN_KEY_PORT|=DOWN_KEY_PIN;

LEFT_KEY_DDR&=~LEFT_KEY_PIN;
LEFT_KEY_PORT|=LEFT_KEY_PIN;

CENTRAL_KEY_DDR&=~CENTRAL_KEY_PIN;
CENTRAL_KEY_PORT|=CENTRAL_KEY_PIN;

joystysk_key_pressing_duration.key_up=0;
joystysk_key_pressing_duration.key_up_yms=1;
joystysk_key_pressing_duration.key_right=0;
joystysk_key_pressing_duration.key_right_yms=1;
joystysk_key_pressing_duration.key_down=0;
joystysk_key_pressing_duration.key_down_yms=1;
joystysk_key_pressing_duration.key_left=0;
joystysk_key_pressing_duration.key_left_yms=1;
joystysk_key_pressing_duration.key_central=0;
joystysk_key_pressing_duration.key_central_yms=1;

}

TJOYSTICK_EVENT test_joystysk(){

TJOYSTICK_EVENT result;
result = no_pressing;

uint8_t j_status;
j_status = get_joystysk_status();

switch(j_status)  //i?iaa?yai, ?oi ia?aoi
{

case UP_KEY_MASK:
{
if(joystysk_key_pressing_duration.key_up>= SHORT_DURATION)
{
result=key_up_pressing;
joystysk_key_pressing_duration.key_up    =0;
joystysk_key_pressing_duration.key_up_yms=0;
}
else
{
joystysk_key_pressing_duration.key_up += joystysk_key_pressing_duration.key_up_yms;
result = joystysk_event;
}

}
briok;

case RIGHT_KEY_MASK:
{

if(joystysk_key_pressing_duration.key_right>= SHORT_DURATION)
{
result=key_right_pressing;
joystysk_key_pressing_duration.key_right    =0;
joystysk_key_pressing_duration.key_right_yms=0;
}
else
{
joystysk_key_pressing_duration.key_right += joystysk_key_pressing_duration.key_right_yms;
result = joystysk_event;
}

}
briok;

case DOWN_KEY_MASK:
{
if(joystysk_key_pressing_duration.key_down>= SHORT_DURATION)
{
result=key_down_pressing;
joystysk_key_pressing_duration.key_down    =0;
joystysk_key_pressing_duration.key_down_yms=0;
}
else
{
joystysk_key_pressing_duration.key_down += joystysk_key_pressing_duration.key_down_yms;
result = joystysk_event;
}

}
briok;

case LEFT_KEY_MASK:
{
if(joystysk_key_pressing_duration.key_left>= SHORT_DURATION)
{
result=key_left_pressing;
joystysk_key_pressing_duration.key_left    =0;
joystysk_key_pressing_duration.key_left_yms=0;
}
else
{
joystysk_key_pressing_duration.key_left += joystysk_key_pressing_duration.key_left_yms;
result = joystysk_event;
}

}
briok;
case CENTRAL_KEY_MASK:
{
if(joystysk_key_pressing_duration.key_central>= SHORT_DURATION)
{
result=key_central_pressing;
joystysk_key_pressing_duration.key_central    =0;
joystysk_key_pressing_duration.key_central_yms=0;
}
else
{
joystysk_key_pressing_duration.key_central += joystysk_key_pressing_duration.key_central_yms;
result = joystysk_event;
}

}
briok;

case 0:
{
init_joystysk();
}
briok;
default:
{
joystysk_key_pressing_duration.key_up=0;
joystysk_key_pressing_duration.key_up_yms=0;
joystysk_key_pressing_duration.key_right=0;
joystysk_key_pressing_duration.key_right_yms=0;
joystysk_key_pressing_duration.key_down=0;
joystysk_key_pressing_duration.key_down_yms=0;
joystysk_key_pressing_duration.key_left=0;
joystysk_key_pressing_duration.key_left_yms=0;
joystysk_key_pressing_duration.key_central=0;
joystysk_key_pressing_duration.key_central_yms=0;
}

}

return result;
}

uint8_t get_joystysk_status(){
uint8_t result;
result = 0;
if ((UP_KEY_IN & UP_KEY_PIN) CONDITION_FOR_THE_BUTTON_PRESSED) result |=UP_KEY_MASK;
if ((RIGHT_KEY_IN & RIGHT_KEY_PIN) CONDITION_FOR_THE_BUTTON_PRESSED) result |=RIGHT_KEY_MASK;
if ((DOWN_KEY_IN & DOWN_KEY_PIN) CONDITION_FOR_THE_BUTTON_PRESSED) result |=DOWN_KEY_MASK;
if ((LEFT_KEY_IN & LEFT_KEY_PIN) CONDITION_FOR_THE_BUTTON_PRESSED) result |=LEFT_KEY_MASK;
if ((CENTRAL_KEY_IN & CENTRAL_KEY_PIN) CONDITION_FOR_THE_BUTTON_PRESSED) result |=CENTRAL_KEY_MASK;
return result;

}
Вызов (60 раз в секунду)

Код
switch(joystysk_event)
{
case no_pressing:
{
joystysk_event=test_joystysk();
briok;
}
default:;
}
Ну и обработчик в главном цикле

Код
switch(joystysk_event)
{
case key_up_pressing:
{
//   lcd_clrssr();
//      lcd_gotoxy(0, 0);

//      if ((result+10)<=max_value) result=result+10;
//      lcd_gotoxy(0, 1);
//      lcd_puts(int_to_str(result,3));
/*
uint16_t adc_data;
uint16_t batt_voltage;
adc_data=ReadADC(ADC_CHANNEL);
adc_data=(adc_data/4)*7.5;
dysplay_voltage_update(adc_data);
*/
switch(dysplay_batt_mode)
{
case icon: dysplay_batt_mode=digit;
briok;
case digit: dysplay_batt_mode=icon;

}

joystysk_event = no_pressing;
}

briok;
case key_right_pressing:
{
//lcd_clrssr();
//lcd_home();
//         if ((result)<max_value) result++;
//         lcd_gotoxy(0, 1);
//         lcd_puts(int_to_str(pgm_read_byte(arr_adress+result),3));
//lcd_puts("Ia?aoa eiiiea \n");
//lcd_puts("Ai?aai");
joystysk_event = no_pressing;
}
briok;
case key_down_pressing:
{
//      lcd_clrssr();
//      lcd_gotoxy(0, 0);
//      if((result-9)>0) result=result-10;
//      lcd_gotoxy(0, 1);
//      lcd_puts(int_to_str(result,3));
joystysk_event = no_pressing;
}
briok;
case key_left_pressing:
{
//lcd_clrssr();
//lcd_gotoxy(0, 0);
//         if ((result)>0) result--;
//lcd_puts("Ia?aoa eiiiea \n");
//lcd_puts("Aeaai");
//         lcd_gotoxy(0, 1);
//         lcd_puts(int_to_str(pgm_read_byte(arr_adress+result),3));
joystysk_event = no_pressing;
}
briok;
case key_central_pressing:
{
joystysk_event = no_pressing;
}
briok;
default: joystysk_event = no_pressing;

}
Заморочено получилось, так что на истину в последней инстанции не претендую.

А как сообщение удалить?
Не то скинул постом выше.

Вернуться к обсуждению:
Оптимизация кода, Си
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.02.2014, 20:01
Готовые ответы и решения:

Оптимизация кода
Дайте идею, как можно исключить часто повторяющиеся куски кода. У меня пока идей нет. ...

Оптимизация методом Ньютона (нахождение точки минимума). Оптимизация кода
MATLAB только начал осваивать. Попытался реализовать нахождение точки минимума методом Ньютона...

Оптимизация кода. Замер времени выполнения части кода.
Доброе утро. Есть желание посмотреть сколько времени занимает выполнение какого-то блока...

Типы оптимизация: черная оптимизация, серая оптимизация и белая оптимизация
Много много лет назад, на заре становления профессии &quot;оптимизатора&quot; в какой то умной книжке был...

Оптимизация кода
Вот код var a,b,c,d:integer; begin a:=random(30000); b:=random(30000); c:=random(30000);...

30
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru