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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
U235
Встал на лапы
Сообщения: 135
Зарегистрирован: Вт фев 21, 2012 20:42:26
Откуда: Санкт-Петербург, Россия, Земля

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

Сообщение U235 »

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

ADCSRA|=(0<<ADEN)   // Устанавливаете бит ADEN
ADCSRA&=~(0<<ADEN)  // Сбрасываете ADEN
ADCSRA^=(0<<ADEN)  // Изменяете состояние бита ADEN на противоположное
А из наших труб идет необычный дым. Стой! Опасная зона! Работа мозга!...
Реклама
Аватара пользователя
levaclaus
Потрогал лапой паяльник
Сообщения: 302
Зарегистрирован: Пн янв 07, 2008 16:56:28
Откуда: Минск

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

Сообщение levaclaus »

хочу подключить TDA8425. Как правильно её пользовать?
Нашёл такой сайт http://stoom.ru/component/option,com_so ... temid,161/
думется мне, что должно быть как-то так:

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

#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();  // иначе стоповый импульс
    };




я правильно мыслю?
Реклама
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

U235 писал(а):

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

ADCSRA|=(0<<ADEN)   // Устанавливаете бит ADEN
 
Вы уверены в этом?
думется мне, что должно быть как-то так
очень похоже на правду, только вот тут

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

 i2c_write(0x80);//Позвали тда-ху по имени
if (PINC.4=1;) { //если ответила   
Подозрительно, вы действительно считаете, что эта микра успеет в любом случае ответить?Может дать ей время для сравнения своего адреса с полученным?Что там в листке данных про микру написано?
и почему не используете имя которое понятно вам, для чего вы именно этот сигнал смотрите, кинете порт на другие ноги и получите сюрприз.
В поисках истины человек развивается.
Аватара пользователя
levaclaus
Потрогал лапой паяльник
Сообщения: 302
Зарегистрирован: Пн янв 07, 2008 16:56:28
Откуда: Минск

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

Сообщение levaclaus »

думется мне, что должно быть как-то так
очень похоже на правду, только вот тут

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

 i2c_write(0x80);//Позвали тда-ху по имени
if (PINC.4=1;) { //если ответила     
Подозрительно, вы действительно считаете, что эта микра успеет в любом случае ответить?Может дать ей время для сравнения своего адреса с полученным?Что там в листке данных про микру написано?
и почему не используете имя которое понятно вам, для чего вы именно этот сигнал смотрите, кинете порт на другие ноги и получите сюрприз.
[/quote]
ок,
#asm("nop"); нам поможет либо delay_ms(100);
правда непонятно, сколько конкретно будет длиться подтверждение, и сколько надо времени между посылами адресов.

Да, имя (0x80) вполне понятно. У ds1307 (0xD0) либо (0xD1).

ну, судя по инфе, при успешном сравнении адреса должно быть подтверждение в виде высокого уровня на линии SDA. Его и проверяем.
Реклама
Эиком - электронные компоненты и радиодетали
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

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

Сообщение pokk »

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);
Реклама
Аватара пользователя
Apparatchik
Держит паяльник хвостом
Сообщения: 908
Зарегистрирован: Вс май 23, 2010 13:55:42
Откуда: Украина, Александрия

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

Сообщение Apparatchik »

pokk писал(а): а вот так вот нет

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

ADCSRA|=(0<<ADEN);
Для выключения нужно присвоить этому биту ноль, а для включения один:

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

ADCSRA &= ~(1 << ADEN); // выключение
ADCSRA |= (1 << ADEN); // включение
«И всё-таки она вертится!»
Реклама
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

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

Сообщение pokk »

благодарю за помощь заработало, а можно сделать что бы выключался нулём? А то там 100% запутаюсь когда-нибудь :))
Аватара пользователя
Apparatchik
Держит паяльник хвостом
Сообщения: 908
Зарегистрирован: Вс май 23, 2010 13:55:42
Откуда: Украина, Александрия

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

Сообщение Apparatchik »

pokk писал(а):а можно сделать что бы выключался нулём? А то там 100% запутаюсь когда-нибудь :))
непонял вопроса.

Вот почитайте.
«И всё-таки она вертится!»
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

Сообщение Gudd-Head »

Apparatchik писал(а):Вот почитайте.
...используя оператор ^ (поразрядное исключающее ИЛИ) поменять местами значения двух переменных можно так (без промежуточной третьей переменной):

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

var1 ^= var2;
var2 ^= var1;
var1 ^= var2;
Однако... Кто-нибудь так извращался? :))
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

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

Сообщение pokk »

Apparatchik писал(а):непонял вопроса.

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

ADCSRA &= ~(1 << ADEN); // выключение

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

ADCSRA (вот тут какя-то операция)  (0(а здесь главное ноль) << ADEN); // выключение же  
Вот почитайте.
Читаю может что и придумаю.
Аватара пользователя
Apparatchik
Держит паяльник хвостом
Сообщения: 908
Зарегистрирован: Вс май 23, 2010 13:55:42
Откуда: Украина, Александрия

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

