WinAvr в вопросах и ответах

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

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

Сообщение ARV »

AlexFisher писал(а):чтобы применить к биту операцию ИЛИ, там должен быть 0, иначе мы не сможем этой операцией записать в бит 0.

во-первых, логической операции абсолютно по барабану состояние битов, поэтому мы можем ее применять не взирая на происки врагов ВСЕГДА. :)))
во-вторых, если в бите был НЕ НОЛЬ, то не по барабану ли наши старания установить там ЕДИНИЦУ?! даже хорошо - напрягаться не придется :)))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
32768
Родился
Сообщения: 6
Зарегистрирован: Чт авг 19, 2010 20:50:02

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

Сообщение 32768 »

В общем мне понравилось как написал ARV
ARV писал(а):как вам такой вариант:

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

var |= (PORTC & _BV(PC1)) ? _BV(0) : 0;


И написал я себе вот такой макросик:

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

#define PIN(VAR1,PIN1,VAR2,PIN2)    VAR2 |= (VAR1 & _BV(PIN1)) ? _BV(PIN2) : 0;


и теперь решение моей задачи выглядит вот так красиво:

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

PIN(DATA,0,PORTC,1);
Аватара пользователя
AlexFisher
Мучитель микросхем
Сообщения: 493
Зарегистрирован: Вт апр 21, 2009 13:31:27
Откуда: Санкт-Петербург
Контактная информация:

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

Сообщение AlexFisher »

ARV писал(а):во-первых, логической операции абсолютно по барабану состояние битов, поэтому мы можем ее применять не взирая на происки врагов ВСЕГДА. :)))

Согласен! Всеми лапами за независимость операций от операндов! :)))
ARV писал(а):во-вторых, если в бите был НЕ НОЛЬ, то не по барабану ли наши старания установить там ЕДИНИЦУ?! даже хорошо - напрягаться не придется :)))

Но мы же не знаем, что будем устанавливать. Наши потуги установить 0 операцией "или" будут напрасны, если там 1 :)
Вот я и сбрасываю бит, чтобы не задумываясь записывать бит операцией "или". Иначе получим очередное ветвление - если в операнде 0, то применить "или", иначе применить "и" предварительно установив остальные биты операнда в 1

Давайте уже закончим на этом, а то офтоп развели :beer:

32768 писал(а):И написал я себе вот такой макросик:

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

#define PIN(VAR1,PIN1,VAR2,PIN2)    VAR2 |= (VAR1 & _BV(PIN1)) ? _BV(PIN2) : 0;


Не согласен!
Если VAR1.PIN1 содержит 1, то всё работает правильно, если 0, то Вы не меняете состояние VAR2, потому что операция OR с нулём ничего не меняет, а Вам нужно сбросить соответствующий бит!
Вам перед этой операцией в макросе нужно добавить VAR2 &=`(_BV(PIN2));
[i]Да здравствует всё то, благодаря чему мы не смотря ни на что![/i]
32768
Родился
Сообщения: 6
Зарегистрирован: Чт авг 19, 2010 20:50:02

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

Сообщение 32768 »

Да точно,1 на 0 не меняет, зараза.
Куда вот это VAR2 &=`(_BV(PIN2)) нужно добавить,напишите мой исправленный макрос,если не трудно?
Последний раз редактировалось 32768 Пт авг 20, 2010 18:13:46, всего редактировалось 1 раз.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

32768 писал(а):и теперь решение моей задачи выглядит вот так красиво:

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

PIN(DATA,0,PORTC,1);
я бы вам посоветовал только дать макросу другое наименование, которое само за себя говорило бы... а то PIN вызывает ассоциацию с выводами МК - а на самом деле происходит перемещение бита... ну и назвали бы MOVE_BIT или как-то так...

кстати, для чего вам такая операция потребовалась?

P.S. в вашем #define в конце строки точка с запятой не нужна - может быть ошибка в определенных случаях применения макроса

P.P.S. (на справедливое замечание AlexFisher) ок, ИЛИ 1 на 0 не поменяет, ясен пень :beer: как вам это:

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

VAR2 = VAR1 & _BV(PIN1) ? VAR2 | _BV(PIN2) : VAR2 & ~_BV(PIN2)
?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
AlexFisher
Мучитель микросхем
Сообщения: 493
Зарегистрирован: Вт апр 21, 2009 13:31:27
Откуда: Санкт-Петербург
Контактная информация:

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

Сообщение AlexFisher »

