Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как опредилить состояние нужного бита в порте в - IAR ?
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Denis89
Вобщем стыдно блин, crying.gif как чайник не могу сделать несколько кнопок на Mega32. Вобщем есть программа MMC плеера на AVR, я решил её заюзать в своём проекте. Всё работает, а кнопки которые я от себя добавил не хотят.

Вобщем в WinAVR это очень просто и всегда работает.
Урезанная Часть кода из моего проекта тахометра который я брату в девятку делал

Код
#define leds PD3  //Обзываем кнопки именами
#define lcd PD4
#define regim PD0

//***************************

//Думаем что же там было нажато
volatile uint8_t key (volatile uint8_t s){
   if (!(_SFR_BYTE(PIND) & _BV(s)))    // или аналог  (bit_is_clear(PIND,s))
  {  
        _delay_loop_2(100);
        if (!(_SFR_BYTE(PIND) & _BV(s)))
    {return (0);}
  }
  return (1);
}

//***********************************

void check_keys(){       // Расставляем флаги по нажатым кнопкам
    if ((key(regim)) == 0 ) {key_pr=3;}
    if ((key(lcd)) == 0 ) {key_pr=2;}
    if ((key(leds)) == 0 ) {key_pr=1;}
                        
}


Вообщем как гениально просто это сделать на IAR?

К статье прилагается архив, со схемой и исходниками. Посмотрите пожалуйсто smile3046.gif
zltigo
Цитата(Denis89 @ Apr 10 2009, 14:42) *
Вообщем как гениально просто это сделать на IAR?

Абсолютно так-же, как и для абсолютно любого 'C' компилятора. Для этого, правда, нужно с языком ознакомиться,а не бездумно copy-paste из чьих-то исходников никчемные макрообертки типа _BV() не имеющие к собственно языку нималейшего отношения.
Ну а если их и пользовать, то по крайней мере посмотреть, что это такое и как оно определено.
В Вашем случае '_BV(s)' есть чистый выпендреж, ибо в реальности представляет собой абсолютно узнаваемую, читаемую и переносимую конструкцию '1<<s'
Denis89
Цитата
В Вашем случае '_BV(s)' есть чистый выпендреж, ибо в реальности представляет собой абсолютно узнаваемую, читаемую и переносимую конструкцию '1<<s'


Ну знаете, не я макросы к WinAVR писал. А насчёт узнаваемости и простоты, то вы как думаете, я что, не пробовал различные конструкции кода чтобы определить что там на ноге 0 или 1? smile3046.gif

Насчёт тупого Copy/Paste кода, на данный момент у меня нет никакого времени разбираться с особенностями IAR.

Мне ещё надо сделать очень немало в пректе, Первую часть на которой будет дисплей, кнопки, датчики, и интерфейс RS232 я буду писать на WinAVR, благо проблем с ним никогда небыло.

Посмотрите исходник из архива main.c. Разве это сложно сказать где я не прав и исправить ошибку? 1111493779.gif

P.S. Потом я обязательно буду учить С++ в чистом виде, даже и ASM захвачу, но сейчас я просто прошу помощи с кодом 1111493779.gif


Вообщем пока помощи дождёшься, борода блин отростёт bb-offtopic.gif

Я конечно понимаю, копаться в чужом белье как и программном коде не очень то приятно, но зачем ветку эту тогда назвали "в помощь начинающему" laughing.gif

Проблему решил, не знаю каким мокаром(наверно Кевин, Митник который, благословил меня по интернетуbiggrin.gif )

Код
     if (PINC & (1 << PC7))
       {
        PORTD_Bit0 = 0;
        }else PORTD_Bit0 = 1;


Здесь просто проверял рабочесть кода, помигать светодиодом чтоб. smile3046.gif
SysRq
Цитата(Denis89 @ Apr 10 2009, 17:22) *
...у меня нет никакого времени разбираться с особенностями IAR.
О том и речь, что понимая суть того что делает WinAVR'овский _BV() не надо никаких "особенностей", т.к. "особенности" здесь - это надстройки для удобства и красоты smile.gif

Код
if(value & (1 << 5))
{
   // бит 5 значения value равен 1
}
else
{
   // бит 5 значения value равен 0
}

Учите основы, обычную логику. У гуру этого форума аллергия на тех кто не понимает двоичную логику biggrin.gif
SasaVitebsk
Цитата(Denis89 @ Apr 10 2009, 16:52) *
Ну знаете, не я макросы к WinAVR писал.

