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

Вопросы от начинающих по МК


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

  • Ответов 8,9т
  • Создана
  • Последний ответ

Топ авторов темы

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

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

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

Где то видел такой пример

Очень плохой "пример".

Запрет прерываний в начале обработчика бессмысленен, но и не вреден. Прерывания запрещаются автоматически при переходе по вектору прерываний и разрешаются так же автоматически при выходе из обработчика, поскольку команда выхода у обработчика не такая как у обычного вызова, а с ОДНОВРЕМЕННЫМ разрешением прерываний.

Разрешение сделанное ДО ВЫХОДА, даже за одну команду до него, приведет к тому, что флаг этого или любого другого прерываний взведенный ВО ВРЕМЯ ИСПОЛНЕНИЯ ТЕКУЩЕГО ОБРАБОТЧИКА, приведет к немедленному вложенному прерыванию (до выхода из исполняемого), порче контекста и вероятному разрушению содержимого  стека при многократном повторе такой ситуации.

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

戦う前に相手のベルトの色に注目

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

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

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

А вот флаг регистра int0/1 GIFR. Я так понимаю если на int0 к примеру установилась 1 то в шестом бите будет 1. А если на int0 затем встанет 0... на GIFR запишется 0? Или 0 встанет когда следующий раз на int0 появится 1? По нарастающему фронту (если на него настроенно)

 

 

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

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

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

GIFR в Вашем случае не нужен.

Если Вы настроили на срабатывания прерывания по переходу в высокий уровень, то когда Вы подадите высокий уровень на ногу, бит станет 1.

Если Вы настроили прерывания на низкий уровень, то когда на ногу мк будет подан 0, бит все равно станет равен 1.

Флаг в этом регистре значит что прерывание сработало, не важно что на пине, важно что оно сработало в зависимости от ваших настроек.

Данный флаг Вам не нужен потому что Вы настроили срабатывание прерывания в GICR и отлавливаете его в ISR.

Когда прерывание начнет выполнятся флаг в GIFR сбросится автоматически. Если же Вы не установите флаг в GICR, то при срабатывании прерывания код в ISR не будет выполнятся, Вы сможете в другом месте, напрмиер в главном цикле приложения проверить установлен ли флаг 

GIFR & (1 << INTx)

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

GIFR |= 1 << INTx;

Но, повторюсь, в Вашем случае этого не нужно.

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

15 часов назад, my504 сказал:

Разрешение сделанное ДО ВЫХОДА, даже за одну команду до него, приведет к тому, что флаг этого или любого другого прерываний взведенный ВО ВРЕМЯ ИСПОЛНЕНИЯ ТЕКУЩЕГО ОБРАБОТЧИКА, приведет к немедленному вложенному прерыванию (до выхода из исполняемого)

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

Учение - изучение правил. Опыт - изучение исключений.

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

#define F_CPU 1000000L
#include <avr/interrupt.h>
#include <util/delay.h>
#include <avr/io.h>
#define dirX PIND1
#define dirY PIND0
#define dirZ PINC6
const int stepX=4,stepY=4,stepZ=4;//stepX-PD2(INT0) stepY-PD3(INT1) 
//stepZ-PD4(T0)
int axisX[stepX]={(1<<PB1),(1<<PB2),(1<<PB3),(1<<PB4)};
int axisY[stepY]={(1<<PD5),(1<<PD6),(1<<PD7),(1<<PB0)};
int axisZ[stepZ]={(1<<PC0),(1<<PC1),(1<<PC2),(1<<PC3)};
void port_ini(void)
{
	  DDRC=0b0111111;//PINC6 на вход остальные на выход
	  DDRB=0xff;
	  DDRD=0b11100000;//step/dir на вход
	  PORTC=0x00;//порт подтянули к нулю
	  PORTB=0x00;
	  PORTD=0x00;
}
void INTinit()
{
	GICR=((1<<INT0)|(1<<INT1)); //разрешаем прерывание int0 и int1
	MCUCR=((1<<ISC00)|(1<<ISC01)|(1<<ISC10)|(1<<ISC11));// прерывание по 
	//переднему фронту импульса int0 и int1
}
ISR(INT0_vect)
{
	if (PIND&(1<<dirX))//проверяем состояние кнопки
	{
		for(int i=0;i<stepX;i++)//прямо
		{
			axisX[stepX];
		}
	} 
	else if((!(PIND&(1<<dirX))))
	{
		for (int i=4;i<stepX;i--)//реверс
		{
			axisX[stepX];
		}
	}
	
}
ISR(INT1_vect)
{
		if (PIND&(1<<dirY))
		{
			for(int i=0;i<stepY;i++)
			{
				axisY[stepY];
			}
		}
		else if((!(PIND&(1<<dirY))))
		{
			for (int i=4;i<stepY;i--)
			{
				axisY[stepY];
			}
		}
}
int main(void)
{
	    port_ini();//вызываем функцию инициализации портов
		INTinit();//вызываем функцию инициализации прерывания
	    sei();//устанавливаем бит глобального разрешения прерываний
}

