Страница 3 из 3
Re: Декодирование протокола парктроника
Добавлено: Вт мар 17, 2015 13:40:46
Albert_V
Dmitry888 писал(а):...Получаю немного не то что ожидал...
Флаг прерывания (INT0IF) устанавливается независимо от того разрешено прерывание или нет. Т.е., перед разрешением прерывания надо снять флаг прерывания.
Re: Декодирование протокола парктроника
Добавлено: Вт мар 17, 2015 13:47:33
Dmitry888
Albert_V писал(а):Dmitry888 писал(а):...Получаю немного не то что ожидал...
Флаг прерывания (INT0IF) устанавливается независимо от того разрешено прерывание или нет. Т.е., перед разрешением прерывания надо снять флаг прерывания.
Я снимаю флаг в самом начале работы программы в main:
INT0IE_bit = 0; // запрещаем прерывания на INT0
и снимаю его в случае когда SS - в "1".
Re: Декодирование протокола парктроника
Добавлено: Вт мар 17, 2015 13:50:06
Albert_V
Вы неправильно меня поняли. Перед разрешением прерывания (INT0IE_bit = 1) надо снять флаг прерывания (INT0IF_bit = 0)!
Re: Декодирование протокола парктроника
Добавлено: Вт мар 17, 2015 13:58:57
Dmitry888
Большое спасибо, дошло.
Re: Декодирование протокола парктроника
Добавлено: Вт мар 17, 2015 14:50:32
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 бита(номер посылки).
Re: Декодирование протокола парктроника
Добавлено: Вт мар 17, 2015 19:53:06
PicNik
У вас дисплей ОК или ОА?
Re: Декодирование протокола парктроника
Добавлено: Вт мар 17, 2015 21:39:19
Dmitry888
PicNik писал(а):У вас дисплей ОК или ОА?
не понял вопроса
Re: Декодирование протокола парктроника
Добавлено: Ср мар 18, 2015 06:51:10
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++;
}
те же самые глюки. Может я что-то неправильно понимаю? Как правильно идентифицировать конец посылки?
Re: Декодирование протокола парктроника
Добавлено: Ср мар 18, 2015 12:28:09
Albert_V
Проверять программу лучше по частям.
Попробуйте, для начала, сделать такую проверку:
После окончания приёма - вывод не данных, а число CLK в пакете. Должно быть "как вкопанное" число .20.
Re: Декодирование протокола парктроника
Добавлено: Ср мар 18, 2015 13:01:31
Dmitry888
Я тут еще раз снял осциллограмму, вот такая бяка наблюдается в самом начале(при подаче питания):

К тому же первые несколько посылок имеют немного другой формат.
Короче, дело не в программе, она , как раз, отрабатывает правильно.
Re: Декодирование протокола парктроника
Добавлено: Ср мар 18, 2015 13:13:37
Albert_V
Очень похоже на условие Reset-а счётчика пакетов.
Re: Декодирование протокола парктроника
Добавлено: Ср мар 18, 2015 13:21:32
PicNik
Dmitry888 писал(а):PicNik писал(а):У вас дисплей ОК или ОА?
не понял вопроса
Дисплей парковки с общим анодом или ОК. И если есть возможность покажите,более растянутую картинку где можно увидеть, какой адрес и данные.
Re: Декодирование протокола парктроника
Добавлено: Ср мар 18, 2015 13:42:09
Dmitry888
PicNik писал(а):
Дисплей парковки с общим анодом или ОК. И если есть возможность покажите,более растянутую картинку где можно увидеть, какой адрес и данные.
Затрудняюсь ответить, на первой странице есть фото разобранного дисплея. Более детальная осциллограмма в первом посте.
Re: Декодирование протокола парктроника
Добавлено: Ср мар 18, 2015 13:48:07
Dmitry888
Albert_V писал(а):Очень похоже на условие Reset-а счётчика пакетов.
Такая посылка появляется только один раз - при подаче питания, мне она не интересна, я её просто игнорирую.
Меня больше интересует другой вопрос: как мне отличить условия когда: датчик неисправен, датчик смотрит в бесконечность, расстояние перед датчиком менее 30 см. При всех этих условиях значение на датчике - 255.
Re: Декодирование протокола парктроника
Добавлено: Ср мар 18, 2015 14:00:18
Albert_V
Если я правильно понял вопрос (данные во всех этих случаях одинаковые) - никак.
Возможно, на какие-то данные вы не обратили внимание. Например, может быть одна посылка в которой каждому из этих условий соответствует один бит. Но это лишь моё предположение...
Re: Декодирование протокола парктроника
Добавлено: Ср мар 18, 2015 14:25:03
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
Re: Декодирование протокола парктроника
Добавлено: Ср мар 18, 2015 14:36:35
Albert_V
Напишите программу сравнения блоков посылок так, что бы отображалось в какой посылке что изменилось. Так будет проще "расколоть" протокол.
Более простой вариант - выводите попарно 1-ый блок 1-ая посылка, 2-ой блок 1-ая посылка; 1-ый блок 2-ая посылка, 2-ой блок 2-ая посылка; и т.д..
Re: Декодирование протокола парктроника
Добавлено: Чт мар 26, 2015 10:46:40
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 раз.
В чём моя ошибка?
Re: Декодирование протокола парктроника
Добавлено: Пн мар 30, 2015 06:24:24
Dmitry888
Раз никто не может ответить - отвечу сам:
Ошибка в том, что флаг INT0IF_bit снимается каждый раз в основном цикле и возникает ситуация когда условие прерывания произошло, но флаг INT0IF_bit тут же снялся в основном цикле программы и обработчик прерывания не отработал. Правильнее, перед сбросом флага INT0IF_bit - проверять состояние флага INT0IE_bit, и сбрасывать его только когда это действительно нужно.
Re: Декодирование протокола парктроника
Добавлено: Вт окт 18, 2022 10:10:09
eri
У меня парктроник без cs. Как правильно получить длину импульса по спаду?