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

Обсуждаем контроллеры компании Atmel.
Александр 2677
Встал на лапы
Сообщения: 89
Зарегистрирован: Пн фев 22, 2010 11:16:00

Сообщение Александр 2677 »

Снова я вклиниваюсь со своим кодом.
На этот раз пытаюсь разобраться с прерываниями.
Проверьте пожалуйста . И сразу вопросы что нужно подставить вместо знаков вопроса? И я так понимаю в этом случае используется сигнал со входов МК INT0 и INT1 ? А как сделать допустим срабатывание прерывания с кнопок заведённых на РB1 PB2?


#include <mega8>

#include <stdio>

#include <delay>

// External Interrupt 0 service routine - PD2 any changes
interrupt [EXT_INT0] void ???????(void)
{

PORTD.0 = 0;
delay_ms (1000); // ждем 1 сек. // Place your code here
PORTD.0 = 1;

PORTD.1 = 0;
delay_ms (1000); // ждем 1 сек.
PORTD.1 = 1;

PORTD.2 = 0;
delay_ms (1000); // ждем 1 сек.
PORTD.2 = 1;

PORTD.3 = 0;
delay_ms (1000); // ждем 1 сек.
PORTD.3 = 1;
}

// External Interrupt 1 service routine - PD3 any changes
interrupt [EXT_INT1] void ???????(void)
{

PORTC.0 = 1;
delay_ms (1000); // ждем 1 сек.
PORTC.0 = 0; // Place your code here

PORTC.1 = 1;
delay_ms (1000); // ждем 1 сек.
PORTC.1 = 0;

PORTC.2 = 1;
delay_ms (1000); // ждем 1 сек.
PORTC.2 = 0;

PORTC.3 = 1;
delay_ms (1000); // ждем 1 сек.
PORTC.3 = 0;

PORTC.4 = 1;
delay_ms (1000); // ждем 1 сек.
PORTC.4 = 0;

}

#include <stdio>

void main(void)
{

PORTB=0x00;
DDRB=0x00;

PORTC=0xff;
DDRC=0xff;

PORTD=0xff;
DDRD=0xff;

#asm("sei") // Global enable interrupts

while (1)
{

PORTD=0x00;
delay_ms (1000);

PORTD=0xff;
delay_ms (1000);
};
}

Заранее спасибо )
Реклама
Аватара пользователя
ValBag
Потрогал лапой паяльник
Сообщения: 326
Зарегистрирован: Сб сен 06, 2008 12:56:13

Сообщение ValBag »

Александр 2677 писал(а):Снова я вклиниваюсь со своим кодом.
Почему вы пишете #include <mega8> без расширения ".h" И что..., компилятор принимает такие включения заголовочных файлов ?
Вместо знаков вопроса, подставьте любые запоминающиеся имена функций обработки прерывания.
Не определены разрешения прерываний INT0, INT1 (регистр GICR) и условия их возникновения: по фронту, по спаду или по нулевому уровню (MCUCR).
Кроме INT0 и INT1, у Mega8 нет источников внешних прерываний. У Mega48/88 - намного больше. Кнопки можно повесить на то, что есть, сгладив дребезг внешней цепочкой или программно.
Реклама
Александр 2677
Встал на лапы
Сообщения: 89
Зарегистрирован: Пн фев 22, 2010 11:16:00

Сообщение Александр 2677 »

Вобще то у меня стоит .h, Ума не приложу как я сюда копировал что они потерялись.


Не определены разрешения прерываний INT0, INT1 (регистр GICR) и условия их возникновения: по фронту, по спаду или по нулевому уровню (MCUCR).

Эта строчка что то мне совсем не ясна. Можете написать Что именно у куда вписать на простом примере.
Аватара пользователя
ValBag
Потрогал лапой паяльник
Сообщения: 326
Зарегистрирован: Сб сен 06, 2008 12:56:13

Сообщение ValBag »