вот что у меня получилось, но не хватает тямы... пишет сообщение что нет эффекта. полагаю что ISR как то должны работать в maim(void)

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

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

вот что у меня получилось

Не смотрел код, глянул только main и не увидел в ней основного цикла аля while(1) {} что бы прошивка не завершила свое выполнение сразу после инициализации

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

axisX[stepX];

Что это по вашему должно сделать?

Зачем вы пишите в 2х темах поочередно? я вас в то1 теме вроде бы объяснил как работать с массивом

 

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

int axisX[stepX]={(1<<PB1),(1<<PB2),(1<<PB3),(1<<PB4)};

Вы сделали массив в который поместили просто бит пина который нужно включить

а потом 

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

if (PIND&(1<<dirX))

То есть у вас срабатывает от чего то прерывание на PD2 (INT0) и в нем проверяется состояние pd1?

if (PIND&(1<<dirY))
...	
else if((!(PIND&(1<<dirY))))

Зачем там else if?

Работать будет точно так как если бы вы написали 

if (PIND&(1<<dirY))
...	
else {
 ... 
}

Только дольше из за лишней проверки

Вообщем пока весь код не верный

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

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

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

Вы вот написали PD5 или PB0

Вы понимаете что это всгео лишь макрос, который вместо PB0 подставит 0 а вместо PD5 будет 5

То есть если вы напишите так

int8_t pins[2] = { 1 << PB0, 1 << PD0 };

То это будет то же самое что вы напишите 

int8_t pins[2] = { 1 << 0, 1 << 0 };

То же самое что вы напишите

int8_t pins[2] = { 1, 1 };

То есть чисто массивом pins в данном случае вы ни как не определите на каком порте эта нога на PB или PD

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

const int stepX=4

Вот тут, компилятор, не знаю конечно как там атмелстудия но обычная визуалстудия или gpp какой нить выделит под это место в ОЗУ

а запись типа

#define stepX 4

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

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

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

axisX[stepX];

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

 

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

int axisX

Зачем Вы используете тип int? Это 32 бита! У вас там значения 8ми битные. То есть Вы расходуете память 4 байта * 4 вместо 1 байт * 4 при uint8

У Вас так много лишней памяти?)

 

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

Сделайте хотя бы как то так

#define stepX 4
#define stepY 4
#define stepZ 4

uint8_t pinX[stepX] = { (1<<PB1), (1<<PB2), (1<<PB3), (1<<PB4) };
uint8_t pinX[stepY] = { (1<<PD5), (1<<PD6), (1<<PD7), (1<<PB0) };
uint8_t pinX[stepZ] = { (1<<PC0), (1<<PC1), (1<<PC2), (1<<PC3) };

volatile uint8_t* portX[stepX] = { &PORTB, &PORTB, &PORTB, &PORTB };
volatile uint8_t* portX[stepY] = { &PORTD, &PORTD, &PORTD, &PORTB };
volatile uint8_t* portX[stepZ] = { &PORTC, &PORTC, &PORTC, &PORTC };

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

*(portX[posX]) |= 1 << pinX[posX];

где posX - это число uint8_t от 0 до 3 включительно для выбора ноги мк

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

руководствовался этим уроком.

Зачем там else if? согласен. просто видимо про себя проговаривал "иначе если кнопка не нажата". последний пример ваш вообще не понял. я предполагал что на каждое прерывание INT0 выводить состояние определенной ножки из массива, по типу как в уроке выше

не понятно почему но урок 28 должен был быть а поставился 0

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

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

руководствовался этим уроком.

я никогда не смотрел видео уроки, потому что в 99%  случаев их пишут люди, который увидели что есть ЯП, смогли запустить где то взятый кусок кода, решили что они умнее всех стали сразу, и начинают учить других) Как говорится кто не умеет тот учит а кто умеет тот делает) Читайте книги лучше) Смотрите OpenSource проекты, учитесь по ним. 

Я не говорю что уроки которые вы смотрите плохие, я не смотрел, но если вы хотя бы разок прочтете какого нибудь Бьерна Страуструпа по с++ хуже не будет)

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

