Jump to content

Recommended Posts

Posted (edited)

Я Вам уже написал все про это, не понимаете, повторю еще раз

ISR(INT0_vect) // функция которая будет вызвана при срабатывании прерывания
{
	if (PIND & (1 << dirX)) //проверяем состояние кнопки
	{
		for(int i = 0; i < stepX; i++) // запускаем цикл который выполнит 4 итерации
		{
			axisX[i]; // тут бесполезная запись, которая ничего не делает, просто читаем по очереди цисла впустую
		}
	} 

 

14 минуты назад, Дмитрий Мамедиев сказал:

вызываем из массива состояние порта.

Вообщем вот это я не понимаю что вы хотите сделать...

14 минуты назад, Дмитрий Мамедиев сказал:

и ++ вызываем из массива следующее состояние порта.

По Вашему ++ выполнится только 1 раз на 1 прерывание? Я вам уже несколько раз написал что сработало прерывание, цикл прошел 4 раза, то есть после каждого прерывания будет 4 раза выполнено тело цикла

Так же я Вам два раза уже дал код, на случай если вам нужно за 1 прерывание на 1 сдвигать в цикле элемент

Дам третий

uint8_t posX = 0;

ISR(INT0_vect)
{
    if (PIND & (1 << dirX)) {
      if (*(массивПортов[posX]) & axisX[posX]) {
       	// на порте 1 
      } else {
       	// на порте 0 
      }
      if (++posX == stepX) {
       	posX = 0; 
      }
    

и переменные лучше называть чуть понятней, по мне stepX - это то какой сейчас шаг, а у вас это количество пинов

Edited by DrobyshevAlex

Share this post


Link to post
Share on other sites
3 часа назад, DrobyshevAlex сказал:

Вообщем вот это я не понимаю что вы хотите сделать...

читая ваши посты ответ очевиден , фразу надо перефразировать в : "ТС нихрена не понимает что вы ему пишите" , и все эта канитель из-за вашей приверженности писать на плюсах для ПК , которой вы выносите мозг ТСу. ТС с трудом понимает что  и для чего пишет на Си . Плюсы и Си это две большие разницы и обе разные. Си процедурный ,а Плюсы объектный языки программирования и подходы к решению задачи у них разные  https://habr.com/post/347980/

а ТС всего-то хотел эмулировать работу L297  в полношаговом режиме

 

Share this post


Link to post
Share on other sites
4 часа назад, IMXO сказал:

ТС с трудом понимает что  и для чего пишет на Си

я так понимаю он пишет на плюсах

В 22.12.2018 в 20:03, Дмитрий Мамедиев сказал:

Как его теперь писать в с++

 

Share this post


Link to post
Share on other sites

Литиевые батарейки Fanso для систем телеметрии и дистанционного контроля

Системы телеметрии находят все более широкое применение во многих отраслях на промышленных и коммунальных объектах. Требования, предъявляемые к условиям эксплуатации приборов телеметрии и, как следствие, источников питания для них, могут быть довольно жесткими. Fanso предоставляет широкую линейку продукции, рассчитанной на различные условия эксплуатации, что позволяет подобрать батарейку для каждого конкретного применения, в том числе и для устройств телеметрии.

Подробнее

А я вот всё понимаю, тут просто надо было сказать что значение в массиве ПРОСТО ХРАНИТСЯ, это не порт, даже если записано "PB1" это просто число. В памяти, в регистрах где угодно но не в порту ввода-вывода. Чтобы изменить состояние ножки контроллера есть ТОЛЬКО ОДИН ПУТЬ ЭТО СДЕЛАТЬ - обратится к порту ввода-вывода с символическим именем PORTB или PORTD в зависимости от того какой порт-ножка нам нужны. И ещё один ньюанс - произвольно дергать ножками порта мы не можем(за редким исключением, но это уже забота компилятора), мы можем только установить все 8 ножек сразу. Если мы указываем только одну ножку то она и установится а остальные сбросятся, что в целом не есть хорошо - другие ножки в вашей программе могут нести другую функцию. Поэтому чтобы установить ножку нам надо сначала прочитать текущее состояние порта, потом сделать с этим значением логическое ИЛИ с маской нужного бита(вот именно ОНА ХРАНИТСЯ У НАС В МАССИВЕ!) и результат записать обратно, как именно это записывается в коде - надеюсь подскажут.

Share this post


Link to post
Share on other sites
2 часа назад, Alexeyslav сказал:

тут просто надо было сказать что значение в массиве ПРОСТО ХРАНИТСЯ

Да ну! Если вы перечитаете две темы, то я несколько раз сказал что это не порт и порт нужно тоже занести в массив отдельный, или через структуру или класс в тот же :)

2 часа назад, Alexeyslav сказал:

Поэтому чтобы установить ножку нам надо сначала прочитать текущее состояние порта, потом сделать с этим значением логическое ИЛИ с маской нужного бита

Тоже три раза.

Даже с кодом написал об этом.

В 25.12.2018 в 22:17, DrobyshevAlex сказал:

если нужно сохранить старшие 4 бита то как то так


if (PORTD & 0b00001000) {
	PORTD = (PORTD & 0xF0) | ((PORTD & 0x0f) >> 3);
} else {
	PORTD = (PORTD & 0xF0) | ((PORTD << 1) & 0x0F);
}
2 часа назад, Alexeyslav сказал:

И ещё один ньюанс - произвольно дергать ножками порта мы не можем(за редким исключением, но это уже забота компилятора)

Что это вообще значит?) Почему не можем? Я могу :D

2 часа назад, Alexeyslav сказал:

Чтобы изменить состояние ножки контроллера есть ТОЛЬКО ОДИН ПУТЬ ЭТО СДЕЛАТЬ - обратится к порту ввода-вывода с символическим именем PORTB или PORTD

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

Share this post


Link to post
Share on other sites
                     

Приглашаем на вебинар Решения для построения ультразвуковых счетчиков жидкостей и газов на базе MSP430

Компэл совместно с Texas Instruments 23 октября 2019 приглашают на вебинар, посвященный системам-на-кристалле для построения ультразвуковых расходомеров жидкостей и газов на базе ядра MSP430. Вебинар проводит Йоханн Ципперер – эксперт по ультразвуковым технологиям, непосредственно участвовавший в создании данного решения. На вебинаре компания Texas Instruments представит однокристальное решение, позволяющее создавать точные недорогие счетчики жидкостей и газов.

Подробнее...

Очень многое значит. Человек не понимает основ, он ожидает что обращение к PB1 например, изменяет состояние ножки. Поэтому для него занести в массив и потом обратится к нему - это изменение состояния ножки. А что написано же... и порт в имени указан и пин.... но почему оно? А потмоу что кто-то в далёком эээ году сделал язык С стандартом толком не доработав его, и теперь досихпор за ним тянется шлейф из костылей. Почему, вот почему тогда паскаль не победил?

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

Почему не можем? Я могу

Не сомневаюсь, но в архитектуре многих контроллеров есть ограничения на побитовый доступ к портам, например на AVR для побитового доступа доступны не все порты, особенно на мясистых контроллерах-многоножках. И есть ещё правда пару фишек которые не имеют уже смысла для С++ и работают только на уровне ассемблера - например запись в порт PINB(хотя он по логике предназначен для чтения) инвертирует состояние пина в который запишешь "1" т.е. сделает операцию XOR. В С++ конечно тоже можно записать в этот порт, но ни наглядности ни скорости всеравно не получишь наоборот только запутаешь тех кто потом будет читать код.

Share this post


Link to post
Share on other sites
2 часа назад, Alexeyslav сказал:

А потмоу что кто-то в далёком эээ году сделал язык С стандартом толком не доработав его, и теперь досихпор за ним тянется шлейф из костылей.

О чем Вы? Какие костыли?) если человек только учится и не понимает чего то то он и в asm этого не поймет)) вообще не вижу костыля в решени данной проблемы

