Перейти к содержанию

Преобразование массива в код (Си)


-=FISHER=-

Рекомендуемые сообщения

9 минут назад, ruhi сказал:

Тогда:

Нужны комментарии, сложно читается код, много непонятных (может просто не описанных) функций... Поясните пожалуйста, хоть через строчку

Мы все учились по-немногу, чему-нибудь и как-нибудь...

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Только что, -=FISHER=- сказал:

Нужны комментарии, сложно читается код, много непонятных (может просто не описанных) функций... Поясните пожалуйста, хоть через строчку

надо написать-реализовать тебе следующие функции:

getRLC() которая возвращает значение RLC - правый поворотник-бит, КОМ-бит, левый-бит, Понятно?

cntrBitsSet - подписана,

timerStart(); - запустить счет времени,

timerStop(); остановить счет времени, вернуть посчитанное значение

timerStart(3 seconds); - запустить отсчет заданного периода - три секунды там

timerIsActive() вернуть состояние таймера периода считает или закончился!

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

Можно сделать все! Но чем больше можно, тем больше нельзя!

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

1 минуту назад, ruhi сказал:

timerStart(); - запустить счет времени,

А для чего вообще считать время? Когда можно посчитать вспышки?

 

1 минуту назад, ruhi сказал:

timerStart(3 seconds); - запустить отсчет заданного периода - три секунды там

Время 3 секунды для чего?

Мы все учились по-немногу, чему-нибудь и как-нибудь...

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

тут пропустил:

While(timerIsActive()) {};

Goto startPoint;

Должно быть:

While(timerIsActive()) {};

cntrBitsClearAll();//РАзОмкнуть паралельные ключи

Goto startPoint;

Только что, -=FISHER=- сказал:

Время 3 секунды для чего?

время на которое ты хочешь задержать "моргание" поворотника при коротком нажатии поворотника.

2 минуты назад, -=FISHER=- сказал:

А для чего вообще считать время? Когда можно посчитать вспышки?

А что короткое нажатие можно посчитать во вспышках??? Сколько в него вспышек уберется?

Можно сделать все! Но чем больше можно, тем больше нельзя!

Ссылка на комментарий
Поделиться на другие сайты

9 минут назад, ruhi сказал:

время на которое ты хочешь задержать "моргание" поворотника при коротком нажатии поворотника.

Этот подход как бы сказать...не грамотный. Потому что бывают разные реле и где-то три секунды это будет 3 вспышки, а где-то это грубо будет 3.5 или 2.5. Считать удлинение нужно исключительно в количестве вспышек, а не времени, чтобы не было привязки к длине вспышки.

56 минут назад, ruhi сказал:

Да! только это не третье состояние, это другой тип состояния, это обычная ошибка

Давайте перечислим все состояния и все виды состояний.

Состояния: горит фонарь, не горит фонарь.

Виды состояний: ....?

Изменено пользователем -=FISHER=-

Мы все учились по-немногу, чему-нибудь и как-нибудь...

Ссылка на комментарий
Поделиться на другие сайты

6 минут назад, -=FISHER=- сказал:

Этот подход как бы сказать...не грамотный. Потому что бывают разные реле и где-то три секунды это будет 3 вспышки, а где-то это грубо будет 3.5 или 2.5. Считать удлинение нужно исключительно в количестве вспышек, а не времени, чтобы не было привязки к длине вспышки.

Ты хотя бы так сделай сначала, потом будешь думать о высоком :) !

но сделать считать можно в чем угодно внутри функции, это общему принципу не противоречит!

Можно обозвать StartPulseCounter(val)  -  val -будет обозначать значение в штуках!

и вместо timerIsActive() - pulseCounterEnd() тогда например

Изменено пользователем ruhi

Можно сделать все! Но чем больше можно, тем больше нельзя!

Ссылка на комментарий
Поделиться на другие сайты

24 минуты назад, -=FISHER=- сказал:

Виды состояний: ....?

можно объединить с мокрый -сухой фонарь?

