
| Если это ваш первый визит, рекомендуем почитать справку по форуму. Для размещения своих сообщений необходимо зарегистрироваться. Для просмотра сообщений выберите раздел. |
![]() |
||
PIC контроллеры. Программаторы и первый проект на PIC
|
||
| Программирование микроконтролеров,ремонт аудио/видео/бытовой техники,полезные устройства для дома,телефония, обсуждение статей журнала Радио |
![]() |
|
|
Опции темы |
|
|
#781 |
|
Форумец
Сообщений: 8
Регистрация: 12.02.2011
Возраст: 51
|
Здравствуйте petrd...Спасибо за подсказку ..
У меня исче один вопрос к Вам.. Сделали счетчик импульсов..Для проверки ДОС.. Подсчет имульсов идет нормально, но нам исче необходимо высчитать сдвиг(смещение)...Как это можно реализовать..?? На фото то, что нуно вычислить(приблизительно).. Импульсы идут с одинаковой(регулируемой) частотой.. |
|
|
|
|
#783 |
|
Форумец
Сообщений: 8
Регистрация: 12.02.2011
Возраст: 51
|
Датчик обратной связи..
Сча не помню какая, но завтра гляну на работе... В принципе там такое соотношение: 1.2500имп. на оборот 2.1024имп. на оборот 3.1000имп. на оборот 4.100 имп. на оборот Это четыре разных устройства.. Начало отсчета -- ноль метка. А так завтра на работе могу сфоткать паспорт устройства и выслать Вам... |
|
|
|
|
#784 |
|
Форумец
|
Вариантов много. Все зависит от частоты и нужной точности. Например, можно так. Запустить таймер. На INT подать первый сигнал - когда придет захватить значение таймера, второй сигнал завести на вход CCP, когда на него придет второй сигнал, снова захватить значение таймера, потом расчитать разницу первого и второго значения.
|
|
|
|
|
#785 | |
|
Форумец
|
Цитата:
у меня непонятки. Нафига заводить на вход контроллера сигнал с неисправного датчика? Он же вроде как умер! Что от него хотят получить? Гемморно это, т.к. надо иметь машину с рабочими датчиками, потом во всех режимах двигателя записать сигналы с обоих датчиков, потом по этим записям выявить зависимости, зависимости перевести в какой-то упрощенный алгоритм, который (как мы думаем) должен удовлетворить ЭБУ, алгоритм прошить в контроллер, подсунуть это ЭБУ и смотреть на его реакцию, а если ЭБУ думает как-то не так как мы, то получим горящий Check и все сначала. Времени уйдет много, и врядли оно окупится. |
|
|
|
|
|
#786 | |
|
Форумец
Сообщений: 4
Регистрация: 17.02.2011
Возраст: 53
|
Цитата:
и поставим пламя гаситель. С ДК1 ( рабочей ) берем сигнал который практически одинаковый у большенства авто и подаем на эмулятор который заменет ДК2. Сигнал с ДК1 0.6 - 0.9 вольт, а с эмулятора нужно получить 0.1 - 0.4 вольта и подать на ЭБУ !!!!!!!!! Где то так!!!!!!!!! |
|
|
|
|
|
#787 | |
|
Форумец
|
Цитата:
|
|
|
|
|
|
#788 | |
|
Форумец
Сообщений: 4
Регистрация: 17.02.2011
Возраст: 53
|
Цитата:
Первый вариант: #include <stdio.h> //подключаем библиотеку для считывания значений и вывода на консоль float dk1, dk2; //переменные для хранения значений ДК1 и ДК2 void main(){ //точка входа в программу scanf("%f",&dk1); //вводим значение в переменную (получения значения с ДК1) dk2 = dk1-0.5; //вычисляем значение переменной dk2 printf("dk1 = %f\n",dk1); //выводим на печать значение dk1 printf("dk2 = %f\n",dk2); //выводим на печать значение dk2 (данное значение подаем на выход эмулятора) } Второй вариант: #include <stdio.h> //подключаем библиотеку для считывания значений и вывода на консоль float dk1, dk2; //переменные для хранения значений ДК1 и ДК2 void main(){ //точка входа в программу scanf("%f",&dk1); //вводим значение в переменную (получения значения с ДК1) if (dk1>=0.6 && dk1<=0.9){ //Если 0.6<=dk1<=0.9, то... dk2 = dk1-0.5; //вычисляем значение переменной dk2 printf("dk1 = %f\n",dk1); //выводим на печать значение dk1 printf("dk2 = %f\n",dk2); //выводим на печать значение dk2 (данное значение подаем на выход эмулятора) } else{ //иначе (если значение dk1 не попадает в диапозон от 0.6 до 0.9) printf("Значение dk1 выходит за пределы интервала от 0.6 до 0.9\n");//выводим информацию на консоль (в идеале можно передать в ЭБУ какое-либо значение) } } Третий вариант #include <stdio.h> //подключаем библиотеку для считывания значений и вывода на консоль float dk1, dk2; //переменные для хранения значений ДК1 и ДК2 void main(){ //точка входа в программу scanf("%f",&dk1); //вводим значение в переменную (получения значения с ДК1) if (dk1 < 0.6){ //если dk1 меньше 0.6 то... dk2 = 0.1; //присваиваем dk2 минимальное значение printf("dk2 = %f\n",dk2); //выводим на печать значение dk2 (данное значение подаем на выход эмулятора) } else if (dk1 > 0.9){ //если dk1 больше 0.9 то... dk2 = 0.4; //присваиваем dk2 максимальное значение printf("dk2 = %f\n",dk2); //выводим на печать значение dk2 (данное значение подаем на выход эмулятора) } else { //иначе... dk2 = dk1-0.5; //вычисляем значение переменной dk2 printf("dk1 = %f\n",dk1); //выводим на печать значение dk1 printf("dk2 = %f\n",dk2); //выводим на печать значение dk2 (данное значение подаем на выход эмулятора) } } |
|
|
|
|
|
#789 | |
|
Форумец
|
Цитата:
Можете забыть про эти варианты! Последний раз редактировалось petrd; 27.02.2011 в 12:13. |
|
|
|
|
|
#791 |
|
Форумец
Сообщений: 4
Регистрация: 13.03.2011
Возраст: 40
|
Господа, большое спасибо за интереснейшую тему!
Начал изучать программирование Pic на microC PRO. Скачал microC PRO V 4.6, там переведенный хелп. Меня интересует работа с COM-портом. Первоначально помигал диодиком - значит связка компилятор-программатор-макетка работает правильно. Использую Pic16F876. Открыл пример работы с програмным UART и пытаюсь повторить, проверяю с помощью встроенного V 4.6 терминала. Но что-то по примеру ничего не получается, не могли бы Вы помочь мне? Листинг1 - это пример (см. коментарии): Код:
unsigned short data = 0, ro = 0;
unsigned short *rec;
void main() {
er = &ro; \\не ясно что это за строка - компилятор ошибку по ней выдает
Soft_Uart_Init(PORTB, 1, 2, 2400, 0);
do {
do {
data = Soft_Uart_Read(rec); // Прием данных
} while (!*rec);
Soft_Uart_Write(data); // Отправка данных назад по UART
} while (1);
Листинг2 - это сделал я из примера: Код:
unsigned short dt=0;
unsigned short *rec;
void main()
{
TrisB=0;
PortB=0;
Soft_Uart_Init(PORTB,2,1,9600,0); // Tx-RB2, Rx-RB1
do
{
do
{
dt=Soft_Uart_Read(rec); // прием данных
} while(!*rec);
Soft_Uart_Write(dt); //отправка данных назад по Uart
}while(1);
}
Большое спасибо за помощь! |
|
|
|
|
#792 | |
|
Форумец
|
Цитата:
|
|
|
|
|
|
#794 |
|
Форумец
|
|
|
|
|
|
#798 | |
|
Форумец
|
Цитата:
2. Не зря же новые версии стали PRO, а это значит, что что-то изменилось, в т.ч и в библиотеках и в help (в частности для Soft_Uart кое-что точно изменилось). Открываете help для PRO 4.60 и переведеный и находите в чем их различие. 3. Берете пример из help для 4.60 и делаете как в нем. Про пример из переводного можно забыть. |
|
|
|
|
|
#799 |
|
Форумец
Сообщений: 8
Регистрация: 12.02.2011
Возраст: 51
|
Подскажите как правильно реализовать операцию деления с выводом на ЛСД трех знаков после запятой..
Пример. 0001(двоичн.)/0011(двоичн.)= 0,333(десятич.) Если делить в дв. системе(как делает мк), то получится 0 в ответе. Я так понимаю, что для таких случаев нуно сделать какое-то преобразование и получить ответ в целых числах, а затем вывести на ЛСД , но как -- я не пойму..И как вывести полученный результат в виде 0,ххх |
|
|
|
|
#800 | |
|
Форумец
|
Цитата:
0001(дв) = 1(дес) 0011(дв) = 3(дес) берем и к 1 прибавляем 1000 и получаем 1001, 1001 : 3 = 333. Теперь для вывода на ЖКИ надо преобразовать число в строку функцией типа IntToStr(...). Полученная строка имеет конечную длину и мы это знаем. Начинаем считать символы справа, все символы начиная с 4-го сдвигаем на одну позицию в строке влево, а на место 4-го вставляем запятую. И уже полученную строку выводим в ЖКИ. НО, если 0/3 = 0, 0+1000 / 3 =333, т.е. уже не верно, ну и т.д. А вообще-то в компиляторах эти вещи реализованы по всем законам математики и к тому же работают, только для мелких контроллеров эти вещи пожирают много ресурсов, поэтому программисты начинают придумывать разные трюки и хитрости, чтобы сохранить ресурсы и производительность. Посмотреть, например, можно в AN575 от Microchip или порыться на piclist.com и т.д. Вообще решение Вашей задачи зависит от того, что Вам на что надо делить и откуда оно берется и какой компилятор используете. Для MikroC, если делать по всем правилам то будет выглядеть как-то так: Код:
float ff1, ff2, ff3; char txt[15]; ...... ff1 = 1; ff2 = 3; ff3 = ff1/ff2; FloatToStr(ff3, txt); Lcd_Out(1, 1,txt); |
|
|
|
|
|
#801 | |||
|
Форумец
Сообщений: 8
Регистрация: 12.02.2011
Возраст: 51
|
Цитата:
Пограмма на Basic(microBasic)...C C и Pascal знаком с компиляторами от microELECTRONIKI вот пример куска кода Код:
...
dim shirina as word ' ширина импульса
dim shirina_ex as string[5] ' выод на ЛСД ширины
dim imp_1 as word ' Захват по переднему фронту
dim skvazhnost as word ' скважность импульсов
dim skvazhnost_ex as string[6] ' выод на ЛСД скважности
dim period as word ' Захват по второму переднему фронту
....
sub procedure Interrupt()
if CCP1CON= 0x04 then ' Если вкл.захват по срезу
PIE1.CCP1IE=0 ' Откл. модуль ССР
CCP1CON= 0x05 ' Вкл. захват по фронту
PIR1.CCP1IF = 0 ' сброс флага
PIE1.CCP1IE=1 ' включаем модуль ССР
TMR0=TMR0+1 ' Считаем кол-во фронтов
imp_1 = CCPR1L + (CCPR1H*256) ' Сохраняем значене таймера TMR1
else
PIE1.CCP1IE=0 ' Откл. модуль ССР
CCP1CON= 0x04 ' Вкл. захват по срезу
PIR1.CCP1IF = 0 ' сброс флага
PIE1.CCP1IE=1 ' включаем модуль ССР
shirina = CCPR1L + (CCPR1H*256) - imp_1 ' Вычисляем ширину
period=(CCPR1L + (CCPR1H*256)) ' Вычисляем период
skvazhnost= shirina*10/period ' Вычисляем скважность
TMR1H=0 ' обнуляем таймер
TMR1L=0 '
end if
end sub
....
' Вывод ширины импульса
if shirina <= 0 then
Lcd_Out(1,4,"ERROR" )
else
WordToStr(shirina,shirina_ex)
Lcd_Out(1,4,shirina_ex )
end if
' Вывод скважеости импульсов
if skvazhnost <= 0 then
Lcd_Out(1,4,"ERROR" )
else
WordToStr(skvazhnost,skvazhnost_ex)
Lcd_Out(2,4,skvazhnost_ex)
Lcd_Out(2,6, "0," )
end if
Как видно из кода, я произвел умножение на 10(можно на 100,1000 и т.д.) и у меня выводит 3(33, 333 и т.д.), а мне нуно что б выводило 0,3(0.33,0.333).Я использовал переменную типа word, и так понимаю нуно использовать integer..НО...Для -- word Цитата:
Цитата:
И иче, как видно из кода предпоследняя строчка, я попытался вывести "0," -- он у меня моргает..Можно ли это как нить убрать(мот каким путем сдвига..??)... Скважность меняется от 0 до 1 |
|||
|
|
|
|
#802 |
|
Форумец
Сообщений: 4
Регистрация: 29.03.2011
|
Здравствуйте! Пытаюсь изучать программирование пиков, форум до конца не дочитал.
Подскажите, пожалуйста, как в микроси написать код для 12F509, её в списке нет. Хочу потренироваться на похожей схеме: radiohlam.ru/control/bipolar_step_motor.htm Флопик раскурочил, движёк шагает, правда не так как в статье. Фактически схема- две кнопки и два светодиода на землю. Логика такая- нажимаем кнопку "вперёд" - зажигается первый светодиод, второе нажатие- второй диод, третье- первый диод гаснет, четвёртое- гаснет и второй. Нажатие кнопки "назад"- из любого положения в обратном порядке. (типа фул-степ, можно и дорожку возле LB1838 порвать и зделать полушаг и др. - интересно!) |
|
|
|
|
#803 |
|
Форумец
|
|
|
|
|
|
#805 |
|
Форумец
Сообщений: 129
Регистрация: 18.02.2009
Возраст: 44
|
Всем добрый день.
Проведите ликбез на тему калибровочная константа в PIC-микроконтроллерах и с чем ее едят , пожалуйста. Я почитал немного - кругом советы как ее можно восстановить, какие предпринять меры и проч. Несколько вопросов: она (константа) актуальна только при работе от внутреннего генератора, а если работаем от внешнего кварца, то на нее можно забить? У меня программатор ЭкстраПик, софт icprog; МК - 16ф684. Проект работает от внешнего кварца 20МГц. Правильная ли последовательность моих действий - 1. читаем МК, последнюю ячейку переписываем на листок. 2. льем имеющийся hex-файл (а что делать с цифрами на бумажке????) 3. В софтине icprog надо устанавливать галочки о типе тактирования (НЧ, ВЧ), или "все уже внутри хекса"? Спасибо |
|
|
|
|
#806 | ||
|
Форумец
|
Цитата:
Тоже можете забить, у этого контроллера нет калибровочной константы. Цитата:
Что делать с калибровочной константой (актуально для распространенных PIC12F629, 675, PIC16F676 и т.д. см. DS)? 1. Прочитали чистый МК, записали на бумажку значение по адресу 0x3FF вида 0x34xx . 2. Загрузили в IC-Prog подготовленный hex. 3. Установили руками биты конфигурации (если надо). 4. Нашли в дампе памяти программ ячейку с адресом 0x3FF и руками в нее вместо 0x3FFF вставляем 0x34xx с бумажки. 5. Программируем. Если контроллер с константой, а Вы ее затерли, а программа работает с калибровочной константой, то берете и пишите в последнюю ячейку 0x3480, это будет середина диапазона калибровки. Если в программе нет кода для работы с калибровочной константой и особой точности при работе программы не требуется, то на константу можно забить. |
||
|
|
|
|
#807 |
|
Форумец
Сообщений: 129
Регистрация: 18.02.2009
Возраст: 44
|
petrd, огромное спасибо!
Прям нет слов - одна несущая! Низкий поклон. |
|
|
|
|
#808 | ||
|
Форумец
Сообщений: 7
Регистрация: 07.04.2011
|
Здравствуйте, petrd! Хочу спросить по следующему коду:
Цитата:
Цитата:
П.С. Пробовал с несколькими пультами стандарта RC-5, ситуация не изменилась. |
||
|
|
|
|
#809 | |
|
Форумец
|
Цитата:
2. RA4 подтянут резистором к +5в, к RA4 что-то подключено? 3. Как Вы видите эту проблему ( в железе, протеусе)? 4. Покажите код главного цикла main. |
|
|
|
|
|
#810 | |
|
Форумец
Сообщений: 7
Регистрация: 07.04.2011
|
По поводу RA4 - я указал кусок кода просто как пример, у меня RA4 в других целях используется.
Программу делаю для электронного регулятора громкости. Проявляется в том что, после нажатия кнопки смены режима (32) или любой другой кнопки, код приходит не 32 а той кнопки которая нажималась до этого. Вот код главного цикла, и процедура обработки кода с пду: Цитата:
|
|
|
|