Александр 2677 писал(а):Эта строчка что то мне совсем не ясна. Можете написать Что именно у куда вписать на простом примере.
GICR=0xC0; // тут разрешения прерываний INT0, INT1
MCUCR=0x0A; // тут условия: сейчас стоит по спаду. Кнопку нажали - сигнал на входе прерывания переключился с еденицы на ноль (спад) - получили прерывание
P.S. Надо определить
DDRD.2=0; // (INT0)
DDRD.3=0; // (INT1)
как входы и включить подтягиващие резисторы для кнопок
PORTD.2=1;
PORTD.3=1;
А то, что в проге "навесили" на PORTD.2 и PORTD.3 - убрать (переключить на другие PIN-ы), т. к. эти разряды задействуются на кнопки.
Реклама
Эиком - электронные компоненты и радиодетали
Александр 2677
Встал на лапы
Сообщения: 89
Зарегистрирован: Пн фев 22, 2010 11:16:00

Сообщение Александр 2677 »

Большое спасибо за помощь. Всё работает :))
Реклама
Александр 2677
Встал на лапы
Сообщения: 89
Зарегистрирован: Пн фев 22, 2010 11:16:00

Сообщение Александр 2677 »

А програмно избавиться от дребезга кнопки можно таким образом?

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

interrupt [EXT_INT1] void INT1(void)
delay_ms (30);

