Сообщение от Axell_2:
Сделали счетчик импульсов..Для проверки ДОС..
Сообщение от petrd:
ДОС - это что?
Частота импульсов какая?
Сообщение от Axell_2:
Подсчет имульсов идет нормально, но нам исче необходимо высчитать сдвиг(смещение)...Как это можно реализовать..??
Сообщение от James_Kuk:
Здравствуйте!!!!!!!!!!!!!
Попробую напечатать ссылку, т.к. вставленная не отправляется.
prolin-auto.ru/catalog/645/detail/3484/
Собрать дешевле и интересней, если нет образца или мыслей,
сколько будет стоить ваша прошивка??????????????
Заранее Спасибо!!!!!!!!!
Сообщение от petrd:
Нафига заводить на вход контроллера сигнал с неисправного датчика? Он же вроде как умер!
Сообщение от James_Kuk:
А если все датчики рабочие, а умер сам катализатор который мы просто выкинем
и поставим пламя гаситель. С ДК1 ( рабочей ) берем сигнал который практически
одинаковый у большенства авто и подаем на эмулятор который заменет ДК2.
Сигнал с ДК1 0.6 - 0.9 вольт, а с эмулятора нужно получить 0.1 - 0.4 вольта
и подать на ЭБУ !!!!!!!!! Где то так!!!!!!!!!
Сообщение от petrd:
Только сигнал не просто надо занизить по уровню, а его надо сдвинуть ибо он там по идее импульсный должен быть.
Сообщение от James_Kuk:
Мой знакомый накидал несколько вариантов, можно ли дорабатывать их ????????????????
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);
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); }
Сообщение от moorzik:
подскажите где взять хоть кусочек исходника для опроса нескольких датчиков ds18b20 по одному проводу так как не хватает у проца
Сообщение от Азат:
...но помоему на твоем Pic16F876 по даташиту RX и TX используются ноги RC7 и RC6.
Сообщение от Feo787:
Скачал microC PRO V 4.6, там переведенный хелп.
Сообщение от petrd:
Это где это переведенный help для PRO появился ???
Сообщение от Feo787:
Имеется ввиду хелп по microC на русском. По программе можете помочь, в чем я таки не прав?
Сообщение от Axell_2:
Подскажите как правильно реализовать операцию деления с выводом на ЛСД трех знаков после запятой..
Пример. 0001(двоичн.)/0011(двоичн.)= 0,333(десятич.)
Если делить в дв. системе(как делает мк), то получится 0 в ответе. Я так понимаю, что для таких случаев нуно сделать какое-то преобразование и получить ответ в целых числах, а затем вывести на ЛСД , но как -- я не пойму..И как вывести полученный результат в виде 0,ххх
float ff1, ff2, ff3; char txt[15]; ...... ff1 = 1; ff2 = 3; ff3 = ff1/ff2; FloatToStr(ff3, txt); Lcd_Out(1, 1,txt);
Сообщение от petrd:
...Вообще решение Вашей задачи зависит от того, что Вам на что надо делить и откуда оно берется и какой компилятор используете.
... 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
Сообщение от :
Выходная строка должна иметь длину, как минимум, 6 символов
Сообщение от :
Выходная строка должна иметь длину, как минимум, 7 символов
Сообщение от Вовка-Морковка:
Подскажите, пожалуйста, как в микроси написать код для 12F509, её в списке нет.
Сообщение от tranzistor:
Несколько вопросов: она (константа) актуальна только при работе от внутреннего генератора, а если работаем от внешнего кварца, то на нее можно забить?
Сообщение от tranzistor:
У меня программатор ЭкстраПик, софт icprog; МК - 16ф684.
Сообщение от tranzistor:
Проект работает от внешнего кварца 20МГц. Правильная ли последовательность моих действий -
1. читаем МК, последнюю ячейку переписываем на листок.
2. льем имеющийся hex-файл (а что делать с цифрами на бумажке????)
3. В софтине icprog надо устанавливать галочки о типе тактирования (НЧ, ВЧ), или "все уже внутри хекса"?
Спасибо
Сообщение от 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. Нажал один включился.нажал два.нажал один.нажал два выключился.
Сообщение от Andrey T:
Программа работает реагирует на нажатия кнопок пульта, но через несколько нажатий начинает глючить, допустим была нажата кнопка 1, затем при нажатии на кнопку 2, программа интерпретирует ее как будто была нажата кнопка 1, следующее нажатие на кнопку 2 как и положено отрабатывает правильно. В чем может быть дело.
П.С. Пробовал с несколькими пультами стандарта RC-5, ситуация не изменилась.
Сообщение от :
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); // бесконечный цикл
}