Большой Воронежский Форум

Если это ваш первый визит, рекомендуем почитать справку по форуму. Для размещения своих сообщений необходимо зарегистрироваться. Для просмотра сообщений выберите раздел.
Вернуться   Большой Воронежский Форум » Компьютеры и все, что с ними связано » »Радиолюбитель
Программирование микроконтролеров,ремонт аудио/видео/бытовой техники,полезные устройства для дома,телефония, обсуждение статей журнала Радио

Ответ
 
Опции темы
Старый 21.02.2011, 09:31   #781   
Форумец
 
Сообщений: 8
Регистрация: 12.02.2011
Возраст: 49

Axell_2 вне форума Не в сети
Здравствуйте petrd...Спасибо за подсказку ..
У меня исче один вопрос к Вам..
Сделали счетчик импульсов..Для проверки ДОС..
Подсчет имульсов идет нормально, но нам исче необходимо высчитать сдвиг(смещение)...Как это можно реализовать..??
На фото то, что нуно вычислить(приблизительно)..
Импульсы идут с одинаковой(регулируемой) частотой..
Миниатюры
Нажмите на изображение для увеличения
Название: IMAG0397.jpg
Просмотров: 16
Размер:	39.8 Кб
ID:	1167694  
  Ответить с цитированием
Старый 21.02.2011, 13:21   #782   
Форумец
 
Сообщений: 1,525
Регистрация: 19.02.2009
Возраст: 53
Записей в дневнике: 1

petrd вне форума Не в сети
Цитата:
Сообщение от Axell_2 Посмотреть сообщение
Сделали счетчик импульсов..Для проверки ДОС..
ДОС - это что?
Частота импульсов какая?
  Ответить с цитированием
Старый 21.02.2011, 18:00   #783   
Форумец
 
Сообщений: 8
Регистрация: 12.02.2011
Возраст: 49

Axell_2 вне форума Не в сети
Цитата:
Сообщение от petrd Посмотреть сообщение
ДОС - это что?
Частота импульсов какая?
Датчик обратной связи..

Сча не помню какая, но завтра гляну на работе...
В принципе там такое соотношение:
1.2500имп. на оборот
2.1024имп. на оборот
3.1000имп. на оборот
4.100 имп. на оборот
Это четыре разных устройства..

Начало отсчета -- ноль метка.

А так завтра на работе могу сфоткать паспорт устройства и выслать Вам...
  Ответить с цитированием
Старый 21.02.2011, 21:22   #784   
Форумец
 
Сообщений: 1,525
Регистрация: 19.02.2009
Возраст: 53
Записей в дневнике: 1

petrd вне форума Не в сети
Цитата:
Сообщение от Axell_2 Посмотреть сообщение
Подсчет имульсов идет нормально, но нам исче необходимо высчитать сдвиг(смещение)...Как это можно реализовать..??
Вариантов много. Все зависит от частоты и нужной точности. Например, можно так. Запустить таймер. На INT подать первый сигнал - когда придет захватить значение таймера, второй сигнал завести на вход CCP, когда на него придет второй сигнал, снова захватить значение таймера, потом расчитать разницу первого и второго значения.
  Ответить с цитированием
Старый 21.02.2011, 21:45   #785   
Форумец
 
Сообщений: 1,525
Регистрация: 19.02.2009
Возраст: 53
Записей в дневнике: 1

petrd вне форума Не в сети
Цитата:
Сообщение от James_Kuk Посмотреть сообщение
Здравствуйте!!!!!!!!!!!!!
Попробую напечатать ссылку, т.к. вставленная не отправляется.
prolin-auto.ru/catalog/645/detail/3484/
Собрать дешевле и интересней, если нет образца или мыслей,
сколько будет стоить ваша прошивка??????????????
Заранее Спасибо!!!!!!!!!
По схеме http://www.proline-auto.ru/catalog/645/detail/3484/
у меня непонятки. Нафига заводить на вход контроллера сигнал с неисправного датчика? Он же вроде как умер! Что от него хотят получить?
Гемморно это, т.к. надо иметь машину с рабочими датчиками, потом во всех режимах двигателя записать сигналы с обоих датчиков, потом по этим записям выявить зависимости, зависимости перевести в какой-то упрощенный алгоритм, который (как мы думаем) должен удовлетворить ЭБУ, алгоритм прошить в контроллер, подсунуть это ЭБУ и смотреть на его реакцию, а если ЭБУ думает как-то не так как мы, то получим горящий Check и все сначала. Времени уйдет много, и врядли оно окупится.
  Ответить с цитированием
