Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
BCluster
Собутыльник Кота
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение BCluster »

Можно конечно если она соотвествующего типа. В данном случае char или int...
Вы должны понять такую вещь - char он и в Африке char. Нету же двоичного чара, десятичного чара, шестнадцатиричного чара :)
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение vitalik_1984 »

Ghost in shell писал(а):это опорное у меня +5В. Я так понимаю, выше опорного АЦП не меряет?
Ghost in shell писал(а):мерять то не меряет, а подать то можно...только не больше напряжения питания вроде.
Запятые мне сейчас ненужны - хочу знать, какому напряжению на входе соответствует какое число в ADRES.
Ghost in shell писал(а):вообще это легко посчитать.если полный брать ADRES то 10 бит это 1024
делишь 5 на 1024. 0,0048828125 на бит...например напряжение 3.1в будет 1001111011 в двоичной или 635 в десятеричной системе.А реальное напряжение зависит от того,какой делитель поставить перед входом... В вашем случае это делитель с кнопок
Мне для аналоговой клавиатуры надо задать соответствие, и мне действительно все равно, что там будет. Абы такое-то число (точнее, диапазон чисел) соответствовало такой-то клавише.

ну с этого и нужно было начинать:)вот проект, в котором такой метод используется.Часы-календарь-термометр (Mega8+DS1307+DS18B20+4LED)Автор тот же - Danko
В поисках истины человек развивается.
Аватара пользователя
Ghost in shell
Держит паяльник хвостом
Сообщения: 931
Зарегистрирован: Пн июн 15, 2009 06:01:38
Откуда: USSR

Re: Вопросы по С/С++ (СИ)

Сообщение Ghost in shell »

ну с этого и нужно было начинать:)

Я стараюсь спрашивать по минимуму.
Кот гуляет сам по себе, но вблизи холодильника.
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Вопросы по С/С++ (СИ)

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

Ghost in shell писал(а):Я стараюсь спрашивать по минимуму.

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

Re: Вопросы по С/С++ (СИ)

Сообщение vitalik_1984 »

Ghost in shell писал(а):
ну с этого и нужно было начинать:)

Я стараюсь спрашивать по минимуму.

пытаетесь спрашивать по минимуму, но даете мало полезной информации,вам мало отвечают и вы опять спрашиваете:)
со стороны походит на загадки.
В поисках истины человек развивается.
demiurg301
Опытный кот
Сообщения: 812
Зарегистрирован: Ср мар 18, 2009 21:14:33

Re: Вопросы по С/С++ (СИ)

Сообщение demiurg301 »

Подскажите какбы так сделать:
Хочу сделать универсальные define-ы для определения функционала портов ВВ

Типа такого как то нельзя сделать? (для меги)

#define Z_OUTPUT(X,Y) DDRX&=~Y PORTX&=~Y // выбрал портX и ногуY и выставил в нули (Z- состояние)

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

Re: Вопросы по С/С++ (СИ)

Сообщение vitalik_1984 »

demiurg301 писал(а):Подскажите какбы так сделать:
Хочу сделать универсальные define-ы для определения функционала портов ВВ

Типа такого как то нельзя сделать? (для меги)

#define Z_OUTPUT(X,Y) DDRX&=~Y PORTX&=~Y // выбрал портX и ногуY и выставил в нули (Z- состояние)
Так то лучше это в функцию запихать.Прикинуть если пять раз записать Z_OUTPUT(X,Y) это уже десять команд одинаковых, а так одна функция и все.Меньше места должно занимать.Но если место не критично то можно, наверно и так сделать, так будет работать быстрее.(не тратится время на переходы)
demiurg301 писал(а):Это адреса портов надо переопределять както?

это как? вроде с адресами компилятор сам должен справляться.
В поисках истины человек развивается.
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение urry »

Типа такого ?
#define _dirI(port,bit,val) _bitL(DDR##port,bit)
#define _dirO(port,bit,val) _bitH(DDR##port,bit)

http://electronix.ru/forum/index.php?ac ... t&id=30242
demiurg301
Опытный кот
Сообщения: 812
Зарегистрирован: Ср мар 18, 2009 21:14:33

Re: Вопросы по С/С++ (СИ)

Сообщение demiurg301 »

