Парни! есть кто в "СИ" силен???

Валера
03:53, 04.09.2015
Хватит явки и персонал обнародовать!!
Еще не настало время выйти из за клавиатуры!!!!! :ultra: :ultra:
2 / 0
Валера
16:59, 14.06.2017
:beer:

[Сообщение изменено пользователем 14.06.2017 17:01]
0
Валера
17:00, 14.06.2017
Перед всеми кто зашел и стало не интересно извиняюсь!


Парни еще разок помогите!!!! :ultra: :ultra: :ultra:

можно ли оператору задержки

delay_ms(1800);

вместо значения подставить переменную

delay_ms(m);

и ее по ходу цикла менять

m=1000;

..............

..............

m=0;

компилятор без ошибок срабатывает.
На макете время не меняется!

Или это я придумал несуществующие в СИ ????
0
Oбыв@тель
08:31, 15.06.2017
По ходу цикла надо ещё и функцию вызывать.
m=1000;
....
m=0;
конечный результат все рано m==0.
Если хотите результат то где-то вот так

for(m=1800;m==0;m--)
{delay_ms(m);
мигание();
}
Задержки лучше вообще через прерывание организовывать.

И ещё, посмотрите какой тип использует функция delay_ms(1800); значение 1800 может быть для неё очень много, надо хидер файл глянуть. А компилятору пофиг он обрежет последние биты и по факту у вас не 1800 будет а 5 либо 8.
0
@ndrew2709 (откубрячил шаурму)
08:42, 15.06.2017
От пользователя John Dow
Кружок программистов?

почему кружок ? Н- мерный куб

ага
в Х-мерном пространстве :-D
ПС:
Валера, если до пятницы не решишь проблему- могу дать контакт профика
0
John Dow
09:28, 15.06.2017
От пользователя Валера
Перед всеми кто зашел и стало не интересно извиняюсь!


Парни еще разок помогите!!!! :ultra: :ultra: :ultra:

можно ли оператору задержки

delay_ms(1800);

вместо значения подставить переменную

delay_ms(m);

и ее по ходу цикла менять

m=1000;

..............

..............

m=0;

компилятор без ошибок срабатывает.
На макете время не меняется!

Или это я придумал несуществующие в СИ ????


Емнип там при инициализации задержки передаеться параметр.. следовательно её каждый раз при шаге цила надо инициализировать..
З.Ы. Говорю по аналогии с дельфей..ибо си не мое.
0
Валера
12:05, 16.06.2017
От пользователя Oбыв@тель
А компилятору пофиг он обрежет последние биты и по факту у вас не 1800 будет а 5 либо 8.


Похоже так и есть.

В виде отсутствия смекалки решил задачу аппаратно. Взял еще один порт и диодами сделал логическое или. И управляю светодиодом.
Понимаю, что жлобство но работает!!!

Задача то такая :

крутится цикл. В нем мигает светодиод (мало горит, долго не горит) Это индикатор, что проц работает. Попутно МК управляет всякой херней. Это все работает.
При наступлении аварии светодиод начинает -(долго горит, мало не горит) Это индикация аварии.

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

Вот и думал до начала цикла присвоить задержки мигания "нормальной работы". Переменной в операторе дилей.
При аварии принудительно в эти переменные записать другие цифры.
И мигала бы авария до перегрузки.

Чую херней занимаюсь!! можно как то просто решить.
0
John Dow
12:07, 16.06.2017
может не через делеай, а через слип?
1 / 0
Валера
12:33, 16.06.2017
От пользователя John Dow
может не через делеай, а через слип?

у меня трудность - как сделать, что бы после прпопадания ситуации аварии индикация аварии осталась!!
Как то надо, что бы в цикле изменились параметры задержек до перегрузки!
0
Oбыв@тель
19:52, 16.06.2017
Покажите код, можно в личку.
Помогу чем смогу. я мигающие лампочки ещё на 86 процессоре делал в институте
0
Валера
23:58, 16.06.2017
От пользователя Oбыв@тель
Покажите код



Хотел так:


#include <tiny13a.h> //библиотеки
#include <delay.h>
//#include <stdio.h>



unsigned char l, k, i, c; // описываем переменные
unsigned short int m; // длинное число для паузы часа



#define PB0 0
#define PB3 3


