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

Обсуждаем электронику на колесах. Нужен увлажнитель воздуха для Камаза? Вам сюда.
Dmitry888
Встал на лапы
Сообщения: 131
Зарегистрирован: Чт мар 05, 2015 07:14:58

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

Сообщение Dmitry888 »

Понял, спасибо, счас попробую что-нить написать уже. Единственно непонятна запись: CS=LOW>HI , это момент перехода с низкого на высокий? Если да - то хз как это объяснить ардуино.
Реклама
Аватара пользователя
Albert_V
Друг Кота
Сообщения: 4119
Зарегистрирован: Чт сен 12, 2013 00:54:12
Откуда: ЗаМКАДье. Там, где ЦУП

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

Сообщение Albert_V »

Да. Это именно "фронт" CS.
Реклама
Dmitry888
Встал на лапы
Сообщения: 131
Зарегистрирован: Чт мар 05, 2015 07:14:58

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

Сообщение Dmitry888 »

В общем накатал на ардуино кое-что :shock: . Прошу ногами не пинать, я только учусь.

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

//определяем пины 
#define DATA_PIN 11    // Data
#define SCK_PIN  2    // CLK
#define CS_PIN 3      // CS

void setup() {
  attachInterrupt(0, sck_int, FALLING);     //прерывание по спаду сигнала на SCK 
  attachInterrupt(1, cs_int, RISING);       //прерывание по фронту CS
  
  Serial.begin(57600);
  //определяем состояние пинов
  pinMode(DATA_PIN, INPUT);
  pinMode(SCK_PIN, INPUT);
  pinMode(CS_PIN, INPUT);
}

void loop() {

}

void sck_int() {
  if (digitalRead(CS_PIN)==LOW){         //если пин CS опущен
    Serial.print(digitalRead(DATA_PIN));                     //отправляем бит в терминал

  }
}

//получен фронт CS
void cs_int() {
  Serial.println();
}
Работает, но не правильно. Вместо 20 бит - получаю 16, подозреваю что это из-за тормознутости функции digitalRead. Как можно решить эту проблему?
Dmitry888
Встал на лапы
Сообщения: 131
Зарегистрирован: Чт мар 05, 2015 07:14:58

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

Сообщение Dmitry888 »

Мои предположения не подтвердились, немного погуглив переписал скетч уже без digitalRead :

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

//определяем пины 
#define DATA_PIN 11    // Data - PB3
#define SCK_PIN  2    // CLK - PD2
#define CS_PIN 3      // CS - PD3

void setup() {
  attachInterrupt(0, sck_int, FALLING);     //прерывание по спаду сигнала на SCK 
  attachInterrupt(1, cs_int, RISING);       //прерывание по фронту CS
  
  Serial.begin(57600);
  //определяем состояние пинов
  pinMode(DATA_PIN, INPUT);
  pinMode(SCK_PIN, INPUT);
  pinMode(CS_PIN, INPUT);
}

void loop() {

}

void sck_int() {
  
  if (((PIND >> 3)&0x01) == 0){         //если пин CS опущен
    Serial.print((PINB >> 3)&0x01, BIN);                     //отправляем бит в терминал

  }
}

//получен фронт CS
void cs_int() {
  Serial.println();
}
но приходит вновь 16 бит, куда делись ещё 4-ре?
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
PicNik
Прорезались зубы
Сообщения: 223
Зарегистрирован: Вс июл 10, 2011 14:41:10

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

Сообщение PicNik »

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

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

Сообщение Albert_V »

Вспомнилось...
В начале 90-ых мне говорил ("вправлял мозги") Андрей Солонин /программист "от бога", работал на кафедре МОСОИиУ в МИЭМ-е/:
"Никогда не пользуйся чужими библиотеками, поскольку хрен его знает как они работают.
Пиши свои.
Пусть, вначале, это будет коряво, но будешь точно понимать как работает твоя программа".
Реклама
Dmitry888
Встал на лапы
Сообщения: 131
Зарегистрирован: Чт мар 05, 2015 07:14:58

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

Сообщение Dmitry888 »

PicNik писал(а):Найдите в гугле пдф на микросхему ТМ1628,РТ6961итд. Там описан протокол ИС.
Похоже это оно. И это очень плохо, значит на дисплей передаются данные только для LED-матрицы, а я ожидал получить расстояния по каждому датчику. :facepalm:
Аватара пользователя
PicNik
Прорезались зубы
Сообщения: 223
Зарегистрирован: Вс июл 10, 2011 14:41:10

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

Сообщение PicNik »

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

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

Сообщение Dmitry888 »

Нашел на одном из форумов информацию по такому же парктронику, там товарищ частично расколол протокол. Собственно, я пошёл по его стопам. На данный момент имеем:
Спойлер00000111111111110000
10000111111111110000
01000111111111110000
11000111111111110000
00100111111111110000
10100111111111110000
01100111111111110000
здесь: пакет из 7 посылок, следующий пакет аналогичен предыдущему и так в цикле.
в посылке:

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

1000 011 1 11111111 0000
 |    |  |     |
 |    |  |     расстояние (младший бит слева)
 |    |  флаг наличия данных от датчиков (?) 
 |    ?
номер посылки (младший бит слева)
Непонятно почему посылок 7? По логике их должно быть 4, по одной на каждый датчик. Предположительно соответствие номеров посылок датчикам следующее:
0 - B
1 - C
2 - A
3 - D
В ближайшее время попытаюсь выяснить подробнее.
Данные выше получены при всех отключенных датчиках.
PS. незнаю можно ли здесь разместить ссылку на источник? Если кому надо - пишите в личку.
Аватара пользователя
PicNik
Прорезались зубы
Сообщения: 223
Зарегистрирован: Вс июл 10, 2011 14:41:10

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