vitalik_1984 писал(а): Так то лучше это в функцию запихать.Прикинуть если пять раз записать Z_OUTPUT(X,Y) это уже десять команд одинаковых, а так одна функция и все.Меньше места должно занимать.Но если место не критично то можно, наверно и так сделать, так будет работать быстрее.(не тратится время на переходы)


ДА места валом... Надоело просто "городить огороды" из инициализаций портов ВВ. Как то "умять" хочу.

urry
Типа такого ?
#define _dirI(port,bit,val) _bitL(DDR##port,bit)
#define _dirO(port,bit,val) _bitH(DDR##port,bit)


Да чтото типа этого...

Только чтобы в один макрос вошло всё.
Т.е. 4 состояния порта - выход 1, выход 0, подтяжка к +, и Z-состояние ,а значит и 4 макроса со входным параметром порта.
Видимо тут только через функцию...
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение vitalik_1984 »

demiurg301 писал(а):
vitalik_1984 писал(а): Так то лучше это в функцию запихать.Прикинуть если пять раз записать Z_OUTPUT(X,Y) это уже десять команд одинаковых, а так одна функция и все.Меньше места должно занимать.Но если место не критично то можно, наверно и так сделать, так будет работать быстрее.(не тратится время на переходы)


ДА места валом... Надоело просто "городить огороды" из инициализаций портов ВВ. Как то "умять" хочу.


Если инициализировать, так можно и макрос:)
А функцией если делать, то можно и менять интерактивно во время исполнения.
В поисках истины человек развивается.
Аватара пользователя
van_de_luxe
Встал на лапы
Сообщения: 103
Зарегистрирован: Вс окт 31, 2010 16:46:10
Откуда: Оттуда

Re: Вопросы по С/С++ (СИ)

Сообщение van_de_luxe »

использую ф-ю

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

void SetBright(unsigned short color, unsigned short bright)
{
   color = bright;
}


переменные определены как

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

volatile unsigned short LED1[3]={0,0,0};
#define R1   LED1[0]


когда вызываю ее например так

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

SetBright(R1, 0x1F2);

ничего не происходит

пишу для atmega8a
запускал на симуляторе в avrstudio, он строчку color = bright; вообще пропускает.

в чем может быть дело?

почему присваиваю 1 аргумент другому? - в последствии ф-я будет доработана, 2 аргумент должен изменяться в зависимости от глобальной переменной
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Мастер Ломастер »

вы в студии поглядите лучше, чему у вас LED1[0] равно к тому моменту, когда оно "пропускает строчку"... если кроме этого несчастного обращения к функции больше в программе и нет ничего, компилятор запросто может записать туда сразу "нужное" значение, чтобы не лепить бессмысленный вызов вашей функции.
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
danger3466
Встал на лапы
Сообщения: 135
Зарегистрирован: Ср дек 21, 2011 12:18:39

Re: Вопросы по С/С++ (СИ)

Сообщение danger3466 »

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

#define F_CPU 20000000UL  // 20 MHz

#define BAUD 9600
#include <util/setbaud.h>

#include <avr/io.h> // ввод-вывод
#include <util/delay.h>

void UART_Init(void)
{
    UBRRH = UBRRH_VALUE;
    UBRRL = UBRRL_VALUE;
    UCSRB = (1 << TXEN) | (1 << RXEN);
    UCSRC = (1 << USBS) | (3 << UCSZ0);
}

void Send(unsigned char *data)
{
   USART_Send(data);
}

void USART_Send(unsigned char *data)
{
   int i;
   while(data[i]){
      if (data == '\n')
              USART_Send('\r');
      while ( !( UCSRA & (1<<UDRE)) ){};
      UDR = data[i];
      i++;
   }
}

int main(void)
{
   DDRA = 0x00; // Весь порт как вход
   DDRB = 0x00; // Весь порт как вход

   UART_Init();

   int tmp=2;
   while (1){
      if ((PINB & _BV(PB1)) == 1) {
         if(tmp != 1) Send("Test 1\n");
         tmp = 1;
      } else {
         if(tmp != 0) Send("Test 0\n");
         tmp = 0;
      }
   }

   return 0;
}


Гоняю это дело в эмуляторе, но почему то все время мк считает что на линии 0, в терминале только один раз вижу "Test 0". Хотя я туда то 0 то 1 загоняю. Для этого завел две кнопки одна на минус вторая на плюс.
Похоже косяк тут:

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