Можно сделать все! Но чем больше можно, тем больше нельзя!

Ссылка на комментарий
Поделиться на другие сайты

Только что, ruhi сказал:

можно объединить с мокрый -сухой фонарь?

Я прошу привести пример...

Мы все учились по-немногу, чему-нибудь и как-нибудь...

Ссылка на комментарий
Поделиться на другие сайты

1 минуту назад, -=FISHER=- сказал:

Я прошу привести пример...

Смотри код который я тебе написал, там каждый while это состояние ожидания того что в этом while является условием.

количество while = количество состояний!

Вообще в этом коде есть ответы на все вопросы по этой твоей задаче, и у тебя конечно есть выбор поверить или попробовать найти/придумать другое решение.

Можно сделать все! Но чем больше можно, тем больше нельзя!

Ссылка на комментарий
Поделиться на другие сайты

В 15.12.2017 в 13:22, -=FISHER=- сказал:

Что Вы подразумеваете под словом "ключ"?

Вот упрощенная схема:

Я могу попробовать написать статью о том как разрабатывать ПО микроконтроллера на примере вашей задачи, начиная с этапа уточнения технического задания!

Поскольку все было в переписке, я хорошо помню как, в какой последовательности рождались решения (промежуточные). И уже хорошо представляю окончательное решение - идеальную программу. И готов изложить критерии идеальности. 

Вы не против я использую в статье эту схему в качестве исходных данных?  

Можно сделать все! Но чем больше можно, тем больше нельзя!

Ссылка на комментарий
Поделиться на другие сайты

3 часа назад, ruhi сказал:

готов изложить критерии идеальности

Любопытно. Ждём статью с нетерпением! Надеюсь, что одним из критериев будет то, что программа должна работать в соответствии с техническим заданием ...

Ссылка на комментарий
Поделиться на другие сайты

В 18.12.2017 в 12:12, ruhi сказал:

Вы не против я использую в статье эту схему в качестве исходных данных?  

Конечно я не против. Но идеальным будет только "независимый" код. Чтобы он не зависел ни от длительности вспышек от разных реле, ни от чего-то иного.

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

Изменено пользователем -=FISHER=-

Мы все учились по-немногу, чему-нибудь и как-нибудь...

Ссылка на комментарий
Поделиться на другие сайты

В 18.12.2017 в 13:40, Yurkin2015 сказал:

Любопытно. Ждём статью с нетерпением! Надеюсь, что одним из критериев будет то, что программа должна работать в соответствии с техническим заданием ...

это не та тема вроде как,

вот здесь вот

попытался сформулировать ответ.

 

Можно сделать все! Но чем больше можно, тем больше нельзя!

Ссылка на комментарий
Поделиться на другие сайты

Всех приветствую!

В общем код я написал, кому интересно то вот, разбил его на модули, выкладываю все:

long_turn.c:

Скрытый текст

#include "main.h"

char code, count_right, count_left; //переменные для обработки нажатия на рычаг поворотника и кнопок

typedef enum{ //список возможных состояний
STAND_BY, //ожидание (ничего не горит)
RIGHT, //горит правый поворотник
LEFT, //горит левый поворотник
ALL, //горят оба поворотника
PAUSE //пауза между вспышками
} state_t;
	
state_t state = STAND_BY; //исходное стостояние - ожидание

uint8_t get_button(void) 
{
	return PINB & ANY_K; //считывание состояние трёх входов (PB0, PB1, PB2)
}

uint8_t get_code(void) //обработка антидребезга и формирование кода команды
{
	code=get_button();
	_delay_ms(10);
	if(code!=get_button()){code=command_Error;}
	return code;
}