Старый 25.02.2011, 15:50   #786   
Форумец
 
Сообщений: 4
Регистрация: 17.02.2011
Возраст: 52

James_Kuk вне форума Не в сети
Цитата:
Сообщение от petrd Посмотреть сообщение
Нафига заводить на вход контроллера сигнал с неисправного датчика? Он же вроде как умер!
А если все датчики рабочие, а умер сам катализатор который мы просто выкинем
и поставим пламя гаситель. С ДК1 ( рабочей ) берем сигнал который практически
одинаковый у большенства авто и подаем на эмулятор который заменет ДК2.
Сигнал с ДК1 0.6 - 0.9 вольт, а с эмулятора нужно получить 0.1 - 0.4 вольта
и подать на ЭБУ !!!!!!!!! Где то так!!!!!!!!!
  Ответить с цитированием
Старый 25.02.2011, 16:03   #787   
Форумец
 
Сообщений: 1,525
Регистрация: 19.02.2009
Возраст: 53
Записей в дневнике: 1

petrd вне форума Не в сети
Цитата:
Сообщение от James_Kuk Посмотреть сообщение
А если все датчики рабочие, а умер сам катализатор который мы просто выкинем
и поставим пламя гаситель. С ДК1 ( рабочей ) берем сигнал который практически
одинаковый у большенства авто и подаем на эмулятор который заменет ДК2.
Сигнал с ДК1 0.6 - 0.9 вольт, а с эмулятора нужно получить 0.1 - 0.4 вольта
и подать на ЭБУ !!!!!!!!! Где то так!!!!!!!!!
Говорю ж не понял, теперь понятно. Только сигнал не просто надо занизить по уровню, а его надо сдвинуть ибо он там по идее импульсный должен быть.
  Ответить с цитированием
Старый 26.02.2011, 22:25   #788   
Форумец
 
Сообщений: 4
Регистрация: 17.02.2011
Возраст: 52

James_Kuk вне форума Не в сети
Цитата:
Сообщение от petrd Посмотреть сообщение
Только сигнал не просто надо занизить по уровню, а его надо сдвинуть ибо он там по идее импульсный должен быть.
Мой знакомый накида несколько вариантов, можно ли дорабатывать их ????????????????


Первый вариант:

#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   
Форумец
 
Сообщений: 1,525
Регистрация: 19.02.2009
Возраст: 53
Записей в дневнике: 1

petrd вне форума Не в сети
Цитата:
Сообщение от James_Kuk Посмотреть сообщение
Мой знакомый накидал несколько вариантов, можно ли дорабатывать их ????????????????
Конечно можно, но тогда эмулятором будет работать ПК (ноутбук, нетбук) в багажнике. Ваш знакомый видимо знает, что такое Си для ПК, но не знает особенностей Си для МК. Float, scanf и printf требуют огромных ресурсов и не всякий МК такое потянет, к тому же слова "ввод значения" и "вывод на печать" - это кто будет делать? В Вашем случае "ввод" - это АЦП, "вывод" это типа ЦАП, где это все?
Можете забыть про эти варианты!

Последний раз редактировалось petrd; 27.02.2011 в 12:13.
  Ответить с цитированием
Старый 13.03.2011, 05:49   #790   
Форумец
 
Сообщений: 12
Регистрация: 04.05.2010

moorzik вне форума Не в сети
Люди добрые не дайте стать дуроком

подскажите где взять хоть кусочек исходника для опроса нескольких датчиков ds18b20 по одному проводу так как не хватает у проца
  Ответить с цитированием
Старый 13.03.2011, 23:02   #791   
Форумец
 
Сообщений: 4
Регистрация: 13.03.2011
Возраст: 39

Feo787 вне форума Не в сети
Господа, большое спасибо за интереснейшую тему!
Начал изучать программирование 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);
}
Во вложении файл прошивки.
Большое спасибо за помощь!
Вложения
Тип файла: rar First.rar (1.7 Кб, 10 просмотров)
  Ответить с цитированием
