Код: Выделить всё
ADCSRA|=(0<<ADEN) // Устанавливаете бит ADEN
ADCSRA&=~(0<<ADEN) // Сбрасываете ADEN
ADCSRA^=(0<<ADEN) // Изменяете состояние бита ADEN на противоположное
Код: Выделить всё
ADCSRA|=(0<<ADEN) // Устанавливаете бит ADEN
ADCSRA&=~(0<<ADEN) // Сбрасываете ADEN
ADCSRA^=(0<<ADEN) // Изменяете состояние бита ADEN на противоположное
Код: Выделить всё
#include <mega8.h>
#include <delay.h>
#include <i2c.h>
// I2C Bus functions
#asm
.equ __i2c_port=0x15 ;PORTC
.equ __sda_bit=4
.equ __scl_bit=5
#endasm
***
// I2C Bus initialization
i2c_init();
***
i2c_start();//Стартовый импульс
i2c_write(0x80);//Позвали тда-ху по имени
if (PINC.4=1;) { //если ответила
i2c_write(0x00); //Послали субадрес для левого канала
i2c_write(0x3F); //Сделали максимальную громкость на левом канале
i2c_stop();//стоповый импульс
}
else { i2c_stop(); // иначе стоповый импульс
};
Вы уверены в этом?U235 писал(а):Код: Выделить всё
ADCSRA|=(0<<ADEN) // Устанавливаете бит ADEN
очень похоже на правду, только вот тутдумется мне, что должно быть как-то так
Код: Выделить всё
i2c_write(0x80);//Позвали тда-ху по имени
if (PINC.4=1;) { //если ответила [/quote]очень похоже на правду, только вот тутдумется мне, что должно быть как-то такПодозрительно, вы действительно считаете, что эта микра успеет в любом случае ответить?Может дать ей время для сравнения своего адреса с полученным?Что там в листке данных про микру написано?Код: Выделить всё
i2c_write(0x80);//Позвали тда-ху по имени if (PINC.4=1;) { //если ответила
и почему не используете имя которое понятно вам, для чего вы именно этот сигнал смотрите, кинете порт на другие ноги и получите сюрприз.
Так как правильно будет ? Так вот ацп перестаёт работать.vitalik_1984 писал(а):Вы уверены в этом?U235 писал(а):Код: Выделить всё
ADCSRA|=(0<<ADEN) // Устанавливаете бит ADEN
Код: Выделить всё
ADCSRA=(0<<ADEN) | (0<<ADSC) | (0<<ADFR) | (0<<ADIF) | (1<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);Код: Выделить всё
ADCSRA|=(0<<ADEN);Для выключения нужно присвоить этому биту ноль, а для включения один:pokk писал(а): а вот так вот нетКод: Выделить всё
ADCSRA|=(0<<ADEN);
Код: Выделить всё
ADCSRA &= ~(1 << ADEN); // выключение
ADCSRA |= (1 << ADEN); // включение
непонял вопроса.pokk писал(а):а можно сделать что бы выключался нулём? А то там 100% запутаюсь когда-нибудь
...используя оператор ^ (поразрядное исключающее ИЛИ) поменять местами значения двух переменных можно так (без промежуточной третьей переменной):Apparatchik писал(а):Вот почитайте.
Код: Выделить всё
var1 ^= var2;
var2 ^= var1;
var1 ^= var2;Apparatchik писал(а):непонял вопроса.
Код: Выделить всё
ADCSRA &= ~(1 << ADEN); // выключениеКод: Выделить всё
ADCSRA (вот тут какя-то операция) (0(а здесь главное ноль) << ADEN); // выключение же Читаю может что и придумаю.Вот почитайте.
Я пробовал, но оказалось что с третьей переменной генерируется hex чуть меньшего размера (компилировал GCC), значит такой подход неоправдан.Gudd-Head писал(а): Однако... Кто-нибудь так извращался?
Через директиву define можно сделать как удобно, примеры в конце статьи.pokk писал(а):ADCSRA (вот тут какя-то операция) (0(а здесь главное ноль) << ADEN); // выключение же
А выигрыш в скорости?Apparatchik писал(а):генерируется hex чуть меньшего размера, значит такой подход неоправдан
Незнаю, на "глаз" незаметноGudd-Head писал(а):А выигрыш в скорости?
Можно примерно такpokk писал(а):благодарю за помощь заработало, а можно сделать что бы выключался нулём? А то там 100% запутаюсь когда-нибудь
Код: Выделить всё
#define set_bit(registr,bit) do{registr|=(1<<bit)}while(0) //установка бита
#define clear_bit(registr,bit) do{registr&=~(1<<bit)}while(0) //очистка бита
#define inv_bit(registr,bit) do{registr^=(1<<bit)}while(0) //инверсия бита
Код: Выделить всё
if (uslovie){set_bit(PORTB,PB1);break;}
Код: Выделить всё
PORTB.1=0;Ещё можете попробовать pin_macros.hpokk писал(а):а можно сделать что бы выключался нулём? А то там 100% запутаюсь когда-нибудь
Код: Выделить всё
#define BUZZER B,1,H // PORTB, вывод 1, включать единичкой
#define RELAY B,2,H // PORTB, вывод 2, включать нулёмКстати, для большинства нынешних AVR-ок инвертировать вывод можно гораздо проще, и, что часто приятно, атомарно, командой записи в регистр PIN. Макросы TOGGLE и CPL (синонимы) в pin_macros.h это учитывают, но для другого компилятора придётся править ту часть, которая задаёт параметр PORT_TOGGLE_BY_PIN_WRITE автоматически по выставленному компилятором define для типа контроллераvitalik_1984 писал(а):Код: Выделить всё
#define inv_bit(registr,bit) do{registr^=(1<<bit)}while(0) //инверсия бита
Так то по той ссылке пониже были эти самые макроопределения, только немного по другому выглядят.pokk писал(а):vitalik_1984, Спасибо.
Эт конечно интересно выглядит, а как включать тот же АЦП в соответствующем регистре?avreal писал(а):Там вообще писать будете ON(BUZZER), OFF(RELAY), TOGGLE(LED). А нулём или единицей -- это будете задавать (в том числе менять в одном месте не перетаптывая весь исходник) при определении пина
Код: Выделить всё
145 #define PM_SETL(port,bit,dummy) (PORT##port &= ~(1<<(bit)))
146 #define PM_SETH(port,bit,dummy) (PORT##port |= (1<<(bit)))
147 #define PM_SET(port,bit,val) PM_SET##val(port,bit,dummy)
148 #define ON(x) PM_SET(x) Код: Выделить всё
#define BUZZER B,1,H // PORTB, вывод 1, включать единичкойКод: Выделить всё
#define SET(x) PM_SETH(x)
#define CLR(x) PM_SETL(x)"ну если так, то да, если так, то конечно".vitalik_1984 писал(а):Эт конечно интересно выглядит, а как включать тот же АЦП в соответствующем регистре?
Код: Выделить всё
bit_set(ADCSRA, ADEN);
bit_clr(ADCSRA, ADEN);Код: Выделить всё
ADCSRA |= (0<<ADEN);
ADCSRA &= ~(0<<ADEN);Код: Выделить всё
ADMUX = (1<<ADLAR) | (1<<REFS0);Код: Выделить всё
bit_set(ADCSRA, ADEN);
ADMUX = (1<<ADLAR) | (1<<REFS0);Код: Выделить всё
145 #define PM_SETL(port,bit,dummy) (port &= ~(1<<(bit)))
146 #define PM_SETH(port,bit,dummy) (port |= (1<<(bit)))
147 #define PM_SET(port,bit,val) PM_SET##val(port,bit,dummy)
148 #define ON(x) PM_SET(x)
Код: Выделить всё
#define My_ADC(ADCSRA,ADEN,H)
ON(My_ADC);// гораздо доступнее для понимания и писанины меньше, если один раз прописать больше
аналогично.Только все равно можно делать часто используемые моменты короче в написании.Понимаете, у меня проблем с восприятием битовых операций в С нет, а