2 часа назад, Alexeyslav сказал:

но в архитектуре многих контроллеров есть ограничения на побитовый доступ к портам

Не буду спорить ибо я не в курсе, в данном случае речь шла о atmega8 где я не вижу проблемы изменить 1 бит контроллера.

Или же я не понял о чем Вы вообще...

Share this post


Link to post
Share on other sites
15 минут назад, DrobyshevAlex сказал:

Или же я не понял о чем Вы вообще...

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

Share this post


Link to post
Share on other sites

Костыли - да там везде костыли, все эти макросы... удобная штука иногда, но её используют как костыли и выстроили уже такую систему костылей что исправлять всё поздно, привыкли и не считают костылями но оно всё ими является.

17 минут назад, DrobyshevAlex сказал:

речь шла о atmega8 где я не вижу проблемы изменить 1 бит контроллера.

В общем случае это делается через процедуру чтение-модификация-запись, и она несколько уязвима к временным задержкам. прочитали, допустим и тут возникло какое-то прерывание, прерывание закончилось и только потом мы записали в регистр результат а он уже устарел на миллисекунды и не актуален. Побитовый же доступ через команду SBI/CBI лишён этого недостатка но доступен для портов находящихся в младшем адресном пространстве - туда попадают не все внешние порты.

24 минуты назад, DrobyshevAlex сказал:

