Если это ваш первый визит, рекомендуем почитать справку по форуму. Для размещения своих сообщений необходимо зарегистрироваться. Для просмотра сообщений выберите раздел. |
PIC контроллеры. Программаторы и первый проект на PIC |
Программирование микроконтролеров,ремонт аудио/видео/бытовой техники,полезные устройства для дома,телефония, обсуждение статей журнала Радио |
|
Опции темы |
21.02.2011, 09:31 | #781 |
Форумец
Сообщений: 8
Регистрация: 12.02.2011
Возраст: 49
Не в сети |
Здравствуйте petrd...Спасибо за подсказку ..
У меня исче один вопрос к Вам.. Сделали счетчик импульсов..Для проверки ДОС.. Подсчет имульсов идет нормально, но нам исче необходимо высчитать сдвиг(смещение)...Как это можно реализовать..?? На фото то, что нуно вычислить(приблизительно).. Импульсы идут с одинаковой(регулируемой) частотой.. |
21.02.2011, 18:00 | #783 |
Форумец
Сообщений: 8
Регистрация: 12.02.2011
Возраст: 49
Не в сети |
Датчик обратной связи..
Сча не помню какая, но завтра гляну на работе... В принципе там такое соотношение: 1.2500имп. на оборот 2.1024имп. на оборот 3.1000имп. на оборот 4.100 имп. на оборот Это четыре разных устройства.. Начало отсчета -- ноль метка. А так завтра на работе могу сфоткать паспорт устройства и выслать Вам... |
21.02.2011, 21:22 | #784 |
Форумец
|
Вариантов много. Все зависит от частоты и нужной точности. Например, можно так. Запустить таймер. На INT подать первый сигнал - когда придет захватить значение таймера, второй сигнал завести на вход CCP, когда на него придет второй сигнал, снова захватить значение таймера, потом расчитать разницу первого и второго значения.
|
21.02.2011, 21:45 | #785 | |
Форумец
|
Цитата:
у меня непонятки. Нафига заводить на вход контроллера сигнал с неисправного датчика? Он же вроде как умер! Что от него хотят получить? Гемморно это, т.к. надо иметь машину с рабочими датчиками, потом во всех режимах двигателя записать сигналы с обоих датчиков, потом по этим записям выявить зависимости, зависимости перевести в какой-то упрощенный алгоритм, который (как мы думаем) должен удовлетворить ЭБУ, алгоритм прошить в контроллер, подсунуть это ЭБУ и смотреть на его реакцию, а если ЭБУ думает как-то не так как мы, то получим горящий Check и все сначала. Времени уйдет много, и врядли оно окупится. |
|
25.02.2011, 15:50 | #786 | |
Форумец
Сообщений: 4
Регистрация: 17.02.2011
Возраст: 52
Не в сети |
Цитата:
и поставим пламя гаситель. С ДК1 ( рабочей ) берем сигнал который практически одинаковый у большенства авто и подаем на эмулятор который заменет ДК2. Сигнал с ДК1 0.6 - 0.9 вольт, а с эмулятора нужно получить 0.1 - 0.4 вольта и подать на ЭБУ !!!!!!!!! Где то так!!!!!!!!! |
|
25.02.2011, 16:03 | #787 | |
Форумец
|
Цитата:
|
|
26.02.2011, 22:25 | #788 | |
Форумец
Сообщений: 4
Регистрация: 17.02.2011
Возраст: 52
Не в сети |
Цитата:
Первый вариант: #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 (данное значение подаем на выход эмулятора) } } |
|
27.02.2011, 11:28 | #789 | |
Форумец
|
Цитата:
Можете забыть про эти варианты! Последний раз редактировалось petrd; 27.02.2011 в 12:13. |
|
13.03.2011, 23:02 | #791 |
Форумец
Сообщений: 4
Регистрация: 13.03.2011
Возраст: 39
Не в сети |
Господа, большое спасибо за интереснейшую тему!
Начал изучать программирование 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); } Большое спасибо за помощь! |
14.03.2011, 13:05 | #792 | |
Форумец
|
Цитата:
|
|
14.03.2011, 15:38 | #794 |
Форумец
|
|
14.03.2011, 17:30 | #798 | |
Форумец
|
Цитата:
2. Не зря же новые версии стали PRO, а это значит, что что-то изменилось, в т.ч и в библиотеках и в help (в частности для Soft_Uart кое-что точно изменилось). Открываете help для PRO 4.60 и переведеный и находите в чем их различие. 3. Берете пример из help для 4.60 и делаете как в нем. Про пример из переводного можно забыть. |
|
19.03.2011, 21:32 | #799 |
Форумец
Сообщений: 8
Регистрация: 12.02.2011
Возраст: 49
Не в сети |
Подскажите как правильно реализовать операцию деления с выводом на ЛСД трех знаков после запятой..
Пример. 0001(двоичн.)/0011(двоичн.)= 0,333(десятич.) Если делить в дв. системе(как делает мк), то получится 0 в ответе. Я так понимаю, что для таких случаев нуно сделать какое-то преобразование и получить ответ в целых числах, а затем вывести на ЛСД , но как -- я не пойму..И как вывести полученный результат в виде 0,ххх |
20.03.2011, 17:24 | #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); |
|
20.03.2011, 22:21 | #801 | |||
Форумец
Сообщений: 8
Регистрация: 12.02.2011
Возраст: 49
Не в сети |
Цитата:
Пограмма на 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 |
|||
29.03.2011, 09:32 | #802 |
Форумец
Сообщений: 4
Регистрация: 29.03.2011
Не в сети |
Здравствуйте! Пытаюсь изучать программирование пиков, форум до конца не дочитал.
Подскажите, пожалуйста, как в микроси написать код для 12F509, её в списке нет. Хочу потренироваться на похожей схеме: radiohlam.ru/control/bipolar_step_motor.htm Флопик раскурочил, движёк шагает, правда не так как в статье. Фактически схема- две кнопки и два светодиода на землю. Логика такая- нажимаем кнопку "вперёд" - зажигается первый светодиод, второе нажатие- второй диод, третье- первый диод гаснет, четвёртое- гаснет и второй. Нажатие кнопки "назад"- из любого положения в обратном порядке. (типа фул-степ, можно и дорожку возле LB1838 порвать и зделать полушаг и др. - интересно!) |
29.03.2011, 09:51 | #803 |
Форумец
|
|
29.03.2011, 15:34 | #805 |
Форумец
Сообщений: 129
Регистрация: 18.02.2009
Возраст: 43
Не в сети |
Всем добрый день.
Проведите ликбез на тему калибровочная константа в PIC-микроконтроллерах и с чем ее едят , пожалуйста. Я почитал немного - кругом советы как ее можно восстановить, какие предпринять меры и проч. Несколько вопросов: она (константа) актуальна только при работе от внутреннего генератора, а если работаем от внешнего кварца, то на нее можно забить? У меня программатор ЭкстраПик, софт icprog; МК - 16ф684. Проект работает от внешнего кварца 20МГц. Правильная ли последовательность моих действий - 1. читаем МК, последнюю ячейку переписываем на листок. 2. льем имеющийся hex-файл (а что делать с цифрами на бумажке????) 3. В софтине icprog надо устанавливать галочки о типе тактирования (НЧ, ВЧ), или "все уже внутри хекса"? Спасибо |
29.03.2011, 16:06 | #806 | ||
Форумец
|
Цитата:
Тоже можете забить, у этого контроллера нет калибровочной константы. Цитата:
Что делать с калибровочной константой (актуально для распространенных PIC12F629, 675, PIC16F676 и т.д. см. DS)? 1. Прочитали чистый МК, записали на бумажку значение по адресу 0x3FF вида 0x34xx . 2. Загрузили в IC-Prog подготовленный hex. 3. Установили руками биты конфигурации (если надо). 4. Нашли в дампе памяти программ ячейку с адресом 0x3FF и руками в нее вместо 0x3FFF вставляем 0x34xx с бумажки. 5. Программируем. Если контроллер с константой, а Вы ее затерли, а программа работает с калибровочной константой, то берете и пишите в последнюю ячейку 0x3480, это будет середина диапазона калибровки. Если в программе нет кода для работы с калибровочной константой и особой точности при работе программы не требуется, то на константу можно забить. |
||
29.03.2011, 18:54 | #807 |
Форумец
Сообщений: 129
Регистрация: 18.02.2009
Возраст: 43
Не в сети |
petrd, огромное спасибо!
Прям нет слов - одна несущая! Низкий поклон. |
07.04.2011, 09:51 | #808 | ||
Форумец
Сообщений: 7
Регистрация: 07.04.2011
Не в сети |
Здравствуйте, petrd! Хочу спросить по следующему коду:
Цитата:
Цитата:
П.С. Пробовал с несколькими пультами стандарта RC-5, ситуация не изменилась. |
||
07.04.2011, 14:13 | #809 | |
Форумец
|
Цитата:
2. RA4 подтянут резистором к +5в, к RA4 что-то подключено? 3. Как Вы видите эту проблему ( в железе, протеусе)? 4. Покажите код главного цикла main. |
|
07.04.2011, 15:07 | #810 | |
Форумец
Сообщений: 7
Регистрация: 07.04.2011
Не в сети |
По поводу RA4 - я указал кусок кода просто как пример, у меня RA4 в других целях используется.
Программу делаю для электронного регулятора громкости. Проявляется в том что, после нажатия кнопки смены режима (32) или любой другой кнопки, код приходит не 32 а той кнопки которая нажималась до этого. Вот код главного цикла, и процедура обработки кода с пду: Цитата:
|
|