void main(void)
{
PORTB= 0b11000010;

DDRB = 0b00011101;





delay_ms(800);
PORTB.0=1; // контроль устройств поочередное вкл
delay_ms(1800);
PORTB.0=0;
delay_ms(800);
PORTB.2=1;
delay_ms(1800);
PORTB.2=0;


l=10;
k=1000;



while (1)





{



while (m < 3600) // пауза длинная m-равно 1 сек
{
PORTB.4=1; //мигаем светодиод индикация работы
delay_ms(l);
PORTB.4=0;
delay_ms(k);

m++;

}

{ PORTB.0=1; // включаем воздух




while (i < 300) //Время работы компрессора воздух
{
delay_ms(3500);

i++;

}


{


{ PORTB.2=1;



while (c < 300) //Время работы насос вода

{
if (PINB.1==1) //Если аврия по уровню
{
l=10;
k=1000; //меняем время мигания светодиод авария

goto lab; //переходим на конц цикла работы насоса
}

delay_ms(3500);

c++;

}
lab:;
PORTB.0=0;
PORTB.2=0;

}

}







}

m=0;
i=0;
c=0;
}



}

_______________________________________________________

переменными
l=;
k=;
не получается управлять delay_ms

Тут кругом задержки в коде применил - потому, что крайне медленное устройство, раз в час надо включать выключать.....

не пинайте я не настоящий сварщик :-D
0
Shpil
23:58, 16.06.2017
От пользователя John Dow
может не через делеай, а через слип?

Обе эти функции следует табуировать, как в свое время безусловный переход goto()


От пользователя Валера
можно как то просто решить

Посмотреть библиотеку, асм, и к чертям сменить компилятор. :-)
0
John Dow
00:34, 17.06.2017
От пользователя Shpil
, как в свое время безусловный переход goto()


От пользователя Shpil
Обе эти функции следует табуировать, как в свое время безусловный переход goto()


10 Print "Не надо нас таубировать";
20 GoTo 10;
1 / 1
Мoзгoпрaв и мoзгoвeд©
00:39, 17.06.2017
От пользователя Валера
можно ли оператору задержки

delay_ms(1800);


От пользователя Oбыв@тель
И ещё, посмотрите какой тип использует функция delay_ms(1800); значение 1800 может быть для неё очень много, надо хидер файл глянуть. А


Perform a delay of __ms milliseconds, using _delay_loop_2().

The macro F_CPU is supposed to be defined to a constant defining the CPU clock frequency (in Hertz).

The maximal possible delay is 262.14 ms / F_CPU in MHz.


От пользователя Валера
Тут кругом задержки в коде применил - потому, что крайне медленное устройство, раз в час надо включать выключать.....


Ещё раз напиши, что именно нужно, без привязки к коду. и схему дай :ultra:
0 / 2
Shermon
00:57, 17.06.2017
Привет,
переменные "I" и "k" имеют тип "unsigned char"
т.е. они могут принимать значение от 0 до 255, и впихнуть в них больше не получится)) поэтому и задержка не меняется. Как и писал Oбыв@тель.

Нужно заменить строку:
unsigned char l, k, i, c; // описываем переменные
на:
unsigned int l, k, i, c; // описываем переменные

Должно заработать ;-) .
2 / 0
Валера
07:47, 17.06.2017
Ура!!!!! получилось!!!

От пользователя Shermon
переменные "I" и "k" имеют тип "unsigned char"

Вот я балбес!! специально сделал для длинного числа unsigned int m большую паузу сосчитать , а эти переменные потом в голове родились и забыл про диапазон совсем!!!

Странно , что AVR студия не ругнулась .

Спасибо тебе добрый человек!! :fire: :fire: :fire: :fire:
2 / 0
Shermon
11:46, 17.06.2017
Пожалуйста, будут еще вопросы, обращайся :-)
1 / 0
aka rus
18:30, 18.06.2017
От пользователя Валера
delay_ms(1800);

вместо значения подставить переменную

delay_ms(m);


Не мог пройти мимо, но код на delay - гвнокод по умолчанию и если микруха без кварца, и на строенном генераторе, то будут зацикивания, надо через флаги включений-выключения (BOOLEAN переменные) отрабатывать портом, а задержки высчитывать через mills(); в это случае и проц будет 80% времени бездействовать и багов с зацикливанием не будет.

В итоге основная программа будет в 5 строк, а все проверки раскидать по процедурам, и код понятнее станет и девайс будет качественно работать даже на встроенном LC генераторе вместо кварца.

От пользователя Мoзгoпрaв и мoзгoвeд©
The maximal possible delay is 262.14 ms / F_CPU in MHz.

Кстати да, можно же во фьюзах частоту задать в 1Мгц (вместо 8 или 16) и тогда не будут такие большие цифры в delay

[Сообщение изменено пользователем 18.06.2017 18:36]
1 / 0
aka rus
18:35, 18.06.2017
[Сообщение удалено пользователем 18.06.2017 18:36]
0
InsolentS
12:45, 19.06.2017
если нужна точная задержка - попробуйте использовать таймер. Код выполнять в прерывании от таймера, либо просто делать polling (циклически опрашивать) флаг события от таймера. Чтобы таймер "тикал" помедленее, выставьте ему большой пред-делитель (биты CS02-CS00 регистра TCCR0B).
При тактовой частте 8МГц и делителе clkio/1024, 8-ми битный таймер даст максимальную задержку 32мс. Чтобы выдерживать более длительные интервалы, можно увеличивать (или уменьшать) счетчик по событию от таймера. Например, настроить период таймера на 1мс и отсчитать 1000 прерываний (или флагов) от таймера. Это будет 1 секунда.