if ((PINB & _BV(PB1)) == 1)

Но я его не вижу :(
Помогите!
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Мастер Ломастер »

danger3466 писал(а):Похоже косяк тут:

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

if ((PINB & _BV(PB1)) == 1)

Но я его не вижу :(
ну как же вы не видите?! _BV(PB1) по-вашему равно какому числу?
не надо писать в условии проверки бита ==
надо так:

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

if (PINB & _BV(PB1))
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение vitalik_1984 »

van_de_luxe писал(а):использую ф-ю

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

void SetBright(unsigned short color, unsigned short bright)
{
   color = bright;
}
а ничего, что color в вашем случае это массив?указатель на его начало точнее
van_de_luxe писал(а):переменные определены как

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

volatile unsigned short LED1[3]={0,0,0};
#define R1   LED1[0]


когда вызываю ее например так

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

SetBright(R1, 0x1F2);

ничего не происходит

пишу для atmega8a
запускал на симуляторе в avrstudio, он строчку color = bright; вообще пропускает.

в чем может быть дело?

почему присваиваю 1 аргумент другому? - в последствии ф-я будет доработана, 2 аргумент должен изменяться в зависимости от глобальной переменной

представьте себе получившийся код: перешли к выполнению функции
загрузили данные, выполнили, вернулись обратно.

а если у вас глобальная переменная и все таки данное действие выполняется не один раз, то все равно можно не передавать функции данные просто присвоить данным значения глобальных переменных.
В поисках истины человек развивается.
inkHunter
Грызет канифоль
Сообщения: 287
Зарегистрирован: Сб авг 21, 2010 20:44:27
Откуда: Ростов
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение inkHunter »

Что за прикол не пойму ???!!!

int volatile rx=0;
int volatile starframe=0;

Вот есть такое, пишу в содевижион поставил оптимизацию low , смотрю в протеусе starframe=1; rx=2; и в if заходит, почему если starframe=1 ?
if ((starframe==0)&&(rx!=0))
{

/////////////

}
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Re: Вопросы по С/С++ (СИ)

Сообщение BerZerK-ku »

Мастер Ломастер писал(а):вы в студии поглядите лучше, чему у вас LED1[0] равно к тому моменту, когда оно "пропускает строчку"... если кроме этого несчастного обращения к функции больше в программе и нет ничего, компилятор запросто может записать туда сразу "нужное" значение, чтобы не лепить бессмысленный вызов вашей функции.
Вы вообще задумывались когда ответ давали?

van_de_luxe, есть шанс, что вы сможете попасть на эту строчку, если отключите оптимизацию, но функция при этом все равно работать не будет как задумано. vitalik_1984 указал путь решения проблемы. Вам надо либо передавать в функцию указатель на переменную

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

void SetBright(unsigned short *color, unsigned short bright)
{
   *color = bright;
}
SetBright(&LCD[0], 0x1F2);
, либо сделать у функции возвращаемое значение.

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

unsigned short SetBright(unsigned short bright)
{
   return bright;
}
LCD[0] = SetBright(0x1F2);

Victor_Gordienko - ищите проблему в другом месте. Как вариант - исходники вы исправили, а отладку ведете на старом варианте.
Аватара пользователя
danger3466
Встал на лапы
Сообщения: 135
Зарегистрирован: Ср дек 21, 2011 12:18:39

Re: Вопросы по С/С++ (СИ)

Сообщение danger3466 »

Мастер Ломастер, спасибо, вы совершенно правы.
А чему равно _BV(PB1)? :))
Rusja2008
Открыл глаза
Сообщения: 68
Зарегистрирован: Пн окт 06, 2008 15:51:58
Откуда: Черкассы

Re: Вопросы по С/С++ (СИ)

Сообщение Rusja2008 »

_BV(PB1) аналогично (1<<PB1) аналогично (1<<1) аналогично 0x02 аналогично 0b00000010
Не умееш - не берись, но не взявшись не научишся.
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Мастер Ломастер »

BerZerK-ku писал(а):Вы вообще задумывались когда ответ давали?
нет. а что, надо было?
битва с дураками проиграна, победители торжествуют. слава победителям!
Ответить

Вернуться в «Разные вопросы по МК»