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

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

Сообщение Albert_V »

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

Сообщение Dmitry888 »

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

Сообщение Albert_V »

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

Сообщение Dmitry888 »

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

Сообщение 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 бита(номер посылки).
Реклама
Прорезались зубы
Аватара пользователя
Сообщения: 223
Зарегистрирован: Вс июл 10, 2011 14:41:10

Сообщение PicNik »

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

Сообщение Dmitry888 »

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

Сообщение 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++;
}
те же самые глюки. Может я что-то неправильно понимаю? Как правильно идентифицировать конец посылки?
Друг Кота
Аватара пользователя
Сообщения: 4119
Зарегистрирован: Чт сен 12, 2013 00:54:12
Откуда: ЗаМКАДье. Там, где ЦУП

Сообщение Albert_V »

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

Сообщение Dmitry888 »

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

Сообщение Albert_V »

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

Сообщение PicNik »

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

Сообщение Dmitry888 »

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

Сообщение Dmitry888 »

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

Сообщение Albert_V »

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

Сообщение 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
Друг Кота
Аватара пользователя
Сообщения: 4119
Зарегистрирован: Чт сен 12, 2013 00:54:12
Откуда: ЗаМКАДье. Там, где ЦУП

Сообщение Albert_V »

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

Сообщение 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 раз.
В чём моя ошибка?
Встал на лапы
Сообщения: 131
Зарегистрирован: Чт мар 05, 2015 07:14:58

Сообщение Dmitry888 »

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

Сообщение eri »

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

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