если человек только учится и не понимает чего то то он и в asm этого не поймет

Поэтому, начинать надо с ассемблера, с прямой работы с периферией.

Share this post


Link to post
Share on other sites
Posted (edited)
42 минуты назад, IMXO сказал:

речь о одновременном изменении нескольких бит порта без изменения состояния соседних бит

то есть or или xor это не то и есть мк где можно изменить биты как то иначе?

я даже не представляю что вы имеете ввиду можно пример?

То есть речь идет о том, что нужен массив при обращении к которому мы сразу получим значение состояния PIN ибо автору нужно именно это, то есть asixX[x] - должно вернуть значение состояния пина на каком то порте на каком то пине. Что есть такого у других мк или асм для этого мк что позволит это сделать?

34 минуты назад, Alexeyslav сказал:

все эти макросы

имхо макросы это вообще можно отнести к компилятору или ide что угодно может выполнить подстановку в код вместо макросов кода :)

34 минуты назад, Alexeyslav сказал:

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

то есть это беда именно с++? в си или асм не будет такого? :)

что же касается данного мк, это выполняется в прерывании, то есть во время одного прерывания может стартануть другое?

34 минуты назад, Alexeyslav сказал:

Побитовый же доступ через команду SBI/CBI лишён этого недостатка

как все это относится к тому что запись типа

struct {
	port;
	pin;
} myPin;
...
myPin[4] pins;
...
*pins[0].port & (1 << pins[i].pin)

Вы вы называете костылем с++ :) как я понял говорите что это беда с++ с массивом в данном случае. То есть юзая асм вам не нужно знать адрес в каком читать состояние пинов? я конечно на асм мало писал) но не думаю что в асм можно создать массив в котором будет хранится только в 8 битах информация о номере пина без адреса порта и можно будет понять к какому порту она относится)

разве sbi позволит записать одновременно несколько бит порта да еще и не зная регистра?

34 минуты назад, Alexeyslav сказал:

Поэтому, начинать надо с ассемблера, с прямой работы с периферией.

дак я это ему и советовал парой страниц назад) или в соседней теме не помню уже

 

 

Мне кажется мы немного о разном говорим. Вы пытаетесь доказать в целом что с++ плох?)

Я же отталкиваюсь отданного проблемного места где человек не может понять что он в массиве хранит только бит который он хочет проверить.

Говорить же в целом о том что какой то язык плох... ну блин я сайты пишу на питоне руби или пхп но не на ассемблере или с++.

а приложение под андроди на яве а под иос на объектив си.

Есть вопрос, я обсуждаю как его решить а не то что на с++ не стоит писать художественную литературу :)

емнип можно легко вставлять ассемблеровский код в си и с++ если очень нужно)

Edited by DrobyshevAlex

Share this post


Link to post
Share on other sites
30 минут назад, DrobyshevAlex сказал:

я даже не представляю что вы имеете ввиду можно пример?

конечно можно , собственно на примере вашего кода с некоторыми допущениями

PORTD = (PORTD & 0xF0) | ((PORTD & 0x0f) >> 3);

в зависимости от платформы и компилятора с некоторыми вариациями разворачивается в

1. temp1=PORTD & 0xF0;

2. temp2=PORTD & 0x0f;

3. temp2>>=3;

4.  temp1 |= temp2;

5. PORTD = temp1;

по сути если этот код в майне и на 2..4 итерации прелетит прерывание с изменением битов <7:4> порт получит совершенно иное значение чем ожидалось , об этом вам собственно и грят

1 час назад, Alexeyslav сказал:

В общем случае это делается через процедуру чтение-модификация-запись, и она несколько уязвима к временным задержкам. прочитали, допустим и тут возникло какое-то прерывание, прерывание закончилось и только потом мы записали в регистр результат а он уже устарел на миллисекунды и не актуален. Побитовый же доступ через команду SBI/CBI лишён этого недостатка но доступен для портов находящихся в младшем адресном пространстве - туда попадают не все внешние порты.

 

30 минут назад, DrobyshevAlex сказал:

как все это относится к тому что запись типа

именно так и относится , ваш код может изменять биты только последовательно , но ни как не одновременно.

Share this post


Link to post
Share on other sites
1 час назад, IMXO сказал:

речь о одновременном изменении нескольких бит порта без изменения состояния соседних бит.

да, глянул скомпилированный код в с++ PORTD |= 1 он действительно сделал с чтением, я думал компилятор умнее, ибо еще лет 10 назад слышал что компилятор выражения типа a *= 2 компилирую как просто сдвиг.

Но тут конечно компилятор компилятору рознь) может кто то и компилирует))