Старый 14.03.2011, 13:05   #792   
Форумец
 
Сообщений: 1,525
Регистрация: 19.02.2009
Возраст: 53
Записей в дневнике: 1

petrd вне форума Не в сети
Цитата:
Сообщение от moorzik Посмотреть сообщение
подскажите где взять хоть кусочек исходника для опроса нескольких датчиков ds18b20 по одному проводу так как не хватает у проца
http://www.maxim-ic.com/app-notes/index.mvp/id/187
  Ответить с цитированием
Старый 14.03.2011, 15:26   #793   
Форумец
 
Сообщений: 82
Регистрация: 13.09.2010

Азат вне форума Не в сети
Feo787, Если взял из примера то примеры рабочие. Я конечно сам новичок,но помоему на твоем Pic16F876 по даташиту RX и TX используются ноги RC7 и RC6.
  Ответить с цитированием
Старый 14.03.2011, 15:38   #794   
Форумец
 
Сообщений: 1,525
Регистрация: 19.02.2009
Возраст: 53
Записей в дневнике: 1

petrd вне форума Не в сети
Цитата:
Сообщение от Азат Посмотреть сообщение
...но помоему на твоем Pic16F876 по даташиту RX и TX используются ноги RC7 и RC6.
Так у него Soft_Uart, вот только зачем, если там и аппаратный UART есть? Видимо потому как новичек.
  Ответить с цитированием
Старый 14.03.2011, 16:04   #795   
Форумец
 
Сообщений: 4
Регистрация: 13.03.2011
Возраст: 39

Feo787 вне форума Не в сети
Нет, я осознанно на софт перешел. Хочу попробовать именно данную конфигурацию.
  Ответить с цитированием
Старый 14.03.2011, 16:22   #796   
Форумец
 
Сообщений: 1,525
Регистрация: 19.02.2009
Возраст: 53
Записей в дневнике: 1

petrd вне форума Не в сети
Цитата:
Сообщение от Feo787 Посмотреть сообщение
Скачал microC PRO V 4.6, там переведенный хелп.
Это где это переведенный help для PRO появился ???
  Ответить с цитированием
Старый 14.03.2011, 16:58   #797   
Форумец
 
Сообщений: 4
Регистрация: 13.03.2011
Возраст: 39

Feo787 вне форума Не в сети
Цитата:
Сообщение от petrd Посмотреть сообщение
Это где это переведенный help для PRO появился ???
Имеется ввиду хелп по microC на русском. По программе можете помочь, в чем я таки не прав?
  Ответить с цитированием
Старый 14.03.2011, 17:30   #798   
Форумец
 
Сообщений: 1,525
Регистрация: 19.02.2009
Возраст: 53
Записей в дневнике: 1

petrd вне форума Не в сети
Цитата:
Сообщение от Feo787 Посмотреть сообщение
Имеется ввиду хелп по microC на русском. По программе можете помочь, в чем я таки не прав?
1. mikroC.
2. Не зря же новые версии стали PRO, а это значит, что что-то изменилось, в т.ч и в библиотеках и в help (в частности для Soft_Uart кое-что точно изменилось). Открываете help для PRO 4.60 и переведеный и находите в чем их различие.
3. Берете пример из help для 4.60 и делаете как в нем. Про пример из переводного можно забыть.
  Ответить с цитированием
Старый 19.03.2011, 21:32   #799   
Форумец
 
Сообщений: 8
Регистрация: 12.02.2011
Возраст: 49

Axell_2 вне форума Не в сети
Подскажите как правильно реализовать операцию деления с выводом на ЛСД трех знаков после запятой..
Пример. 0001(двоичн.)/0011(двоичн.)= 0,333(десятич.)
Если делить в дв. системе(как делает мк), то получится 0 в ответе. Я так понимаю, что для таких случаев нуно сделать какое-то преобразование и получить ответ в целых числах, а затем вывести на ЛСД , но как -- я не пойму..И как вывести полученный результат в виде 0,ххх
  Ответить с цитированием
Старый 20.03.2011, 17:24   #800   
Форумец
 
Сообщений: 1,525
Регистрация: 19.02.2009
Возраст: 53
Записей в дневнике: 1

