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

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

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

Сообщение vitalik_1984 »

FreshMan писал(а):
Аlex писал(а):Не инвертируется, а сбрасывается 2-ой бит.

а не проще ли написать PORTD.2=0 ? :tea:

вы похоже тему перепутали... это только CVAVR такой формат понимает, поэтому не проще.А тут вопросы по С насколько мне память не изменяет
В поисках истины человек развивается.
Arlleex
Друг Кота
Сообщения: 4435
Зарегистрирован: Сб мар 07, 2009 20:44:36

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

Сообщение Arlleex »

Доброго времени, хвостатые, усатые :)
Вопрос касательно функций записи/чтения данных в/из датчика температуры DS18B20.
Верно ли все тут?
Микроконтроллер - ATTiny2313.

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

void sensor_write_1_0(int bit)
{
   if (bit==0)
   {
      DDRB=DDRB | (1<<DQ); // запись 0
      _delay_us(100); // задержка 100мкс
      DDRB=DDRB & 0xFE; // запись 1
   }
   else if (bit==1)
   {
      DDRB=DDRB | (1<<DQ); // запись 0
      _delay_us(1); // задержка 1мкс
      DDRB=DDRB & 0xFE; // запись 1
      _delay_us(100); // задержка 100мкс
   }
}
// sensor_read_1_0 - функция чтения 1/0
unsigned int sensor_read_1_0(void)
{
        // объявление переменных
        char bit; // данные DQ
   DDRB=DDRB | (1<<DQ); // запись 0
   _delay_us(1); // задержка 1мкс
   DDRB=DDRB & 0xFE; // запись 1
        bit=PINB & 0x1; // чтение состояния линии DQ
        _delay_us(100); // задержка 100мкс
   if (bit==0x1)
   {
      return 1; // возвращение 1
   }
   else if (bit==0x0)
   {
      return 0; // возвращение 0
   }
}
Не умеешь - не берись, но не взявшись не научишься...
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

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

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

не все тут верно. во-первых, не увидел задержек, регламентированных стандартом 1-wire для тайм-слота. во-вторых просто удивила конструкция
if(bit == 1){
} else if(bit == 0){
}
по=вашему выходит, что теоретически существует и какое-то третье значение переменной bit, раз вы дважды проверяете? но ведь очевидно, что если она не равна 0, то все равно, чему она равна - это логически будет означать единицу. т.е.
if(bit == 1){
} else {
}
ну и по мелочи: много повторов в коде, ничем не оправданных.
битва с дураками проиграна, победители торжествуют. слава победителям!
Arlleex
Друг Кота
Сообщения: 4435
Зарегистрирован: Сб мар 07, 2009 20:44:36

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

Сообщение Arlleex »

if(bit == 1){
} else if(bit == 0){
}

Да, может быть и другое значение (в моем устройстве).
Задержки выдержал согласно документации - 100мкс, и 1мкс как положено (время тайм-слота 60-120мкс, я выбрал среднее значение 100мкс, и это еще без учета накладных команд).
Не умеешь - не берись, но не взявшись не научишься...
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

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

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

Arlleex писал(а):
if(bit == 1){
} else if(bit == 0){
}

Да, может быть и другое значение (в моем устройстве).
фантастика! и какое же третье значение может иметь бит? :shock: вы ведь так или иначе опрашиваете 1-проводную линию, а в ней либо 0, либо 1 - третьего не дано (если требования стандарта 1-wire вы соблюли). да и цифровой вход принципиально не способен выдать "третий" уровень :)
битва с дураками проиграна, победители торжествуют. слава победителям!
Arlleex
Друг Кота
Сообщения: 4435
Зарегистрирован: Сб мар 07, 2009 20:44:36

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

Сообщение Arlleex »

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

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

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

Arlleex писал(а):Ну хорошо :) убедили :)
Я просто опасался того случая, когда переменная может содержать все что угодно :)
Но, собственно говоря, сам процесс организации чтения/записи битов верен?
принципиально - нет, т.к. вы не соблюдаете требования стндарта по временным интервалам. кроме того, тип int для результата функции чтения бита - великоват, хватило бы и unsigned char. кроме того, эти функции надо бы сделать static, а то плохо будет оптимизироваться функция чтения байта. ну и для записи то же самое.
битва с дураками проиграна, победители торжествуют. слава победителям!
Arlleex
Друг Кота
Сообщения: 4435
Зарегистрирован: Сб мар 07, 2009 20:44:36

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