Я уже писал (отредактировал свой пост)
Вам перед этой операцией в макросе нужно добавить VAR2 &=`(_BV(PIN2));
НО
При этом, если в качестве операнда VAR2 Вы передаете порт вывода, в котором этот бит =1, то у вас на очень маленькое время там появится 0. Получите импульс, который Вам может все испортить, поэтому я и предлагал промежуточную переменную
ARV писал(а):P.P.S. (на справедливое замечание AlexFisher) ок, ИЛИ 1 на 0 не поменяет, ясен пень :beer: как вам это:

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

VAR2 = VAR1 & _BV(PIN1) ? VAR2 | _BV(PIN2) : VAR2 & ~_BV(PIN2)


А этот макрос сделает все правильно. Я полагаю, что компилятор сам создаст временную переменную. :idea:
Но я "такой злой", что сделаю еще замечание:
Сюда в таком виде нельзя передавать в качестве аргумента VAR2 макроса имя порта, потому что слева от = должно получиться, скажем, PORTC, а в правой части выражения нужно подставить PINC. Придется список аргументов удлинять :)
Последний раз редактировалось AlexFisher Пт авг 20, 2010 18:26:28, всего редактировалось 1 раз.
[i]Да здравствует всё то, благодаря чему мы не смотря ни на что![/i]
32768
Родился
Сообщения: 6
Зарегистрирован: Чт авг 19, 2010 20:50:02

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

Сообщение 32768 »

ARV писал(а): как вам это:

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

VAR2 = VAR1 & _BV(PIN1) ? VAR2 | _BV(PIN2) : VAR2 & ~_BV(PIN2)
?

Во, теперь работает!
Спасиб.

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

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

Сообщение ARV »

AlexFisher писал(а):При этом, если в качестве операнда VAR2 Вы передаете порт вывода, в котором этот бит =1, то у вас на очень маленькое время там появится 0. Получите импульс, который Вам может все испортить, поэтому я и предлагал промежуточную переменную
чевой-то я не понял... какой импульс, при каких условиях? как надел я портупею - все тупею и тупею поясните на примере, что ли...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
AlexFisher
Мучитель микросхем
Сообщения: 493
Зарегистрирован: Вт апр 21, 2009 13:31:27
Откуда: Санкт-Петербург
Контактная информация:

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

Сообщение AlexFisher »

ARV писал(а):
AlexFisher писал(а):При этом, если в качестве операнда VAR2 Вы передаете порт вывода, в котором этот бит =1, то у вас на очень маленькое время там появится 0. Получите импульс, который Вам может все испортить, поэтому я и предлагал промежуточную переменную
чевой-то я не понял... какой импульс, при каких условиях? как надел я портупею - все тупею и тупею поясните на примере, что ли...


Это относится к "моему методу" - сначала сбросить бит, потом к нему применить "ИЛИ"
Пример:
PORT.PIN=1, DATA.PIN=1
Сбрасываем бит у порта (потому что не знаем состояния DATA.PIN) PORT.PIN=0;
Потом применяем "ИЛИ" PORT.PIN|=DATA.PIN - получаем ту же единицу, но на несколько тактов на выходе порта появится 0.

В своем предыдущем посте я указал на ошибку применения PORTX и PINX...
Хотя ничего страшного. Посмотрел даташит - из PORTX можно и читать. При этом читаются данные, которые мы туда внесли (из регистра), а не состояние ног. Если порт сконфигурирован на выход и схемотехника "пряморукая", то неважно, можно читать из PORTX
[i]Да здравствует всё то, благодаря чему мы не смотря ни на что![/i]
Аватара пользователя
skef
Родился
Сообщения: 9
Зарегистрирован: Сб июл 17, 2010 14:16:00

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

Сообщение skef »

:cry:
начал изучать winavr, написал программу (по книге шпака), не компилируется...
#include <avr/io.h>
#include <avr/delay.h>
void pause (int ms)
{
PORTD=0xFF; //все светодиоды отключены
delay_loop_2 (ms); //задержка
}
//==============
void P (void)
{
PORTD = 0; //включаем все светодиоды
delay_loop_2(5); //короткая задержка
pause (5); //пауза с погасшими светодиодами
}
//==============
void D (void)
{
PORTD = 0;
delay_loop_2 (20);
pause (5);
}
/==============
int main (void)
{
DDRD = 0xFF;
while (1)
{
P(); P(); P();
D(); D(); D();
P(); P(); P();
pause (100);
}
}
вылезают ошибки:
undefined reference to `delay_loop_2'
и предупреждения:
warning "This file has been moved to <util/delay.h>."
warning: implicit declaration of function 'delay_loop_2'
и ошибки, и предупреждения связаны с delay.h почему не компилируется???
предполагалось что программа для mega8, тактовая частота 8мгц,
писал программу в аврстудио...
на любой элемент найдется мощность, которая его сожжет.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