petrd вне форума Не в сети
Цитата:
Сообщение от Axell_2 Посмотреть сообщение
Подскажите как правильно реализовать операцию деления с выводом на ЛСД трех знаков после запятой..
Пример. 0001(двоичн.)/0011(двоичн.)= 0,333(десятич.)
Если делить в дв. системе(как делает мк), то получится 0 в ответе. Я так понимаю, что для таких случаев нуно сделать какое-то преобразование и получить ответ в целых числах, а затем вывести на ЛСД , но как -- я не пойму..И как вывести полученный результат в виде 0,ххх
Именно для Вашего примера можно так:
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

Axell_2 вне форума Не в сети
Цитата:
Сообщение от petrd Посмотреть сообщение
...Вообще решение Вашей задачи зависит от того, что Вам на что надо делить и откуда оно берется и какой компилятор используете.
Это исп-ся в программе по обработке импульсов, в частности для вычисления скважности сигнала..

Пограмма на 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
Цитата:
Выходная строка должна иметь длину, как минимум, 6 символов
, а для integer --
Цитата:
Выходная строка должна иметь длину, как минимум, 7 символов
-- мне это не приемлемо(ограничено индикатором)..
И иче, как видно из кода предпоследняя строчка, я попытался вывести "0," -- он у меня моргает..Можно ли это как нить убрать(мот каким путем сдвига..??)...


Скважность меняется от 0 до 1
Миниатюры
Нажмите на изображение для увеличения
Название: Лсд.JPG
Просмотров: 43
Размер:	46.5 Кб
ID:	1215571  
  Ответить с цитированием
Старый 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   
Форумец
 
Сообщений: 1,525
Регистрация: 19.02.2009
Возраст: 53
Записей в дневнике: 1

petrd вне форума Не в сети
Цитата:
Сообщение от Вовка-Морковка Посмотреть сообщение
Подскажите, пожалуйста, как в микроси написать код для 12F509, её в списке нет.
Никак. Раз его нет, значит, он его не поддерживает. Используйте другой компилятор или другой контроллер.
  Ответить с цитированием
Старый 29.03.2011, 13:04   #804   
Форумец
 
Сообщений: 5
Регистрация: 15.08.2010

Roma4ka вне форума Не в сети
Всем привет!)
кто-то проверял пост #635 В ПРАКТИКЕ?
если есть у кого-то рабочая программам в этом духе поделитесь...
(необходимо управлять симистором)
  Ответить с цитированием
Старый 29.03.2011, 15:34   #805   
Форумец
 
Сообщений: 129
Регистрация: 18.02.2009
Возраст: 43

tranzistor вне форума Не в сети
Всем добрый день.
Проведите ликбез на тему калибровочная константа в PIC-микроконтроллерах и с чем ее едят , пожалуйста.
Я почитал немного - кругом советы как ее можно восстановить, какие предпринять меры и проч.
Несколько вопросов: она (константа) актуальна только при работе от внутреннего генератора, а если работаем от внешнего кварца, то на нее можно забить?
У меня программатор ЭкстраПик, софт icprog; МК - 16ф684. Проект работает от внешнего кварца 20МГц. Правильная ли последовательность моих действий -
1. читаем МК, последнюю ячейку переписываем на листок.
2. льем имеющийся hex-файл (а что делать с цифрами на бумажке????)
3. В софтине icprog надо устанавливать галочки о типе тактирования (НЧ, ВЧ), или "все уже внутри хекса"?
Спасибо
  Ответить с цитированием
Старый 29.03.2011, 16:06   #806   
Форумец
 
Сообщений: 1,525
Регистрация: 19.02.2009
Возраст: 53
Записей в дневнике: 1

