Помогите разобраться с кодом где ошибка
- Войдите на сайт для отправки комментариев
Сб, 11/02/2012 - 21:34
#define rxd 3 // rx data pin #define rxe 4 // rx enable pin #define delta 100 // max time delta #define mintime 100 // min time pulse unsigned int time,oldtime,count,log0,log1; // byte data[8]; // void setup(){ pinMode(rxd,INPUT); // pinMode(rxe,OUTPUT); // digitalWrite(rxe,LOW); // attachInterrupt(rxd,pinint,CHANGE); // Serial.begin(115200); // Serial.println("Starline 64 bit receiver started");// interrupts(); // } void pinint(){ if(digitalRead(rxd)==HIGH)oldtime=micros(); // else{ time=micros()-oldtime; // if(time<mintime)return; // if(constrain(time,log0-delta,log0+delta)==time)savebit(false); // else if(constrain(time,log1-delta,log1+delta)==time)savebit(true); // else{ log0=time/2; // log1=time/4; // count=0; // } } } void savebit(boolean val){ for(int i=1;i<=8;i++){ // data[i]=data[i]<<1; // if(i<8)if(bitRead(data[i+1],7))bitSet(data[i],0); // } if(val)bitSet(data[8],0); // count++; // if(count==64){ // Serial.print("STARLINE "); // for(int i=1;i<=8;i++)printhex(data[i]); // Serial.println(""); // } } void printhex(byte val){ // if(val<=0x0F)Serial.print("0"); // Serial.print(val,HEX); // } void loop(){}
Данные не выводятся в терминал не пойму почему, есле что сильно не ругать навичек...
а скорость в терминале такая же как в скетче ?
Да
А строка приветствия ("Starline 64 bit receiver started") выводится?
В радной терминалке эроглефы!!! А в другой только приветсвия и выводится...
В коде гдето ошибка так как принемаеммые данные не выводятся в терминал!!!! А где именно ошибка понять не могу.
В радной терминалке эроглефы!!! А в другой только приветсвия и выводится...
Прежде чем искать ошибку в алгоритме, устраните вывод "'эроглефов в радной терминалке"? Ненормально выводимое приветствие говорит о том, что вы канал связи криво настроили.
Как минимум.
Кстати, что за значение вы пытаетесь сохранить в переменной time?
Для чего нужны переменные log0 и log1?
Чего ради вы пишете за границы массива (строка 35) и иногда читаете за границами массива (строка 33)?
Диапазон частот принимаемого на пин rxd сигнала?
Еще очень много вопросов можно было бы поставить, если бы алгоритм был известен хотя бы в общих чертах. А гадать на кофейной гуще - нет уж, увольте...
Ресивер стоит 433.92 Мгц частота в основном используется во всех авто сигнализациях...
Данные идут вот в этой кодеровке - KeeLoq (является блочным кодом с 64-разрядным ключом и размером блока 32 бита.)
Ошибку в родном терменале устранил... Приветствия выводится отлично но код не в коком виде
Уважаемый step962 делал по этому примеру есле что не принимайте в серьез маи ошибки я новичек вот код ниже ... Код под ATmegu 16
Уважаемый step962 где вы увидели выход за границе; границы массива 0-8, используется 1-8, выхода за границы нет...
Вот оналогичный код... Нашел в интернети ну тож не понятно...
Уважаемый step962 где вы увидели выход за границе; границы массива 0-8, используется 1-8, выхода за границы нет...
Если вы объявляете массив как
int arr[8];
то резервируете область памяти под 8 (восемь) переменных типа int, обращение к которым происходит с помощью индекса, изменяющегося в пределах 0...7. При обращении к массиву с помощью индекса 8, вы, по сути, пытаетесь работать с ДЕВЯТЫМ элементом массива, место под который, естественно не зарезервировано. При этом читается (записывается) из области памяти, следующей сразу за массивом. Что там находится - дело случая. Что из этого может получиться - трудно предсказать. В любом случае, такие действия не могут идти на пользу программе.
А вот теперь понял спасибо за очень подробное разЪеснение.... step962
Уважаемый step962 есле вас не затруднит не моглибы полностью разжувать мне мою программу... И помочь с описанием кождой строчки может всетока получится найти ошибку... За рание огромное спасибо!!!
Уважаемый step962 есле вас не затруднит не моглибы полностью разжувать мне мою программу...
Конечно же затруднит - я представления не имею, для чего нужны эти коды, какая информация поступает на вход, что должно получиться на выходе и т.д. и т.п. Я до сих пор понятия не имею, будет ли интересна мне эта задача (скорее всего - нет).
Вам необходимо искать человека, которому будет интересна тема - и заниматься правкой данного кода (или разработкой нового) вместе. А для того, чтобы найти такого человека, необходимо хотя бы как можно точнее обрисовать задачу. Еще лучше - обрисовать эту задачу как можно увлекательнее. В противном случае вы едва ли найдете человека, готового убить несколько вечеров на непонятно что. Я точно не в их числе.
Всем ограммное спасибо кто участвовал!!! С кодом разобрался самостоятельно там была маленкая ошибочка...
Как говарится... Есле долго мучится, Чтонибудь получится....
))))
Всем ограммное спасибо кто участвовал!!! С кодом разобрался самостоятельно там была маленкая ошибочка...
Ну не томите - скажите, какую "маленькую ошибочку" нашли? Может быть, тогда и на более серъезные укажем. ;)
Вот рабачий код...
/*
*/
// (c) 2012 Phreaker Chernie
#define rxd 3 // ***rx data pin***
#define rxe 4 // ***rx enable pin***
#define delta 100 // ***Максимальное время дельта***
#define mintime 100 // ***Минимальное время импульса***
unsigned int time,oldtime,count,log0,log1; // ***Переменные которые принимают значения от 0 до 65535***
byte data[8]; // ***Массив для хранения информации с RX***
void setup() // ***Инициализирует и устанавливает***
{
pinMode(rxd,INPUT); // ***Устанавливаем как Вход***
pinMode(rxe,OUTPUT); // ***Устанавливаем как Выход***
digitalWrite(rxe,LOW); // ***Включить резистор на выводе аналогового входа 1***
attachInterrupt(rxd,pinint,CHANGE); // ***Обработки внешнего прерывания,(CHANGE прерывание вызывается при смене значения на порту, с LOW на HIGH и наоборот)***
Serial.begin(115200);
Serial.println("***STARLINE 64 Bit Receiver Started***");
interrupts(); // ***Включены прерывания***
}
void loop() // ***Выполнения программы***
{
pinint();
}
void pinint()
{
if(digitalRead(rxd)==HIGH)oldtime=micros(); //
else{
time=micros()-oldtime; //
if(time<mintime)return; //
if(constrain(time,log0-delta,log0+delta)==time)savebit(false); //
else if(constrain(time,log1-delta,log1+delta)==time)savebit(true); //
else{
log0=time/2; //
log1=time/4; //
count=0; //
}
}
}
void savebit(boolean val)
{
for(int i=1;i<=8;i++) //
{
data[i]=data[i]<<1; //
if(i<8)if(bitRead(data[i+1],7))bitSet(data[i],0); //
}
if(val)bitSet(data[8],0); //
count++; //
if(count==64) //
{
Serial.print("STARLINE_"); //
for(int i=1;i<=8;i++)printhex(data[i]); //
Serial.println(""); //
}
}
void printhex(byte val)
{
if(val<=0x0F)Serial.print("0"); //
Serial.print(val,HEX); //
}
так а ошибка где была?
Покрайне мери в терминал сыпятся данные после нажатия на пульт!!! А дальше буду модефецировать и разбиратся....
Вот так ...
А пречем тут азбука???
А пречем тут азбука???
да так, не бери в голову..
Ошибка была в том что в void loop небыло указано pinint (); Поэтому и не выводился код приема...
Ну ладно не буду принимать так близко к сердцу... так как новичек!!!
Ошибка была в том что в void loop небыло указано pinint (); Поэтому и не выводился код приема...
Ну, это не ошибка. Это фича... ;)
Ссорри а что такое фича???
Из Википедии (статья про "баг" - ошибка):
Популярное выражение «Это не баг, это фича» следует понимать буквально: это не ошибка, это предусмотренная особенность работы программы
Из англо-русского словаря:
feature (произносится примерно как "фича") - 1) особенность, характерная черта; деталь, признак, свойство; свойства, особенности, общий вид
В общем - шутка юмора с длинной бородой.
Понятно буду иметь в видду на будущее...!
НУ ВОТ ЧЕТО С МАДИФИКАЦИЕЙ КОДА ПОКА ПРОГРЕССА НЕТ... ОБИДНО ИНФЫ МАЛО...
Уважаемы step962 не моглибы вы мне обьяснить... Есле сможете понять...
Смотрите код по идее должин состоять из 64 байт
32 байта из них первые защифрованные они всегда должны быть разные
32 байта последние не зашифрованные они вообще дожны быть всегда одинаковые!!!
Не могу понять как это сделать...
Вот точная информация про пакет STARLINE http://trashgate.net/trashdb/StarLine
Не код, а посылка (или пакет, или телеграмма).
Длина не 64 байта, а 64 бита.
По приведенной ссылке точной информации нет. Только общая.
Не сказано, ни что из себя представляет блок hop, ни как формируется код кнопки.
Все, что можно сделать на основании этой информации - написать логгер. Программульку, которая будет уметь слушать входную линию, различать импульсы преамбулы, нуля и единицы. Благо формат используется очень простой, с одинаковой скважностью всех элементов и различием только в длительности импульсов.
В общем, для начала научитесь определять период: в цикле считывайте состояние на входе сигнальной линии, запоминайте времена перехода с низкого уровня на высокий (достаточно в этот момент прочитать и запомнить значение функции micros()), по разнице между соседними моментами определяйте, какой элемент получен (преамбула, ноль или единица) и выводите соответствующее значение в файл или в Serial-канал.
А вот для того, чтобы понимать, что за посылку вы приняли, необходимо еще много-много информации об этом протоколе найти.
Спасибо за разьеснения!!!! Вот толко мой код помоему есле я не ошибаюсь и работает как логгер...
У слова логгер несколько значений.
Это и тип рыболовного судна, если верить толковому словарю.
И устройство регистрации потока информации (от logging - регистрация, запиь (информации), протоколирование).
И еще, наверное, пара -другая неизвестных мне значений.
Если ваш код и работает как логгер в том смысле, который я вкладывал в это слово, то:
- очень хорошо
- на основании той информации, которая есть по приведенной вами ссылке, большего из устройства выжать не удастся. Например, устройство едва ли будет работать в качестве ключа, потому что оно не знает, как формируется блок "hop"
- но ведь он еще не работает, он только будет работать после устранения основных ошибок ;)
Вот я и занимаюсь устронением ошибок,,, перепроверяю и изучаю доп. инфу ну пока продвежений не очень много!!! Однаму трудно разобратся... Как говарится одна голова хорошо А две еще лучше...!!!
Уважаемы step962 как вы думаете а токой информации будет достаточно для нармального отображения покета????
1- http://trashgate.net/trashdb/KeeLoq
2- http://trashgate.net/trashdb/KeeLoqАлгоритм
ТОЛЬКО УЖЕ БРИЛОК ПРИДЕТСЯ ИСПОЛЬЗОВАТЬ С КОДИРОВКОЙ KeeLog...
Ну и вот типо описания...
Хотя Keelog уже отмирает, но многим будет интересна инфа формирование пачки.
Состав кодовой посылки
Формат передачи команды
;
; преамбула пауза кодовая посылка
; 512 us 12 раз 8*256 us 64 импульса с периодом 3*256 us
; +--+ +--+ +-...-+ +-++-++-++-++-++-...-+ +
; ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦¦ ¦¦ ¦¦ ¦¦ ¦¦ ¦ ¦
; +--+ +--+ +--...----+ ++ ++ ++ ++ ++ +----------...-----------+
; пауза между посылками
; 50*256 us
; +-------------------------------------------+
; ¦ Переменная часть 32 ¦ Постоянная часть 32 ¦
; +-------------------------------------------+
; ************************************************** ******************
; Переменная часть - зашифрованная последовательность бит
; +----------------------------------------------------+
; ¦ Функция 4 ¦ Контрольное слово 12 ¦ Синхронизатор 16¦
; +----------------------------------------------------+
; Контрольное слово - последнии 12 бит серийного номера
;
; Постоянная часть
; +-------------------------------+
; ¦ Серийный номер 28 ¦ Функция 4 ¦
; +-------------------------------+
;
; Функци
; +----------------------------------------------------------------------------+
; ¦ Бит защищенной команды ¦ Бит кнопки 1¦ Бит кнопки 2 ¦ Флаг долгого нажатия ¦
; +----------------------------------------------------------------------------+
;
;
; Получение переменной части
; +-----------------+ +------------------------------------+
; ¦ Скремблер 32 ¦ <- ¦ Незашифрованная переменная часть 32¦
; +-----------------+ +------------------------------------+
; XOR
; +-----------------+
; ¦ Ключ 32 ¦
; +-----------------+
; \/ \/ \/ \/ \/
; +-------------------------------------+
; ¦ Зашифрованная переменная часть 32 ¦
; +-------------------------------------+
;
; Функция скремблера X^32+X^21+X^1+1
; +---+ +---+
; +------------------------>¦== +----------------->¦== ¦ --+
; ¦ +->¦ ¦ +->¦ ¦ ¦
; ¦ ¦ +---+ ¦ +---+ ¦
; ¦ +----+ +---+ ¦
; ¦ ¦ ¦ ¦
; ¦ +--------------------- ------ ------------------+ ¦
; +-¦ 32¦ 31¦ 30¦ 29¦ 28¦...¦ 21¦ ... ¦ 4 ¦ 3 ¦ 2 ¦ 1 ¦<---+
;
Пытаюсь намисать код вычесления времени посылок чет не получатся.... SOS SOS SOS