CodeVision AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение vitalik_1984 »

Мастер Ломастер писал(а):
BerZerK-ku писал(а)::)) почему же правильнее? Чем работа дефайнов будет отличаться в приведенном примере?
как говорится, чтобы понять, почувствуйте разницу:

Код: Выделить всё

#define your_variant(x) (1<<x)
#define my_variant(x) (1<<(x))
int i = 2;
int your_result = your_variant(5+i);
int my_result = my_variant(5+i);
сравните оба результата


Сравнил:

Код: Выделить всё

#include <avr/io.h>

#define your_variant(x) (1<<x)
#define my_variant(x) (1<<(x))
int i = 2;
int your_result,my_result;

main(void){
your_result = your_variant(5+i);//результат 128
my_result = my_variant(5+i);//результат 128


}

при int i = 3;
your_result = your_variant(5+i);//результат 256
my_result = my_variant(5+i);//результат 256

на первый вариант только варнингом сопротивляется
В поисках истины человек развивается.
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение Мастер Ломастер »

ладно, дотошный вы какой. сравните тогда такой вариант:

Код: Выделить всё

int your_result = your_variant(2 | i);
int my_result = my_variant(2 | i);
битва с дураками проиграна, победители торжествуют. слава победителям!
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Re: CodeVision AVR в вопросах и ответах

Сообщение BerZerK-ku »

:)) это не дотошный, это говорит о том что вы не понимаете на чем пишете.
Мастер Ломастер писал(а):int your_result = your_variant(2 | i);

А вот это я и назвал бы извратом. Вы использовали подобную конструкцию в своих программах хоть единожды?
Засунуть в макрос _BV() арифметическую операцию еще норм, но это...
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение Мастер Ломастер »

изврат или нет - дело десятое. отсутствие скобок вокруг "операнда" в макросе - это потенциальный источник трудноотлавливаемых ошибок, так как отличить "на глаз" макрос с парамтерами от функции в программе практически нереально - для функций любые выражения, передаваемые в параметрах, будут правильно интерпретированы, а для макроса - не всегда, если нет скобок.

сдвиг - одна из низкоприоритетных операций, и для нее скобки кажутся явно лишними, но привычка писать макросы без скобок наверняка приведет не к добру.
битва с дураками проиграна, победители торжествуют. слава победителям!
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Re: CodeVision AVR в вопросах и ответах

Сообщение BerZerK-ku »

Надо просто думать, что и как делаешь, когда мыслю на практике воплощаешь.
P.S. Когда пару тройку раз головой об шкафчик вмажешься, запоминаешь что он существует , где висит и чем это тебе грозит :))
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение Мастер Ломастер »

BerZerK-ku писал(а):Надо просто думать, что и как делаешь, когда мыслю на практике воплощаешь.
P.S. Когда пару тройку раз головой об шкафчик вмажешься, запоминаешь что он существует , где висит и чем это тебе грозит :))

в принципе, если ограничиться визардом CVAVR, то можно даже и не думать вообще. но если все-таки думать, то думать надо с перспективой на будущее. а эта перспектива выглядит буквально так: сделанное однажды надо просто в будущем повторять, не напрягая мозг. поэтому делать надо так, чтобы спустя время не пришлось ломать голову, почему оно вдруг перестало работать. и в этом контексте скобки вокруг "параметра" макроса, как и вокруг всего "тела" макроса, будут исключительно уместны.

P.S. но вы можете этого не делать - вам можно :)
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение pyzhman »

Вы, уважаемые, о чем спорите-то? Чемпионат по мерянию писюнами? Известно же: кто как хочет, так и. Главное - работоспособность и надежность. Вспоминается стишок о двух баранах на мосту.
ps. Мечта у меня - сделать что-нибудь этакое, чтобы потом люди себе лбы расшибали в спорах как это лучше использовать.
Docendo discimus
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Re: CodeVision AVR в вопросах и ответах

Сообщение BerZerK-ku »

Мастер Ломастер писал(а):но если все-таки думать, то думать надо с перспективой на будущее
Ога. Сажая дерево надо думать о мире во всем мире :))
Аватара пользователя
BCluster
Собутыльник Кота
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение BCluster »

Мастер Ломастер прав. Всяко бывает :)
John-RADIST
Открыл глаза
Сообщения: 44
Зарегистрирован: Чт дек 15, 2011 19:04:24

Re: CodeVision AVR в вопросах и ответах

Сообщение John-RADIST »

