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

Переделка Кода Из Avr Под Pic, И Не Только.


Dj_smart

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

Всём доброго дня.

Нашёл у вас тут статью http://cxem.net/mc/mc210.php . Очень и очень заинтересовало. Причина одна, и она весьма прозаична. При нынешних пенсиях всё больше приходится доставать раритеты из старых запасов.

Суть в чём. Хочу сделать ЧПУ сверлилку для печатных плат. Большой станок есть, но это со свёрлами от 0,3мм крайне неудобно. Будет настольное, маленькое, без компа, и из шнурков - только сетевой :).

Почему PIC, а не AVR как в статье? Опять же, причина банальна - они есть в наличии. И в статье MEGA32, что крайне избыточно.

Пошарился по интернетам, нашёл похожее http://it-en.ru/cnc/doc/1.html .

Сразу оговорюсь что опыт самостоятельного программирования - мелкие поделки на асме для КР580ВМ80 :). Сто лет назад. По мк - на уровне спаять и зашить. Эт мы могём.

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

Мысля была следующая - там в исходнике есть таблица шагов движка. Четыре числа, полный шаг. Думал выдернуть из авээровского исходника микрошаговую таблицу, всунунть под PIC, ну там порты подправить... В реальности оказалось не просто, точнее совсем не просто. Внешнее прерывание на Pic628a находится на порту RB0, а порт А, точнее RA5, работает только на вход. А мне нужны все 8 линий любого порта на вывод.

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

Если это возможно, как это будет выглядеть на Си?

Чо-то с заголовком темы:(. Пробовал изменить, безрезультатно.

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

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

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

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

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

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

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

Это не то. Это... ну вместо компьютера. Оно читает G-код из карточки/флешки, и выдаёт на драйвера двигателей. Вот последние я и пытаюсь слепить "из того что было":).

У меня похожее есть http://www.cncrouter.ru/forum/index.php?showtopic=437

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

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

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

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

Есть в сети драйвер на 628А и довольно хороший, себе на станок самопальный делал, ссылку надо поискать. Для не сильно мощных моторов работает.

Такую схему видели?

Не добавил :)

Драйвер pic16f628.rar

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

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

У меня на станке сейчас такие стоят:

Вопрос не в драйверах, а как код переделать. Хоть бери байт на полубайты дели, и выдавай в половинки разных портов...

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

Ну код можно и с нуля переписать, взяв за основу общую концепцию.

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

Главное уместить это в 2к слов.

И не опрашивайте энкодер в прерывании. Лучше в коде. Сравнивать текущее состояние с предыдущим и принимать решение о направлении вращения.

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

Не-не.

Вы меня не поняли. За основу берётся схема-прошивка на пике. Изначально там выводится четырёхразрядный код по каждому прерыванию. Из авээрки я беру только таблицу шагов движка. И тогда уже надо выводить всё 8 разрядов. Микрошаг однако. И тут всплывает вот такое: мне нужно 8 линий одного порта. На вывод. Порт А в пик628 отпадает из-за RA5, который в этом проце работает только на ввод, а значит отпадает совсем. А на порту В сидит внешнее прерывание, которое и запускает всю эту канитель. И его не изменить. И вот мне нужна помощь в переносе запуска на любой пин порта А. Вместо внешнего прерывания. Скажем чтобы срабатывало от компаратора, или ещё как-то.

Какой я программер я писал в первом посту. Заменить таблицу могу, откомпилировать тоже могу. Ну там пины поменять. А остальное...

Короче "Казань -брал! Астрахань- брал! Шпака.... не, не брал"(С)

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

Да не мучайте себя такой задачей, ведь можно с порта "Б" взять 4-5-6 и с порта "А" не достающие.

Думал в эту сторону. Маску применять надо? И куда это подсунуть- сразу за выдачей одного "полубайта"? Тут что получается. Там в схеме на атмеге чтобы не расширять разрядность шины управления два сигнала формируются внешними элементами 3 или-не. И там в комментах пишут что просто добавили в прерывание вот такую конструкцию, тоесть оно анализирует выводимый код, и где надо выдаёт "1" вместо наружного 3 или-не.

if(PORTC==0x70) Это что идёт на вывод, у меня будет порт В

PORTA = b00000100;

if(PORTC==0x0e)

PORTA = b00001000;

if(PORTC==0xf0)

PORTA = b00000100;

if(PORTC==0x0f)

PORTA = b00001000;

Если я это же всуну вот сюда