petrd вне форума Не в сети
Цитата:
Сообщение от tranzistor Посмотреть сообщение
Несколько вопросов: она (константа) актуальна только при работе от внутреннего генератора, а если работаем от внешнего кварца, то на нее можно забить?
Да, если кварц внешний, то можно забить.
Цитата:
Сообщение от tranzistor Посмотреть сообщение
У меня программатор ЭкстраПик, софт icprog; МК - 16ф684.
Тоже можете забить, у этого контроллера нет калибровочной константы.
Цитата:
Сообщение от tranzistor Посмотреть сообщение
Проект работает от внешнего кварца 20МГц. Правильная ли последовательность моих действий -
1. читаем МК, последнюю ячейку переписываем на листок.
2. льем имеющийся hex-файл (а что делать с цифрами на бумажке????)
3. В софтине icprog надо устанавливать галочки о типе тактирования (НЧ, ВЧ), или "все уже внутри хекса"?
Спасибо
Если при компиляции Вы указывали конфигурацию, то при загрузке hex в IC-Prog Вы увидите, какие биты Вы указали при компиляции. Если при компиляции Вы программе биты не указывали, то IC-Prog покажет биты по умолчанию (по-моему, типа что там все биты в 1). И тогда уже надо руками ставить нужные галки.
Что делать с калибровочной константой (актуально для распространенных 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

tranzistor вне форума Не в сети
petrd, огромное спасибо!
Прям нет слов - одна несущая! Низкий поклон.
  Ответить с цитированием
Старый 07.04.2011, 09:51   #808   
Форумец
 
Сообщений: 7
Регистрация: 07.04.2011

Andrey T вне форума Не в сети
Здравствуйте, petrd! Хочу спросить по следующему коду:
Цитата:
Сообщение от petrd Посмотреть сообщение
Программа - декодер формата RC5. Нашел в сети, переделал, работает.
Выводит на ЖКИ принятый сигнал, разложенный в соответствии со стандартом RC5 (номер системы, номер команды, управляющий бит) + количество повторов.
Код:
/***********************************************************************************
*               ПРОГРАММА ДЕКОДИРОВАНИЯ ПРОТОКОЛА  IR PHILIPS RC5                  *
************************************************************************************
* Для приемника RC5 с инверсным выходом (= активный выходной уровень низкий,)      *
* например, TSOP1736. Выход приемника RC5 подключен к выводу внешнего прерывания   *
* INT(RB0).                                                                        *
*                                                                                  *
************************************************************************************
*Алгоритм :                                                                        *
*~~~~~~~~~                                                                         *
* При каждом изменении входного сигнала от приемника RC5 генерируется прерывание.  *
* В обработчике измеряется время между двумя следующими друг за другом изменениями.*
* На основании измеренной разницы делается вывод: одиночный или двойной импульс.   *
* Если измеренное время находится вне допустимого интервала принятый код считается *
* недостоверным и обработчик переводит себя в исходное состояние. В стейт-машине   *
* используется три состояния: IDLE (СВОБОДЕН), DECODING (ДЕКОДИРОВАНИЕ) и          *
* COMPLETED (ЗАВЕРШЕНО).                                                           *
************************************************************************************
* Hardware config : 16F628A @ 4Mhz  + TSOP1736 + LED + LCD                         *
* -------------------------------------------------------------------------------- *
* LED on RA0 (active when port high)                                               *
* TSOP-1736 : Output pin connected to RB0 (active when low)                        *
* LCD : WH1602 on PORTB : bits 7..4 = DB7...DB4/bit 3 = EN/bit 2 = RS/ GND = RW    *
* Note : when using a different Crystal speed, you will need to change prescaler   *
* in the main program and potentially the counters in the definition section       *
***********************************************************************************/

//-----------------------------------------------------------------------------
// Hardware specific settings
//-----------------------------------------------------------------------------
#define LED_On()      (RA0_bit=1)
#define LED_Off()     (RA0_bit=0)
#define LED_Toggle()  (RA0_bit=~RA0_bit)

#define IR_PIN        (RB0_bit)

//-----------------------------------------------------------------------------
// Predefined constants
//------------------------------------------------------------------------------
#define RC5_NR_Bits   14

// Всего должно быть захвачено 14 RC5_Bits (первый "стартбит" уже есть
// при первом прерывании)
// Формат принимаемых бит:
// - 2 стартовых бита (оба "1")
// - 1 управляющий бит (изменяется всякий раз когда отправлена новая команда)
// - 5 системных бит, старшим битом вперед (номер системы)
// - 6 командных бит, старшим битом вперед (номер команды)
// Биты распознаются между 2-мя фронтами сигнала RC5:
// - "длинный" означает: принятый бит отличается от предыдущего
// - два "коротких" означает: принятый бит эквивалентен предыдущему биту,
//   первый стартовый бит всегда равен "1"

#define RC5_TIME_BOUNDARY       83  // граница, ниже 83 = короткий, выше = длинный (0.75 bittime)
#define RC5_TIME_TOO_SHORT      28  // (0.25 bittime)
#define RC5_TIME_TOO_LONG      140  // (1.25 bittime)

// 1 bit time = 1778 uS
//    "короткий" время = 1/2 bittime = 889 uS, = timer value 55.5 (= 889/16)
//    "длинный"  время = 1 bittime = 1778 uS,  = timer value 111.12 (=1778/16)

//-----------------------------------------------------------------------------
// Global variables
//-----------------------------------------------------------------------------
// LCD module connections
sbit LCD_RS at RB2_bit;
sbit LCD_EN at RB3_bit;
sbit LCD_D4 at RB4_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D6 at RB6_bit;
sbit LCD_D7 at RB7_bit;

sbit LCD_RS_Direction at TRISB2_bit;
sbit LCD_EN_Direction at TRISB3_bit;
sbit LCD_D4_Direction at TRISB4_bit;
sbit LCD_D5_Direction at TRISB5_bit;
sbit LCD_D6_Direction at TRISB6_bit;
sbit LCD_D7_Direction at TRISB7_bit;
// End LCD module connections

enum {
      RC5_IDLE,
      RC5_DECODING,
      RC5_COMPLETED
} RC5_state = RC5_IDLE ;

unsigned int   RC5_bits ;               // содержит принятые биты
unsigned char  RC5_bitCount ;           // счетчик обработанных битов
unsigned char  RC5_prevBit ;            // значение предыдущего бита
unsigned char  RC5_shortPulses ;        // число последовательных коротких бит

struct
{
    toggle   : 1 ;
    device   : 5 ;
    command  : 6 ;
    received : 1 ;
} IR ;

//-----------------------------------------------------------------------------
// Прототипы функций
//-----------------------------------------------------------------------------
void  Lcd_INT (int row, int col, int x, unsigned char len);

//------------------------------------------------------------------------------
// Обработчик прерывания
//------------------------------------------------------------------------------
void interrupt()
{
     unsigned char time;

     // прерывание по INT/RB0
     if (INTF_bit)
     {
       LED_Toggle () ;

       INTEDG_bit = 1-INTEDG_bit ; //переключение INTEDG (фронт-спад INT)
       INTF_bit = 0;

       time = TMR0;       // захват значения таймера
       TMR0 = 0;          // перезапуск таймера

       switch (RC5_state)
       {
           ////////// СВОБОДЕН. НИЧЕГО НЕ ПОЛУЧЕНО ////////////////////////////
           case RC5_IDLE :
                RC5_bits        = 1; // already 1 bit (with value "1") received
                RC5_bitCount    = 1;
                RC5_shortPulses = 0;
                RC5_prevBit     = 1;
                RC5_state       = RC5_DECODING;

                T0IF_bit = 0; // сброс флага переполнения TMR0
                T0IE_bit = 1; // разрешить прерывания TMR0
                break ;

           ////////// ЗАФИКСИРОВАННО ИЗМЕНЕНИЕ. НАЧИНАЕМ ОБРАБОТКУ БИТ /////////
           case RC5_DECODING :  // Execution time is about 52 uS at 4 Mhz CPU clock
                if ((time > RC5_TIME_TOO_SHORT) && (time < RC5_TIME_TOO_LONG))
                {
                     if (time < RC5_TIME_BOUNDARY) // обнаружен короткий импульс
                     {
                        RC5_shortPulses ++ ;
                        if (RC5_shortPulses == 2)
                        {
                           RC5_bits <<= 1;          // сохраняем принятый бит
                           RC5_bits |= RC5_PrevBit;
                           RC5_bitCount ++ ;
                           RC5_shortPulses = 0;
                        }
                     } else {    // обнаружен длинный импульс
                        RC5_prevBit = 1- RC5_prevBit;  // переключаем бит
                        RC5_bits <<= 1;                // сохраняем принятый бит
                        RC5_Bits |= RC5_PrevBit;
                        RC5_bitCount ++ ;
                        RC5_shortPulses = 0;
                     }

                     if (RC5_bitCount == RC5_NR_Bits)// если приняты все биты
                     {
                        RC5_state = RC5_COMPLETED;
                        INTEDG_bit = 0; // следующее прерывание по спаду
                        T0IE_bit = 0;   // отключить прерывания от TMR0
                     }
                } else { // что-то не правильно с временами
                     RC5_state = RC5_IDLE;  // начать сначала
                     INTEDG_bit = 0;        // следующее прерывание по спаду
                     T0IE_bit  = 0;         // отключить прерывания от TMR0
                }
                break ;

           /////////// ВСЕ БИТЫ ПРИНЯТЫ КОРРЕКТНО. Сохранение данных ///////////
           case RC5_COMPLETED :
                INTEDG_bit = 0; // следующее прерывание по спаду
                IR.toggle = ((RC5_bits>>11) & 0x01) ? 0 : 1 ;
                IR.device =  (RC5_bits>>6) & 0b00011111 ;
                IR.command=  (RC5_bits & 0b00111111) ;
                IR.received = 1 ;
                RC5_state = RC5_IDLE ;
                break ;

       } // end switch
     } // end INIF

     // Прерывание TMR0
     if (T0IF_bit)  // Переполнение TMR0, тайм-аут
     {
        if (RC5_state == RC5_DECODING) // что-то неправильно
        {
           RC5_state = RC5_IDLE;  // начать с начала
           LED_Off();
           INTEDG_bit = 0;        // следующее прерывание по спаду
           T0IE_bit  = 0;         // отключить прерывания TMR0
        }
     }

     T0IF_bit = 0; // всегда сбрасывать флаг переполнения TMR0

} // конец обработчика прерывания

//------------------------------------------------------------------------------
// MAIN PROGRAM
//------------------------------------------------------------------------------
void main ()
{
     unsigned int dev, cmd ;
     unsigned int repeat ;
     unsigned char last_toggle ;

     // инициализация стейт машины
     RC5_state = RC5_IDLE ;
 
    // инициализация регистров
    CMCON  = 0x07 ;         // отключить компараторы
    
    PORTA  = 0;
    TRISA = 0;
    
    PORTB = 0;
    TRISB = 0b00000001;     // PORTB D7-D1 = LCD  / D0 = IR приемник

    // Настройка TMR0  -->  Настройки зависят от кварца
    // Настройки TMR0  : Предделитель = 1:16 -  1 тик = 16 usec / 62.5 Khz
    OPTION_REG = 0x83;
    TMR0  = 0;  // предустановка TMR0

    T0IF_bit = 0;
    T0IE_bit = 0;      // отключить прерывания от TMR0

    // Enable external interrupt
    INTEDG_bit    = 0;            // начинаем со спада
    INTF_bit      = 0;            // сброс флага прерывания INT
    INTE_bit      = 1;            // разрешить прерывание INT
    GIE_bit       = 1;            // разрешить все прерывания

    // Инициализация LCD
    LCD_Init();
    Lcd_Cmd(_LCD_CURSOR_OFF);                  // Выключить курсор
    Lcd_Out (1, 1, "  Philips RC5") ;
    Lcd_Out (2, 1, "    Decoder  ") ;

    IR.received = 0 ;
    last_toggle = 2 ; // Невозможное значение

    // главный цикл программы

    while (1)
    {
          if (IR.received) {
             dev = IR.device ;
             cmd = IR.command;
             IR.received = 0 ;  // Команда обработана

             if (last_toggle == IR.toggle)
             {
                repeat ++ ;
             } 
             else
             {
                repeat = 0 ;
                last_toggle = IR.toggle;
             }

             LCD_Out (1, 1, "DEV CMD TOG CNT") ;
             LCD_INT (2, 1, dev, 3) ;
             LCD_Chr (2, 4, ' ');
             LCD_INT (2, 5, cmd, 3) ;
             LCD_Chr (2, 8, ' ');
             LCD_Out (2, 9, IR.toggle ? " T  ":"    ") ;
             LCD_INT (2, 13, repeat, 3) ;
          }
          Delay_ms (250) ;
    }
} // end main

//------------------------------------------------------------------------------
// ДОПОЛНИТЕЛЬНЫЕ ПОДПРОГРАММЫ
//------------------------------------------------------------------------------

//------------------------------------------------------------------------------
void  Lcd_INT (int row, int col, int x, unsigned char size)
{
      static char txt[7] ;
      int i ;

      IntToStr (x, txt) ;
      for (i=0; i<7; i++) if (txt[i] == ' ') txt[i] = '0' ;
      Lcd_Out(row, col, txt+(6-size)) ;
}
Ситуация такая же как и у Азата:
Цитата:
Сообщение от Азат Посмотреть сообщение
Здраствуйте petrd, Простите за не внимательность сейчас попробую.Обновил MikroC Pro и все проблемы с зависанием исчезли.

if(IR.received == 1) {
switch(IR.command)
{
case 1: RA4_bit = ~RA4_bit; break; // на ПДУ нажата кнопка "1", переключить RA4
}
IR.received = 0;
}
Если рассматривать данный пример он же никак не должен включаться и выключаться от кнопки 2. Нажал один включился.нажал два.нажал один.нажал два выключился.
Программа работает реагирует на нажатия кнопок пульта, но через несколько нажатий начинает глючить, допустим была нажата кнопка 1, затем при нажатии на кнопку 2, программа интерпретирует ее как будто была нажата кнопка 1, следующее нажатие на кнопку 2 как и положено отрабатывает правильно. В чем может быть дело.
П.С. Пробовал с несколькими пультами стандарта RC-5, ситуация не изменилась.
  Ответить с цитированием
Старый 07.04.2011, 14:13   #809   
Форумец
 
Сообщений: 1,525
Регистрация: 19.02.2009
Возраст: 53
Записей в дневнике: 1

petrd вне форума Не в сети
Цитата:
Сообщение от Andrey T Посмотреть сообщение
Программа работает реагирует на нажатия кнопок пульта, но через несколько нажатий начинает глючить, допустим была нажата кнопка 1, затем при нажатии на кнопку 2, программа интерпретирует ее как будто была нажата кнопка 1, следующее нажатие на кнопку 2 как и положено отрабатывает правильно. В чем может быть дело.
П.С. Пробовал с несколькими пультами стандарта RC-5, ситуация не изменилась.
1. RA4 настроен на выход?
2. RA4 подтянут резистором к +5в, к RA4 что-то подключено?
3. Как Вы видите эту проблему ( в железе, протеусе)?
4. Покажите код главного цикла main.
  Ответить с цитированием
Старый 07.04.2011, 15:07   #810   
Форумец
 
Сообщений: 7
Регистрация: 07.04.2011

Andrey T вне форума Не в сети
По поводу RA4 - я указал кусок кода просто как пример, у меня RA4 в других целях используется.

Программу делаю для электронного регулятора громкости. Проявляется в том что, после нажатия кнопки смены режима (32) или любой другой кнопки, код приходит не 32 а той кнопки которая нажималась до этого.

Вот код главного цикла, и процедура обработки кода с пду:
Цитата:
void ir()
{
if (RC5.received) {
cmd = RC5.command;
RC5.received = 0 ; // Команда обработана
if (cmd==16) vol_up();
if (cmd==17) vol_down();
if (cmd==11) rez_stb();
if (cmd==12) rez_mute();
if (cmd==32) rez_mode_up();
if (cmd==33) rez_mode_down();
}
}

void main(){
// инициализация стейт машины
RC5_state = RC5_IDLE ;
CMCON = 0x07;
OPTION_REG = 0x03;

TRISB = 0b01110001;
PORTB = 0b00000000;
TRISA = 0b01000000;
PORTA = 0b00000011;

// Настройка TMR0 --> Настройки зависят от кварца
// Настройки TMR0 : Предделитель = 1:16 - 1 тик = 16 usec / 62.5 Khz
TMR0 = 0; // предустановка TMR0
T0IF_bit = 0;
T0IE_bit = 0; // отключить прерывания от TMR0

// Enable external interrupt
INTEDG_bit = 0; // начинаем со спада
INTF_bit = 0; // сброс флага прерывания INT
INTE_bit = 1; // разрешить прерывание INT
GIE_bit = 1; // разрешить все прерывания

RC5.received = 0 ;

Lcd_Init();
Lcd_Cmd(_LCD_CURSOR_OFF);
Soft_I2C_Init();

do {
buttons();
encoder();
ir();
} while(1); // бесконечный цикл
}
  Ответить с цитированием
Поиск в теме: 



Быстрый переход:

  Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Support by DrIQ & Netwind