Доброго всем времени суток!!! Ребята помогите новичку с программой. В общем в двух словах: При включении на LCD 16х02 должно отбражается "LCD 16x02" и "CodeVision1.25.3, далее при нажатии на int0 должна высвечиваться надпись: "LCD", а при нажатии int1 - "Cool".В Протеусе первая часть программы работает, а обработка прерываний - нет. Текст программы привожу. Подскажите пожалуйста что надо здесь исправить. Заранее очень всем благодарен!!!!

#include <mega32.h>
#include <delay.h>
#asm
.equ __lcd_port=0x1B ;PORTA

#endasm
#include <lcd.h>
#define PIN_INT0 PIND.2
volatile unsigned char flagInt0 = 0;


void main( void ) //* Основная функция "main", с которой начинается выполнение всей /* программой процедуры */
{
lcd_init( 16 ); //* инициализация на 16 символов */
lcd_clear( ); //* очистка дисплея */
lcd_gotoxy( 4,0 ); //* верхняя строка, 4 позиция */
lcd_putsf( "LCD 16x02" ); //* выводим надпись в указанных координатах */
lcd_gotoxy( 0,1 ); //* нижняя строка, 0 позиция */
lcd_putsf( "CodeVision1.25.3" );

DDRD.2=0; // (INT0)
DDRD.3=0; // (INT1)
//как входы и включить подтягиващие резисторы для кнопок
PORTD.2=1;
PORTD.3=1;
GICR=0xC0; // тут разрешения прерываний INT0, INT1
MCUCR=0x0A; // тут условия: сейчас стоит по спаду.
//Кнопку нажали - сигнал на входе прерывания переключился
//с еденицы на ноль (спад) - получили прерывание
}

#asm("sei");

//внешнее прерывание. обработчик.
interrupt [EXT_INT0] void ExtInt0(void)
{
while(1){
if (PORTD.2=1)
{
lcd_init( 16 ); //* инициализация на 16 символов */
lcd_clear( ); //* очистка дисплея */
lcd_gotoxy(0,0);
lcd_putsf( "LCD");
}
}
}

interrupt [EXT_INT1] void ExtInt1(void)
{
while(1){
if (PORTD.3=1)
{
lcd_init( 16 ); //* инициализация на 16 символов */
lcd_clear( ); //* очистка дисплея */
lcd_gotoxy(0,0);
lcd_putsf( "Cool");
}
}
}
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение pyzhman »

Порты опрашивать по PIN. Операция сравнения ==, а не =. И незачем каждый раз инициализировать ЖКИ. И не вижу смысла в вечном цикле в прерываниях. Вам же вылезти оттуда надо.
Docendo discimus
John-RADIST
Открыл глаза
Сообщения: 44
Зарегистрирован: Чт дек 15, 2011 19:04:24

Re: CodeVision AVR в вопросах и ответах

Сообщение John-RADIST »

Принял исправления как вы сказали, при трасляции ругается на "volatile unsigned char flagInt0 = 0;".
В Протеусе также неработает. Подскажите пожалуйста, что еще может быть?
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Re: CodeVision AVR в вопросах и ответах

Сообщение ibiza11 »

после инициализации в основном цикле нужно остановиться и ждать прерывания в цикле. а у вас он безконтрольно вылетает дальше.
while(1) {} поставьте после #asm("sei");

volatile unsigned char flagInt0 Вам вообще зачем?
Ставим плюсы: )
John-RADIST
Открыл глаза
Сообщения: 44
Зарегистрирован: Чт дек 15, 2011 19:04:24

Re: CodeVision AVR в вопросах и ответах

Сообщение John-RADIST »

Поставил, но результат тот же. Я извиняюсь!!!! Может я что-то не очень понимаю. Не могли бы Вы скопировать фрагмент моего исходника и показать что по чем...??? Спасибо!!!
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение pyzhman »

Код: Выделить всё

#include <mega32.h>
#include <delay.h>
#asm
.equ __lcd_port=0x1B ;PORTA

#endasm
#include <lcd.h>
#define PIN_INT0 PIND.2
//*******volatile unsigned char flagInt0 = 0;


