Декодирование протокола парктроника

Обсуждаем электронику на колесах. Нужен увлажнитель воздуха для Камаза? Вам сюда.
Аватара пользователя
Albert_V
Друг Кота
Сообщения: 4119
Зарегистрирован: Чт сен 12, 2013 00:54:12
Откуда: ЗаМКАДье. Там, где ЦУП

Re: Декодирование протокола парктроника

Сообщение Albert_V »

Dmitry888 писал(а):...Получаю немного не то что ожидал...
Флаг прерывания (INT0IF) устанавливается независимо от того разрешено прерывание или нет. Т.е., перед разрешением прерывания надо снять флаг прерывания.
Реклама
Dmitry888
Встал на лапы
Сообщения: 131
Зарегистрирован: Чт мар 05, 2015 07:14:58

Re: Декодирование протокола парктроника

Сообщение Dmitry888 »

Albert_V писал(а):
Dmitry888 писал(а):...Получаю немного не то что ожидал...
Флаг прерывания (INT0IF) устанавливается независимо от того разрешено прерывание или нет. Т.е., перед разрешением прерывания надо снять флаг прерывания.
Я снимаю флаг в самом начале работы программы в main:
INT0IE_bit = 0; // запрещаем прерывания на INT0
и снимаю его в случае когда SS - в "1".
Реклама
Аватара пользователя
Albert_V
Друг Кота
Сообщения: 4119
Зарегистрирован: Чт сен 12, 2013 00:54:12
Откуда: ЗаМКАДье. Там, где ЦУП

Re: Декодирование протокола парктроника

Сообщение Albert_V »

Вы неправильно меня поняли. Перед разрешением прерывания (INT0IE_bit = 1) надо снять флаг прерывания (INT0IF_bit = 0)!
Последний раз редактировалось Albert_V Вт мар 17, 2015 14:31:02, всего редактировалось 1 раз.
Dmitry888
Встал на лапы
Сообщения: 131
Зарегистрирован: Чт мар 05, 2015 07:14:58

Re: Декодирование протокола парктроника

Сообщение Dmitry888 »

Большое спасибо, дошло.
Реклама
Эиком - электронные компоненты и радиодетали
Dmitry888
Встал на лапы
Сообщения: 131
Зарегистрирован: Чт мар 05, 2015 07:14:58

Re: Декодирование протокола парктроника

Сообщение Dmitry888 »

Лишняя единица вначале пропала. Но все равно какие то глюки:
Спойлер00000001111111110011
10000001111111110001
01000011111111100011
11000011111111100011
01000011111111100111
10100011111111100011
01100001111111110001
00000001111111110011
10000011111111100011
01000001111111110001
11000011111111100011
11011110000000100011
00100111111111110000
11001111111111100001
01001111111111100001
00000111111111110000
10000111111111110000
00001111111111100001
11000111111111110000
00100111111111110000
10100111111111110000
01100111111111110000
00000111111111110000
10000111111111110000
01000111111111110000
Теоретически, должны меняться только первые 4 бита(номер посылки).
Реклама
Аватара пользователя
PicNik
Прорезались зубы
Сообщения: 223
Зарегистрирован: Вс июл 10, 2011 14:41:10

Re: Декодирование протокола парктроника

Сообщение PicNik »

У вас дисплей ОК или ОА?
Реклама
Dmitry888
Встал на лапы
Сообщения: 131
Зарегистрирован: Чт мар 05, 2015 07:14:58

Re: Декодирование протокола парктроника

Сообщение Dmitry888 »

PicNik писал(а):У вас дисплей ОК или ОА?
не понял вопроса
Dmitry888
Встал на лапы
Сообщения: 131
Зарегистрирован: Чт мар 05, 2015 07:14:58

Re: Декодирование протокола парктроника

Сообщение Dmitry888 »

Написал на ардуино аналог программы для PIC'a:
Спойлер

Код: Выделить всё

// логер данных с парктроника
/*
подключение:
ардуино - парктроник
  D2 - SCK
  D3 - CS
  D4 - DATA  PD4
*/

boolean buffer[21]; // посылка - 8+8+4 бита

volatile int tact = 0;

void setup() {
  pinMode(2, INPUT);
  pinMode(3, INPUT);
  pinMode(4, INPUT);
  

  Serial.begin(115200);
  
}

void loop() {
  if (digitalRead(3) == LOW) {
    EIFR |= (1 << INTF0); 
      // взведем прерывание 0
    attachInterrupt(0, isr_DATA, FALLING);
  }
  else {
    // уберем обработчик прерывания 0
    detachInterrupt(0);
  }
  
   // если счётчик больше 19
  if (tact > 19) {
    for(int i=0; i<20; i++){
      Serial.print(buffer[i]);
    }
    Serial.println();
    // обнулим счетчик тактов
    tact=0;
  }
  
}