Сообщение Apparatchik »

Gudd-Head писал(а): Однако... Кто-нибудь так извращался? :))
Я пробовал, но оказалось что с третьей переменной генерируется hex чуть меньшего размера (компилировал GCC), значит такой подход неоправдан.
pokk писал(а):ADCSRA (вот тут какя-то операция) (0(а здесь главное ноль) << ADEN); // выключение же
Через директиву define можно сделать как удобно, примеры в конце статьи.
Последний раз редактировалось Apparatchik Вт сен 04, 2012 14:42:27, всего редактировалось 1 раз.
«И всё-таки она вертится!»
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

Сообщение Gudd-Head »

Apparatchik писал(а):генерируется hex чуть меньшего размера, значит такой подход неоправдан
А выигрыш в скорости?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
Apparatchik
Держит паяльник хвостом
Сообщения: 908
Зарегистрирован: Вс май 23, 2010 13:55:42
Откуда: Украина, Александрия

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

Сообщение Apparatchik »

Gudd-Head писал(а):А выигрыш в скорости?
Незнаю, на "глаз" незаметно :) , у меня тогда программа в мк не влазила вот и пробовал разные способы, этот непрокатил.
«И всё-таки она вертится!»
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

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) //инверсия бита
 
do{}while(0) нужно для того, чтобы в каком нибудь блоке if или еще где не вылазило ошибок при стандартном использовании :

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

if (uslovie){set_bit(PORTB,PB1);break;}
 
Bот так точно не запутаетесь.Я себе в стандартную библиотеку дописал эти два макроса для удобства.

в код вижне же можно еще так делать:

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

PORTB.1=0;
правда работает не со всеми регистрами.Только до адреса 0x1f как и команды sbic,cbi
Последний раз редактировалось vitalik_1984 Вт сен 04, 2012 16:45:39, всего редактировалось 1 раз.
В поисках истины человек развивается.
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

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

Сообщение pokk »

vitalik_1984, Спасибо.
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

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

Сообщение avreal »

pokk писал(а):а можно сделать что бы выключался нулём? А то там 100% запутаюсь когда-нибудь :))
Ещё можете попробовать pin_macros.h
http://radiokot.ru/forum/viewtopic.php? ... 2#p1366592
Там вообще писать будете ON(BUZZER), OFF(RELAY), TOGGLE(LED). А нулём или единицей -- это будете задавать (в том числе менять в одном месте не перетаптывая весь исходник) при определении пина

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

#define BUZZER B,1,H // PORTB, вывод 1, включать единичкой
#define RELAY  B,2,H // PORTB, вывод 2, включать нулём
Должны и в кодевижине заработать.
vitalik_1984 писал(а):

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

#define inv_bit(registr,bit) do{registr^=(1<<bit)}while(0) //инверсия бита
 
Кстати, для большинства нынешних AVR-ок инвертировать вывод можно гораздо проще, и, что часто приятно, атомарно, командой записи в регистр PIN. Макросы TOGGLE и CPL (синонимы) в pin_macros.h это учитывают, но для другого компилятора придётся править ту часть, которая задаёт параметр PORT_TOGGLE_BY_PIN_WRITE автоматически по выставленному компилятором define для типа контроллера
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

pokk писал(а):vitalik_1984, Спасибо.
Так то по той ссылке пониже были эти самые макроопределения, только немного по другому выглядят.
avreal писал(а):Там вообще писать будете ON(BUZZER), OFF(RELAY), TOGGLE(LED). А нулём или единицей -- это будете задавать (в том числе менять в одном месте не перетаптывая весь исходник) при определении пина
Эт конечно интересно выглядит, а как включать тот же АЦП в соответствующем регистре?
В поисках истины человек развивается.
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

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

Сообщение pokk »

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

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

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, включать единичкой
Сейчас вроде бы всё понятно 3 параметра порт номер и уровень передаются через x дальше подставляется буква уровня и выбирается нужный define но вот дальше что за параметр dummy там же уже 3 параметра не надо хватит двух ?
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

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

Сообщение avreal »

А там ещё есть

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

#define SET(x) PM_SETH(x)
#define CLR(x) PM_SETL(x)
на случай, когда хочется именно установить конкретный уровень, а не ON/OFF. Под эти макросы передаётся то же определение ножки, с третьим параметром. Который принимается, но игнорируется.
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);
только напрягает.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

Вот сложность то написать PORTB вместо B, зато не привязаны к определенной области регистров.Так то можно поменять немного эти макросы и пользоваться также как и макросами для портов.
Вроде такого

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

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);// гораздо доступнее для понимания и писанины меньше, если один раз прописать больше 
 
:)))

PS
Понимаете, у меня проблем с восприятием битовых операций в С нет, а
аналогично.Только все равно можно делать часто используемые моменты короче в написании.
В поисках истины человек развивается.
Ответить

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