Тут опять же спорить не буду особо)) Ибо я не в курсе включает ли стандарт си или с++ инструкции как компилятор должен обработать код. Есть 100500 вариантов натсроек оптимизации компилятора, и я тестировал без оптимизации, так что может с другими натсройками он и по другому скомпилирует код.

Так что могу лишь сказать, что есть стандарт и css и IE упорно десятилетия делает не так как другие, и под IE нужно писать костыли. Так это беда стандарта? Или все таки разработчики такие у IE?) Так и тут, спорно утверждать что это беда именно с++ или си) Есть куча компиляторов и оптимизаций)

 

 

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

конечно можно

да я уже понял о чем вы) я просто смотрел немного с другой стороны, отталкиваясь от этой фразы

7 часов назад, Alexeyslav сказал:

А я вот всё понимаю, тут просто надо было сказать что значение в массиве ПРОСТО ХРАНИТСЯ, это не порт, даже если записано "PB1" это просто число. В памяти, в регистрах где угодно но не в порту ввода-вывода. Чтобы изменить состояние ножки контроллера есть ТОЛЬКО ОДИН ПУТЬ ЭТО СДЕЛАТЬ - обратится к порту ввода-вывода с символическим именем PORTB или PORTD

и все мои рассуждения были о том что я не считаю костылем конкретно макросы или структуры)

 

Share this post


Link to post
Share on other sites

Блин, да не решает применение виртуального порта ни Си , ни Плюсы, ни компилятор , ни оптимизация. это проблема  на уровне железа.

Share this post


Link to post
Share on other sites

 

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

говорите что это беда с++ с массивом в данном случае.

беды-то как раз в этом нет никакой, массив непричем и наверно единственный способ красиво решить задачу на любом языке. Но конкретно сам язык С слишком сильно и глубоко завяз в костылях, которые не позволяют ему развиваться. И один из этих костылей - макросы. Особенно в части ЯВУ - им уже не место. Они слишком непрозрачны и всепроникающи как метастазы.

Share this post


Link to post
Share on other sites
int axisX[4]={1,2,4,8};
while (1)
		{
			if (PIND&(1<<dirX))//проверяем состояние кнопки
			{
				PORTB=axisX[4-i];
			}
			else
			{				
			   PORTB=axisX[i];			   				
			}		
			if ((i>3))
			{
				i=0;
			}
			
		}

я не знаю в чем проблема была объяснить орфографию.  

4-i заменить на 3-i

Share this post


Link to post
Share on other sites
6 часов назад, Дмитрий Мамедиев сказал:

я не знаю в чем проблема была объяснить орфографию.  

6 часов назад, Дмитрий Мамедиев сказал:

4-i заменить на 3-i

Серьезно? Орфографию? Для начала это не орфография даже)

Ну и если вы не читаете что Вам пишут то о чем речь

Вот ваш код

В 02.01.2019 в 11:01, Дмитрий Мамедиев сказал:

axisX[stepX];

в каком месте тут нужно 4-i заменить на 3-i??? Где тут вообще i? 

а вот Вам ответ был

В 02.01.2019 в 11:46, DrobyshevAlex сказал:

Зачем вы пишите константу если я в примере не просто так писал define?)

В 02.01.2019 в 11:01, Дмитрий Мамедиев сказал:

axisX[stepX];

Тут мало того что ничего не делается, так вы еще и пишете stepX вместо как я думаю вы хотели написать туда i что бы обойти все элементы массива, а так вы каждый проход цикла пытаетесь обратится к axisX[4] которой даже не существует. У вас всего 4 элемента массива, где первый имеет индекс 0. То есть 0, 1, 2, 3 - это существующие элементы массива, а вы пишите axisX[4] у Вас даже компилятор должен ругаться и не скомпилировать прошивку.

 

Что у Вас там вообще нет i.

Дальше Вы пишите сейчас PORTB=axisX[4-i]

А что было? axisX[stepX]

То есть Вы даже PORTB не писали. О чем я раза три минимум Вам написал. А теперь Вы пишите про какую то орфографию, что этим даже назвать нельзя, то ошибка логики.

Если вы пишите в ста темах, не нежно потом путаться.

Share this post


Link to post
Share on other sites

Ах да совсем забыл, хотя смысла писать нет так как Вы не читаете видимо.

Но я Вам уже говорил об этом, у Вас чередуются PORTB и PORTD в одном массиве

В 02.01.2019 в 11:01, Дмитрий Мамедиев сказал:

int axisY[stepY]={(1<<PD5),(1<<PD6),(1<<PD7),(1<<PB0)};