Сообщение Arlleex »

хм... странно. Вроде все по стандарту делаю. Собственно говоря, где я конкретно допускаю ошибку?
Скрипт из даташита прилагаю:
Вложения
Безымянный.png
(68.68 КБ) 334 скачивания
Не умеешь - не берись, но не взявшись не научишься...
Аватара пользователя
svetl1928
Потрогал лапой паяльник
Сообщения: 305
Зарегистрирован: Пт сен 03, 2010 19:29:56
Откуда: Планета Земля

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

Сообщение svetl1928 »

Извините, немного не в тему вопрос, но в надлежащей теме)
Осваиваю микроконтроллеры AVR, но уже надоело копировать чужие проекты и перерывать весь инет когда прийдет в голову очередное устройство на МК.
Хочу освоить язык СИ, немного уже понял. В основном работал с Code Vision,а когда увидел исходники для других компиляторов, то ничего в них не разобрал.
Вот у меня вопросик. Что мне нужно учить, если язык си для каждого компилятора разный? Я не вижу единого базового. Подскажите плиз.
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

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

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

svetl1928 писал(а):Что мне нужно учить, если язык си для каждого компилятора разный? Я не вижу единого базового.
это не правда: язык Си строго стандартизирован. не ведитесь на поводу у создателей "си-подобных" языков или "диалектов языка", учите язык Си. заодно изучайте аппаратуру микроконтроллеров. ну и развивайте логическое мышление - оно в программировании главное
битва с дураками проиграна, победители торжествуют. слава победителям!
Rusja2008
Открыл глаза
Сообщения: 68
Зарегистрирован: Пн окт 06, 2008 15:51:58
Откуда: Черкассы

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

Сообщение Rusja2008 »

Доброе время суток.
Ребята, подскажите, с какой целью глобальные переменные определяют как static, что это дает и в каких случаях так надо делать, а в каких нет?
P.S. может уже такой вопрос поднимался, случай че не серчайте. Спасибо.
Не умееш - не берись, но не взявшись не научишся.
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

Rusja2008 писал(а):Ребята, подскажите, с какой целью глобальные переменные определяют как static, что это дает и в каких случаях так надо делать, а в каких нет?


смысла нет вроде.Они и так глобальные.
А вот в подпрограммах есть смысл, если хотите, чтобы при повторном вызове подпрограммы значение переменной сохранялось.
В поисках истины человек развивается.
AaNnDdRrEeYy
Встал на лапы
Сообщения: 100
Зарегистрирован: Ср дек 24, 2008 11:59:24
Откуда: Москва

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

Сообщение AaNnDdRrEeYy »

Добрый вечер.
возник вопрос по работе с PROGMEM в avr studio 4
есть код который выводит символы на дисплей вот код

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

#include <avr/io.h>
#include <avr/pgmspace.h>
//определяю массив в оперативке
const unsigned char my_word       []  =   {'a','b','c'};
//отправляю на дисплей
int main( void )
{
   LSDSend(my_word);
   while(1)
   return 0;
}


я хочу разместить переменную my_word во флеш памяти делаю так

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

const char my_word       [] PROGMEM  =   {'a','b','c'};


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

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

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

AaNnDdRrEeYy писал(а):я хочу разместить переменную my_word во флеш памяти делаю так

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

const char my_word       [] PROGMEM  =   {'a','b','c'};

подскажите пожалуйста как ее потом достать от туда, для того чтобы передать в метод LCDSend();

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

PROGMEM char my_word[] = {'a', 'b', 'c'};

LCDSend(pgm_read_byte((void*)&my_word[1])); // выводим 'b'
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

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

Сообщение IfoR »

А зачем здесь явно преобразовывать указатель к нетипизированному виду? И почему не записать тогда так:

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

