Флаг прерывания (INT0IF) устанавливается независимо от того разрешено прерывание или нет. Т.е., перед разрешением прерывания надо снять флаг прерывания.Dmitry888 писал(а):...Получаю немного не то что ожидал...
Декодирование протокола парктроника
- Albert_V
- Друг Кота
- Сообщения: 4119
- Зарегистрирован: Чт сен 12, 2013 00:54:12
- Откуда: ЗаМКАДье. Там, где ЦУП
Re: Декодирование протокола парктроника
- Реклама
Re: Декодирование протокола парктроника
Я снимаю флаг в самом начале работы программы в main:Albert_V писал(а):Флаг прерывания (INT0IF) устанавливается независимо от того разрешено прерывание или нет. Т.е., перед разрешением прерывания надо снять флаг прерывания.Dmitry888 писал(а):...Получаю немного не то что ожидал...
INT0IE_bit = 0; // запрещаем прерывания на INT0
и снимаю его в случае когда SS - в "1".
- Albert_V
- Друг Кота
- Сообщения: 4119
- Зарегистрирован: Чт сен 12, 2013 00:54:12
- Откуда: ЗаМКАДье. Там, где ЦУП
Re: Декодирование протокола парктроника
Вы неправильно меня поняли. Перед разрешением прерывания (INT0IE_bit = 1) надо снять флаг прерывания (INT0IF_bit = 0)!
Последний раз редактировалось Albert_V Вт мар 17, 2015 14:31:02, всего редактировалось 1 раз.
Re: Декодирование протокола парктроника
Большое спасибо, дошло.
Re: Декодирование протокола парктроника
Лишняя единица вначале пропала. Но все равно какие то глюки:
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 бита(номер посылки).
Спойлер
0000000111111111001110000001111111110001
01000011111111100011
11000011111111100011
01000011111111100111
10100011111111100011
01100001111111110001
00000001111111110011
10000011111111100011
01000001111111110001
11000011111111100011
11011110000000100011
00100111111111110000
11001111111111100001
01001111111111100001
00000111111111110000
10000111111111110000
00001111111111100001
11000111111111110000
00100111111111110000
10100111111111110000
01100111111111110000
00000111111111110000
10000111111111110000
01000111111111110000
- Реклама
Re: Декодирование протокола парктроника
У вас дисплей ОК или ОА?
Re: Декодирование протокола парктроника
не понял вопросаPicNik писал(а):У вас дисплей ОК или ОА?
Re: Декодирование протокола парктроника
Написал на ардуино аналог программы для 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++;
}
- Albert_V
- Друг Кота
- Сообщения: 4119
- Зарегистрирован: Чт сен 12, 2013 00:54:12
- Откуда: ЗаМКАДье. Там, где ЦУП
Re: Декодирование протокола парктроника
Проверять программу лучше по частям.
Попробуйте, для начала, сделать такую проверку:
После окончания приёма - вывод не данных, а число CLK в пакете. Должно быть "как вкопанное" число .20.
Попробуйте, для начала, сделать такую проверку:
После окончания приёма - вывод не данных, а число CLK в пакете. Должно быть "как вкопанное" число .20.
- Albert_V
- Друг Кота
- Сообщения: 4119
- Зарегистрирован: Чт сен 12, 2013 00:54:12
- Откуда: ЗаМКАДье. Там, где ЦУП
Re: Декодирование протокола парктроника
Очень похоже на условие Reset-а счётчика пакетов.
Re: Декодирование протокола парктроника
Дисплей парковки с общим анодом или ОК. И если есть возможность покажите,более растянутую картинку где можно увидеть, какой адрес и данные.Dmitry888 писал(а):не понял вопросаPicNik писал(а):У вас дисплей ОК или ОА?
Re: Декодирование протокола парктроника
Затрудняюсь ответить, на первой странице есть фото разобранного дисплея. Более детальная осциллограмма в первом посте.PicNik писал(а): Дисплей парковки с общим анодом или ОК. И если есть возможность покажите,более растянутую картинку где можно увидеть, какой адрес и данные.
Re: Декодирование протокола парктроника
Такая посылка появляется только один раз - при подаче питания, мне она не интересна, я её просто игнорирую.Albert_V писал(а):Очень похоже на условие Reset-а счётчика пакетов.
Меня больше интересует другой вопрос: как мне отличить условия когда: датчик неисправен, датчик смотрит в бесконечность, расстояние перед датчиком менее 30 см. При всех этих условиях значение на датчике - 255.
- Albert_V
- Друг Кота
- Сообщения: 4119
- Зарегистрирован: Чт сен 12, 2013 00:54:12
- Откуда: ЗаМКАДье. Там, где ЦУП
Re: Декодирование протокола парктроника
Если я правильно понял вопрос (данные во всех этих случаях одинаковые) - никак.
Возможно, на какие-то данные вы не обратили внимание. Например, может быть одна посылка в которой каждому из этих условий соответствует один бит. Но это лишь моё предположение...
Возможно, на какие-то данные вы не обратили внимание. Например, может быть одна посылка в которой каждому из этих условий соответствует один бит. Но это лишь моё предположение...
Re: Декодирование протокола парктроника
Скорее всего так оно и есть. Возможно неисправность датчика указывается в первых посылках, они немного отличаются от последующих. Приведу здесь лог с помеременно откюченными датчиками:Albert_V писал(а):может быть одна посылка в которой каждому из этих условий соответствует один бит
Отключены все датчики:
Спойлер
0001000000000000000000000001111111110001
11000001111111110001
00100001111111110001
10100001111111110001
01100001111111110001
00000001111111110001
10000001111111110001
01000001111111110001
11000001111111110001
01010110111100000000
00100111111111110000
10100111111111110000
10000111111111110000
01000111111111110000
11000111111111110000
00100111111111110000
Спойлер
0001000000000000000010000001111111110001
01000000011001000001
10100001111111110001
00000001111111110001
10000001111111110001
01010110111000000000
11000111111111110000
00100111111111110000
10100111111111110000
Спойлер
0001000000000000000000000000001001000001
11000001111111110001
00100001111111110001
01100001111111110001
10100001111111110001
01100001111111110001
00000000001001000001
11000001111111110001
01010110010000000001
10000111111111110000
11000111111111110000
00100111111111100001
10100111111111110000
01100111111111110000
Спойлер
0001000000000000000000000001111111110001
10000000001001000001
01000001111111100011
00100001111111110001
01100001111111110001
10100001111111110001
01100001111111110001
00000001111111110001
01000001111111110001
10000000001001000001
11000000001001000011
01010110001000000001
10000110001001000000
00100111111111110000
01100111111111110000
Спойлер
0001000000000000000000000001111111110001
10000001111111110001
11000000000010000001
00100001111111110001
10100001111111110001
01100001111111110001
00000001111111110001
10000001111111110001
01010110011100000000
11000110000010000000
00100111111111110000
10100111111111110000
01100111111111110000
00000111111111110000
- Albert_V
- Друг Кота
- Сообщения: 4119
- Зарегистрирован: Чт сен 12, 2013 00:54:12
- Откуда: ЗаМКАДье. Там, где ЦУП
Re: Декодирование протокола парктроника
Напишите программу сравнения блоков посылок так, что бы отображалось в какой посылке что изменилось. Так будет проще "расколоть" протокол.
Более простой вариант - выводите попарно 1-ый блок 1-ая посылка, 2-ой блок 1-ая посылка; 1-ый блок 2-ая посылка, 2-ой блок 2-ая посылка; и т.д..
Более простой вариант - выводите попарно 1-ый блок 1-ая посылка, 2-ой блок 1-ая посылка; 1-ый блок 2-ая посылка, 2-ой блок 2-ая посылка; и т.д..
Re: Декодирование протокола парктроника
На ардуино вроде все получилось, пытаюсь "завести" всё это на pic и никак не получается настроить прерывание.
Прошивку разарабатываю в MikroC, код выглядит так:
всё время получаю разное количество срабатываний по прерыванию:
e
c
d
e
d
e
c
c
g
e
d
V
e
c
f
b
d
e
e
d
тоесть здесь прерывание происходило от 16 до 20 раз.
В чём моя ошибка?
Прошивку разарабатываю в 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; // обнулим счетчик тактов
}
}
}
Спойлер
de
c
d
e
d
e
c
c
g
e
d
V
e
c
f
b
d
e
e
d
В чём моя ошибка?
Re: Декодирование протокола парктроника
Раз никто не может ответить - отвечу сам:
Ошибка в том, что флаг INT0IF_bit снимается каждый раз в основном цикле и возникает ситуация когда условие прерывания произошло, но флаг INT0IF_bit тут же снялся в основном цикле программы и обработчик прерывания не отработал. Правильнее, перед сбросом флага INT0IF_bit - проверять состояние флага INT0IE_bit, и сбрасывать его только когда это действительно нужно.
Ошибка в том, что флаг INT0IF_bit снимается каждый раз в основном цикле и возникает ситуация когда условие прерывания произошло, но флаг INT0IF_bit тут же снялся в основном цикле программы и обработчик прерывания не отработал. Правильнее, перед сбросом флага INT0IF_bit - проверять состояние флага INT0IE_bit, и сбрасывать его только когда это действительно нужно.
Re: Декодирование протокола парктроника
У меня парктроник без cs. Как правильно получить длину импульса по спаду?