P.S. просто совет - называйте переменные длинными, понятными именами (это не отразится на итоговом исполняемом коде). Например, delayHours, delayCounter, relayEngageTimer, ledBlinkPeriodMs и т.п. Посторонним людям, да и Вам тоже, будет легче разбираться в таком коде.

[Сообщение изменено пользователем 19.06.2017 13:03]
3 / 0
Валера
00:30, 20.06.2017
От пользователя aka rus
можно же во фьюзах частоту задать в 1Мгц (вместо 8 или 16) и тогда не будут такие большие цифры в delay

Понятно! когда программа заработала так и сделал и еще CKDIV8 включил.
Цифры уменьшились.

От пользователя aka rus
надо через флаги включений-выключения (BOOLEAN переменные) отрабатывать портом,

Я не настолько виртуозно владею, но спасибо сижу читаю.
Хотя и так работает, поэксплуатирую ясно станет. Залить новую прогу дело 2 минут, всегда разъемы для программатора впаиваю.


От пользователя InsolentS
если нужна точная задержка - попробуйте использовать таймер.

Думал так тоже, но мне очень приблизительно надо раз в час по очереди два потребителя включать.

Спасибо за помощью
Включил смотрю как жить будет идея.
0
aka rus
09:41, 26.06.2017
От пользователя Валера
Я не настолько виртуозно владею

Тут с флагами все просото, описываешь переменную логическую BOOL "dev1" = FALSE, это твой флаг включения устройства один, и также на остальные, а потом в проверке, если условия требуют включения порта для устройства одын, то подымаешь флаг (в переменную заталкиваешь TRUE или 1)
И потом в самом начале программы пишешь if (BOOL) then PB0=1/HI else PB0=0/LOW (пунктуацию под язык поправь, я не помню точно)))

Этот метод с флагами ускорит обработку математики и в процессе вычислений МК не будет отвлекаться на ввод\вывод, чтоб не терять драгоценные такты процессора.
0
Валера
00:04, 13.12.2017
Опять я помощи прошу!!! Не выходит каменный цветок!!!

Мучаю Ардуину и в башке непонятки между СИ и этим языком!! вроде похоже но не работает!

короче хочу готовую плату Нано засунуть как есть.
Только хочется тока побольше с выхода порта.
Решил 4 выхода параллельно соединить.

И по ходу программы нужно включать и выключать сразу 4 порта.

Естественно хочется упростить написание программы.

Например вот поморгать портами:





// назначаем ноги порта

int a = 9;
int b = 10;
int c = 11;
int d = 12;



void setup() {

// НАстраиваем ноги на выход

pinMode(a, OUTPUT);
pinMode(b, OUTPUT);
pinMode(c, OUTPUT);
pinMode(d, OUTPUT);

}

void loop() {


delay(300); // время которое на выходе "0"

digitalWrite(q, HIGH);

delay(300); // время которое на выходе "1"

digitalWrite(q, LOW);

}



как q присвоить (a,b,c,d,) ???
все попытки разбивались о синтаксис. Как разом все порты дергать??
0
Валера
00:08, 13.12.2017
Опять я помощи прошу!!! Не выходит каменный цветок!!!

Мучаю Ардуину и в башке непонятки между СИ и этим языком!! вроде похоже но не работает!

короче хочу готовую плату Нано засунуть как есть.
Только хочется тока побольше с выхода порта.
Решил 4 выхода параллельно соединить.

И по ходу программы нужно включать и выключать сразу 4 порта.

Естественно хочется упростить написание программы.

Например вот поморгать портами:





// назначаем ноги порта

int a = 9;
int b = 10;
int c = 11;
int d = 12;



void setup() {

// НАстраиваем ноги на выход

pinMode(a, OUTPUT);
pinMode(b, OUTPUT);
pinMode(c, OUTPUT);
pinMode(d, OUTPUT);

}

void loop() {


delay(300); // время которое на выходе "0"

digitalWrite(q, HIGH);

delay(300); // время которое на выходе "1"

digitalWrite(q, LOW);

}



как q присвоить (a,b,c,d,) ???
все попытки разбивались о синтаксис. Как разом все порты дергать??
0
Коля Плюшкин
06:58, 13.12.2017
Я тут слабый советчик, но может не :cen:, а так же поочерёдно прописывать: делэй 300 диджитал райт а хай, б хай и т.д.
0
Авторизуйтесь, чтобы принять участие в дискуссии.