void isr_DATA(){
  buffer[tact]=((PIND >> 4)&0x01);
  tact++;
}
те же самые глюки. Может я что-то неправильно понимаю? Как правильно идентифицировать конец посылки?
Аватара пользователя
Albert_V
Друг Кота
Сообщения: 4119
Зарегистрирован: Чт сен 12, 2013 00:54:12
Откуда: ЗаМКАДье. Там, где ЦУП

Re: Декодирование протокола парктроника

Сообщение Albert_V »

Проверять программу лучше по частям.
Попробуйте, для начала, сделать такую проверку:
После окончания приёма - вывод не данных, а число CLK в пакете. Должно быть "как вкопанное" число .20.
Dmitry888
Встал на лапы
Сообщения: 131
Зарегистрирован: Чт мар 05, 2015 07:14:58

Re: Декодирование протокола парктроника

Сообщение Dmitry888 »

Я тут еще раз снял осциллограмму, вот такая бяка наблюдается в самом начале(при подаче питания):
Изображение
К тому же первые несколько посылок имеют немного другой формат.
Короче, дело не в программе, она , как раз, отрабатывает правильно.
Аватара пользователя
Albert_V
Друг Кота
Сообщения: 4119
Зарегистрирован: Чт сен 12, 2013 00:54:12
Откуда: ЗаМКАДье. Там, где ЦУП

Re: Декодирование протокола парктроника

Сообщение Albert_V »

Очень похоже на условие Reset-а счётчика пакетов.
Аватара пользователя
PicNik
Прорезались зубы
Сообщения: 223
Зарегистрирован: Вс июл 10, 2011 14:41:10

Re: Декодирование протокола парктроника

Сообщение PicNik »

Dmitry888 писал(а):
PicNik писал(а):У вас дисплей ОК или ОА?
не понял вопроса
Дисплей парковки с общим анодом или ОК. И если есть возможность покажите,более растянутую картинку где можно увидеть, какой адрес и данные.
Dmitry888
Встал на лапы
Сообщения: 131
Зарегистрирован: Чт мар 05, 2015 07:14:58

Re: Декодирование протокола парктроника

Сообщение Dmitry888 »

PicNik писал(а): Дисплей парковки с общим анодом или ОК. И если есть возможность покажите,более растянутую картинку где можно увидеть, какой адрес и данные.
Затрудняюсь ответить, на первой странице есть фото разобранного дисплея. Более детальная осциллограмма в первом посте.
Dmitry888
Встал на лапы
Сообщения: 131
Зарегистрирован: Чт мар 05, 2015 07:14:58

Re: Декодирование протокола парктроника

Сообщение Dmitry888 »

Albert_V писал(а):Очень похоже на условие Reset-а счётчика пакетов.
Такая посылка появляется только один раз - при подаче питания, мне она не интересна, я её просто игнорирую.
Меня больше интересует другой вопрос: как мне отличить условия когда: датчик неисправен, датчик смотрит в бесконечность, расстояние перед датчиком менее 30 см. При всех этих условиях значение на датчике - 255.
Аватара пользователя
Albert_V
Друг Кота
Сообщения: 4119
Зарегистрирован: Чт сен 12, 2013 00:54:12
Откуда: ЗаМКАДье. Там, где ЦУП

Re: Декодирование протокола парктроника

Сообщение Albert_V »

Если я правильно понял вопрос (данные во всех этих случаях одинаковые) - никак.
Возможно, на какие-то данные вы не обратили внимание. Например, может быть одна посылка в которой каждому из этих условий соответствует один бит. Но это лишь моё предположение...
Dmitry888
Встал на лапы
Сообщения: 131
Зарегистрирован: Чт мар 05, 2015 07:14:58

Re: Декодирование протокола парктроника

Сообщение Dmitry888 »

