Обсуждаем электронику на колесах. Нужен увлажнитель воздуха для Камаза? Вам сюда.
Вт мар 17, 2015 13:40:46
Dmitry888 писал(а):...Получаю немного не то что ожидал...
Флаг прерывания (INT0IF) устанавливается независимо от того разрешено прерывание или нет. Т.е., перед разрешением прерывания надо снять флаг прерывания.
Вт мар 17, 2015 13:47:33
Albert_V писал(а):Dmitry888 писал(а):...Получаю немного не то что ожидал...
Флаг прерывания (INT0IF) устанавливается независимо от того разрешено прерывание или нет. Т.е., перед разрешением прерывания надо снять флаг прерывания.
Я снимаю флаг в самом начале работы программы в main:
INT0IE_bit = 0; // запрещаем прерывания на INT0
и снимаю его в случае когда SS - в "1".
Вт мар 17, 2015 13:50:06
Вы неправильно меня поняли. Перед разрешением прерывания (INT0IE_bit = 1) надо снять
флаг прерывания (INT0IF_bit = 0)!
Последний раз редактировалось
Albert_V Вт мар 17, 2015 14:31:02, всего редактировалось 1 раз.
Вт мар 17, 2015 13:58:57
Большое спасибо, дошло.
Вт мар 17, 2015 14:50:32
Лишняя единица вначале пропала. Но все равно какие то глюки:
Спойлер
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 бита(номер посылки).
Вт мар 17, 2015 19:53:06
У вас дисплей ОК или ОА?
Вт мар 17, 2015 21:39:19
PicNik писал(а):У вас дисплей ОК или ОА?
не понял вопроса
Ср мар 18, 2015 06:51:10
Написал на ардуино аналог программы для 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++;
}
те же самые глюки. Может я что-то неправильно понимаю? Как правильно идентифицировать конец посылки?
Ср мар 18, 2015 12:28:09
Проверять программу лучше по частям.
Попробуйте, для начала, сделать такую проверку:
После окончания приёма - вывод не данных, а число CLK в пакете. Должно быть "как вкопанное" число .20.
Ср мар 18, 2015 13:01:31
Я тут еще раз снял осциллограмму, вот такая бяка наблюдается в самом начале(при подаче питания):
К тому же первые несколько посылок имеют немного другой формат.
Короче, дело не в программе, она , как раз, отрабатывает правильно.
Ср мар 18, 2015 13:13:37
Очень похоже на условие Reset-а счётчика пакетов.
Ср мар 18, 2015 13:21:32
Dmitry888 писал(а):PicNik писал(а):У вас дисплей ОК или ОА?
не понял вопроса
Дисплей парковки с общим анодом или ОК. И если есть возможность покажите,более растянутую картинку где можно увидеть, какой адрес и данные.
Ср мар 18, 2015 13:42:09
PicNik писал(а):Дисплей парковки с общим анодом или ОК. И если есть возможность покажите,более растянутую картинку где можно увидеть, какой адрес и данные.
Затрудняюсь ответить, на первой странице есть фото разобранного дисплея. Более детальная осциллограмма в первом посте.
Ср мар 18, 2015 13:48:07
Albert_V писал(а):Очень похоже на условие Reset-а счётчика пакетов.
Такая посылка появляется только один раз - при подаче питания, мне она не интересна, я её просто игнорирую.
Меня больше интересует другой вопрос: как мне отличить условия когда: датчик неисправен, датчик смотрит в бесконечность, расстояние перед датчиком менее 30 см. При всех этих условиях значение на датчике - 255.
Ср мар 18, 2015 14:00:18
Если я правильно понял вопрос (данные во всех этих случаях одинаковые) - никак.
Возможно, на какие-то данные вы не обратили внимание. Например, может быть одна посылка в которой каждому из этих условий соответствует один бит. Но это лишь моё предположение...
Ср мар 18, 2015 14:25:03
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
Ср мар 18, 2015 14:36:35
Напишите программу сравнения блоков посылок так, что бы отображалось в какой посылке что изменилось. Так будет проще "расколоть" протокол.
Более простой вариант - выводите попарно 1-ый блок 1-ая посылка, 2-ой блок 1-ая посылка; 1-ый блок 2-ая посылка, 2-ой блок 2-ая посылка; и т.д..
Чт мар 26, 2015 10:46:40
На ардуино вроде все получилось, пытаюсь "завести" всё это на 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 раз.
В чём моя ошибка?
Пн мар 30, 2015 06:24:24
Раз никто не может ответить - отвечу сам:
Ошибка в том, что флаг INT0IF_bit снимается каждый раз в основном цикле и возникает ситуация когда условие прерывания произошло, но флаг INT0IF_bit тут же снялся в основном цикле программы и обработчик прерывания не отработал. Правильнее, перед сбросом флага INT0IF_bit - проверять состояние флага INT0IE_bit, и сбрасывать его только когда это действительно нужно.
Вт окт 18, 2022 10:10:09
У меня парктроник без cs. Как правильно получить длину импульса по спаду?
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.