и займут 64 * 4 бита памяти) И в ПК им ее хватит с головой и они даже могут и не знать зачем есть различные типы данных, а с учетом еще и 64 битных процессоров оно будет работать быстро)

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

По этому если вы за ранее знаете что у вас число не превысит 255, то зачем использовать тип int 32 битный?

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

Зачем бы было столько типов, если можно было бы сделать 1 и все :)

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

я предполагал что на каждое прерывание INT0 выводить состояние определенной ножки из массива

Я вам в соседней ветке написал как это сделать. И тут показал как сделать на двух массивах если не хотите как я показывал раньше.

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

Смотрите, у Вас есть массив

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

int axisX[stepX]={(1<<PB1),(1<<PB2),(1<<PB3),(1<<PB4)};

Кстати вот вам удобно читать код? мне кажется гораздо удобней когда пробелами отделено одно от другого :) ну да ладно, дело ваше)

Вернемся к массиву. Вот axisX[] - массив с 4 элементами, как я уже писал сегодня выше, это просто числа. В данном случае Ваш массив выглядет так 

asixX[4] = { 0b00000010, 0b00000100, 0b00001000, 0b00010000 }

я уже писал что это только Вы указали какой бит Вы хотите установить в 1

А где Вы показали в какой порт??

Дальше, сработало прерывание, вы запустили цикл, допустим этот

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

for(int i=0;i<stepY;i++) { axisY[stepY]; }

Что тут происходит? Представьте что вы МК и Вам дали эту инструкцию.

1) Вы в переменную i (кстати опять почему то int если у вас тут значение заведомо от 0 до 3) пишите 0
2) проверяете i < 4? да => 3 шаг
3 ) axisY[stepY]; // что это?) вы просто попытались прочесть ячейку массива с индексом 4!!! я уже писал выше, что данного индекса у массива даже нет
хорошо, предположим вы ошиблись и хотели написать так axisY;
ну и что тогда, у вас i = 0, то есть выполнится код axisY[0];
что делает этот код? ну ничего...
4 ) дальше по вашей логике увеличиваем i на 1 то есть i++ выполнятся и переход на шаг 2)
 

Не понимаю вообще чего вы хотели от этого кода, зачем тут вообще цикл? Что вызывает прерывание? Как оно связано с PIND&(1<<dirY) и тд...

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

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

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

последний пример ваш вообще не понял

а что там не понятного?

исходя из этого

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

А где Вы показали в какой порт??

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

5 часов назад, DrobyshevAlex сказал:

uint8_t*

это указатель - прочесть можно у того же автора или погуглить указатели c++ и почитать вкратце статьи. Хотя я за книги) ибо статьи может писать кто угодно) У книг количество ошибок имхо меньше) Хотя и там могут быть, но не думаю что разработчик с++ написал уж очень плохую книгу)

В кратце

uint8_t a = 5; // это просто переменная типа uint8_t то есть 8-битная целочисленная не отрицательная, беззнаковая
uint8_t* b = 0; // переменная b это указатель на тип uint8_t, сейчас он не куда не ссылается
b = &a; // в указатель b мы записываем адрес переменной a, то есть не число 5, а адрес в памяти
a++; // тепереь у нас в a значение 6

uint8_t c = *b; // мы объявили еще одну переменную в которую записали НЕ указатель на переменную а, а содержимое ячейки на которую ссылается указатель b

то есть *b это можете представить как то же самое что a

a++; // в a стало 7
// *b - ссылается на ячейку памяти "a" по этому *b вернет тоже 7
*b += 3; // в переменной "a" будет значение 10
c ++; // в "c" теперь 7! потому что "c" это отдельная переменная и у нее своя ячейка памяти
b = &c; // тепреь "b" ссылается на ячейку "c" и ничего больеш не знает о "a"

 

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

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

uint8_t a = 0; // вы выделили в памяти 1 байт места.
int b = 0; // выделили 2 байта

По сути работая с переменными a и b вы работаете с какими то частями памяти мк.

Упс, только что дошло что я немного вас обманул. Я просто не кодю под мк, и могу сейчас ошибаться, но если я правильно помню то у мк данных тип int будет не 4 байта а только 2, но сути дела это не меняет :D все равно вам не нужен тип int в данных местах а нужен uint8_t :)

Так вот, у всех ячеек памяти есть адреса. Указатель это то, что используют для хранения адреса на ячейку.

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

Вы расходуете память 4 байта * 4

Думаю для atmega8 это 2 байта * 4

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

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

последний пример ваш вообще не понял

Ну и вот после всего вышесказанного, чуть поясню)

PORTB это макрос примерно такой

#define PORTB _SFR_IO8(0x18)