my_word+1
?
Изображение
/dev/urandom - гигабайты информации.

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

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

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

Rusja2008 писал(а):Доброе время суток.
Ребята, подскажите, с какой целью глобальные переменные определяют как static, что это дает и в каких случаях так надо делать, а в каких нет?
P.S. может уже такой вопрос поднимался, случай че не серчайте. Спасибо.

переменная, объявленная как static, доступна для использования (видима) только в пределах того файла, где она объявлена. то есть если ваша программа состоит из трех файлов исходников file1.c, file2.c и file3.c, то вы можете в каждом из этих файлов объявить static int var1; и при этом получите ТРИ РАЗНЫХ ПЕРЕМЕННЫХ, и при этом вы можете объявить переменную static int var2 в файле file1.c и в файлах file2.c и file3.c она будет недоступна. а вот если вы объявите переменную int var3 в файле file1.c, то ее можно будет "увидеть" и использовать и в файлах file2.c и file3.c - компилятор выдаст варнинг, но тем не менее скомпилирует правильно.

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

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

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

IfoR писал(а):А зачем здесь явно преобразовывать указатель к нетипизированному виду? И почему не записать тогда так:

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

my_word+1
?

можно и не приводить, можно и так, как вы сказали - но в этих случаях компилятор может выдть варнинг о несоответствии типов указателей (хотя, конкретно для вашего примера его скорее всего не будет - это я уже по привычке перестраховываюсь). лично мне запись &my_word[1] кажется более понятной, чем my_word+1, т.к. в моем варианте сразу понятно, что my_word - это массив.
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
Bigcrash
Открыл глаза
Сообщения: 61
Зарегистрирован: Вс фев 12, 2012 09:32:37

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

Сообщение Bigcrash »

Решил сделать себе часики, вырезал корпус из текстолита, вставил светодиоды, напоял все и тут дошла очередь до программы.... я нуб, могу простенькие программы на ассемблере и все. А тут решил разобраться с ds 1302 и начались траблы. Народ вообще походу поголовно на СИ пишет, а для мя это пока дремучий лес, да и асм нравиться вполне. Вообщем пытаюсь взять от сюда
Может кто нибудь объяснить на пальцах шо тут творитцо, как организовывается передача команды с данными (да тупой не понимаю) вот на примере этой функции

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

//посылаем команду или байт данных в часы
void write(unsigned char cmd)
{
DDR_RTC |= (1<<E) | (1<<SCLK)|(1<<IO);//устанавливаем на выход
PORT_RTC |= (1<<E);//СE=1
_delay_us(4);
for(unsigned char i=0; i<8; i++)//передаем биты
{
if((cmd&(1<<i)) == 1<<i)
{
PORT_RTC |= (1<<IO);
}
else
{
PORT_RTC &= ~(1<<IO);
}
PORT_RTC |= (1<<SCLK);//устанавливаем синхроимпульс и по фронту бит записывается в часы
_delay_us(1);
PORT_RTC &= ~(1<<IO);//сбрасываем IO и SCLK
PORT_RTC &= ~(1<<SCLK);
}
}

Если есть желание и свободные 5 минут перевести это в асм, прям вообще шикарно будет.
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6307
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

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

Сообщение Jack_A »

Bigcrash писал(а):Если есть желание и свободные 5 минут перевести это в асм, прям вообще шикарно будет.

Если не найдется добродеев, желающих в свободное время поработать компиляторами :) , то это легко можно сделать самому. По приведенной ссылке скачивается архив, из него вытаскивается .hex, загружается AVR Studio - и вуаля - имеем прошивку в виде ассемблерного листинга ( почти, за исключением имен и меток ). Включив соображалку, несложно найти соответствие между операторами Си и реализующими их кусками кода.
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

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

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

Jack_A писал(а):Включив соображалку, несложно найти соответствие между операторами Си и реализующими их кусками кода.

не соглашусь :) после того, как над исходником Си поработает оптимизатор компилятора, даже включив соображалку в режиме турбо порой сложно увидеть соответствие ассемблерных команд с Сишными операторами :)))
битва с дураками проиграна, победители торжествуют. слава победителям!
Ответить

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