Парни! есть кто в "СИ" силен???
В
Валера
03:53, 04.09.2015
Хватит явки и персонал обнародовать!!
Еще не настало время выйти из за клавиатуры!!!!!
Еще не настало время выйти из за клавиатуры!!!!!
В
Валера
16:59, 14.06.2017
[Сообщение изменено пользователем 14.06.2017 17:01]
В
Валера
17:00, 14.06.2017
Перед всеми кто зашел и стало не интересно извиняюсь!
Парни еще разок помогите!!!!
можно ли оператору задержки
delay_ms(1800);
вместо значения подставить переменную
delay_ms(m);
и ее по ходу цикла менять
m=1000;
..............
..............
m=0;
компилятор без ошибок срабатывает.
На макете время не меняется!
Или это я придумал несуществующие в СИ ????
Парни еще разок помогите!!!!
можно ли оператору задержки
delay_ms(1800);
вместо значения подставить переменную
delay_ms(m);
и ее по ходу цикла менять
m=1000;
..............
..............
m=0;
компилятор без ошибок срабатывает.
На макете время не меняется!
Или это я придумал несуществующие в СИ ????
O
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.
m=1000;
....
m=0;
конечный результат все рано m==0.
Если хотите результат то где-то вот так
for(m=1800;m==0;m--)
{delay_ms(m);
мигание();
}
Задержки лучше вообще через прерывание организовывать.
И ещё, посмотрите какой тип использует функция delay_ms(1800); значение 1800 может быть для неё очень много, надо хидер файл глянуть. А компилятору пофиг он обрежет последние биты и по факту у вас не 1800 будет а 5 либо 8.
n
@ndrew2709 (откубрячил шаурму)
08:42, 15.06.2017
Кружок программистов?
почему кружок ? Н- мерный куб
почему кружок ? Н- мерный куб
ага
в Х-мерном пространстве
ПС:
Валера, если до пятницы не решишь проблему- могу дать контакт профика
J
John Dow
09:28, 15.06.2017
Перед всеми кто зашел и стало не интересно извиняюсь!
Парни еще разок помогите!!!!
можно ли оператору задержки
delay_ms(1800);
вместо значения подставить переменную
delay_ms(m);
и ее по ходу цикла менять
m=1000;
..............
..............
m=0;
компилятор без ошибок срабатывает.
На макете время не меняется!
Или это я придумал несуществующие в СИ ????
Парни еще разок помогите!!!!
можно ли оператору задержки
delay_ms(1800);
вместо значения подставить переменную
delay_ms(m);
и ее по ходу цикла менять
m=1000;
..............
..............
m=0;
компилятор без ошибок срабатывает.
На макете время не меняется!
Или это я придумал несуществующие в СИ ????
Емнип там при инициализации задержки передаеться параметр.. следовательно её каждый раз при шаге цила надо инициализировать..
З.Ы. Говорю по аналогии с дельфей..ибо си не мое.
В
Валера
12:05, 16.06.2017
А компилятору пофиг он обрежет последние биты и по факту у вас не 1800 будет а 5 либо 8.
Похоже так и есть.
В виде отсутствия смекалки решил задачу аппаратно. Взял еще один порт и диодами сделал логическое или. И управляю светодиодом.
Понимаю, что жлобство но работает!!!
Задача то такая :
крутится цикл. В нем мигает светодиод (мало горит, долго не горит) Это индикатор, что проц работает. Попутно МК управляет всякой херней. Это все работает.
При наступлении аварии светодиод начинает -(долго горит, мало не горит) Это индикация аварии.
И при пропадании ситуации аварии надо, чтоб индикация осталась. Сброс вручную перегрузкой .
Вот и думал до начала цикла присвоить задержки мигания "нормальной работы". Переменной в операторе дилей.
При аварии принудительно в эти переменные записать другие цифры.
И мигала бы авария до перегрузки.
Чую херней занимаюсь!! можно как то просто решить.
J
John Dow
12:07, 16.06.2017
может не через делеай, а через слип?
В
Валера
12:33, 16.06.2017
может не через делеай, а через слип?
у меня трудность - как сделать, что бы после прпопадания ситуации аварии индикация аварии осталась!!
Как то надо, что бы в цикле изменились параметры задержек до перегрузки!
O
Oбыв@тель
19:52, 16.06.2017
Покажите код, можно в личку.
Помогу чем смогу. я мигающие лампочки ещё на 86 процессоре делал в институте
Помогу чем смогу. я мигающие лампочки ещё на 86 процессоре делал в институте
В
Валера
23:58, 16.06.2017
Покажите код
Хотел так:
#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
Тут кругом задержки в коде применил - потому, что крайне медленное устройство, раз в час надо включать выключать.....
не пинайте я не настоящий сварщик
S
Shpil
23:58, 16.06.2017
может не через делеай, а через слип?
Обе эти функции следует табуировать, как в свое время безусловный переход goto()
можно как то просто решить
Посмотреть библиотеку, асм, и к чертям сменить компилятор.
J
John Dow
00:34, 17.06.2017
, как в свое время безусловный переход goto()
Обе эти функции следует табуировать, как в свое время безусловный переход goto()
10 Print "Не надо нас таубировать";
20 GoTo 10;
М
Мoзгoпрaв и мoзгoвeд©
00:39, 17.06.2017
можно ли оператору задержки
delay_ms(1800);
delay_ms(1800);
И ещё, посмотрите какой тип использует функция 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.
Тут кругом задержки в коде применил - потому, что крайне медленное устройство, раз в час надо включать выключать.....
Ещё раз напиши, что именно нужно, без привязки к коду. и схему дай
S
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; // описываем переменные
Должно заработать .
переменные "I" и "k" имеют тип "unsigned char"
т.е. они могут принимать значение от 0 до 255, и впихнуть в них больше не получится)) поэтому и задержка не меняется. Как и писал Oбыв@тель.
Нужно заменить строку:
unsigned char l, k, i, c; // описываем переменные
на:
unsigned int l, k, i, c; // описываем переменные
Должно заработать .
В
Валера
07:47, 17.06.2017
Ура!!!!! получилось!!!
Вот я балбес!! специально сделал для длинного числа unsigned int m большую паузу сосчитать , а эти переменные потом в голове родились и забыл про диапазон совсем!!!
Странно , что AVR студия не ругнулась .
Спасибо тебе добрый человек!!
переменные "I" и "k" имеют тип "unsigned char"
Вот я балбес!! специально сделал для длинного числа unsigned int m большую паузу сосчитать , а эти переменные потом в голове родились и забыл про диапазон совсем!!!
Странно , что AVR студия не ругнулась .
Спасибо тебе добрый человек!!
S
Shermon
11:46, 17.06.2017
Пожалуйста, будут еще вопросы, обращайся
a
aka rus
18:30, 18.06.2017
delay_ms(1800);
вместо значения подставить переменную
delay_ms(m);
вместо значения подставить переменную
delay_ms(m);
Не мог пройти мимо, но код на delay - гвнокод по умолчанию и если микруха без кварца, и на строенном генераторе, то будут зацикивания, надо через флаги включений-выключения (BOOLEAN переменные) отрабатывать портом, а задержки высчитывать через mills(); в это случае и проц будет 80% времени бездействовать и багов с зацикливанием не будет.
В итоге основная программа будет в 5 строк, а все проверки раскидать по процедурам, и код понятнее станет и девайс будет качественно работать даже на встроенном LC генераторе вместо кварца.
The maximal possible delay is 262.14 ms / F_CPU in MHz.
Кстати да, можно же во фьюзах частоту задать в 1Мгц (вместо 8 или 16) и тогда не будут такие большие цифры в delay
[Сообщение изменено пользователем 18.06.2017 18:36]
a
aka rus
18:35, 18.06.2017
[Сообщение удалено пользователем 18.06.2017 18:36]
I
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]
При тактовой частте 8МГц и делителе clkio/1024, 8-ми битный таймер даст максимальную задержку 32мс. Чтобы выдерживать более длительные интервалы, можно увеличивать (или уменьшать) счетчик по событию от таймера. Например, настроить период таймера на 1мс и отсчитать 1000 прерываний (или флагов) от таймера. Это будет 1 секунда.
P.S. просто совет - называйте переменные длинными, понятными именами (это не отразится на итоговом исполняемом коде). Например, delayHours, delayCounter, relayEngageTimer, ledBlinkPeriodMs и т.п. Посторонним людям, да и Вам тоже, будет легче разбираться в таком коде.
[Сообщение изменено пользователем 19.06.2017 13:03]
В
Валера
00:30, 20.06.2017
можно же во фьюзах частоту задать в 1Мгц (вместо 8 или 16) и тогда не будут такие большие цифры в delay
Понятно! когда программа заработала так и сделал и еще CKDIV8 включил.
Цифры уменьшились.
надо через флаги включений-выключения (BOOLEAN переменные) отрабатывать портом,
Я не настолько виртуозно владею, но спасибо сижу читаю.
Хотя и так работает, поэксплуатирую ясно станет. Залить новую прогу дело 2 минут, всегда разъемы для программатора впаиваю.
если нужна точная задержка - попробуйте использовать таймер.
Думал так тоже, но мне очень приблизительно надо раз в час по очереди два потребителя включать.
Спасибо за помощью
Включил смотрю как жить будет идея.
a
aka rus
09:41, 26.06.2017
Я не настолько виртуозно владею
Тут с флагами все просото, описываешь переменную логическую BOOL "dev1" = FALSE, это твой флаг включения устройства один, и также на остальные, а потом в проверке, если условия требуют включения порта для устройства одын, то подымаешь флаг (в переменную заталкиваешь TRUE или 1)
И потом в самом начале программы пишешь if (BOOL) then PB0=1/HI else PB0=0/LOW (пунктуацию под язык поправь, я не помню точно)))
Этот метод с флагами ускорит обработку математики и в процессе вычислений МК не будет отвлекаться на ввод\вывод, чтоб не терять драгоценные такты процессора.
В
Валера
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,) ???
все попытки разбивались о синтаксис. Как разом все порты дергать??
Мучаю Ардуину и в башке непонятки между СИ и этим языком!! вроде похоже но не работает!
короче хочу готовую плату Нано засунуть как есть.
Только хочется тока побольше с выхода порта.
Решил 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,) ???
все попытки разбивались о синтаксис. Как разом все порты дергать??
В
Валера
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,) ???
все попытки разбивались о синтаксис. Как разом все порты дергать??
Мучаю Ардуину и в башке непонятки между СИ и этим языком!! вроде похоже но не работает!
короче хочу готовую плату Нано засунуть как есть.
Только хочется тока побольше с выхода порта.
Решил 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,) ???
все попытки разбивались о синтаксис. Как разом все порты дергать??
К
Коля Плюшкин
06:58, 13.12.2017
Я тут слабый советчик, но может не , а так же поочерёдно прописывать: делэй 300 диджитал райт а хай, б хай и т.д.
Авторизуйтесь, чтобы принять участие в дискуссии.