где _SFR_IO8 это еще макрос  в котором в зависимости от архитектуры определяется смещение начала указателей IO ввода вывода

вообщем это все не важно

uint8_t* port = &PORTB;

мы в переменную port запишем указатель на регистр PORTB

тогда что бы нам изменить содержимое данного регистра, нам нужно уже не так писать

port |= 1 << PB1;

а так

*port |= 1 << PB1;

разыменование указателя *var - это как будто на этом месту будет написано в нашем случае

PORTB |= 1 << PB1;

 

Честно говоря не знаю как еще подробней объяснить)

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

Да что такое указатели я уже знаю. Я не понимаю зачем такая сложность. Почему нельзя (как в уроке) вызвать по номеру, содержимое массива, путем реакции на прерывание. Про порты тоже не понял. 1

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

Я не знаю что там в уроке.

Если в уроке вот так

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

axisX[stepX];

то это не правильно. Вы тут ни чего не делаете.

Либо вы урок не поняли либо урок не правильный)

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

Почему нельзя (как в уроке) вызвать по номеру

Что вообще означает вызвать по номеру? Вызвать что? По какому номеру?

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

Я вам уже минимум 2 раза написал что axisX[stepX] - это ошибка, нет элемента с индексом 4. Так же я не понимаю что в вашем понимание есть вызов? Получить жжлемент массива вы можете так

uint8_t pin = axisX[i];

Только вопрос, а зачем он вам? У вас не понятно в какой порт писать этот бит.

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

какая разница axisX или axis[stepX]. это число элементов массива, назови их хоть на три буквы.

int axisX[stepX]={(1<<PB1),(1<<PB2),(1<<PB3),(1<<PB4)};

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

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

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

Вызвать содержтмое массива. В моем случае состочние ноги

Блин... я не знаю как еще написать, вот эта строка

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

int axisX[stepX]={(1<<PB1),(1<<PB2),(1<<PB3),(1<<PB4)};

это как будто вы  написали 

int axisX[4]={ 2, 4, 8, 16 };

что вы хотите от этого числа потом? Как вы получите с его помощью состояние ноги?

ну хорошо, вы получили элемент массива

uint8_t element = axisX[i]; // где x = 0

и то при условии что вы впишите i вместо stepX.

у вас в element будет 2 то есть 0b00000010

Что дальше? Вам нужно прочесть (или записать) это с порта! Откуда вы знаете по номеру элемента массива какой это порт???

Как вы читаете порт?

PINB & (1 << PB1)

ок 1 << PB1 вы вынести в массив

но PINB где??

PBx - вообще плевать компилятору и мк что там буква PBx это всего лишь макрос, компилятор вместо него подставит 1 сразу же, в массив вычислится значение 1 << 1 то етсь запишется 0b00000010

Что дальше? А дальше вам нужно проверить PINB или записать в PORTB это значение!

А у вас axisY содержит ножки 2х разных портов!

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

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

у вас 4 элемент (под индексом 3) PB а остальные PD

значит либо костыль в коде типа 

if (i == 3) {
	if (PINB & (asixY[i]) {
    	... 
    }
} else {
	if (PIND & (asixY[i]) {
    	... 
    }
}

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

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

 

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

какая разница axisX или axis[stepX]. это число элементов массива, назови их хоть на три буквы.

омг, речь про ваше прерывание а не про объявление массива

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

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

не могут! в нем у вас просто числа, в данном случае бит, который нужно читать/писать в нужном вам PINx/PORTx соотвественно

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

тогда вы 

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

какая разница axisX или axis[stepX]

вы вот даже прочесть не можете видимо) 

я написал не axisX или axis[stepX]

я написал в прерывании должно быть не axisX[stepX] а axisX[i] - и то я сомневаюсь что у вас там должен быть цикл такой, судя по тому что вы писали изначально у вас код прерывания вообще не верный

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

ISR(INT0_vect)
{
	if (PIND&(1<<dirX))//проверяем состояние кнопки
	{
		for(int i=0;i<stepX;i++)//прямо
		{
			axisX[i];
		}
	} 

я полагал так: на каждое внешнее прерывание проверяем состояние кнопки реверса и в цикле вызываем из массива состояние порта. на следующее прерывание: опять проверяем нажата ли кнопка и ++ вызываем из массива следующее состояние порта. я не пойму что вы хотите сказать. что нельзя в массив записать состояния портов или я их не правильно пишу?

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

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

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 - это то какой сейчас шаг, а у вас это количество пинов

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

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

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

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

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

 

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

4 часа назад, IMXO сказал:

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

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

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

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

 

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

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

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

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

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

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

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

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

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

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

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

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