void main(void){//После сброса МК программа начнёт выполняться с этого места

Init_CPU();//Настроим МК

GIE = 1;//Глобальное разрешение прерываний

while(1){//Вечный цикл

PORTB = step_table[cur_step];//Выводим в порт значение из таблицы

А ВОТ СЮДЫ ПРЯМ :) Сначала вторую половинку байта на порт А, а потом эту конструкцию из "if(PORTC==0x70)"... и тд.

};

}

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

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

Ну во-первых.

Как Вы уже сказали, можно использовать компаратор. На один вход подать уровень через делитель, на второй импульсы. Разрешить от него прерывание и ловить его.

У 628-ого на порте А (RA4) есть ещё вход таймера TMR0. Если Вам его будет не жалко, то можно затактировать его от внешнего сигнала. Также разрешить прерывания, записывать в него 0xFF и по каждому импульсу МК будет переходить на вектор. В обработчике снимаем флаг и заного пишем в таймер 0xFF. Есть минус - прерывание будет происходить только по одному фронту - положительному.

Во-вторых.

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

В третьих.

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

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

возьми готовый драйвер drv8825 и не мучайся.

Это к рыбакам. Типа не сиди тут с удочкой, на базаре караси по рублю. Ответ прогнозируем :)

RA1=1 не проще?

Это не моё, как передрал, так и есть. Для наглядности оно такое... наверное.

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

От компа приходит импульс, и шаговый двигатель делает шаг. В зависимости от уровня на другой ноге вправо, или влево. А частота... При микрошаге 16, ну около 40-50 кГц.

У 628-ого на порте А (RA4) есть ещё вход таймера TMR0. Если Вам его будет не жалко, то можно затактировать его от внешнего сигнала. Также разрешить прерывания, записывать в него 0xFF и по каждому импульсу МК будет переходить на вектор. В обработчике снимаем флаг и заного пишем в таймер 0xFF.

Во! Вот за это спасибо! Именно то, чего я и добивался. Я правильно понимаю, это вроде называется "прерывание по переполнению таймера"?

Нельзя чиркнуть пару строчек на Си? Для примера. Книжка у меня есть, попытаюсь сам, но не уверен.

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

ну около 40-50 кГц.
Тогда да, без внешнего прерывания не обойтись.
это вроде называется "прерывание по переполнению таймера"?
Оно самое.

Таймер TMR0 не сложный, для 628-ого есть даже даташит на Русском. Попробуйте и всё должно получиться :)

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

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

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

ну около 40-50 кГц.

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

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

Книжка "Программирование на языке С для AVR и PIC микроконтроллеров". У Си есть разные... диалекты? Потому как примеры там по синтаксису вообще не так.

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

Тупо в лоб, с привязкой к конкретным пинам :