int main(void)
{
	port_ini(); //инициализация портов
    while(1)
    {
		switch(state) //конечный автомат состояний
		{
			case STAND_BY: //ожидание (ничего не горит)
			{
				if(get_code()==command_Right){PORTB|=(1<<RIGHT_OUT); state=RIGHT;}
				if(get_code()==command_Left){PORTB|=(1<<LEFT_OUT); state=LEFT;}
				break;
			}
			
			case RIGHT: //горит правый поворотник
			{
				if(get_code()==command_Pause){if(count_right<TURN_COUNT){count_right++;} state=PAUSE;}
				if(get_code()==command_All){PORTB&=~(1<<RIGHT_OUT); state=ALL;}
				break;
			}
			
			case LEFT: //горит левый поворотник
			{
				if(get_code()==command_Pause){if(count_left<TURN_COUNT){count_left++;} state=PAUSE;}
				if(get_code()==command_All){PORTB&=~(1<<LEFT_OUT); state=ALL;}
				break;
			}
			
			case ALL: //горят оба поворотника
			{
				if(get_code()==command_StandBy){count_right=0; count_left=0; state=STAND_BY;}
				break;
			}

			case PAUSE: //пауза между вспышками
			{
				if(count_right==TURN_COUNT){PORTB&=~(1<<RIGHT_OUT);}
				if(get_code()==command_Right){state=RIGHT;}
				
				if(count_left==TURN_COUNT){PORTB&=~(1<<LEFT_OUT);}
				if(get_code()==command_Left){state=LEFT;}
					
				if(get_code()==command_StandBy){count_right=0; count_left=0; state=STAND_BY;}	
				break;
			}
		}
    }
}

 

long_turn.h:

Скрытый текст

#ifndef LONG_TURN_H_
#define LONG_TURN_H_

#include "main.h"

#endif /* LONG_TURN_H_ */

 

init.c:

Скрытый текст

#include "init.h"

void port_ini(void)
{
	PORTB=0x7; //0b00000111 - включаем подтягивающие резисторы внутри МК на PB0, PB1, PB2
	DDRB=0x30; //0b00011000 - настраиваем PB3 и PB4 на выход
}

 

init.h:

Скрытый текст

#ifndef INIT_H_
#define INIT_H_

#include "main.h"

#define TURN_COUNT 3 //задаем количество морганий для удлинения

#define LEFT_IN _BV(PB0) //(1<<PB0)
#define COM _BV(PB1) //(1<<PB1)
#define RIGHT_IN _BV(PB2) //(1<<PB2)
#define RIGHT_OUT 3
#define LEFT_OUT 4

#define command_Pause 7
#define command_StandBy 5
#define command_Left 4
#define command_Right 1
#define command_All 0
#define command_Error 10

#define ANY_K (RIGHT_IN|COM|LEFT_IN)

void port_ini(void);

#endif /* INIT_H_ */

 

main.h:

Скрытый текст

#define MAIN_H_

#define F_CPU 8000000UL //задаем тактовую частоту

#include <avr/io.h> //подключаем библиотеку для работы с портами ввода/вывода
#include <util/delay.h> //подключаем библиотеку для работы с задержками
#include <avr/interrupt.h> //подключаем библиотеку для работы с прерываниями
#include <avr/eeprom.h> //подключаем библиотеку для работы с EEPROM

#include "long_turn.h"
#include "init.h"

#endif /* MAIN_H_ */

 

Дело дошло у меня до тестирования в железе, собрал устройство по вот такой схеме, она упрощена и здесь показаны только ключевые элементы:

Скрытый текст

5a43458ae294f_.jpg.a5391ce67163acd53f2cb792580727ff.jpg

Для тестирования купил реле прерывателя поворотов, подключил две кнопки и две лампочки, тем самым собрав упрощенный аналог системы поворотников в авто:

Скрытый текст

5a434a9fae946_2.jpg.2bef92d12ef4fc3b252b9d3f1326aa3a.jpg

Проверил, без удлинителя всё работает как надо, нажал одну кнопку замигала одна лампочка, нажал другую замигала другая. Далее от правой лампочки подключил к RIGHT, от левой к LEFT, от центрального контакта реле прерывателя поворотов к COM. В итоге когда я подключаю всё это к питанию, то у меня сразу же начинает щёлкать реле! При этом лампочки не загораются. Потому что мосфеты закрыты и кнопки не нажаты.

 

