CodeVision AVR в вопросах и ответах
-
Александр 2677
- Встал на лапы
- Сообщения: 89
- Зарегистрирован: Пн фев 22, 2010 11:16:00
Снова я вклиниваюсь со своим кодом.
На этот раз пытаюсь разобраться с прерываниями.
Проверьте пожалуйста . И сразу вопросы что нужно подставить вместо знаков вопроса? И я так понимаю в этом случае используется сигнал со входов МК 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);
};
}
Заранее спасибо )
На этот раз пытаюсь разобраться с прерываниями.
Проверьте пожалуйста . И сразу вопросы что нужно подставить вместо знаков вопроса? И я так понимаю в этом случае используется сигнал со входов МК 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);
};
}
Заранее спасибо )
- Реклама
Почему вы пишете #include <mega8> без расширения ".h" И что..., компилятор принимает такие включения заголовочных файлов ?Александр 2677 писал(а):Снова я вклиниваюсь со своим кодом.
Вместо знаков вопроса, подставьте любые запоминающиеся имена функций обработки прерывания.
Не определены разрешения прерываний INT0, INT1 (регистр GICR) и условия их возникновения: по фронту, по спаду или по нулевому уровню (MCUCR).
Кроме INT0 и INT1, у Mega8 нет источников внешних прерываний. У Mega48/88 - намного больше. Кнопки можно повесить на то, что есть, сгладив дребезг внешней цепочкой или программно.
-
Александр 2677
- Встал на лапы
- Сообщения: 89
- Зарегистрирован: Пн фев 22, 2010 11:16:00
Вобще то у меня стоит .h, Ума не приложу как я сюда копировал что они потерялись.
Не определены разрешения прерываний INT0, INT1 (регистр GICR) и условия их возникновения: по фронту, по спаду или по нулевому уровню (MCUCR).
Эта строчка что то мне совсем не ясна. Можете написать Что именно у куда вписать на простом примере.
Не определены разрешения прерываний INT0, INT1 (регистр GICR) и условия их возникновения: по фронту, по спаду или по нулевому уровню (MCUCR).
Эта строчка что то мне совсем не ясна. Можете написать Что именно у куда вписать на простом примере.
GICR=0xC0; // тут разрешения прерываний INT0, INT1Александр 2677 писал(а):Эта строчка что то мне совсем не ясна. Можете написать Что именно у куда вписать на простом примере.
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
- Встал на лапы
- Сообщения: 89
- Зарегистрирован: Пн фев 22, 2010 11:16:00
А програмно избавиться от дребезга кнопки можно таким образом?
Код: Выделить всё
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; - ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18548
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
это не похоже на GCC. да и на Си тоже мало похоже... или какая-то экзотическая версия Си - не стандартная...ELcat писал(а):Помогите, пожалуйста, уважаемые товарищи коты в следующем вопросе - есть кусочек кода, вроде на GCC:
#byte LATD =0xF8C
#bit LED = LATD.3
------
LED=0;
LED=1;
Как его записать в Code Vision AVR? Заранее спасибо...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Pooher
- Мучитель микросхем
- Сообщения: 491
- Зарегистрирован: Вс янв 07, 2007 01:45:48
- Откуда: Российская Федерация, будь она неладна...
Re: CodeVision AVR в вопросах и ответах
Народ, а подскажите как понимать этот код:
Я понял так:
Код: Выделить всё
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 в вопросах и ответах
вроде понял все верно, при условии что переменные xstart и xend именно однобайтные. кроме того, операция ИЛИ с нулевым значением смысла не имеет, сточки clr tmp и or tmp, xstart лишние (если допустима порча xstart)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
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Pooher
- Мучитель микросхем
- Сообщения: 491
- Зарегистрирован: Вс янв 07, 2007 01:45:48
- Откуда: Российская Федерация, будь она неладна...
Re: CodeVision AVR в вопросах и ответах
Ну и славненько, уже проверил даже, работает. По поводу нулевого значения - это понятно, просто в других случаях там другие маски, а эта попалась первая. Спасибо за ответ.
Научить нельзя, можно научиться. Пифагор.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
Re: CodeVision AVR в вопросах и ответах
Люди, объясните пожалуйста, как в CV AVR можно изменять биты в переменной, делать ветвление с сылкой на конкретный бит переменной?
- AI_Disable
- Сверлит текстолит когтями
- Сообщения: 1116
- Зарегистрирован: Чт окт 15, 2009 14:16:18
- Откуда: Екб
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
В кодвижионе, если не ошибаюсь, можно обращаться к биту, указывая через точку номер нужного бита.
Но правильнее будет использовать логические операции:
В отличие от первого, это выражение поймёт любой сишный компилятор.
Код: Выделить всё
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 раза.
Битовая маска у PORTB - глюк?
Всем добрый день.
Прошу помочь мне понять, почему компилятор 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;, что не хотелось бы.
Поясните, где здесь глюк?
Прошу помочь мне понять, почему компилятор 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 - глюк?
глюк заключается в вашем незнании Си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 - глюк?
Замените "!" на "~".DeltaGold писал(а): PORTB &= !( SCALE_LIGHTS | LAND_LIGHTS );
Битовая маска у PORTB - глюк?
Ну прям сразу "незнании Си". Подзабыл один опреатор.
Спасибо ответившим! А-а-а, понятно, надо делать инвеpсию. Т.е., я сунул туда не оператор, а логическое выражение, которые компилятор корректно отрабатывал: т.е. "!"заставляло его выдать false, поэтому PORTB получал 0.
Это у меня значит был затык. Кстати, был приятно удивлён, как быстро мне ответили на этом форуме.
Спасибо, очень нужное мне решение! Всем хорошего дня, буду обращаться.
P.S.: насчёт предыдущих глюков - не, там причина явно глючная. Компилятор упрямо писал ошибку компиляции нету ";" после оператора, хотя там чёрным по зелёному стоит точка с запятой. Даже пробовал её переписать заново - та же ошибка.
Не долго думая, ставлю ещё одну ";" там, где компайлер хочет. Получается PORTB = 0x2F;; - глупость несусветная . Компилирую - ошибок нет! Дальше ещё интереснее: убираю одну точку с запятой, т.е. восстанавливаю совершенно корректную форму PORTB = 0x2F; Компилирую - ошибок нет, хотя минуту назад были.
И нет до сих пор. Вот такие чудеса
Спасибо ответившим! А-а-а, понятно, надо делать инвеpсию. Т.е., я сунул туда не оператор, а логическое выражение, которые компилятор корректно отрабатывал: т.е. "!"заставляло его выдать false, поэтому PORTB получал 0.
Это у меня значит был затык. Кстати, был приятно удивлён, как быстро мне ответили на этом форуме.
Спасибо, очень нужное мне решение! Всем хорошего дня, буду обращаться.
P.S.: насчёт предыдущих глюков - не, там причина явно глючная. Компилятор упрямо писал ошибку компиляции нету ";" после оператора, хотя там чёрным по зелёному стоит точка с запятой. Даже пробовал её переписать заново - та же ошибка.
Не долго думая, ставлю ещё одну ";" там, где компайлер хочет. Получается PORTB = 0x2F;; - глупость несусветная . Компилирую - ошибок нет! Дальше ещё интереснее: убираю одну точку с запятой, т.е. восстанавливаю совершенно корректную форму PORTB = 0x2F; Компилирую - ошибок нет, хотя минуту назад были.
И нет до сих пор. Вот такие чудеса
Re: CodeVision AVR в вопросах и ответах
В CVAVR битовый доступ реализован только к регистрам ввода-вывода и к ...битовой переменной. Обращение: имя_регистра.номер_бита (PORTA.5)ELcat писал(а):Люди, объясните пожалуйста, как в CV AVR можно изменять биты в переменной, делать ветвление с сылкой на конкретный бит переменной?