//**** Функция вывода байта на выходы ****
void Out_Byte(unsigned char {
PORTB=B;
RA0=B&0x01;
}
//****************************************

//**** Инициализация выходов *************
TRISB &=0b00000001;
PORTB &=0b00000001;
TRISA &=0b11111110;
PORTA &=0b11111110;
//****************************************

RA0 - младший бит выводимого байта

RB1-RB7 - остальные биты.

RB0 - вход для внешнего прерывания.

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

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

Тем более, для чего, если выводов хватает ? Зачем в конструкции ещё один лишний корпус ?

Вариант с распределением выходов "как душе угодно" :

//**** Назначение выводов ****************
#define OUT_0_BIT RA0
#define OUT_0_TRIS TRISA0
#define OUT_1_BIT RB1
#define OUT_1_TRIS TRISB1
#define OUT_2_BIT RB2
#define OUT_2_TRIS TRISB2
#define OUT_3_BIT RB3
#define OUT_3_TRIS TRISB3
#define OUT_4_BIT RB4
#define OUT_4_TRIS TRISB4
#define OUT_5_BIT RB5
#define OUT_5_TRIS TRISB5
#define OUT_6_BIT RB6
#define OUT_6_TRIS TRISB6
#define OUT_7_BIT RB7
#define OUT_7_TRIS TRISB7
//****************************************

//**** Функция вывода байта на выходы ****
void Out_Byte(unsigned char {
OUT_0_BIT = B&(1<<0);
OUT_1_BIT = B&(1<<1);
OUT_2_BIT = B&(1<<2);
OUT_3_BIT = B&(1<<3);
OUT_4_BIT = B&(1<<4);
OUT_5_BIT = B&(1<<5);
OUT_6_BIT = B&(1<<6);
OUT_7_BIT = B&(1<<7);
}
//****************************************

//**** Инициализация выходов *************
OUT_0_TRIS=0;
OUT_1_TRIS=0;
OUT_2_TRIS=0;
OUT_3_TRIS=0;
OUT_4_TRIS=0;
OUT_5_TRIS=0;
OUT_6_TRIS=0;
OUT_7_TRIS=0;
OUT_0_BIT=0;
OUT_1_BIT=0;
OUT_2_BIT=0;
OUT_3_BIT=0;
OUT_4_BIT=0;
OUT_5_BIT=0;
OUT_6_BIT=0;
OUT_7_BIT=0;
//****************************************

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

В первом варианте вывод будет в два этапа - на портБ, затем на RA0. И достаточно быстро.

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

Пример с TMR0 :

//**** Обработчик прерывания от TMR0 ****
void interrupt _isr(void){
if(T0IF){
T0IF=0;
TMR0=0xFF;
.............
.............
}
}
//****************************************

//**** Инициализация таймера *************
T0SE=1; // Фронт приращения таймера. Тут я ошибся, оказывается можно настраивать фронт.
T0CS=1; // Внешний тактовый сигнал для таймера.
PSA=1; // Прескаллер выключен.
TMR0=0xFF; // Пишем в таймер число "-1"
T0IF=0; // Сбрасываем флаг прерывания.
T0IE=1; // Разрешаем прерывание от таймера.
//****************************************

post-48853-0-66303600-1439883650_thumb.png

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

Вот, поочередно. Я тоже думал об этом. Что драйвер подумает, может с ума сойдет, а может схавает.

В случае с 595 мы получаем одновременное переключение всех регистров.

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

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

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

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

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

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

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

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

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

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

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

    • Cкорее всего, при 31,5 В на выходе драйвер не выдаст 300 мА.  Хотя, раз заявлено входное от 100 В, то при 230 В может что-то и получится. Но это уже за заявленными пределами работы.  Можно подключить проволочный резистор 100 Ом и померить напряжение, но лучше использовать как заявлено: в диапазоне 12-20 В.  
    • @MisterAnderson , напряжение на выходе светодиодного драйвера зависит от нагрузки, и определяется оно напряжением на светодиодах, а не самим драйвером. Светодиоды имеют характеристику близкую к стабилитрону, напряжение на них от тока зависит мало. Белые светодиоды имеют это напряжение примерно 3...3,4 В. Четыре последовательно включённых - примерно 12...14 В. На подключение таких "трёхвольтовых" белых светодиодов и расчитан ваш драйвер. Драйвер напряжением не управляет, есть только ограничение по максимальному, больше которого он выдать не может. Драйвер светодиодов стабилизирует ток. Ваш драйвер стабилизирует его на уровне 0,3 А. И выдать больше 20 В при этом не может. Измеренные вами 31,5 В на холостом ходу - это напряжение его внутреннего питания. Под нагрузкой 0,3 А напряжение на его выходе тут же "просядет", выше 20 В не поднимется. Мощность на одном трёхвольтовом 300-миллиамперном светодиоде будет (примерно, для светодиодов точность никогда особо не обеспечивают) 0,3 А * 3,3 В = 1 Вт. Трёхвольтовый белый светодиод на ток 300 мА - это и есть одноваттный светодиод. На четырёх будет 4 ватта. Следующие по напряжению в линейке белых осветительных светодиодов - шестивольтовые. У них в одном корпусе последовательно соединённые два светодиодных кристалла. Четыре таких светодиода, включённых последовательно, ваш драйвер не потянет, потому что им нужно минимум 6*4=24 В, а ваш драйвер может выдать не больше 20. Впрочем, можно бы было поставить вместо четырёх трёхвольтовых четыре шестивольтовых на 150 мА, две группы параллельно по два последовательно, но вряд ли справитесь с переделкой платы под светодиоды. Поэтому этот вариант вам и не предлагали. Проще, дешевле и с наименьшими затратами собственного времени, без переделки драйвера, платы и т.п., с которой вы точно не справитесь, поставить четыре одноваттных трёхвольтовых, на которые ваш драйвер расчитан. Тем более, что купить их - проблем нет. Именно этот оптимальнейший совет вам и дали. Всё вам правильно уже много людей много раз разными словами рассказали. Что вас ещё смущает?
    • Предусилители-корректоры на полевых транзисторах. Радио №9,   №10/2010.  А.Гурский.
    • Тоже самое в подсветках фирменных телеках даже 10 летней давности. Ток можно уменьшить на треть без потери качества легко. Потребитель должен потреблять и всё тут.
    • Естественно после 7 вольт то. Или аккум сам по себе хлам и садит в себя или ибп. Тут вариантов не много.
    • Попробуйте зарядить, а потом погонять ее  в полный цикл несколько раз. Это если акум нормальный а у ТС 100% давно не нормальный.
  • Похожий контент

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