Декодирование протокола парктроника
Re: Декодирование протокола парктроника
Понял, спасибо, счас попробую что-нить написать уже. Единственно непонятна запись: CS=LOW>HI , это момент перехода с низкого на высокий? Если да - то хз как это объяснить ардуино.
- Реклама
- Albert_V
- Друг Кота
- Сообщения: 4119
- Зарегистрирован: Чт сен 12, 2013 00:54:12
- Откуда: ЗаМКАДье. Там, где ЦУП
Re: Декодирование протокола парктроника
Да. Это именно "фронт" CS.
Re: Декодирование протокола парктроника
В общем накатал на ардуино кое-что
. Прошу ногами не пинать, я только учусь.
Работает, но не правильно. Вместо 20 бит - получаю 16, подозреваю что это из-за тормознутости функции digitalRead. Как можно решить эту проблему?
Код: Выделить всё
//определяем пины
#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();
}
Re: Декодирование протокола парктроника
Мои предположения не подтвердились, немного погуглив переписал скетч уже без digitalRead :
но приходит вновь 16 бит, куда делись ещё 4-ре?
Код: Выделить всё
//определяем пины
#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();
}
Re: Декодирование протокола парктроника
Найдите в гугле пдф на микросхему ТМ1628,РТ6961итд. Там описан протокол ИС.
- Реклама
- Albert_V
- Друг Кота
- Сообщения: 4119
- Зарегистрирован: Чт сен 12, 2013 00:54:12
- Откуда: ЗаМКАДье. Там, где ЦУП
Re: Декодирование протокола парктроника
Вспомнилось...
В начале 90-ых мне говорил ("вправлял мозги") Андрей Солонин /программист "от бога", работал на кафедре МОСОИиУ в МИЭМ-е/:
"Никогда не пользуйся чужими библиотеками, поскольку хрен его знает как они работают.
Пиши свои.
Пусть, вначале, это будет коряво, но будешь точно понимать как работает твоя программа".
В начале 90-ых мне говорил ("вправлял мозги") Андрей Солонин /программист "от бога", работал на кафедре МОСОИиУ в МИЭМ-е/:
"Никогда не пользуйся чужими библиотеками, поскольку хрен его знает как они работают.
Пиши свои.
Пусть, вначале, это будет коряво, но будешь точно понимать как работает твоя программа".
Re: Декодирование протокола парктроника
Похоже это оно. И это очень плохо, значит на дисплей передаются данные только для LED-матрицы, а я ожидал получить расстояния по каждому датчику.PicNik писал(а):Найдите в гугле пдф на микросхему ТМ1628,РТ6961итд. Там описан протокол ИС.
Re: Декодирование протокола парктроника
Почему,в протоколе обмена с дисплеем идет инфа.о всех датчиках и расстояние каждого.Они опрашиваются последовательно и так-же передаются. +звук.
Re: Декодирование протокола парктроника
Нашел на одном из форумов информацию по такому же парктронику, там товарищ частично расколол протокол. Собственно, я пошёл по его стопам. На данный момент имеем:
10000111111111110000
01000111111111110000
11000111111111110000
00100111111111110000
10100111111111110000
01100111111111110000
здесь: пакет из 7 посылок, следующий пакет аналогичен предыдущему и так в цикле.
в посылке:
Непонятно почему посылок 7? По логике их должно быть 4, по одной на каждый датчик. Предположительно соответствие номеров посылок датчикам следующее:
0 - B
1 - C
2 - A
3 - D
В ближайшее время попытаюсь выяснить подробнее.
Данные выше получены при всех отключенных датчиках.
PS. незнаю можно ли здесь разместить ссылку на источник? Если кому надо - пишите в личку.
Спойлер
0000011111111111000010000111111111110000
01000111111111110000
11000111111111110000
00100111111111110000
10100111111111110000
01100111111111110000
в посылке:
Код: Выделить всё
1000 011 1 11111111 0000
| | | |
| | | расстояние (младший бит слева)
| | флаг наличия данных от датчиков (?)
| ?
номер посылки (младший бит слева)
0 - B
1 - C
2 - A
3 - D
В ближайшее время попытаюсь выяснить подробнее.
Данные выше получены при всех отключенных датчиках.
PS. незнаю можно ли здесь разместить ссылку на источник? Если кому надо - пишите в личку.
Re: Декодирование протокола парктроника
Этот протокол не 7 и не 4 работать не будет, только 8-16-итд.На 1стр. видно по восемь тактов идут данные= 0-0-0-0-0-1-1-1,следующие одни 11111111.
Re: Декодирование протокола парктроника
7 посылок - я имел в виду: 7 посылок по 20 бит, на первой странице одна посылка на верхней осциллограмме, на нижней осциллограмме - масштаб поменьше, там влезло 5 посылок. Внутри каждой посылки: два байта и один полубайт (8+8+4). О каком протоколе Вы говорите? SPI? Почему не будет? Работает, принимаю на ардуино.
Re: Декодирование протокола парктроника
Теперь думаю как мне отправлять данные на дисплей. Кто подскажет : возможно ли с помощью аппаратного SPI отправить полубайт (4 бит)?
- Albert_V
- Друг Кота
- Сообщения: 4119
- Зарегистрирован: Чт сен 12, 2013 00:54:12
- Откуда: ЗаМКАДье. Там, где ЦУП
Re: Декодирование протокола парктроника
Нет.
Пишите программный последовательный интерфейс ("ногодрыг").
Пишите программный последовательный интерфейс ("ногодрыг").
Re: Декодирование протокола парктроника
А принять 20 бит с помощью аппаратного SPI получится? Если да - то что будет на выходе? 3 байта, где в последнем полубайте будут нули?
Re: Декодирование протокола парктроника
Таким образом получим 16 бит вместо 20? Или же те, оставшиеся 4 бита в SSPSR так и останутся там лежать и передадутся в SSPBUF с первым полубитом следующего пакета данных? Или при "поднятии" SS - произойдёт очистка SSPSR?
Последний раз редактировалось Dmitry888 Пт мар 13, 2015 12:54:19, всего редактировалось 1 раз.
- Albert_V
- Друг Кота
- Сообщения: 4119
- Зарегистрирован: Чт сен 12, 2013 00:54:12
- Откуда: ЗаМКАДье. Там, где ЦУП
Re: Декодирование протокола парктроника
Перенос принятых данных в SSPBUF и прерывание с SPI будет только после 8-го SCK.
Лучше сделать приём данных программно.
Не знаю как на СИ - на ASM это не более 15-ти строк.
Лучше сделать приём данных программно.
Не знаю как на СИ - на ASM это не более 15-ти строк.
Последний раз редактировалось Albert_V Пт мар 13, 2015 17:32:04, всего редактировалось 1 раз.
Re: Декодирование протокола парктроника
Под аппаратный SPI есть библиотека в MikroC, в этом случае - 3 строки кода. Да и последние 4 бита в посылке от парктроника - ничего не значат. Только вот непонятно что происходит с данными в SSPSR при "поднятии" SS.
- Albert_V
- Друг Кота
- Сообщения: 4119
- Зарегистрирован: Чт сен 12, 2013 00:54:12
- Откуда: ЗаМКАДье. Там, где ЦУП
Re: Декодирование протокола парктроника
При "поднятии" SS - ничего. По спаду SS (разрешение приёма) сбрасывается счётчик SCK.
К SSPSR нет доступа (его нет в адресном пространстве).
К SSPSR нет доступа (его нет в адресном пространстве).
Re: Декодирование протокола парктроника
Я хотел сказать что дисплей не воспримет 4 бита. И мне не понятно что они в 7 сегментном дисплеи могу засветить,может китайский косяк.
Re: Декодирование протокола парктроника
Аппаратный SPI так и не заработал, пришлось писать "ногодрыг", ниже код программы на си:
Получаю немного не то что ожидал:
11000000111111111000
10100000111111111000
11100000111111111000
10010000111111111000
11010000111111111000
10110000111111111000
10000000111111111000
11000000111111111000
10100000111111111000
11100000111111111000
11101111000000001000
10010011111111111000
11010011111111111000
10110011111111111000
Если посмотреть на осциллограмму:

то мне посылка видится так:
Таким образом, что - то похожее на правду начинается с 13-й посылки, но откуда взялась первая единица? и куда делся последний ноль? Не могу понять где я ошибся?
Спойлер
Код: Выделить всё
/*
Логгер парктроника
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; // обнулим счетчик тактов
}
}
}
Спойлер
1000000011111111100011000000111111111000
10100000111111111000
11100000111111111000
10010000111111111000
11010000111111111000
10110000111111111000
10000000111111111000
11000000111111111000
10100000111111111000
11100000111111111000
11101111000000001000
10010011111111111000
11010011111111111000
10110011111111111000
то мне посылка видится так:
Код: Выделить всё
00000111111111110000