все очень просто: книжка Шпака устарела :)
задержки теперь находятся в модуле <util/delay.h>, к тому же не рекомендую использовать функции задержек, использованные вами, постарайтесь "выкрутиться" только при помощи _delay_ms() и _delay_us(), причем ни в коем случае не передавайте в них в качестве длительности задержки переменные - только константы!!!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
skef
Родился
Сообщения: 9
Зарегистрирован: Сб июл 17, 2010 14:16:00

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

Сообщение skef »

Спасибо!!!
все запустилось.
:wink:
учим дальше.
на любой элемент найдется мощность, которая его сожжет.
Аватара пользователя
skef
Родился
Сообщения: 9
Зарегистрирован: Сб июл 17, 2010 14:16:00

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

Сообщение skef »

ну вот. следующий шаг. как опрашивать кнопки?
в данной программе (на меге8) на выводе PD4стоит кнопка замыкающая
пин на землю. соответственно програма которая по прерыванию таймера
опрашивает эту кнопку.
============
#include <avr/io.h>
#include <avr/delay.h>
#include <avr/interrupt.h>
char space = 0;
const char q = 0;
int main (void)
{
DDRB = 0xFF;
PORTD = (1<<PD4);
PORTB = 1;
TCCR0 = (1<<CS00)|(1<<CS02);//предделитель на 1024
TIMSK = (1<<TOIE0);
sei();
while(1);
}

ISR(TIMER0_OVF_vect)
{ if (PIND4 == 0);
{
space = space+1;
}
PORTB = space;
}
============
вот. проблема в том, что в подпрограмму
if (PIND4 == 0);
{
space = space+1;
}
программа заходит гезависимо от состояния вывода PIND4
в чем может быть проблема?
на любой элемент найдется мощность, которая его сожжет.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

я вообще удивляюсь, что ваша программа скомпилировалась... PIND4 у вас нигде не определено - как компилятор это пропустил?!

ну а вообще говоря, состояние пина опрашивается через обращение к регистру PIND примерно так: if(PIND & (1<<PD4))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
lix
Опытный кот
Сообщения: 703
Зарегистрирован: Вс янв 17, 2010 15:32:19
Откуда: Курган

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

Сообщение lix »

ARV писал(а):я вообще удивляюсь, что ваша программа скомпилировалась... PIND4 у вас нигде не определено - как компилятор это пропустил?!


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

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

Сообщение ARV »

lix писал(а):PIND4 определено в хидерах WINAVR как число 4. для всех пинов есть такое.
действительно... :roll:
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
AlexFisher
Мучитель микросхем
Сообщения: 493
Зарегистрирован: Вт апр 21, 2009 13:31:27
Откуда: Санкт-Петербург
Контактная информация:

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

Сообщение AlexFisher »

Тогда PIND4 == 0 будет всегда ложь, потому что скомпилируется 4 == 0.
В этом месте Вы вообще не опрашиваете порт. Будте внимательны, где у Вас определена константа, а где порт
[i]Да здравствует всё то, благодаря чему мы не смотря ни на что![/i]
QQQ
Нашел транзистор. Понюхал.
Сообщения: 168
Зарегистрирован: Пт сен 18, 2009 11:42:24
Откуда: г. Тверь

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

Сообщение QQQ »

не могу компилировать в hex. В этой программе пока мало что понимаю.
У меня есть файл .с я его открываю данной программой и хочу скомпилировать. Но вкладка проект- компиляция не активна, как сделать ёё активной ?
lix
Опытный кот
Сообщения: 703
Зарегистрирован: Вс янв 17, 2010 15:32:19
Откуда: Курган

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

Сообщение lix »

QQQ писал(а):не могу компилировать в hex. В этой программе пока мало что понимаю.
У меня есть файл .с я его открываю данной программой и хочу скомпилировать. Но вкладка проект- компиляция не активна, как сделать ёё активной ?


нужно создать проект и добаить туда файл. ну или скопировать его содержимое в окно с сорцом проекта.
QQQ
Нашел транзистор. Понюхал.
Сообщения: 168
Зарегистрирован: Пт сен 18, 2009 11:42:24
Откуда: г. Тверь

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

Сообщение QQQ »

А можно по по подробней, а то я создаю проект (там выбираю нужный мне контроллер) - дальше открываю P45avr-v02.c . Вкладка компиляция не активна.

что я не так сделал ?
Ответить

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