И если не использовать указатели на порты, то придется лепить костыль чтобы указать в какой порт писать

+ Вы переписываете ВЕСЬ порт, а это значит будь там ножка на вход с подтяжкой Вы ее отключите. Будь там что то еще Вы это перезапишете. Но Вам либо все равно, либо вы не читаете либо не понимаете...

Share this post


Link to post
Share on other sites

Вы писали что axis[stepx] ничего не даст. Ну привели бы пример что нужно ссылаться на порт PORTB=axis[...]. А то что в массиве разные порты, ну можно и одинаковые написать если от этого проще будет. В моем коде все равно косяк есть, в протеусе уже увидел.

Share this post


Link to post
Share on other sites
1 час назад, Дмитрий Мамедиев сказал:

Ну привели бы пример что нужно ссылаться на порт PORTB=axis[...]

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

В 01.01.2019 в 18:24, DrobyshevAlex сказал:

*(pins[pos].port) |= 1 << pins[pos].pin; // установить 1 на ноге

Я несколько раз просил описать просто словами что Вы хотите? Вы писали что хотите вызвать состояние порта,  моем понимании это вообще не запись а чтение состояние ноги. Из за этого несколько раз я просил описать что вам нужно.

Код в цитате это код с учетом исправления этого

1 час назад, DrobyshevAlex сказал:

И если не использовать указатели на порты, то придется лепить костыль чтобы указать в какой порт писать

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

Где то я прочел такую фразу "Правильно сформулированный вопрос содержит 80% ответа".

1 час назад, Дмитрий Мамедиев сказал:

А то что в массиве разные порты, ну можно и одинаковые написать если от этого проще будет.

Вам религия не позволяет использовать структуры, классы или два массива?

Share this post


Link to post
Share on other sites
9 часов назад, Дмитрий Мамедиев сказал:

Надо было это показать.

с этого надо было начинать....  решается это как-то так:

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

#define dirX_CLK PIND0
#define dirX_reverse PIND1
#define dirY_CLK PIND2
#define dirY_reverse PIND3

struct button_type {
  unsigned CLK: 1;
  unsigned old_CLK: 1;
  unsigned reverse: 1;
  unsigned just_CLK: 1;
  unsigned : 1;
  unsigned : 1;
  unsigned : 1;
  unsigned : 1;
}buttonX,buttonY;

unsigned char axisX[4]={(1<<PB1),(1<<PB2),(1<<PB3),(1<<PB4)};
unsigned char axisY[4]={(1<<PB0),(1<<PB5),(1<<PB6),(1<<PB7)};
unsigned char stepX=0,stepX=0;
unsigned char tempPORTB;

while (1)
{
  // Cостояние кнопок 
        if ( PIND&(1<<dirX_CLK) ){buttonX.CLK = 1;}
         else{ buttonX.CLK = 0;}
              
        if ( PIND&(1<<dirX_reverse) ){buttonX.reverse = 1;}
         else{ buttonX.reverse = 0;}

        if ( PIND&(1<<dirY_CLK) ){buttonY.CLK = 1;}
         else{ buttonY.CLK = 0;}
              
        if ( PIND&(1<<dirY_reverse) ){buttonY.reverse = 1;}
         else{ buttonY.reverse = 0;}
         
  // События: Тактовые кнопки только что нажаты
        if ( buttonX.CLK && !buttonX.old_CLK )
           { buttonX.old_CLK  = buttonX.CLK;
             buttonX.just_CLK = 1;
           }

        if ( buttonY.CLK && !buttonY.old_CLK )
           { buttonY.old_CLK  = buttonY.CLK;
             buttonY.just_CLK = 1;
           }
  // Обрабатываем события
     if( buttonX.just_CLK) 
       { 
        if ( buttonX.reverse )//проверяем состояние кнопки
         {
	  stepX--;
          stepX &=0x03;  
	 }
	else
	 {
	  stepX++;
          stepX &=0x03;  
	 }
        buttonX.just_CLK=0; 
       }
  

     if( buttonY.just_CLK) 
       { 
        if ( buttonY.reverse )//проверяем состояние кнопки
         {
	  stepY--;
          stepY &=0x03;  
	 }
	else
	 {
	  stepY++;
          stepY &=0x03;  
	 }
        buttonX.just_CLK=0; 
       }
        
         tempPORTB =axisX[stepX];
         tempPORTB |=axisY[stepY];
         PORTB =tempPORTB;
}

 

 

Share this post


Link to post
Share on other sites

Народ, день добрый, кто в теме, подскажите. 
у какого осцилла меньше погрешность , понятно что оба не айс, просто нужен ответ у ардуиновского (отсюда) или  DSO150 (вот такой)