Сообщение PicNik »

Этот протокол не 7 и не 4 работать не будет, только 8-16-итд.На 1стр. видно по восемь тактов идут данные= 0-0-0-0-0-1-1-1,следующие одни 11111111.
Dmitry888
Встал на лапы
Сообщения: 131
Зарегистрирован: Чт мар 05, 2015 07:14:58

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

Сообщение Dmitry888 »

7 посылок - я имел в виду: 7 посылок по 20 бит, на первой странице одна посылка на верхней осциллограмме, на нижней осциллограмме - масштаб поменьше, там влезло 5 посылок. Внутри каждой посылки: два байта и один полубайт (8+8+4). О каком протоколе Вы говорите? SPI? Почему не будет? Работает, принимаю на ардуино.
Dmitry888
Встал на лапы
Сообщения: 131
Зарегистрирован: Чт мар 05, 2015 07:14:58

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

Сообщение Dmitry888 »

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

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

Сообщение Albert_V »

Нет.
Пишите программный последовательный интерфейс ("ногодрыг").
Dmitry888
Встал на лапы
Сообщения: 131
Зарегистрирован: Чт мар 05, 2015 07:14:58

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

Сообщение Dmitry888 »

А принять 20 бит с помощью аппаратного SPI получится? Если да - то что будет на выходе? 3 байта, где в последнем полубайте будут нули?
Dmitry888
Встал на лапы
Сообщения: 131
Зарегистрирован: Чт мар 05, 2015 07:14:58

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

Сообщение Dmitry888 »

Таким образом получим 16 бит вместо 20? Или же те, оставшиеся 4 бита в SSPSR так и останутся там лежать и передадутся в SSPBUF с первым полубитом следующего пакета данных? Или при "поднятии" SS - произойдёт очистка SSPSR?
Последний раз редактировалось Dmitry888 Пт мар 13, 2015 12:54:19, всего редактировалось 1 раз.
Аватара пользователя
Albert_V
Друг Кота
Сообщения: 4119
Зарегистрирован: Чт сен 12, 2013 00:54:12
Откуда: ЗаМКАДье. Там, где ЦУП

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

Сообщение Albert_V »

Перенос принятых данных в SSPBUF и прерывание с SPI будет только после 8-го SCK.
Лучше сделать приём данных программно.
Не знаю как на СИ - на ASM это не более 15-ти строк.
Последний раз редактировалось Albert_V Пт мар 13, 2015 17:32:04, всего редактировалось 1 раз.
Dmitry888
Встал на лапы
Сообщения: 131
Зарегистрирован: Чт мар 05, 2015 07:14:58

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

Сообщение Dmitry888 »

Под аппаратный SPI есть библиотека в MikroC, в этом случае - 3 строки кода. Да и последние 4 бита в посылке от парктроника - ничего не значат. Только вот непонятно что происходит с данными в SSPSR при "поднятии" SS.
Аватара пользователя
Albert_V
Друг Кота
Сообщения: 4119
Зарегистрирован: Чт сен 12, 2013 00:54:12
Откуда: ЗаМКАДье. Там, где ЦУП

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

Сообщение Albert_V »

При "поднятии" SS - ничего. По спаду SS (разрешение приёма) сбрасывается счётчик SCK.
К SSPSR нет доступа (его нет в адресном пространстве).
Аватара пользователя
PicNik
Прорезались зубы
Сообщения: 223
Зарегистрирован: Вс июл 10, 2011 14:41:10

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

Сообщение PicNik »

Я хотел сказать что дисплей не воспримет 4 бита. И мне не понятно что они в 7 сегментном дисплеи могу засветить,может китайский косяк.
Dmitry888
Встал на лапы
Сообщения: 131
Зарегистрирован: Чт мар 05, 2015 07:14:58

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

Сообщение Dmitry888 »

Аппаратный SPI так и не заработал, пришлось писать "ногодрыг", ниже код программы на си:
Спойлер

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

/*
Логгер парктроника
RC4(15) - DATA
RC3(14) - SS
RB0(21) - CLK
*/
unsigned short rBuff[20]; // посылка - 8+8+4 бита
unsigned int i;
volatile int tact = 0;

void Interrupt() {
  if (INT0IF_bit && INT0IE_bit) {
     rBuff[tact]=RC4_bit;
     tact++;
     INT0IF_bit = 0;
     INT0IE_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
          Delay_us(10);      // Пауза 10 мкс для устаканивания, т.к. SS и CLK одновременно переходят в LOW
          INT0IE_bit = 1;
       }
       else {
          INT0IE_bit = 0;
       }
       
       if ((RC3_bit)&&(tact!=0)) {  // если "отпустили" SS и счетчик тактов не равен нулю (т.е. посылку считали)
         for(i=0; i<20; i++){
           if (rBuff[i]){
             UART1_Write(49);     // отправляем в терминал "1"
           }
           else{
             UART1_Write(48);     // отправляем в терминал "0"
           };
         }
         
         UART1_Write(13);
         UART1_Write(10);
         
         tact=0;         // обнулим счетчик тактов

       }

     }
}
Получаю немного не то что ожидал:
Спойлер10000000111111111000
11000000111111111000
10100000111111111000
11100000111111111000
10010000111111111000
11010000111111111000
10110000111111111000
10000000111111111000
11000000111111111000
10100000111111111000
11100000111111111000
11101111000000001000
10010011111111111000
11010011111111111000
10110011111111111000
Если посмотреть на осциллограмму:
Изображение
то мне посылка видится так:

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

00000111111111110000
Таким образом, что - то похожее на правду начинается с 13-й посылки, но откуда взялась первая единица? и куда делся последний ноль? Не могу понять где я ошибся?
Ответить

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