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

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


Dj_smart

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

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

post-48853-0-86827100-1439885016.png

Но в таком случае, все 4 ноги (RA0-RA3) становятся аналоговыми входами. Это большой минус.

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

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

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

Спасибище! :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){

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

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

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

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

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

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

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

void Out_Byte(unsigned char 

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

Её нужно будет вызывать с параметром, который хотите в неё передать:

Out_Byte(a);   // Выводим на выходы значение переменной "a"

Из статьи :

Для того чтобы значение выводилось постоянно, будем использовать вечный цикл вида:

while(1){

PORTB = step_table[curr_step];

}

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

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

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

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

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

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

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

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

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

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

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

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

#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];//Выводим в порт значение из таблицы

};

}

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

Изивиняюсь за форматирование кода - движок режет все пробелы :(

#include "pic.h"
__CONFIG ( WDTDIS & INTIO & UNPROTECT & LVPDIS & MCLRDIS ); // Биты конфиг. контролера
/******************************************************************************************/

/******************************************************************************************/
const unsigned char step_table[] ={ // Массив значений для шагания
0b01110000, //0
0b01110010, //1
0b00110100, //2
0b01010110, //3
0b00011000, //4
0b01101010, //5
0b00101100, //6
0b01001110, //7
0b00001110, //8
0b11001110, //9
0b10101100, //10
0b11101010, //11
0b10011000, //12
0b11010110, //13
0b10110100, //14
0b11110010, //15
0b11110000, //16
0b11110011, //17
0b10110101, //18
0b11010111, //19
0b10011001, //20
0b11101011, //21
0b10101101, //22
0b11001111, //23
0b00001111, //24
0b01001111, //25
0b00101101, //26
0b01101011, //27
0b00011001, //28
0b01010111, //29
0b00110101, //30
0b01110011, //31
};
/******************************************************************************************/


/******************************************************************************************/
void Out_Byte(unsigned char {
PORTB=B;
}
/******************************************************************************************/

/******************************************************************************************/
void interrupt _isr(){
static signed char step_cur=0;

if(T0IF){
T0IF=0;
TMR0=0xFF;
//**********************************
if(RA1){ // Прямое вращение
if(++step_cur>=(signed char)sizeof(step_table))
step_cur=0;
}
else{ // Обратное вращение
if(--step_cur<0)
step_cur=(signed char)sizeof(step_table)-1;
}
Out_Byte(step_table[step_cur]);
//**********************************
}

}
/******************************************************************************************/

/******************************************************************************************/
void main(){

CMCON=7;
//**** Инициализация выходов *******
TRISB =0;
PORTB =0;
//**** Инициализация таймера *******
T0SE=1; // Фронт приращения таймера. Тут я ошибся, оказывается можно настраивать фронт.
T0CS=1; // Внешний тактовый сигнал для таймера.
PSA=1; // Прескаллер выключен.
TMR0=0xFF; // Пишем в таймер число "-1". Можно написать =255. Хоть =-1 
T0IF=0; // Сбрасываем флаг прерывания.
T0IE=1; // Разрешаем прерывание от таймера.
//**********************************
PEIE=1;
GIE=1;
//**********************************
while(1){

}
//**********************************
}
/******************************************************************************************/

Архив с проектом и протеусом :

step.rar

Спойлер есть - кнопочка BB-код, сверху слева, после значка "стёрка".

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

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

вроде всё просто: крутим энкодер - крутим двигатель

п.с. в мобильной версии ничего нет, приходится писать вручную :(

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

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

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

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

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

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

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

Или оно ловит именно перепад с "1" в "0"?
Ловится именно переход (фронт). Либо 0->1 (передний), либо 1->0 (задний).

За фронт приращения таймера отвечает бит T0SE. Для внешнего прерывания (INT) - бит INTEDG.

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

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

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

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

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

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

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

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

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

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

Про hi-tech читал один отзыв неприятный.

Дескать в обычной версии (без оптимизации) код наоборот транслируется не самым оптимальным образом, а в ПРО версии не хуже чем у других компиляторов.

Только слухи.

Alex: Для XC таблетка нужна? С протезом8 просто подружить?

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

Выбирается при загрузке, установке, или как? Даже через переводчика не пойму.
Просто устанавливаете и всё, будет фри-версия.
Alex: Для XC таблетка нужна?
Мне, или вообще ? Так то в сети существует таблетка. Не найдёте - пишите в личку - поделюсь :)
С протезом8 просто подружить?
В смысле ?

.cof создаёт, значит в протезе можно отлаживать.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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