Почему не работает конструкция на С

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
amkuznecov
Первый раз сказал Мяу!
Сообщения: 34
Зарегистрирован: Вс янв 24, 2010 11:38:37

Почему не работает конструкция на С

Сообщение amkuznecov »

Задержка получается неверная

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

int set_portA(char delay){
		         port_A=port_A|1<<pinX;
		         _delay_us(delay);		
		         return 0;
		         }
Реклама
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: Почему не работает конструкция на С

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

миллион раз было сказано, в документации написано: никогда не вызывайте _delay_us или _delay_ms с параметром-переменной!!! ТОЛЬКО КОНСТАНТА В КАЧЕСТВЕ ПАРАМЕТРА ОБЕСПЕЧИВАЕТ ЗАЯВЛЕННУЮ ТОЧНОСТЬ ЗАДЕРЖКИ и компактный код!
битва с дураками проиграна, победители торжествуют. слава победителям!
Реклама
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Почему не работает конструкция на С

Сообщение Аlex »

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

#define set_portA(pinX, delay)  do{  \
 port_A |=1<<(pinX);                  \
 _delay_us(delay);                    \
 }while(0)
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: Почему не работает конструкция на С

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

Аlex писал(а):

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

#define set_portA(pinX, delay)  do{  \
 port_A |=1<<(pinX);                  \
 _delay_us(delay);                    \
 }while(0)
это совершенно ничего не меняет, если будет делаться так, как раньше:

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

#define set_portA(pinX, delay)  do{  \
 port_A |=1<<(pinX);                  \
 _delay_us(delay);                    \
 }while(0)

int var = 100;
set_portA(5, var); // все равно в _delay_us попадает ПЕРЕМЕННАЯ
битва с дураками проиграна, победители торжествуют. слава победителям!
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Почему не работает конструкция на С

Сообщение Аlex »

Ну естественно, если использовать переменную, то не меняет.
Возможно что ТС передаёт в свою ф-ию константу.

Я забыл написать, что вызывать нужно с костантой, иначе толку не будет. Спасибо что поправили меня....
Реклама
amkuznecov
Первый раз сказал Мяу!
Сообщения: 34
Зарегистрирован: Вс янв 24, 2010 11:38:37

Re: Почему не работает конструкция на С

Сообщение amkuznecov »

Аlex писал(а):Ну естественно, если использовать переменную, то не меняет.
Возможно что ТС передаёт в свою ф-ию константу.

Я забыл написать, что вызывать нужно с костантой, иначе толку не будет. Спасибо что поправили меня....
Я передаю именно переменную которая вычисляется, ну не писать же 50 одинаковых функций, _delay_us(10); _delay_us(20);.........
Либо писать тогда свой delay
Реклама
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: Почему не работает конструкция на С

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

amkuznecov писал(а):Я передаю именно переменную которая вычисляется, ну не писать же 50 одинаковых функций, _delay_us(10); _delay_us(20);.........
если вы делаете то, что нельзя делать (об этом недвусмысленно сказано в документации) - кто ж вам виноват?
битва с дураками проиграна, победители торжествуют. слава победителям!
amkuznecov
Первый раз сказал Мяу!
Сообщения: 34
Зарегистрирован: Вс янв 24, 2010 11:38:37

Re: Почему не работает конструкция на С

Сообщение amkuznecov »

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

Re: Почему не работает конструкция на С

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

amkuznecov писал(а):
Мастер Ломастер писал(а):если вы делаете то, что нельзя делать (об этом недвусмысленно сказано в документации) - кто ж вам виноват?
Так яж не виноватых ищу, я совета спрашиваю, уже.... Как реализовать задержку внутри функции, передаваемую параметром, при условии что таймер оченно не хочется пользовать?
ну, если супер-точность не требуется, то вот вариант:

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

static void delay_MS(uint16_t ms){
   for(; ms; ms--) _delay_ms(1);
}
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: Почему не работает конструкция на С

Сообщение pyzhman »

Единичную задержку просчитать ручками на бумажке карандашиком и - юзать.
Docendo discimus
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Re: Почему не работает конструкция на С

Сообщение ChipKiller »

amkuznecov писал(а):Как реализовать задержку внутри функции, передаваемую параметром, при условии что таймер оченно не хочется пользовать?
... зависит от диапазона задержки, о чем нет ни слова...
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

Re: Почему не работает конструкция на С

Сообщение DX168B »

Тоже заметил, что _delay_us(); и _delay_ms(); имеют ограничения на максимальное значение.
Только вот не помню на сколько. И передача туда переменной, траблы вызывала. Я вообще МК на АСМе программирую. В С\С++ у меня под ПК лучше получается. :)

Может попробуйте так:

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

void SetPort_A(unsigned long int delay)
{
    ////////////
    _delay_us(delay);
    ////////////
}
I am DX168B and this is my favourite forum on internet!
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: Почему не работает конструкция на С

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

DX168B писал(а):Может попробуйте так:
может, не будете советовать то, что априори неверно?

хотя бы прочли доку к функции _delay_ms или _delay_us: там сказано, что во-первых, аргумент этой функции имеет тип float, а во-вторых, должен быть константой, чтобы все вычисления были сделаны на этапе компиляции.

когда вы подставляете туда переменную, компилятор грузит библиотеку поддержки плавающей точки, чтобы привести содержимое вашей переменной к типу float, затем делает кучу вычислений, в результате тратится много памяти и тактов. любые попытки "обхитрить" эту функцию обречены.
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

Re: Почему не работает конструкция на С

Сообщение DX168B »

Я уже проверил. Нифига оно не работает. :)))
Да уж, придётся свою функцию писать, или библиотеки искать.
I am DX168B and this is my favourite forum on internet!
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Re: Почему не работает конструкция на С

Сообщение ibiza11 »

вот вам библиотека на асм, поддерживающая переменные со значениями от 0 до 65535

этот файл назвать "mydelay.s" и подключить его к проекту:

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

NAME mydelay_lib
  PUBLIC mydelay
  RSEG CODE
mydelay:
  subi r16,1
  sbci r17,0
  push r16
  or r16,r17
  breq exit_delay
  pop r16
  rjmp mydelay
exit_delay:
  pop r16
  ret  
  end
этот файл назвать "mydelay.h" и #include его в основную программу :

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

#ifndef mydelay_lib
#define mydelay_lib
void mydelay(unsigned int);
#endif
вызывать так:

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

#include "mydelay.h"
/***********/
mydelay(ticks);
:))
Ставим плюсы: )
Аватара пользователя
Goldsmith
Опытный кот
Сообщения: 736
Зарегистрирован: Пн янв 10, 2011 03:06:36
Откуда: Ростов-на-Дону
Контактная информация:

Re: Почему не работает конструкция на С

Сообщение Goldsmith »

Если используете GCC и хотите избежать дорогостоящей возни с числами с плавающей точкой, воспользуйтесь готовыми библиотечными функциями _delay_loop_1 и _delay_loop_2. Правда, аргументы для них задаются не в микро(милли)секундах, а в тройках тактов CPU, но при известной тактовой частоте пересчитать не проблема.

Их определения находятся в <util/delay_basic.h>.
Любой дурак может писать код. Настоящий профессионал - это тот, кто способен постоянно создавать продукт высокого качества, укладываясь при этом в бюджет.
J. Ganssle
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»