void main( void ) //* Основная функция "main", с которой начинается выполнение всей /* программой процедуры */
{
lcd_init( 16 ); //* инициализация на 16 символов */
lcd_clear( ); //* очистка дисплея */
lcd_gotoxy( 4,0 ); //* верхняя строка, 4 позиция */
lcd_putsf( "LCD 16x02" ); //* выводим надпись в указанных координатах */
lcd_gotoxy( 0,1 ); //* нижняя строка, 0 позиция */
lcd_putsf( "CodeVision1.25.3" );

DDRD.2=0; // (INT0)
DDRD.3=0; // (INT1)
//как входы и включить подтягиващие резисторы для кнопок
PORTD.2=1;
PORTD.3=1;
GICR=0xC0; // тут разрешения прерываний INT0, INT1
MCUCR=0x0A; // тут условия: сейчас стоит по спаду.
//Кнопку нажали - сигнал на входе прерывания переключился
//с еденицы на ноль (спад) - получили прерывание
//*******}

#asm("sei");
while(1);//********** можно не ставить, оно и так здесь крутиться будет.
}

//внешнее прерывание. обработчик.
interrupt [EXT_INT0] void ExtInt0(void)
{
//*******while(1){
//*******if (PORTD.2=1)
//*******{
//*******lcd_init( 16 ); //* инициализация на 16 символов */
lcd_clear( ); //* очистка дисплея */
lcd_gotoxy(0,0);
lcd_putsf( "LCD");
//*******}
//*******}
}

interrupt [EXT_INT1] void ExtInt1(void)
{
//*******while(1){
//*******if (PORTD.3=1)
//*******{
//*******lcd_init( 16 ); //* инициализация на 16 символов */
lcd_clear( ); //* очистка дисплея */
lcd_gotoxy(0,0);
lcd_putsf( "Cool");
//*******}
//*******}
}

Docendo discimus
John-RADIST
Открыл глаза
Сообщения: 44
Зарегистрирован: Чт дек 15, 2011 19:04:24

Re: CodeVision AVR в вопросах и ответах

Сообщение John-RADIST »

Извиняюсь за назойливость!!! Прерывание по INT0 заработало, а INT1-неработает... Неподскажите почему? Спасибо?
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Re: CodeVision AVR в вопросах и ответах

Сообщение ibiza11 »

John-RADIST писал(а):Извиняюсь за назойливость!!! Прерывание по INT0 заработало, а INT1-неработает... Неподскажите почему? Спасибо?

ресетните контроллер и попробуйте то же самое, но сначала нажимать кнопку на INT1. почти уверен, что INT1 заработает, а INT0 нет.

pyzhman писал(а):while(1);//********** можно не ставить, оно и так здесь крутиться будет.
ммм, с чего это вдруг? :shock:
Ставим плюсы: )
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение pyzhman »

Код: Выделить всё

                 ; 0000 0020 #asm("sei");
000094 9478         sei
                 ; 0000 0021 while(1);//********** можно не ставить, оно и так здесь крутиться будет.
                 _0xB:
000095 cfff         RJMP _0xB
                 ; 0000 0022 }
                 _0xE:
000096 cfff         RJMP _0xE

Вот листинг компилированного кода. Заглушку по метке в данном случае _0х0Е компилятор ставит всегда. Ниже вхиле закомментирован.

Код: Выделить всё

                 ; 0000 0020 #asm("sei");
000094 9478         sei
                 ; 0000 0021 //while(1);//********** можно не ставить, оно и так здесь крутиться будет.
                 ; 0000 0022 }
                 _0xB:
000095 cfff         RJMP _0xB
 


Встречный вопрос: не вижу причины несрабатывания другого прерывания.
Docendo discimus
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Re: CodeVision AVR в вопросах и ответах

Сообщение ibiza11 »

pyzhman писал(а):Встречный вопрос: не вижу причины несрабатывания другого прерывания.
да, действительно. я теперь тоже не вижу :) невнимательно посмотрел код, не заметил, что циклы while(1) уже закомментированы.

насчет заглушки, это видимо CVA ставит. в IAR я такого не встречал. :dont_know:
Ставим плюсы: )
John-RADIST
Открыл глаза
Сообщения: 44
Зарегистрирован: Чт дек 15, 2011 19:04:24

Re: CodeVision AVR в вопросах и ответах

Сообщение John-RADIST »

Ура!!! Теперь все рабатает!!!! Подскажите еще вопрос, как лучше сделать: необходимо создать ну скажем однострочное меню скажем из трех пунктов. При включении чтобы последовательно нажимая скажем INT0, можно было бы переключать пункты меню? Как мне кажется нужно использовать оператор switch(), только как включить его в программу никак неразберусь. Подскажите пожалуйста!!!!
Заранее спасибо!!!!
Последний раз редактировалось John-RADIST Пт дек 16, 2011 18:35:17, всего редактировалось 2 раза.
Ответить

Вернуться в «AVR»