Кто-то же писал? И этот кто-то - простой человек. Так почему вы не в состоянии?
Цитата
А насчёт узнаваемости и простоты, то вы как думаете, я что, не пробовал различные конструкции кода чтобы определить что там на ноге 0 или 1? smile3046.gif

Видимо не пробовали.
Цитата
Насчёт тупого Copy/Paste кода, на данный момент у меня нет никакого времени разбираться с особенностями IAR.

Нет никаких особенностей. Точнее их количество минимально и они чётко описаны. Чем этот компилятор и подкупает.
Цитата
Мне ещё надо сделать очень немало в пректе, Первую часть на которой будет дисплей, кнопки, датчики, и интерфейс RS232 я буду писать на WinAVR, благо проблем с ним никогда небыло.

Если вы не будете знать основ.... А это основы... то вы не то чтобы "очень много", а вообще ничего не сделаете в вашем проекте.
Цитата
Посмотрите исходник из архива main.c. Разве это сложно сказать где я не прав и исправить ошибку? 1111493779.gif

P.S. Потом я обязательно буду учить С++ в чистом виде, даже и ASM захвачу, но сейчас я просто прошу помощи с кодом 1111493779.gif

Это самообман. "Потом" никогда не состоится. "Потом" вы будете считать себя крутым и вообще не полезете в учебник. Надо именно сейчас. Преодолеть свою лень. Как говорится день потратим, потом за час долетим...
Цитата
Вообщем пока помощи дождёшься, борода блин отростёт bb-offtopic.gif

Я конечно понимаю, копаться в чужом белье как и программном коде не очень то приятно, но зачем ветку эту тогда назвали "в помощь начинающему" laughing.gif

Проблему решил, не знаю каким мокаром(наверно Кевин, Митник который, благословил меня по интернетуbiggrin.gif )

Код
     if (PINC & (1 << PC7))
       {
        PORTD_Bit0 = 0;
        }else PORTD_Bit0 = 1;


Здесь просто проверял рабочесть кода, помигать светодиодом чтоб. smile3046.gif


Код
     if (PINC & (1 << PC7))
       {
        PORTD &= ~(1<<PD0);
        }else PORTD |= (1<<PD0);


Так будет затронут только один бит порта, а не весь порт как у вас.

Код
#define    L_YES            0                            // Светодиод "YES"
#define    L_YES_DDR        DDRD
#define    L_YES_PORT        PORTD

#define    L_YES_OFF        L_YES_PORT |= (1<<L_YES)
#define    L_YES_ON        L_YES_PORT &= ~(1<<L_YES)
#define    L_YES_BLINK        L_YES_PORT ^= (1<<L_YES)
#define    L_YES_INIT        L_YES_DDR  |= (1<<L_YES)

#define    KEY_YES        7                            // Кнопка "YES"
#define    KEY_YES_DDR        DDRC
#define    KEY_YES_PIN        PINC

#define    IN_KEY_YES        (KEY_YES_PIN & (1<<KEY_YES))
#define    L_YES_INIT        KEY_YES_DDR  &= ~(1<<KEY_YES)



Код
     if (IN_KEY_YES) L_YES_OFF;
    else     L_YES_ON;


Вот и все макросы, для примера
Denis89
Цитата
Это самообман. "Потом" никогда не состоится. "Потом" вы будете считать себя крутым и вообще не полезете в учебник. Надо именно сейчас. Преодолеть свою лень. Как говорится день потратим, потом за час долетим...

Уж поверьте SasaVitebsk. я не бросаю слова на ветер. Вместо лени у меня огромный интерес. .Контроллеры и электроника моя будущая профессия. И после сессии в моём колледже в котором я на автомеханика учусь, пойду на вышку в БИТМ на ПО, и обязательно буду учить С++, правдо насчёт ASM-а не знаю, после языков высокого уровня, код ASM-а кажется какойто древней клинописью biggrin.gif

Цитата
Если вы не будете знать основ.... А это основы... то вы не то чтобы "очень много", а вообще ничего не сделаете в вашем проекте.

Обязательно сделаю.

Спасибо за праведную критику.
SasaVitebsk
Цитата(Denis89 @ Apr 11 2009, 09:46) *
правдо насчёт ASM-а не знаю, после языков высокого уровня, код ASM-а кажется какойто древней клинописью biggrin.gif

ASM с одной стороны помогает, с другой мешает.

Помогает для понимания того, как поступает компилятор.

Мешает так как не даёт поднятся до абстрактного представления языка. Уровня объектов и т.п.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.