Share this post


Link to post
Share on other sites

STM32F103C8 ADC 12bit

ATmega328V ADC 10bit

ответ очевиден или нет?

Share this post


Link to post
Share on other sites

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

Эти игрушки поиграться и выбросить, максимум посмотреть форму сигнала.

И кстати, знаете ещё один прикол с АЦП в микроконтроллерах? А прикол в том что разрядность указана для скорости измерения менее 1Кс/с для больших скоростей выборок эффективная разрядность падает вплоть до 6 бит + шум... и делай что хочешь. Это вообще ниочемные варианты, дешманский дедовский осцилоскоп типа H313 и то будет лучше(у него полоса до 100кГц).

6 часов назад, IMXO сказал:

ответ очевиден или нет?

Нифига не очевиден. В этих АЦП эффективная разрядность зависит от частоты выборок, и не факт что 12-битный продержится дольше чем 10-битный. На низкой скорости конечно будет преимущество, но сомневаюсь что оно сохранится уже после 1Кс/с.

Share this post


Link to post
Share on other sites

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Similar Content

    • By Anton Bondarenko
      Всем привет
      Прошу не ругать, впервые подобный вопрос задаю.
      Хочу сделать прибор, который будет посылать сигнал, когда возле прибора будет проходить металлический предмет. 
      — угол отслеживания до 30° а лучше прямая линия, траектория
      — время реакции очень высокое до 100 мс
      — ширина проема в котором нужно сканировать от 10 до 20метров,
      — передача сигнала через вифи
      Может есть готовые решения, или отдельные компоненты.
      Подскажите пжл в каком направлении искать.
      Смотрел датчики движения, но главная проблема — время реакции.
      Спасибо
       
    • By Sofia Vin
      Предлагаем проектную работу в Москве:
      Микроконтроллер STM32F103.
        
      Есть встроенный код с использованием функций библиотеки FreeRTOS, код имеет описанный протокол для связи с внешним миром.
        
      Необходимо проводить доработку кода под задачи программиста верхнего уровня и его тестирование в составе оборудования. 
      Работа в лаборатории (м.Университет) и удаленно. 
      Оплата по договоренности.
      Если Вы обладаете опытом схемотехнического проектирования и программирования микроконтроллеров, и Вас заинтересовала данная возможность, ждем Ваши отклики по контактным данным:
      8 (925) 023-60-02   Алексей
      E-mail: nassa@marathon.ru
       
    • By Антон Плюшкин
      В общем есть небольшая тривиальная задача - сделать свитюльку. Контроллер управляет светодиодиками, цвета меняются, людишки довольны.
      Схема проста: Attiny44a -> 2n3904 x3 -> RGB-светодиод.
      Собрал, протестил, всё норм, но!
      Как только в коде я использую функцию задержки - _delay_ms (util/delay.h) - контроллер повисает!
      #define F_CPU 16000000UL #include <avr/io.h> #include <util/delay.h> int main(void) { // Input/Output Ports initialization // Port A initialization // Function: Bit7=Out Bit6=Out Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In DDRA=(1<<DDA7) | (1<<DDA6) | (0<<DDA5) | (0<<DDA4) | (0<<DDA3) | (0<<DDA2) | (0<<DDA1) | (0<<DDA0); // State: Bit7=0 Bit6=0 Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T PORTA=(0<<PORTA7) | (0<<PORTA6) | (0<<PORTA5) | (0<<PORTA4) | (0<<PORTA3) | (0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0); // Port B initialization // Function: Bit3=In Bit2=Out Bit1=In Bit0=In DDRB=(0<<DDB3) | (1<<DDB2) | (0<<DDB1) | (0<<DDB0); // State: Bit3=T Bit2=0 Bit1=T Bit0=T PORTB=(0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0); // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 16000,000 kHz // Mode: Phase correct PWM top=0xFF // OC0A output: Non-Inverted PWM // OC0B output: Non-Inverted PWM // Timer Period: 0,031875 ms // Output Pulse(s): // OC0A Period: 0,031875 ms Width: 0 us // OC0B Period: 0,031875 ms Width: 0 us TCCR0A=(1<<COM0A1) | (0<<COM0A0) | (1<<COM0B1) | (0<<COM0B0) | (0<<WGM01) | (1<<WGM00); TCCR0B=(0<<WGM02) | (0<<CS02) | (0<<CS01) | (1<<CS00); TCNT0=0x00; OCR0A=0x00; OCR0B=0x00; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: 16000,000 kHz // Mode: Ph. correct PWM top=0x00FF // OC1A output: Non-Inverted PWM // OC1B output: Disconnected // Noise Canceler: Off // Input Capture on Falling Edge // Timer Period: 0,031875 ms // Output Pulse(s): // OC1A Period: 0,031875 ms Width: 0 us // Timer1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1A=(1<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (1<<WGM10); TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (0<<CS11) | (1<<CS10); TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; // Timer/Counter 0 Interrupt(s) initialization TIMSK0=(0<<OCIE0B) | (0<<OCIE0A) | (0<<TOIE0); // Timer/Counter 1 Interrupt(s) initialization TIMSK1=(0<<ICIE1) | (0<<OCIE1B) | (0<<OCIE1A) | (0<<TOIE1); // External Interrupt(s) initialization // INT0: Off // Interrupt on any change on pins PCINT0-7: Off // Interrupt on any change on pins PCINT8-11: Off MCUCR=(0<<ISC01) | (0<<ISC00); GIMSK=(0<<INT0) | (0<<PCIE1) | (0<<PCIE0); // USI initialization // Mode: Disabled // Clock source: Register & Counter=no clk. // USI Counter Overflow Interrupt: Off USICR=(0<<USISIE) | (0<<USIOIE) | (0<<USIWM1) | (0<<USIWM0) | (0<<USICS1) | (0<<USICS0) | (0<<USICLK) | (0<<USITC); // Analog Comparator initialization // Analog Comparator: Off // The Analog Comparator's positive input is // connected to the AIN0 pin // The Analog Comparator's negative input is // connected to the AIN1 pin ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0); ADCSRB=(0<<ACME); // Digital input buffer on AIN0: On // Digital input buffer on AIN1: On DIDR0=(0<<ADC1D) | (0<<ADC2D); // ADC initialization // ADC disabled ADCSRA=(0<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (0<<ADPS0); unsigned char VL_OCR0A = 0, VL_OCR0B = 0, VL_OCR1A = 0; OCR0A = 0; OCR0B = 0; OCR1A = 0; while(1) { _delay_ms( 100 ); VL_OCR0A = VL_OCR0A + 1; VL_OCR0B = VL_OCR0B + 1; VL_OCR1A = VL_OCR1A + 1; if( VL_OCR0A >= 250 ){ VL_OCR0A = 0; } if( VL_OCR0B >= 250 ){ VL_OCR0B = 0; } if( VL_OCR1A >= 250 ){ VL_OCR1A = 0; } OCR0A = VL_OCR0A; OCR0B = VL_OCR0B; OCR1A = VL_OCR1A; } } Т.е. если указать задержку в начале цикла, то светодиод не светится вообще.
      Если задержку убрать - светодиод немного подсвечивает всеми цветами.
      while(1) { _delay_ms( 100 ); // <--- ЗАДЕРЖКА --- VL_OCR0A = VL_OCR0A + 1; VL_OCR0B = VL_OCR0B + 1; VL_OCR1A = VL_OCR1A + 1; if( VL_OCR0A >= 250 ){ VL_OCR0A = 0; } if( VL_OCR0B >= 250 ){ VL_OCR0B = 0; } if( VL_OCR1A >= 250 ){ VL_OCR1A = 0; } OCR0A = VL_OCR0A; OCR0B = VL_OCR0B; OCR1A = VL_OCR1A; } Где я накосячил?
      З.Ы.: Замечаний по поводу оптимизации кода, излишних переменных и п.р. прошу не писать - изощряюсь как могу ибо не пойму почему не работает
    • Guest Денис
      By Guest Денис
      В общем, есть такое чудо китайской техники (фото)
      Что оно может:
      1. Заряжаться через microUSB порт
      2. Кнопка вкл/выкл, она же переключает режимы
      3. 3 режима свечения светодиода (он светит разными цветами)
      Что я хочу сделать:
      1. Пункты 1 и 2 выше
      2. Разнообразить количество режимов, переливание статичный цвет и тд...
      Вопрос: как это сделать? что купить?

      P.S. К сожалению, в гугле не нашел подробной инструкции, а я в электронике я дуб дубом


    • By Reptile
      Доброго времени суток. Пытаюсь восстановить работоспособность колонок Top Device TDE 261/2.1. Колонки не раз ремонтировалась по части УНЧ, при очередном ремонте по ошибке (одинаковые разъемы) с трансформатора было подано переменное питающее напряжение на входы (разъем AUX/MP3) аудиопроцессора PT2313L  (3,10,14 ноги - AGND, R_IN2 L_IN2). В результате чего выгорел сам аудиопроцессор PT2313L. PT2313L был заменен. Но колонка по прежнему не запускается. Как я понял, не запускается сам PT2313L, на его аудиовыходах (ноги 24, 25) сигнала нет. Передняя панель работает: индикация, кнопки, енкодер. Имеется подозрение, что вместе с процессором выгорели линии DATA и/или CLK на MCU, так как MCU и PT2313L соединены по этим линиям напрямую друг с другом. В МК и всей этой цифровой штуке не очень шарю, не знаю, как грамотно проверить работоспособность этой цифровой части, поэтому прошу помощи - Возможно ли какими-либо способами восстановить колонку или уже всё... 
      Из приборов, к сожалению, только мультиметр, осциллограф отсутствует.
      Ниже немного измерений.
      Напряжения на линиях: STD-BY-ждущий режим (в скобках рабочий режим):
      DATA - 2.31В (1.9В).
      CLK - 0.125В (0.135В).
      Сопротивление между выводами:
      CLK_MCU-DATA_MCU - 47 Ом. 
      CLK_MCU/DATA_MCU-GND - около 0.22 Ом и там и там. Звонится в обе стороны.
      Питание MCU 5В, (4.6В STD-BY-ждущий режим, 4.0В рабочий режим и со временем также почему-то может падать до 3.6В)
      MCU - не известен, нет маркировки. 18 Выводов, DIP.
      Ноги MCU, которые удалось опознать:
      1 - DATA
      18 - CLK
      3 - GND (?)
      5 - GND (?)
      ? - они соединены вместе
      14 - VCC
      17 - not used (n/a)
      15, 16 - OSC
      ET6202 - управление индикатором, Control LED drive circuit
      Фото плат (под сполером) и даташиты прилагаются.
      Схемы данных колонок не имеется. Все что удалось найти это схема чуть более старшей модели TDE280/2.1, с данными колонками она мало что общего имеет, лишь общий принцип, узлы довольно сильно отличаются, но прикреплю на всякий, для общей информации.
      PT2313L
      ET6202
      TDE280
       
  • Сообщения

    • Представьте, что на форуме музыкантов кто-то предложит из смычка сделать, скажем, ножовку. Тоже, типа пошутит.
    • Когда то давно, в средине прошлого века, действительно было 2 фазы в розетках. И между ними было скорей всего 127в. Сейчас такого нет. Поэтому, если ТС не разбирается в электричестве то пусть идёт.... нет, не лесом, а в школу, на уроки физики. Или в соответствующее учебное заведение по профилю.  Давайте без давайте? Это ни на что не влияет. Межфазное может быть 127, 220, 380. Это показатель?
    • Ну для устойчивого склероза рановато, хотя...  
    • Не пойму, что с R21. У него не хватает верхней части, так может быть, или это вообще не резистор напаян. Буду благодарен за любую подсказку.
    • Нужна помощь по усилителю РР не знаю в правильную внтку пишу или надо отдельную тему? привет. нужна ваша помощь с двохтактником. сделал усилитель.все почти идеально -прекрасно играет .тишина без фона. но очень маленькая мощность. должно бить минимум 2вт. или больше. а на слух по ощущениям есть 0,2вт. как будто очень низкая чуствительность. с сд плеєра никак не роскачать. что делать куда копать. что изменить не понимаю. сижу мучаюсь. Лампи у меня 6П6С на виходе.4шт.  анодное 266-270в. ток ламп  6п6с   46ма 49ма 43ма 40ма смещение при етом -16,5в входние лампи на анодах  от 99 до 106В. смещение -40,5в. ток 5,05-5,15ма по формуле   Ea-(0,0052А*33000). 270-(171,6)=98,4в. тоесть как будто все режими как на схеме в норме. что изменить чтоб повисить чуствительность и соответсвенно вих. мощность.? трансформатор виходной покупал. на железе тс*60 или тс 90 параметри по заявлением продавца Звуковая мощность до 35 Вт Секционирован. Приведённое сопротивление первичной обмотки 4500 ом Сопротивление первичной обмотки постоянному току 180 ом Сопротивление нагрузки 4 ом/8 ом Рабочий ток первичной обмотки 150-185mA Частотный диапазон (по уровню -3дБ) 19..36000Гц Неравномерность АЧХ < 0,5дБ Трансформатор изготовлен на пластинчатых магнитопроводах ПЛР 22х32. Габаритные размеры трансформатора, LxBxH - 113,0х91,0х71,0 мм. Марка провода ПЭТВ-2 0,22 0,84. Немагнитный зазор отсутствует. Редактировать сообщение
    • @FonSchtirlitz А оно тебе надо? Пять страниц ни о чем! То звук тихий, то ухи не те.... ТС сам походу не знает, что хочет! Из смарта хочет УМ сделать
  • Покупай!

×
×
  • Create New...