{

PORTC.0 = 1;
delay_ms (1000); // ждем 1 сек.
PORTC.0 = 0; // Place your code here

PORTC.1 = 1;
delay_ms (1000); // ждем 1 сек.
PORTC.1 = 0; 
Реклама
Аватара пользователя
ELcat
Друг Кота
Сообщения: 3258
Зарегистрирован: Вт май 19, 2009 09:27:30
Откуда: Украина

Сообщение ELcat »

Помогите, пожалуйста, уважаемые товарищи коты в следующем вопросе - есть кусочек кода, вроде на GCC:

#byte LATD =0xF8C
#bit LED = LATD.3
------

LED=0;
LED=1;

Как его записать в Code Vision AVR? Заранее спасибо...
Аватара пользователя
ValBag
Потрогал лапой паяльник
Сообщения: 326
Зарегистрирован: Сб сен 06, 2008 12:56:13

Сообщение ValBag »

Александр 2677 писал(а):А програмно избавиться от дребезга кнопки можно таким образом?
interrupt [EXT_INT1] void INT1(void)
delay_ms (30);
....
Можно. Только надо проверить после выдержки, что кнопка действительно осталась нажатой, а затем продолжить операции, либо выйти, если нет.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18548
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

ELcat писал(а):Помогите, пожалуйста, уважаемые товарищи коты в следующем вопросе - есть кусочек кода, вроде на GCC:

#byte LATD =0xF8C
#bit LED = LATD.3
------

LED=0;
LED=1;

Как его записать в Code Vision AVR? Заранее спасибо...
это не похоже на GCC. да и на Си тоже мало похоже... или какая-то экзотическая версия Си - не стандартная...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
ELcat
Друг Кота
Сообщения: 3258
Зарегистрирован: Вт май 19, 2009 09:27:30
Откуда: Украина

Сообщение ELcat »

Дорогой ARV, я с тобой полностью согласен, на том форуме где я видел этот кусок так и писали, что это не из классической С. Но ты так и не ответил на вопрос, как независимую переменную, пусть это будет unsigned char побить на "обозванные" биты, чтоб CV AVR это понимала?
Аватара пользователя
Pooher
Мучитель микросхем
Сообщения: 491
Зарегистрирован: Вс янв 07, 2007 01:45:48
Откуда: Российская Федерация, будь она неладна...

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

Сообщение Pooher »

Народ, а подскажите как понимать этот код:

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

xstart <<= 1;
    xstart += 6;

    xend <<= 1;
    xend += 7;
    
    spi(0x00 | (xstart & 0x0F));
Я понял так:

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

lsl xstart ; сдвинуть xstart в лево
	ldi tmp, 6
	add xstart, tmp ; xstart=xstart+6

	lsl xend; сдвинуть xend в лево
	ldi tmp, 7
	add xend, tmp ; ; xend=xend+6
	
	clr tmp
	andi xstart, 0x0f ; И xstart и 0x0f
	or tmp, xstart ;ИЛИ tmp и xstart
	rcall  SPI_MasterTransmit ; отправить tmp в SPI
Научить нельзя, можно научиться. Пифагор.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18548
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

Pooher писал(а):Народ, а подскажите как понимать этот код:

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

xstart <<= 1;
    xstart += 6;

    xend <<= 1;
    xend += 7;
    
    spi(0x00 | (xstart & 0x0F));
Я понял так:

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

lsl xstart ; сдвинуть xstart в лево
	ldi tmp, 6
	add xstart, tmp ; xstart=xstart+6

	lsl xend; сдвинуть xend в лево
	ldi tmp, 7
	add xend, tmp ; ; xend=xend+6
	
	clr tmp
	andi xstart, 0x0f ; И xstart и 0x0f
	or tmp, xstart ;ИЛИ tmp и xstart
	rcall  SPI_MasterTransmit ; отправить tmp в SPI
вроде понял все верно, при условии что переменные xstart и xend именно однобайтные. кроме того, операция ИЛИ с нулевым значением смысла не имеет, сточки clr tmp и or tmp, xstart лишние (если допустима порча xstart)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Pooher
Мучитель микросхем
Сообщения: 491
Зарегистрирован: Вс янв 07, 2007 01:45:48
Откуда: Российская Федерация, будь она неладна...

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

Сообщение Pooher »

Ну и славненько, уже проверил даже, работает. По поводу нулевого значения - это понятно, просто в других случаях там другие маски, а эта попалась первая. Спасибо за ответ.
Научить нельзя, можно научиться. Пифагор.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
Аватара пользователя
ELcat
Друг Кота
Сообщения: 3258
Зарегистрирован: Вт май 19, 2009 09:27:30
Откуда: Украина

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

Сообщение ELcat »

Люди, объясните пожалуйста, как в CV AVR можно изменять биты в переменной, делать ветвление с сылкой на конкретный бит переменной?
Аватара пользователя
AI_Disable
Сверлит текстолит когтями
Сообщения: 1116
Зарегистрирован: Чт окт 15, 2009 14:16:18
Откуда: Екб
Контактная информация:

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

Сообщение AI_Disable »

В кодвижионе, если не ошибаюсь, можно обращаться к биту, указывая через точку номер нужного бита.

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

if(peremennay.1) {} //если первый бит равен лог. 1, то…
else{}
peremennay.1=1; //Записать лог. 1 в первый бит
peremennay.1=0; //Записать лог. 0 в первый бит
Но правильнее будет использовать логические операции:

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

if(peremennay&0b00000010) {}//если первый бит равен лог. 1, то…
else {}
peremennay|=(1<<1); //Записать лог. 1 в первый бит
peremennay&=~(1<<1); //Записать лог. 0 в первый бит
В отличие от первого, это выражение поймёт любой сишный компилятор.
Последний раз редактировалось AI_Disable Вт мар 16, 2010 12:19:43, всего редактировалось 3 раза.
DeltaGold
Родился
Сообщения: 7
Зарегистрирован: Вт мар 16, 2010 11:51:06

Битовая маска у PORTB - глюк?

Сообщение DeltaGold »

Всем добрый день.

Прошу помочь мне понять, почему компилятор CodeVision не отрабатывает код, который казалось бы должен работать. Я хочу понять - это глюк компилятора (уже встречал несколько глюков CodeVision), или у меня?

Простая схема, мигания светодиодов на ATTiny13.

Итак: есть объявление двух констант компилятора, которые определяют битовую маску для PORTB:
#define SCALE_LIGHTS 0b00001000
#define LAND_LIGHTS 0b00010000


...

В программе эти биты устанавливаются простой операцией, которая работает корректно:
PORTB |= SCALE_LIGHTS | LAND_LIGHTS; // Т.е., для данных констант это эквивалентно PORTB |= 0b00011000


После этого эти биты нужно сбросить. Пишу вот такую инструкцию:
PORTB &= !( SCALE_LIGHTS | LAND_LIGHTS ); // Т.е., для данных констант это эквивалентно PORTB &= 0b11100111

Компилятор этo пропускает, hex строит, только эта конструкция не работает. Под отладчиком видно, что биты PORTB просто сбрасываются в 0, причём все. Приходится обходить этот глюк инструкциями PORTB.3 = 0; и PORTB.4 = 0;, что не хотелось бы.


Поясните, где здесь глюк?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18548
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Битовая маска у PORTB - глюк?

Сообщение ARV »

DeltaGold писал(а):После этого эти биты нужно сбросить. Пишу вот такую инструкцию:
PORTB &= !( SCALE_LIGHTS | LAND_LIGHTS ); // Т.е., для данных констант это эквивалентно PORTB &= 0b11100111

Компилятор этo пропускает, hex строит, только эта конструкция не работает. Под отладчиком видно, что биты PORTB просто сбрасываются в 0, причём все. Приходится обходить этот глюк инструкциями PORTB.3 = 0; и PORTB.4 = 0;, что не хотелось бы.

Поясните, где здесь глюк?
глюк заключается в вашем незнании Си :) чтобы сбросить биты, надо выполнить логическое И с проинвертированной маской, т.е. сделать вот так:

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

