AlexFisher писал(а):чтобы применить к биту операцию ИЛИ, там должен быть 0, иначе мы не сможем этой операцией записать в бит 0.
во-первых, логической операции абсолютно по барабану состояние битов, поэтому мы можем ее применять не взирая на происки врагов ВСЕГДА.
во-вторых, если в бите был НЕ НОЛЬ, то не по барабану ли наши старания установить там ЕДИНИЦУ?! даже хорошо - напрягаться не придется
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
ARV писал(а):
во-первых, логической операции абсолютно по барабану состояние битов, поэтому мы можем ее применять не взирая на происки врагов ВСЕГДА.
Согласен! Всеми лапами за независимость операций от операндов!
ARV писал(а):
во-вторых, если в бите был НЕ НОЛЬ, то не по барабану ли наши старания установить там ЕДИНИЦУ?! даже хорошо - напрягаться не придется
Но мы же не знаем, что будем устанавливать. Наши потуги установить 0 операцией "или" будут напрасны, если там 1
Вот я и сбрасываю бит, чтобы не задумываясь записывать бит операцией "или". Иначе получим очередное ветвление - если в операнде 0, то применить "или", иначе применить "и" предварительно установив остальные биты операнда в 1
Давайте уже закончим на этом, а то офтоп развели
32768 писал(а):
И написал я себе вот такой макросик:
Не согласен!
Если VAR1.PIN1 содержит 1, то всё работает правильно, если 0, то Вы не меняете состояние VAR2, потому что операция OR с нулём ничего не меняет, а Вам нужно сбросить соответствующий бит!
Вам перед этой операцией в макросе нужно добавить VAR2 &=`(_BV(PIN2));
[i]Да здравствует всё то, благодаря чему мы не смотря ни на что![/i]
я бы вам посоветовал только дать макросу другое наименование, которое само за себя говорило бы... а то PIN вызывает ассоциацию с выводами МК - а на самом деле происходит перемещение бита... ну и назвали бы MOVE_BIT или как-то так...
кстати, для чего вам такая операция потребовалась?
P.S. в вашем #define в конце строки точка с запятой не нужна - может быть ошибка в определенных случаях применения макроса
P.P.S. (на справедливое замечание AlexFisher) ок, ИЛИ 1 на 0 не поменяет, ясен пень как вам это:
Я уже писал (отредактировал свой пост)
Вам перед этой операцией в макросе нужно добавить VAR2 &=`(_BV(PIN2)); НО
При этом, если в качестве операнда VAR2 Вы передаете порт вывода, в котором этот бит =1, то у вас на очень маленькое время там появится 0. Получите импульс, который Вам может все испортить, поэтому я и предлагал промежуточную переменную
ARV писал(а):
P.P.S. (на справедливое замечание AlexFisher) ок, ИЛИ 1 на 0 не поменяет, ясен пень как вам это:
А этот макрос сделает все правильно. Я полагаю, что компилятор сам создаст временную переменную.
Но я "такой злой", что сделаю еще замечание:
Сюда в таком виде нельзя передавать в качестве аргумента VAR2 макроса имя порта, потому что слева от = должно получиться, скажем, PORTC, а в правой части выражения нужно подставить PINC. Придется список аргументов удлинять
Последний раз редактировалось AlexFisher Пт авг 20, 2010 18:26:28, всего редактировалось 1 раз.
[i]Да здравствует всё то, благодаря чему мы не смотря ни на что![/i]
AlexFisher писал(а):При этом, если в качестве операнда VAR2 Вы передаете порт вывода, в котором этот бит =1, то у вас на очень маленькое время там появится 0. Получите импульс, который Вам может все испортить, поэтому я и предлагал промежуточную переменную
чевой-то я не понял... какой импульс, при каких условиях? как надел я портупею - все тупею и тупею поясните на примере, что ли...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
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]
начал изучать 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мгц,
писал программу в аврстудио...
на любой элемент найдется мощность, которая его сожжет.
все очень просто: книжка Шпака устарела
задержки теперь находятся в модуле <util/delay.h>, к тому же не рекомендую использовать функции задержек, использованные вами, постарайтесь "выкрутиться" только при помощи _delay_ms() и _delay_us(), причем ни в коем случае не передавайте в них в качестве длительности задержки переменные - только константы!!!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
ну вот. следующий шаг. как опрашивать кнопки?
в данной программе (на меге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
в чем может быть проблема?
на любой элемент найдется мощность, которая его сожжет.
Тогда PIND4 == 0 будет всегда ложь, потому что скомпилируется 4 == 0.
В этом месте Вы вообще не опрашиваете порт. Будте внимательны, где у Вас определена константа, а где порт
[i]Да здравствует всё то, благодаря чему мы не смотря ни на что![/i]
не могу компилировать в hex. В этой программе пока мало что понимаю.
У меня есть файл .с я его открываю данной программой и хочу скомпилировать. Но вкладка проект- компиляция не активна, как сделать ёё активной ?
QQQ писал(а):не могу компилировать в hex. В этой программе пока мало что понимаю.
У меня есть файл .с я его открываю данной программой и хочу скомпилировать. Но вкладка проект- компиляция не активна, как сделать ёё активной ?
нужно создать проект и добаить туда файл. ну или скопировать его содержимое в окно с сорцом проекта.