на контроллер 12 в , на энкодер и джостик 5 в
приколист!
Я, сначала, вообще за тролля принял, потом смотрю - нет, реальный чел)))
а понял, что он там изобретает?
Там даже ИИ есть. В чем прикол то?))
Сразу нет. Но потом нашёл его тему про принтер
Как вариант, разбивать выполнение работы на части. Текущий адрес хранить в eeprom. Контроллер сам делает ресет, и , продолжает выполнять уже следующую часть с нового адреса.
Мотоцикл?
лучше дать ссылку откуда взят энкодер
Возможно дело в этом:
Для Ардуино УНО (и других плат на базе ATmega328/P) эти выводы:
- D8 … D13 - генерируют запрос прерывания PCINT0
- A0 … A5 - генерируют запрос прерывания PCINT1
- D0 … D7 - генерируют запрос прерывания PCINT2
Таким образом входы-источники прерываний объединены в группы, каждой группе соответствует свой вектор и обработчик. Если мы, например, разрешим прерывания на всех выводах первой группы (PCINT0), то для всех поступающих от них запросов на прерывания будет вызываться один и тот же обработчик. Специальных средств для определения конкретного вывода, от которого поступил запрос прерывания, в микроконтроллере нет.
Проблемы не будет, если в обработчике проверять, какой именно пин изменил состояние
Я не знаю какой вариант кода у него был во время описываемых событий. Соответственно и не знаю, что там проверялось.
спасибо , прочитал про это , разобрался
да , все с этим завязано
сначала изучив это прерывания , как работает , решил сделать
на других пинах
но решил попробовать сделать так
ISR(PCINT1_vect, ISR_NOBLOCK)
При указании значения
ISR_NOBLOCK
в качестве второго параметра макроса ISR компилятор добавит в обработчик команду установки бита бита I , разрешая тем самым обработку вложенных прерываний что мне нужно
Да. это избавило от потерь после работы джойстика на пину A4 …
но вылезла проблема с лимитом . он взбесился .
Поработав с ним я его как бы утизомирил но что то мне не нравится
и нашел еще одну проблему которую я пока не могу решить .
В самый первый раз энкодеру нужно сделать dgcoge
например такой
G91 G21 F5000 Z+50
G04 P1.
G91 G21 F5000 Z-50
для того что бы он начал все последующие dgcoge точно обрабатывать
я пока в процессе изучения зачем ему это нужно
и чтобы это значило, сходить по Z туда сюда?
ты так и не дал ссылку на энкодер
если виж картинку и нужно что то узнать . делаю так

и чтобы это значило, сходить по Z туда сюда?
ты так и не дал ссылку на энкодер
такое чувство что ты меня тролишь
у меня есть хобитный лазерный станок на esp32
на нем есть ось z. для лазера \ не спрашивай зачем . он хоббитный
и что бы я на своем стендиине крутил энкодер вручную и что бы мне микросотки считать на стенде от энкодера_шаговик на микрометр
я выдергиваю оссь Z мотор станка и включаю туда мотор от стенда который крутит энкодр для того что я обьяснил выше .
нихрена не понял что ты наобъяснял, но вспоминая про делительную головку видится, что тебе надо устанавливать абсолютное положение вала приводимого в движение шаговым двигателем?
ну попробую еще раз я знаю это моя вина в неумении коротко изьяснить
так вот
я беру джостик или вручную двигаю каретку с микрометром напримерив нулевое положения . там будет находиться головка принтера
на стенде стоит упор для микрометра. .это и есть воображаемое нулевое положения .
далее . к примеру на микрометре зафиксировали любое число .
пусть это будет 4.55
далее я запускаю от лаз. станка джекод +50,-50
и каретка сделала ход туда сюда но первый раз она может вернуться не на 4.55 а куда угодно ±2-4 мм
далее я фиксирую на микрометре новый показатель 5.76
и далее запускаю снова джекоды и теперь сколько угодно раз каретка придет в 5.76
и будет это так пока я снова руками не поправлю каретку тогда все сбивается
что бы этого не было после того как я джостико или руками снова подвожу каретку например на 4.00 и мне нужно с первого раза чтобы после джекода наприер -5,-5,-5,+5,+5,+5,. микрометр показал 4.00 я должен сделать ресет uno. . тогда с первогоираз все сработае в чистуб а не только вторые и последующие разы
я должен как то автоматом очищать пллностью память не уверен сто это верно
Поставил энкодер на пины 9,10
все работает и мотор и джостик и лимит. но на маленьких оборотах энкодера
если резко дернуть то энкодер пропускает ходы
может я с регистрами напутал ? посмотрите
таблицу по пинам. и регистру брал здесь
//Энкодер на пинах 9, 10. Используется внутренняя подтяжка.
volatile int enc;
void setup(){
Serial.begin(115200);
pinMode(9,INPUT_PULLUP);
pinMode(10,INPUT_PULLUP);
PCIFR=PCIFR; PCICR=1<<PCIE0; //разрешить прерывание
PCMSK0=1<<PCINT1 | 1<<PCINT2; //выбрать вход на котором сработает прерывание
}
ISR(PCINT0_vect){
static char EncPrev=0; //предыдущее состояние энкодера
static char EncPrevPrev=0; //пред-предыдущее состояние энкодера
char EncCur = 0;
if(!(PINB & (1 << PB1))){EncCur = 1;} //опрос фазы 1 энкодера
if(!(PINB & (1 << PB2))){ EncCur |= 2;} //опрос фазы 2 энкодера
if(EncCur != EncPrev) //если состояние изменилось,
{
if(EncPrev == 3 && //если предыдущее состояние 3
EncCur != EncPrevPrev ) //и текущее и пред-предыдущее не равны,
{
if(EncCur == 2) //если текущее состояние 2,
enc++; //шаг вверх
else //иначе
enc--; //шаг вниз
}
EncPrevPrev = EncPrev; //сохранение пред-предыдущего состояния
EncPrev = EncCur; //сохранение предыдущего состояния
}
}
void loop() {
Serial.println(enc);
}