Albert_V писал(а):может быть одна посылка в которой каждому из этих условий соответствует один бит
Скорее всего так оно и есть. Возможно неисправность датчика указывается в первых посылках, они немного отличаются от последующих. Приведу здесь лог с помеременно откюченными датчиками:
Отключены все датчики:
Спойлер00010000000000000000
00000001111111110001
11000001111111110001
00100001111111110001
10100001111111110001
01100001111111110001
00000001111111110001
10000001111111110001
01000001111111110001
11000001111111110001
01010110111100000000
00100111111111110000
10100111111111110000
10000111111111110000
01000111111111110000
11000111111111110000
00100111111111110000
Подключен только A:
Спойлер00010000000000000000
10000001111111110001
01000000011001000001
10100001111111110001
00000001111111110001
10000001111111110001
01010110111000000000
11000111111111110000
00100111111111110000
10100111111111110000
Подключен только B:
Спойлер00010000000000000000
00000000001001000001
11000001111111110001
00100001111111110001
01100001111111110001
10100001111111110001
01100001111111110001
00000000001001000001
11000001111111110001
01010110010000000001
10000111111111110000
11000111111111110000
00100111111111100001
10100111111111110000
01100111111111110000
Подключен только C:
Спойлер00010000000000000000
00000001111111110001
10000000001001000001
01000001111111100011
00100001111111110001
01100001111111110001
10100001111111110001
01100001111111110001
00000001111111110001
01000001111111110001
10000000001001000001
11000000001001000011
01010110001000000001
10000110001001000000
00100111111111110000
01100111111111110000
Подключен только D:
Спойлер00010000000000000000
00000001111111110001
10000001111111110001
11000000000010000001
00100001111111110001
10100001111111110001
01100001111111110001
00000001111111110001
10000001111111110001
01010110011100000000
11000110000010000000
00100111111111110000
10100111111111110000
01100111111111110000
00000111111111110000
Аватара пользователя
Albert_V
Друг Кота
Сообщения: 4119
Зарегистрирован: Чт сен 12, 2013 00:54:12
Откуда: ЗаМКАДье. Там, где ЦУП

Re: Декодирование протокола парктроника

Сообщение Albert_V »

Напишите программу сравнения блоков посылок так, что бы отображалось в какой посылке что изменилось. Так будет проще "расколоть" протокол.
Более простой вариант - выводите попарно 1-ый блок 1-ая посылка, 2-ой блок 1-ая посылка; 1-ый блок 2-ая посылка, 2-ой блок 2-ая посылка; и т.д..
Dmitry888
Встал на лапы
Сообщения: 131
Зарегистрирован: Чт мар 05, 2015 07:14:58

Re: Декодирование протокола парктроника

Сообщение Dmitry888 »

На ардуино вроде все получилось, пытаюсь "завести" всё это на pic и никак не получается настроить прерывание.
Прошивку разарабатываю в MikroC, код выглядит так:
Спойлер

Код: Выделить всё

volatile int tact = 0;

void Interrupt() {
  if (INT0IF_bit && INT0IE_bit) {
     tact++;
     INT0IF_bit = 0;
  }
}

void main() {
     GIE_bit = 1;             // enable GIE
     INTEDG0_bit = 0;         // Передний фронт:1 , задний :0
     INT0IE_bit = 0;          // запрещаем прерывания на INT0
     TRISB = 0xFF;            // задаём PortB как вход
     TRISC = 0xFF;            // задаём PortC как вход
     UART1_Init(9600);
     Delay_ms(100);

     while(1){
       if (RC3_bit==0) {     // Если SS опущен разрешаем прерывание INT0
          INT0IF_bit = 0;
          INT0IE_bit = 1;
       }
       else {
          INT0IE_bit = 0;
       }

       if ((RC3_bit==1)&&(tact!=0)) {  // если "отпустили" SS и счетчик тактов не равен нулю (т.е. посылку считали)
          UART1_Write((83+tact));

          UART1_Write(13);
          UART1_Write(10);

          tact=0;         // обнулим счетчик тактов

       }

     }
}
всё время получаю разное количество срабатываний по прерыванию:
Спойлерd
e
c
d
e
d
e
c
c
g
e
d
V
e
c
f
b
d
e
e
d
тоесть здесь прерывание происходило от 16 до 20 раз.
В чём моя ошибка?
Dmitry888
Встал на лапы
Сообщения: 131
Зарегистрирован: Чт мар 05, 2015 07:14:58

Re: Декодирование протокола парктроника

Сообщение Dmitry888 »

Раз никто не может ответить - отвечу сам:
Ошибка в том, что флаг INT0IF_bit снимается каждый раз в основном цикле и возникает ситуация когда условие прерывания произошло, но флаг INT0IF_bit тут же снялся в основном цикле программы и обработчик прерывания не отработал. Правильнее, перед сбросом флага INT0IF_bit - проверять состояние флага INT0IE_bit, и сбрасывать его только когда это действительно нужно.
eri
Родился
Сообщения: 1
Зарегистрирован: Пн окт 17, 2022 22:30:36

Re: Декодирование протокола парктроника

Сообщение eri »

У меня парктроник без cs. Как правильно получить длину импульса по спаду?
Ответить

Вернуться в «АвтоМотоВело»