вы похоже тему перепутали... это только CVAVR такой формат понимает, поэтому не проще.А тут вопросы по С насколько мне память не изменяетFreshMan писал(а):а не проще ли написать PORTD.2=0 ?Аlex писал(а):Не инвертируется, а сбрасывается 2-ой бит.
Вопросы по С/С++ (СИ)
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
В поисках истины человек развивается.
- Реклама
Re: Вопросы по С/С++ (СИ)
Доброго времени, хвостатые, усатые 
Вопрос касательно функций записи/чтения данных в/из датчика температуры DS18B20.
Верно ли все тут?
Микроконтроллер - ATTiny2313.
Вопрос касательно функций записи/чтения данных в/из датчика температуры 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 {
}
ну и по мелочи: много повторов в коде, ничем не оправданных.
if(bit == 1){
} else if(bit == 0){
}
по=вашему выходит, что теоретически существует и какое-то третье значение переменной bit, раз вы дважды проверяете? но ведь очевидно, что если она не равна 0, то все равно, чему она равна - это логически будет означать единицу. т.е.
if(bit == 1){
} else {
}
ну и по мелочи: много повторов в коде, ничем не оправданных.
битва с дураками проиграна, победители торжествуют. слава победителям!
Re: Вопросы по С/С++ (СИ)
Да, может быть и другое значение (в моем устройстве).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){
}
битва с дураками проиграна, победители торжествуют. слава победителям!
- Реклама
Re: Вопросы по С/С++ (СИ)
Ну хорошо
убедили 
Я просто опасался того случая, когда переменная может содержать все что угодно
Но, собственно говоря, сам процесс организации чтения/записи битов верен?
Я просто опасался того случая, когда переменная может содержать все что угодно
Но, собственно говоря, сам процесс организации чтения/записи битов верен?
Не умеешь - не берись, но не взявшись не научишься...
-
Мастер Ломастер
- Поставщик валерьянки для Кота
- Сообщения: 1995
- Зарегистрирован: Ср май 11, 2011 21:37:45
- Откуда: Цветочный город
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
принципиально - нет, т.к. вы не соблюдаете требования стндарта по временным интервалам. кроме того, тип int для результата функции чтения бита - великоват, хватило бы и unsigned char. кроме того, эти функции надо бы сделать static, а то плохо будет оптимизироваться функция чтения байта. ну и для записи то же самое.Arlleex писал(а):Ну хорошоубедили
Я просто опасался того случая, когда переменная может содержать все что угодно
Но, собственно говоря, сам процесс организации чтения/записи битов верен?
битва с дураками проиграна, победители торжествуют. слава победителям!
Re: Вопросы по С/С++ (СИ)
хм... странно. Вроде все по стандарту делаю. Собственно говоря, где я конкретно допускаю ошибку?
Скрипт из даташита прилагаю:
Скрипт из даташита прилагаю:
- Вложения
-
- Безымянный.png
- (68.68 КБ) 336 скачиваний
Не умеешь - не берись, но не взявшись не научишься...
- svetl1928
- Потрогал лапой паяльник
- Сообщения: 305
- Зарегистрирован: Пт сен 03, 2010 19:29:56
- Откуда: Планета Земля
Re: Вопросы по С/С++ (СИ)
Извините, немного не в тему вопрос, но в надлежащей теме)
Осваиваю микроконтроллеры AVR, но уже надоело копировать чужие проекты и перерывать весь инет когда прийдет в голову очередное устройство на МК.
Хочу освоить язык СИ, немного уже понял. В основном работал с Code Vision,а когда увидел исходники для других компиляторов, то ничего в них не разобрал.
Вот у меня вопросик. Что мне нужно учить, если язык си для каждого компилятора разный? Я не вижу единого базового. Подскажите плиз.
Осваиваю микроконтроллеры AVR, но уже надоело копировать чужие проекты и перерывать весь инет когда прийдет в голову очередное устройство на МК.
Хочу освоить язык СИ, немного уже понял. В основном работал с Code Vision,а когда увидел исходники для других компиляторов, то ничего в них не разобрал.
Вот у меня вопросик. Что мне нужно учить, если язык си для каждого компилятора разный? Я не вижу единого базового. Подскажите плиз.
-
Мастер Ломастер
- Поставщик валерьянки для Кота
- Сообщения: 1995
- Зарегистрирован: Ср май 11, 2011 21:37:45
- Откуда: Цветочный город
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
это не правда: язык Си строго стандартизирован. не ведитесь на поводу у создателей "си-подобных" языков или "диалектов языка", учите язык Си. заодно изучайте аппаратуру микроконтроллеров. ну и развивайте логическое мышление - оно в программировании главноеsvetl1928 писал(а):Что мне нужно учить, если язык си для каждого компилятора разный? Я не вижу единого базового.
битва с дураками проиграна, победители торжествуют. слава победителям!
Re: Вопросы по С/С++ (СИ)
Доброе время суток.
Ребята, подскажите, с какой целью глобальные переменные определяют как static, что это дает и в каких случаях так надо делать, а в каких нет?
P.S. может уже такой вопрос поднимался, случай че не серчайте. Спасибо.
Ребята, подскажите, с какой целью глобальные переменные определяют как static, что это дает и в каких случаях так надо делать, а в каких нет?
P.S. может уже такой вопрос поднимался, случай че не серчайте. Спасибо.
Не умееш - не берись, но не взявшись не научишся.
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
смысла нет вроде.Они и так глобальные.Rusja2008 писал(а): Ребята, подскажите, с какой целью глобальные переменные определяют как static, что это дает и в каких случаях так надо делать, а в каких нет?
А вот в подпрограммах есть смысл, если хотите, чтобы при повторном вызове подпрограммы значение переменной сохранялось.
В поисках истины человек развивается.
-
AaNnDdRrEeYy
- Встал на лапы
- Сообщения: 100
- Зарегистрирован: Ср дек 24, 2008 11:59:24
- Откуда: Москва
Re: AVR studio 4 в вопросах и ответах
Добрый вечер.
возник вопрос по работе с PROGMEM в avr studio 4
есть код который выводит символы на дисплей вот код
я хочу разместить переменную my_word во флеш памяти делаю так
подскажите пожалуйста как ее потом достать от туда, для того чтобы передать в метод LCDSend();
возник вопрос по работе с 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;
}
Код: Выделить всё
const char my_word [] PROGMEM = {'a','b','c'};
-
Мастер Ломастер
- Поставщик валерьянки для Кота
- Сообщения: 1995
- Зарегистрирован: Ср май 11, 2011 21:37:45
- Откуда: Цветочный город
- Контактная информация:
Re: AVR studio 4 в вопросах и ответах
AaNnDdRrEeYy писал(а):я хочу разместить переменную my_word во флеш памяти делаю такподскажите пожалуйста как ее потом достать от туда, для того чтобы передать в метод LCDSend();Код: Выделить всё
const char my_word [] PROGMEM = {'a','b','c'};
Код: Выделить всё
PROGMEM char my_word[] = {'a', 'b', 'c'};
LCDSend(pgm_read_byte((void*)&my_word[1])); // выводим 'b'битва с дураками проиграна, победители торжествуют. слава победителям!
- IfoR
- Поставщик валерьянки для Кота
- Сообщения: 2029
- Зарегистрирован: Сб ноя 15, 2008 10:09:56
- Откуда: г. Тула
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
А зачем здесь явно преобразовывать указатель к нетипизированному виду? И почему не записать тогда так: ?
Код: Выделить всё
my_word+1-
Мастер Ломастер
- Поставщик валерьянки для Кота
- Сообщения: 1995
- Зарегистрирован: Ср май 11, 2011 21:37:45
- Откуда: Цветочный город
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
переменная, объявленная как 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 - компилятор выдаст варнинг, но тем не менее скомпилирует правильно.Rusja2008 писал(а):Доброе время суток.
Ребята, подскажите, с какой целью глобальные переменные определяют как static, что это дает и в каких случаях так надо делать, а в каких нет?
P.S. может уже такой вопрос поднимался, случай че не серчайте. Спасибо.
аналогично можно объявлять и функции. что касается локальных переменных для функций с квалификатором static - вам уже ответили.
битва с дураками проиграна, победители торжествуют. слава победителям!
-
Мастер Ломастер
- Поставщик валерьянки для Кота
- Сообщения: 1995
- Зарегистрирован: Ср май 11, 2011 21:37:45
- Откуда: Цветочный город
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
можно и не приводить, можно и так, как вы сказали - но в этих случаях компилятор может выдть варнинг о несоответствии типов указателей (хотя, конкретно для вашего примера его скорее всего не будет - это я уже по привычке перестраховываюсь). лично мне запись &my_word[1] кажется более понятной, чем my_word+1, т.к. в моем варианте сразу понятно, что my_word - это массив.IfoR писал(а):А зачем здесь явно преобразовывать указатель к нетипизированному виду? И почему не записать тогда так:?Код: Выделить всё
my_word+1
битва с дураками проиграна, победители торжествуют. слава победителям!
Re: Вопросы по С/С++ (СИ)
Решил сделать себе часики, вырезал корпус из текстолита, вставил светодиоды, напоял все и тут дошла очередь до программы.... я нуб, могу простенькие программы на ассемблере и все. А тут решил разобраться с ds 1302 и начались траблы. Народ вообще походу поголовно на СИ пишет, а для мя это пока дремучий лес, да и асм нравиться вполне. Вообщем пытаюсь взять от сюда
Может кто нибудь объяснить на пальцах шо тут творитцо, как организовывается передача команды с данными (да тупой не понимаю) вот на примере этой функции
Если есть желание и свободные 5 минут перевести это в асм, прям вообще шикарно будет.
Может кто нибудь объяснить на пальцах шо тут творитцо, как организовывается передача команды с данными (да тупой не понимаю) вот на примере этой функции
Код: Выделить всё
//посылаем команду или байт данных в часы
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);
}
}
Re: Вопросы по С/С++ (СИ)
Если не найдется добродеев, желающих в свободное время поработать компиляторамиBigcrash писал(а): Если есть желание и свободные 5 минут перевести это в асм, прям вообще шикарно будет.
-
Мастер Ломастер
- Поставщик валерьянки для Кота
- Сообщения: 1995
- Зарегистрирован: Ср май 11, 2011 21:37:45
- Откуда: Цветочный город
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
не соглашусьJack_A писал(а):Включив соображалку, несложно найти соответствие между операторами Си и реализующими их кусками кода.
битва с дураками проиграна, победители торжествуют. слава победителям!