Внимание вопрос: я так понимаю что мне нужно подключить COM таким образом чтобы он "висел в воздухе", чтобы ток не тёк через R1 и R2 тем самым вызывая прерывания реле. Как это сделать? Куда вытекает ток что вызывает прерывания реле?

Изменено пользователем -=FISHER=-

Мы все учились по-немногу, чему-нибудь и как-нибудь...

Ссылка на комментарий
Поделиться на другие сайты

А как у вас ток течет через R1 и  R2? Он же может течь только если OUT4 или OUT5 в низком уровне...

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

9 минут назад, ARV сказал:

Он же может течь только если OUT4 или OUT5 в низком уровне...

Может быть и не через R1 и R2... Но ведь реле почему то щелкает? Вопрос, почему?... Какое может быть этому объяснение?

Изменено пользователем -=FISHER=-

Мы все учились по-немногу, чему-нибудь и как-нибудь...

Ссылка на комментарий
Поделиться на другие сайты

Только что, -=FISHER=- сказал:

Какое может быть этому объяснение?

Ошибочка у вас какая-то в схеме или программе... :)

Изменено пользователем ARV

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

Только что, ARV сказал:

Ошибочка у вас какая-то в схеме или программе... :)

В программе исключено, потому что ключи закрыты, теоретически реле никак не может щелкать пока ключи закрыты, ведь току некуда течь, а ключи наверняка закрыты, потому что лампы не горят. Значит где-то в схеме, Вы имеете ввиду ошибки при пайке или в принципиальной схеме? А вот на той картинке со схемой, которую я приложил, та ситуация которую я описал - исключена?

Мы все учились по-немногу, чему-нибудь и как-нибудь...

Ссылка на комментарий
Поделиться на другие сайты

Ошибки могут быть где угодно - от того, что перепутали нумерацию выводов микросхемы до банального отрыва проводка. Помню, помогал одному товарищу дистанционно отладить обмен по USART... чуть ли не неделю вечерми до полуночи сидели в аське... мегабайты кода переписали...  А потом он меня обрадовал, что разобрался: у него TX с RX коротил время от времени при шевелении устройства...

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

1 минуту назад, ARV сказал:

Ошибки могут быть где угодно - от того, что перепутали нумерацию выводов микросхемы до банального отрыва проводка. 

Ну то есть ошибки при сборке Вы имеете ввиду? Я для тестирования перерезал все дорожки к МК от входов и ключей. И всё равно щелкает...Как будто ток проходит вот так...

5a434.jpg.a924f747b0a91b34370b51d9b6920de2.jpg

Мы все учились по-немногу, чему-нибудь и как-нибудь...

Ссылка на комментарий
Поделиться на другие сайты

"вот так" - дальше-то куда? дальше-то и некуда...

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, -=FISHER=- сказал:

Ну то есть ошибки при сборке Вы имеете ввиду? Я для тестирования перерезал все дорожки к МК от входов и ключей. И всё равно щелкает...Как будто ток проходит вот так...

5a434.jpg.a924f747b0a91b34370b51d9b6920de2.jpg

Ну осталось их тоже перерезать (ногу-4 транзистора поднять) что бы убедиться окончательно!

Изменено пользователем ruhi

Можно сделать все! Но чем больше можно, тем больше нельзя!

Ссылка на комментарий
Поделиться на другие сайты

1 минуту назад, ruhi сказал:

Ну осталось их тоже перерезать (ногу-4 транзистора поднять) что бы убедиться окончательно!

Вечером перережу :spiteful:

Мы все учились по-немногу, чему-нибудь и как-нибудь...

Ссылка на комментарий
Поделиться на другие сайты

2 часа назад, -=FISHER=- сказал:

#include "main.h"

Блин! а как код с цветом получается вставлять???

Можно сделать все! Но чем больше можно, тем больше нельзя!

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...