PORTB &= ~( SCALE_LIGHTS  |  LAND_LIGHTS );
вы уточните на счет предыдущих глюков - наверняка причина та же самая :)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
AI_Disable
Сверлит текстолит когтями
Сообщения: 1116
Зарегистрирован: Чт окт 15, 2009 14:16:18
Откуда: Екб
Контактная информация:

Re: Битовая маска у PORTB - глюк?

Сообщение AI_Disable »

DeltaGold писал(а): PORTB &= !( SCALE_LIGHTS | LAND_LIGHTS );
Замените "!" на "~".
DeltaGold
Родился
Сообщения: 7
Зарегистрирован: Вт мар 16, 2010 11:51:06

Битовая маска у PORTB - глюк?

Сообщение DeltaGold »

Ну прям сразу "незнании Си". Подзабыл один опреатор. :))

Спасибо ответившим! А-а-а, понятно, надо делать инвеpсию. Т.е., я сунул туда не оператор, а логическое выражение, которые компилятор корректно отрабатывал: т.е. "!"заставляло его выдать false, поэтому PORTB получал 0.

Это у меня значит был затык. Кстати, был приятно удивлён, как быстро мне ответили на этом форуме.

Спасибо, очень нужное мне решение! Всем хорошего дня, буду обращаться.


P.S.: насчёт предыдущих глюков - не, там причина явно глючная. Компилятор упрямо писал ошибку компиляции нету ";" после оператора, хотя там чёрным по зелёному стоит точка с запятой. Даже пробовал её переписать заново - та же ошибка.
Не долго думая, ставлю ещё одну ";" там, где компайлер хочет. Получается PORTB = 0x2F;; - глупость несусветная . Компилирую - ошибок нет! Дальше ещё интереснее: убираю одну точку с запятой, т.е. восстанавливаю совершенно корректную форму PORTB = 0x2F; Компилирую - ошибок нет, хотя минуту назад были.
И нет до сих пор. Вот такие чудеса :)
Аватара пользователя
ValBag
Потрогал лапой паяльник
Сообщения: 326
Зарегистрирован: Сб сен 06, 2008 12:56:13

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

Сообщение ValBag »

ELcat писал(а):Люди, объясните пожалуйста, как в CV AVR можно изменять биты в переменной, делать ветвление с сылкой на конкретный бит переменной?
В CVAVR битовый доступ реализован только к регистрам ввода-вывода и к ...битовой переменной. Обращение: имя_регистра.номер_бита (PORTA.5)
Ответить

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