Обсуждаем электронику на колесах. Нужен увлажнитель воздуха для Камаза? Вам сюда.
Ответить

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

Вт мар 10, 2015 08:01:40

Понял, спасибо, счас попробую что-нить написать уже. Единственно непонятна запись: CS=LOW>HI , это момент перехода с низкого на высокий? Если да - то хз как это объяснить ардуино.

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

Вт мар 10, 2015 08:04:47

Да. Это именно "фронт" CS.

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

Вт мар 10, 2015 13:55:23

В общем накатал на ардуино кое-что :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. Как можно решить эту проблему?

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

Вт мар 10, 2015 20:42:29

Мои предположения не подтвердились, немного погуглив переписал скетч уже без 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-ре?

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

Вт мар 10, 2015 21:40:49

Найдите в гугле пдф на микросхему ТМ1628,РТ6961итд. Там описан протокол ИС.

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

Вт мар 10, 2015 21:51:23

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

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

Ср мар 11, 2015 06:59:45

PicNik писал(а):Найдите в гугле пдф на микросхему ТМ1628,РТ6961итд. Там описан протокол ИС.

Похоже это оно. И это очень плохо, значит на дисплей передаются данные только для LED-матрицы, а я ожидал получить расстояния по каждому датчику. :facepalm:

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

Ср мар 11, 2015 11:01:46

Почему,в протоколе обмена с дисплеем идет инфа.о всех датчиках и расстояние каждого.Они опрашиваются последовательно и так-же передаются. +звук.

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

Чт мар 12, 2015 11:00:24

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

здесь: пакет из 7 посылок, следующий пакет аналогичен предыдущему и так в цикле.
в посылке:
Код:
1000 011 1 11111111 0000
 |    |  |     |
 |    |  |     расстояние (младший бит слева)
 |    |  флаг наличия данных от датчиков (?)
 |    ?
номер посылки (младший бит слева)

Непонятно почему посылок 7? По логике их должно быть 4, по одной на каждый датчик. Предположительно соответствие номеров посылок датчикам следующее:
0 - B
1 - C
2 - A
3 - D
В ближайшее время попытаюсь выяснить подробнее.
Данные выше получены при всех отключенных датчиках.
PS. незнаю можно ли здесь разместить ссылку на источник? Если кому надо - пишите в личку.

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

Чт мар 12, 2015 13:17:09

Этот протокол не 7 и не 4 работать не будет, только 8-16-итд.На 1стр. видно по восемь тактов идут данные= 0-0-0-0-0-1-1-1,следующие одни 11111111.

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

Чт мар 12, 2015 13:46:51

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

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

Чт мар 12, 2015 17:06:49

Теперь думаю как мне отправлять данные на дисплей. Кто подскажет : возможно ли с помощью аппаратного SPI отправить полубайт (4 бит)?

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

Чт мар 12, 2015 17:08:36

Нет.
Пишите программный последовательный интерфейс ("ногодрыг").

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

Пт мар 13, 2015 12:21:50

А принять 20 бит с помощью аппаратного SPI получится? Если да - то что будет на выходе? 3 байта, где в последнем полубайте будут нули?

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

Пт мар 13, 2015 12:51:16

Таким образом получим 16 бит вместо 20? Или же те, оставшиеся 4 бита в SSPSR так и останутся там лежать и передадутся в SSPBUF с первым полубитом следующего пакета данных? Или при "поднятии" SS - произойдёт очистка SSPSR?
Последний раз редактировалось Dmitry888 Пт мар 13, 2015 12:54:19, всего редактировалось 1 раз.

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

Пт мар 13, 2015 12:54:06

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

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

Пт мар 13, 2015 13:00:34

Под аппаратный SPI есть библиотека в MikroC, в этом случае - 3 строки кода. Да и последние 4 бита в посылке от парктроника - ничего не значат. Только вот непонятно что происходит с данными в SSPSR при "поднятии" SS.

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

Пт мар 13, 2015 13:14:32

При "поднятии" SS - ничего. По спаду SS (разрешение приёма) сбрасывается счётчик SCK.
К SSPSR нет доступа (его нет в адресном пространстве).

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

Пт мар 13, 2015 16:34:31

Я хотел сказать что дисплей не воспримет 4 бита. И мне не понятно что они в 7 сегментном дисплеи могу засветить,может китайский косяк.

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

Вт мар 17, 2015 13:05:39

Аппаратный 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-й посылки, но откуда взялась первая единица? и куда делся последний ноль? Не могу понять где я ошибся?
Ответить