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

Dj_smart

Members
  • Постов

    28
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные Dj_smart

  1. Решил отчитаться. Пашет на 200%. Надо ваять ещё два. Так что сверлилке быть! :)

    Только вот... Сколько волка не корми, у осла всё равно толще. Микрошаг 1/32 это чрезмерно. Мега 32 которая будет рулить этим делом может выдавать только 9,5 кГц шагов одновременно по всем осям. Сейчас оно 1536 шагов на оборот. Это около 6 оборотов в секунду, 360 в минуту... При ходовом винте с шагом 1 мм стол в 150мм будет проезжать почти за 30 секунд. Долго и нудно. Перепишу таблицу на 1/8, и будет самое оно.

  2. Поставил протеус, запустил поэкт. Красота! Ради интереса переписал табличку под бегущий огонь. Бегает, куда он денется:).

    Так что всем огромное спасибо! В особенности Alex'-у.

    Сейчас нарисую схему в диптрейсе, пускай разводит плату.

  3. Тэкс... По поводу компилятора. Там бесплатный есть, я так понял пугают худшей оптимизацией кода. Неважно. Выбирается при загрузке, установке, или как? Даже через переводчика не пойму.

    MPLAB XC уже качаю, пишут "простой" не проходит.

  4. Спасибо, ясно. Пытаюсь понять всё это. Вот тут

    const unsigned char step_table[] ={ // Массив значений для шагания

    размер таблички не указывается. Как тогда оно узнаёт допустим конец?

    И это, попробовал компильнуть Ваш текст, так оно у меня взбунтовалось. По английски не шарю, но что то вроде язык компилятору не нравится. У меня HI-TECH какой-то установлен. На что поменять чтобы "понимало"? Может что изменить надо будет в будущем.

    Добавлено: Разобрался с компилером. Это не он тупой, это я на ручнике. А вот по указателю размера таблицы непонятно пока.

  5. Ух ты! Готовое всё. На тарелочке :). С протеусом когда-то давненько пробовал играться, ща по новой полезу.

    Тут вот дурной вопрос. Это на почве заражения асмом.

    Вот допустим внешнее прерывание. По низкому уровню скажем. Пришёл нолик. Но длительность низкого уровня десяток мс. За это время прога успеет прокрутиться, вернуться, и обнаружит опять ноль. За десяток мс провернётся сотню раз. Или оно ловит именно перепад с "1" в "0"?

    Ещё раз огромное спасибо. Протеус это конечно сила, но по свободе вечерком прошью, обвешаю светодиодами и... Хома, чего уж там :)

    Энкодера нема, оттуда взята только таблица шагов. Остальное на PIC-е будет делаться.

  6. Плохая реализация. Не понятно, для чего шаг менять в прерывании, а в порт выводить в основном цикле.

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

    Если сделать так, то основной цикл будет типа "пустой", просто крутится сам в себе?

    Тут на форуме спойлера нет? Прятать бы здоровые тексты.

    Я тут вот с таймером... И дописал "комменты к коментам":) Гляньте, если не трудно.

    //Добавим файл с описанием регистров МК

    #include <pic.h>

    //Укажем слово конфигурации

    __CONFIG (INTIO &WDTDIS &PWRTEN &MCLREN &BOREN &LVPDIS &UNPROTECT);

    //Опишем переменные

    const unsigned char step_table[4]={0b00010000,0b00100000,0b01000000,0b10000000};//Таблица состояний ключей ЗМЕНИТЬ НА НУЖНУЮ И РАЗМЕР 4 ЗАМЕНИТЬ НА 32

    unsigned char cur_step;//Номер состояния в таблице

    static void interrupt

    void interrupt _isr(void){//Подпрограмма обработки прерываний

    //Так как вектор прерывания у PIC16F628 общий, то функцию обработки внешнего прерывания ЗАМЕНЯЕМ НА

    //начнём с проверки флага INTF, который устанавливается аппаратно при возникновении ПРЕРЫВАНИЕ ОТ ТАЙМЕРА TOIF0

    //внешнего прерывания

    if(T0IF){//Если было прерывание от таймера

    T0IF=0; //Сбрасываем флаг прерывания

    TMR0=0xFF; // Заносим в таймер -1

    if ((PORTB & 0b00000010) == 2){//Если нужно крутить по часовой, то ТУТ НАДО ПЕРЕПИСАТЬ НА ПОРТ А

    cur_step++;//увеличиваем указатель на элемент таблицы(массива)

    if(cur_step == 4)cur_step = 0;//Если это последнее значение таблицы(массива), то идём в её начало

    }

    if((PORTB & 0b00000010) == 0){//Если нужно крутить против часовой, то И ТУТ ЗАМЕНИТЬ НА ПОРТ А

    if(cur_step == 0) cur_step = 4;//Если текущее значение - это первое значение в таблице(в массиве), то идём в её конец

    cur_step--;//уменьшаем указатель на элемент таблицы(массива)

    }

    }

    }

    void Init_CPU(void){//Настройка МК

    CMCON = 0x07; //Отключаем встроенные компараторы

    OPTION = 0b10000000 ;//Отключаем встроенные резисторы, внешнее прерывание INT - по спаду А ВНЕШНЕГО НЕТ! ЧТО НАПИСАТЬ?

    TRISA = 0b11111111;//Весь порт А - на ввод ТУТ СКОНФИГУРИРОВАТЬ КТО НА ВВОД, КТО НА ВЫВОД

    PORTB = 0x00; //Выводим в порт В нули

    TRISB = 0x00; //Весь - на вывод

    //INTE = 1;//Разрешаем внешние прерывания Это наверное не нужно тут, не используется

    //**** Инициализация таймера *************

    T0SE=1; // Фронт приращения таймера. Тут я ошибся, оказывается можно настраивать фронт.

    T0CS=1; // Внешний тактовый сигнал для таймера.

    PSA=1; // Прескаллер выключен.

    TMR0=0xFF; // Пишем в таймер число "-1" Можно написать 255?

    T0IF=0; // Сбрасываем флаг прерывания.

    T0IE=1; // Разрешаем прерывание от таймера.

    //****************************************

    }

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

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

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

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

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

    };

    }

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

    Спасибище! :dance2:

    Тоесть вот это

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

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

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

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

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

    };

    }

    Я переделываю в вид

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

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

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

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

    void Out_Byte(unsigned char cur_step){

    PORTB=cur_step; / Байт из таблицы

    RA0=cur_step&0x01;/ Маска по "И" для сохранения неиспользуемых битов

    }

    Что то мне эта строчка тут не нравится, каГбэ лишняя void Out_Byte(unsigned char cur_step){

    А инициализацию выходов в каком месте можно выполнить?

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

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

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

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

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

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

    RA1=1 не проще?

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

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

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

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

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

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

  10. Да не мучайте себя такой задачей, ведь можно с порта "Б" взять 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)"... и тд.

    };

    }

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

  11. Не-не.

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

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

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

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

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

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

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

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

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

    Нашёл у вас тут статью 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 линий любого порта на вывод.

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

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

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

  15. Моделизм это только одно из применений. Я всунул самодельный , с самодельным контроллером, в станок с ЧПУ в качестве шпинделя. Для чистовой обработки самое оно, обороты дурные, а шуму мало:). А то киловатный фрезер орёт как... http://www.cncmasterkit.ru/modules.php?name=Forums&file=viewtopic&p=25939#25939

  16. Звук - с ним проблемы, динамик китайский с плеера без обозначений, при включении Клона звук был но тихий, при повторном включении звука нет, горит R25(47),греется VT2(2N7000).Посоветуйте как быть дальше или уже что то сгорело?, звук в динамике еле слышно.

    У китайского динамика очень маленькое сопротивление... было:).Там ведь последовательная цепочка, 47 Ом, динамик,и полевичёк. Сопротивление открытого полевика пренебрежительно мало,и если динамика ом 6-8, то получаем ток в пределах 200-220mA в импульвсе. Больше всего что динамик "поджарился", потому что звук ещё прослушивается.

  17. Я вот из ПВХ на ЧПУ вырезал и сшил. В прямом смысле слова. В паз намотаю провод, повех опять каких-нить ниток, и залью эпоксидкой. 200мм диаметр.

    prew_7143_160.jpg

  18. Если кому интересно... Скачать файл "wideo-detektor.rar" с файлообменника CncFiles.ru (1022.5 кб)

    Плата от Korvin(надеюсь правильно). Принцип простой - вытравил, запаял, включил, пашет. Крутнул подстроечник чуток. Чуйка отменнаая. Спасибо:).

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