Jump to content

    

Поиск ключа в массиве

Добрый день!
Нужно найти ключ шлагбаума в массиве данных. 
В массив записываются данные периода и скважности сигнала. Сигнал состоит из логического нуля и единицы. Логический нуль кодируется периодом в 960 мкс и длительностью 640 мкс. Логическая единица кодируется периодом 960 мкс и длительность 320 мкс. Форма сигнала представлена на рисунки 1.Также сигнала имеет пилотный период равный примерно 15 000 мкс рисунок 2. Преамбула сигнала составляет 320 мкс. Длина ключа 12 бит с преамбулой 13 бит. 
Что сделал инициализировал периферию мк для поиска периода и длительности. Настроил так периферию что в процессе поиска периода и длительности участвует только аппаратная часть мк, не каких программных обработок нет. Только забираю данные периода и длительности в прерывании (конечно пропуск возможен но маловероятно). 
Счет периода от спадающего до спадающего фронта, по растущему фронту длительность. Приложил два файла (сделанные в разное время) с данными периода и длительности.

Spoiler

Период следования
[0] 952 0x2000710C int32_t
[1] 956 0x20007110 int32_t
[2] 977 0x20007114 int32_t
[3] 993 0x20007118 int32_t
[4] 965 0x2000711C int32_t
[5] 975 0x20007120 int32_t
[6] 980 0x20007124 int32_t
[7] 971 0x20007128 int32_t
[8] 960 0x2000712C int32_t
[9] 973 0x20007130 int32_t
[10] 964 0x20007134 int32_t
[11] 970 0x20007138 int32_t
[12] 15086 0x2000713C int32_t
[13] 967 0x20007140 int32_t
[14] 952 0x20007144 int32_t
[15] 988 0x20007148 int32_t
[16] 975 0x2000714C int32_t
[17] 967 0x20007150 int32_t
[18] 990 0x20007154 int32_t
[19] 962 0x20007158 int32_t
[20] 974 0x2000715C int32_t
[21] 964 0x20007160 int32_t
[22] 997 0x20007164 int32_t
[23] 964 0x20007168 int32_t
[24] 965 0x2000716C int32_t
[25] 15083 0x20007170 int32_t
[26] 936 0x20007174 int32_t
[27] 981 0x20007178 int32_t
[28] 968 0x2000717C int32_t
[29] 978 0x20007180 int32_t
[30] 970 0x20007184 int32_t
[31] 977 0x20007188 int32_t
[32] 961 0x2000718C int32_t
[33] 974 0x20007190 int32_t
[34] 986 0x20007194 int32_t
[35] 971 0x20007198 int32_t
[36] 962 0x2000719C int32_t
[37] 988 0x200071A0 int32_t
[38] 15065 0x200071A4 int32_t
[39] 958 0x200071A8 int32_t
[40] 982 0x200071AC int32_t
[41] 968 0x200071B0 int32_t
[42] 979 0x200071B4 int32_t
[43] 970 0x200071B8 int32_t
[44] 980 0x200071BC int32_t
[45] 986 0x200071C0 int32_t
[46] 974 0x200071C4 int32_t
[47] 964 0x200071C8 int32_t
[48] 973 0x200071CC int32_t
[49] 965 0x200071D0 int32_t
[50] 992 0x200071D4 int32_t
[51] 15060 0x200071D8 int32_t
[52] 958 0x200071DC int32_t
[53] 982 0x200071E0 int32_t
[54] 967 0x200071E4 int32_t
[55] 976 0x200071E8 int32_t
[56] 993 0x200071EC int32_t
[57] 964 0x200071F0 int32_t
[58] 969 0x200071F4 int32_t
[59] 978 0x200071F8 int32_t
[60] 966 0x200071FC int32_t
[61] 975 0x20007200 int32_t
[62] 991 0x20007204 int32_t
[63] 966 0x20007208 int32_t
[64] 15066 0x2000720C int32_t
[65] 960 0x20007210 int32_t
[66] 968 0x20007214 int32_t
[67] 972 0x20007218 int32_t
[68] 981 0x2000721C int32_t
[69] 973 0x20007220 int32_t
[70] 984 0x20007224 int32_t
[71] 971 0x20007228 int32_t
[72] 961 0x2000722C int32_t
[73] 978 0x20007230 int32_t
[74] 980 0x20007234 int32_t
[75] 967 0x20007238 int32_t
[76] 962 0x2000723C int32_t
[77] 15096 0x20007240 int32_t
[78] 934 0x20007244 int32_t
[79] 970 0x20007248 int32_t
[80] 970 0x2000724C int32_t
[81] 982 0x20007250 int32_t
[82] 973 0x20007254 int32_t
[83] 984 0x20007258 int32_t
[84] 973 0x2000725C int32_t
[85] 953 0x20007260 int32_t
[86] 995 0x20007264 int32_t
[87] 971 0x20007268 int32_t
[88] 964 0x2000726C int32_t
[89] 965 0x20007270 int32_t
[90] 15082 0x20007274 int32_t
[91] 961 0x20007278 int32_t
[92] 960 0x2000727C int32_t
[93] 975 0x20007280 int32_t
[94] 989 0x20007284 int32_t
[95] 977 0x20007288 int32_t
[96] 949 0x2000728C int32_t
[97] 972 0x20007290 int32_t
[98] 988 0x20007294 int32_t
[99] 975 0x20007298 int32_t
[100] 970 0x2000729C int32_t
[101] 971 0x200072A0 int32_t
[102] 977 0x200072A4 int32_t
[103] 15067 0x200072A8 int32_t
[104] 933 0x200072AC int32_t
[105] 984 0x200072B0 int32_t
[106] 970 0x200072B4 int32_t
[107] 963 0x200072B8 int32_t
[108] 984 0x200072BC int32_t
[109] 971 0x200072C0 int32_t
[110] 980 0x200072C4 int32_t
[111] 972 0x200072C8 int32_t
[112] 985 0x200072CC int32_t
[113] 973 0x200072D0 int32_t
[114] 966 0x200072D4 int32_t
[115] 965 0x200072D8 int32_t
[116] 15089 0x200072DC int32_t
[117] 947 0x200072E0 int32_t
[118] 978 0x200072E4 int32_t
[119] 966 0x200072E8 int32_t
[120] 977 0x200072EC int32_t
[121] 968 0x200072F0 int32_t
[122] 978 0x200072F4 int32_t
[123] 982 0x200072F8 int32_t
[124] 949 0x200072FC int32_t
[125] 985 0x20007300 int32_t
[126] 971 0x20007304 int32_t
[127] 966 0x20007308 int32_t



длительность сигнала

[0] 313 0x2000730C int32_t
[1] 342 0x20007310 int32_t
[2] 693 0x20007314 int32_t
[3] 669 0x20007318 int32_t
[4] 650 0x2000731C int32_t
[5] 342 0x20007320 int32_t
[6] 338 0x20007324 int32_t
[7] 328 0x20007328 int32_t
[8] 645 0x2000732C int32_t
[9] 668 0x20007330 int32_t
[10] 647 0x20007334 int32_t
[11] 675 0x20007338 int32_t
[12] 14771 0x2000733C int32_t
[13] 366 0x20007340 int32_t
[14] 358 0x20007344 int32_t
[15] 701 0x20007348 int32_t
[16] 670 0x2000734C int32_t
[17] 673 0x20007350 int32_t
[18] 354 0x20007354 int32_t
[19] 341 0x20007358 int32_t
[20] 332 0x2000735C int32_t
[21] 648 0x20007360 int32_t
[22] 666 0x20007364 int32_t
[23] 643 0x20007368 int32_t
[24] 650 0x2000736C int32_t
[25] 14742 0x20007370 int32_t
[26] 349 0x20007374 int32_t
[27] 387 0x20007378 int32_t
[28] 680 0x2000737C int32_t
[29] 696 0x20007380 int32_t
[30] 697 0x20007384 int32_t
[31] 364 0x20007388 int32_t
[32] 364 0x2000738C int32_t
[33] 355 0x20007390 int32_t
[34] 673 0x20007394 int32_t
[35] 667 0x20007398 int32_t
[36] 670 0x2000739C int32_t
[37] 671 0x200073A0 int32_t
[38] 14754 0x200073A4 int32_t
[39] 372 0x200073A8 int32_t
[40] 387 0x200073AC int32_t
[41] 680 0x200073B0 int32_t
[42] 697 0x200073B4 int32_t
[43] 672 0x200073B8 int32_t
[44] 366 0x200073BC int32_t
[45] 368 0x200073C0 int32_t
[46] 331 0x200073C4 int32_t
[47] 648 0x200073C8 int32_t
[48] 668 0x200073CC int32_t
[49] 671 0x200073D0 int32_t
[50] 679 0x200073D4 int32_t
[51] 14748 0x200073D8 int32_t
[52] 374 0x200073DC int32_t
[53] 387 0x200073E0 int32_t
[54] 680 0x200073E4 int32_t
[55] 693 0x200073E8 int32_t
[56] 670 0x200073EC int32_t
[57] 326 0x200073F0 int32_t
[58] 343 0x200073F4 int32_t
[59] 361 0x200073F8 int32_t
[60] 650 0x200073FC int32_t
[61] 667 0x20007400 int32_t
[62] 670 0x20007404 int32_t
[63] 651 0x20007408 int32_t
[64] 14738 0x2000740C int32_t
[65] 350 0x20007410 int32_t
[66] 365 0x20007414 int32_t
[67] 686 0x20007418 int32_t
[68] 693 0x2000741C int32_t
[69] 668 0x20007420 int32_t
[70] 346 0x20007424 int32_t
[71] 336 0x20007428 int32_t
[72] 340 0x2000742C int32_t
[73] 661 0x20007430 int32_t
[74] 644 0x20007434 int32_t
[75] 642 0x20007438 int32_t
[76] 648 0x2000743C int32_t
[77] 14742 0x20007440 int32_t
[78] 323 0x20007444 int32_t
[79] 365 0x20007448 int32_t
[80] 684 0x2000744C int32_t
[81] 694 0x20007450 int32_t
[82] 668 0x20007454 int32_t
[83] 346 0x20007458 int32_t
[84] 342 0x2000745C int32_t
[85] 337 0x20007460 int32_t
[86] 679 0x20007464 int32_t
[87] 638 0x20007468 int32_t
[88] 638 0x2000746C int32_t
[89] 648 0x20007470 int32_t
[90] 14758 0x20007474 int32_t
[91] 352 0x20007478 int32_t
[92] 361 0x2000747C int32_t
[93] 686 0x20007480 int32_t
[94] 677 0x20007484 int32_t
[95] 667 0x20007488 int32_t
[96] 338 0x2000748C int32_t
[97] 361 0x20007490 int32_t
[98] 353 0x20007494 int32_t
[99] 662 0x20007498 int32_t
[100] 660 0x2000749C int32_t
[101] 655 0x200074A0 int32_t
[102] 665 0x200074A4 int32_t
[103] 14742 0x200074A8 int32_t
[104] 366 0x200074AC int32_t
[105] 393 0x200074B0 int32_t
[106] 695 0x200074B4 int32_t
[107] 716 0x200074B8 int32_t
[108] 714 0x200074BC int32_t
[109] 388 0x200074C0 int32_t
[110] 386 0x200074C4 int32_t
[111] 353 0x200074C8 int32_t
[112] 672 0x200074CC int32_t
[113] 670 0x200074D0 int32_t
[114] 673 0x200074D4 int32_t
[115] 670 0x200074D8 int32_t
[116] 14753 0x200074DC int32_t
[117] 345 0x200074E0 int32_t
[118] 360 0x200074E4 int32_t
[119] 677 0x200074E8 int32_t
[120] 694 0x200074EC int32_t
[121] 672 0x200074F0 int32_t
[122] 365 0x200074F4 int32_t
[123] 339 0x200074F8 int32_t
[124] 330 0x200074FC int32_t
[125] 671 0x20007500 int32_t
[126] 667 0x20007504 int32_t
[127] 673 0x20007508 int32_t

Spoiler

период
[0] 570 0x2000710C int32_t
[1] 373 0x20007110 int32_t
[2] 678 0x20007114 int32_t
[3] 401 0x20007118 int32_t
[4] 967 0x2000711C int32_t
[5] 1982 0x20007120 int32_t
[6] 1772 0x20007124 int32_t
[7] 1134 0x20007128 int32_t
[8] 2451 0x2000712C int32_t
[9] 1295 0x20007130 int32_t
[10] 3934 0x20007134 int32_t
[11] 677 0x20007138 int32_t
[12] 99 0x2000713C int32_t
[13] 398 0x20007140 int32_t
[14] 606 0x20007144 int32_t
[15] 3492 0x20007148 int32_t
[16] 4794 0x2000714C int32_t
[17] 1035 0x20007150 int32_t
[18] 11590 0x20007154 int32_t
[19] 1971 0x20007158 int32_t
[20] 4991 0x2000715C int32_t
[21] 12165 0x20007160 int32_t
[22] 860 0x20007164 int32_t
[23] 27639 0x20007168 int32_t
[24] 6235 0x2000716C int32_t
[25] 1532 0x20007170 int32_t
[26] 4037 0x20007174 int32_t
[27] 3669 0x20007178 int32_t
[28] 7276 0x2000717C int32_t
[29] 20240 0x20007180 int32_t
[30] 87952 0x20007184 int32_t
[31] 6747 0x20007188 int32_t
[32] 14132 0x2000718C int32_t
[33] 823534 0x20007190 int32_t
[34] 686 0x20007194 int32_t
[35] 2655 0x20007198 int32_t
[36] 402 0x2000719C int32_t
[37] 300 0x200071A0 int32_t
[38] 715 0x200071A4 int32_t
[39] 150 0x200071A8 int32_t
[40] 722 0x200071AC int32_t
[41] 149 0x200071B0 int32_t
[42] 150 0x200071B4 int32_t
[43] 622 0x200071B8 int32_t
[44] 373 0x200071BC int32_t
[45] 375 0x200071C0 int32_t
[46] 622 0x200071C4 int32_t
[47] 201 0x200071C8 int32_t
[48] 125 0x200071CC int32_t
[49] 575 0x200071D0 int32_t
[50] 276 0x200071D4 int32_t
[51] 150 0x200071D8 int32_t
[52] 1076 0x200071DC int32_t
[53] 405 0x200071E0 int32_t
[54] 503 0x200071E4 int32_t
[55] 983 0x200071E8 int32_t
[56] 25 0x200071EC int32_t
[57] 100 0x200071F0 int32_t
[58] 50 0x200071F4 int32_t
[59] 277 0x200071F8 int32_t
[60] 456 0x200071FC int32_t
[61] 382 0x20007200 int32_t
[62] 101 0x20007204 int32_t
[63] 25 0x20007208 int32_t
[64] 199 0x2000720C int32_t
[65] 274 0x20007210 int32_t
[66] 275 0x20007214 int32_t
[67] 3807089 0x20007218 int32_t
[68] 919 0x2000721C int32_t
[69] 977 0x20007220 int32_t
[70] 986 0x20007224 int32_t
[71] 959 0x20007228 int32_t
[72] 994 0x2000722C int32_t
[73] 965 0x20007230 int32_t
[74] 985 0x20007234 int32_t
[75] 957 0x20007238 int32_t
[76] 994 0x2000723C int32_t
[77] 967 0x20007240 int32_t
[78] 956 0x20007244 int32_t
[79] 989 0x20007248 int32_t
[80] 15066 0x2000724C int32_t
[81] 955 0x20007250 int32_t
[82] 981 0x20007254 int32_t
[83] 967 0x20007258 int32_t
[84] 976 0x2000725C int32_t
[85] 966 0x20007260 int32_t
[86] 975 0x20007264 int32_t
[87] 970 0x20007268 int32_t
[88] 985 0x2000726C int32_t
[89] 976 0x20007270 int32_t
[90] 979 0x20007274 int32_t
[91] 965 0x20007278 int32_t
[92] 962 0x2000727C int32_t
[93] 15088 0x20007280 int32_t
[94] 927 0x20007284 int32_t
[95] 972 0x20007288 int32_t
[96] 971 0x2000728C int32_t
[97] 991 0x20007290 int32_t
[98] 974 0x20007294 int32_t
[99] 958 0x20007298 int32_t
[100] 972 0x2000729C int32_t
[101] 981 0x200072A0 int32_t
[102] 967 0x200072A4 int32_t
[103] 978 0x200072A8 int32_t
[104] 969 0x200072AC int32_t
[105] 989 0x200072B0 int32_t
[106] 15079 0x200072B4 int32_t
[107] 966 0x200072B8 int32_t
[108] 956 0x200072BC int32_t
[109] 995 0x200072C0 int32_t
[110] 976 0x200072C4 int32_t
[111] 967 0x200072C8 int32_t
[112] 963 0x200072CC int32_t
[113] 968 0x200072D0 int32_t
[114] 978 0x200072D4 int32_t
[115] 992 0x200072D8 int32_t
[116] 950 0x200072DC int32_t
[117] 989 0x200072E0 int32_t
[118] 976 0x200072E4 int32_t
[119] 15082 0x200072E8 int32_t
[120] 931 0x200072EC int32_t
[121] 956 0x200072F0 int32_t
[122] 983 0x200072F4 int32_t
[123] 963 0x200072F8 int32_t
[124] 993 0x200072FC int32_t
[125] 962 0x20007300 int32_t
[126] 985 0x20007304 int32_t
[127] 972 0x20007308 int32_t




длительность
[0] 76 0x2000730C int32_t
[1] 126 0x20007310 int32_t
[2] 49 0x20007314 int32_t
[3] 100 0x20007318 int32_t
[4] 967 0x2000731C int32_t
[5] 967 0x20007320 int32_t
[6] 76 0x20007324 int32_t
[7] 50 0x20007328 int32_t
[8] 75 0x2000732C int32_t
[9] 25 0x20007330 int32_t
[10] 25 0x20007334 int32_t
[11] 25 0x20007338 int32_t
[12] 49 0x2000733C int32_t
[13] 49 0x20007340 int32_t
[14] 25 0x20007344 int32_t
[15] 74 0x20007348 int32_t
[16] 101 0x2000734C int32_t
[17] 25 0x20007350 int32_t
[18] 25 0x20007354 int32_t
[19] 102 0x20007358 int32_t
[20] 99 0x2000735C int32_t
[21] 51 0x20007360 int32_t
[22] 25 0x20007364 int32_t
[23] 51 0x20007368 int32_t
[24] 51 0x2000736C int32_t
[25] 25 0x20007370 int32_t
[26] 25 0x20007374 int32_t
[27] 3669 0x20007378 int32_t
[28] 3669 0x2000737C int32_t
[29] 26 0x20007380 int32_t
[30] 26 0x20007384 int32_t
[31] 25 0x20007388 int32_t
[32] 26 0x2000738C int32_t
[33] 25 0x20007390 int32_t
[34] 51 0x20007394 int32_t
[35] 26 0x20007398 int32_t
[36] 50 0x2000739C int32_t
[37] 50 0x200073A0 int32_t
[38] 121 0x200073A4 int32_t
[39] 25 0x200073A8 int32_t
[40] 25 0x200073AC int32_t
[41] 75 0x200073B0 int32_t
[42] 50 0x200073B4 int32_t
[43] 100 0x200073B8 int32_t
[44] 174 0x200073BC int32_t
[45] 125 0x200073C0 int32_t
[46] 74 0x200073C4 int32_t
[47] 151 0x200073C8 int32_t
[48] 75 0x200073CC int32_t
[49] 450 0x200073D0 int32_t
[50] 201 0x200073D4 int32_t
[51] 100 0x200073D8 int32_t
[52] 801 0x200073DC int32_t
[53] 380 0x200073E0 int32_t
[54] 177 0x200073E4 int32_t
[55] 958 0x200073E8 int32_t
[56] 25 0x200073EC int32_t
[57] 100 0x200073F0 int32_t
[58] 100 0x200073F4 int32_t
[59] 101 0x200073F8 int32_t
[60] 380 0x200073FC int32_t
[61] 205 0x20007400 int32_t
[62] 101 0x20007404 int32_t
[63] 101 0x20007408 int32_t
[64] 174 0x2000740C int32_t
[65] 49 0x20007410 int32_t
[66] 125 0x20007414 int32_t
[67] 51 0x20007418 int32_t
[68] 369 0x2000741C int32_t
[69] 421 0x20007420 int32_t
[70] 741 0x20007424 int32_t
[71] 708 0x20007428 int32_t
[72] 733 0x2000742C int32_t
[73] 374 0x20007430 int32_t
[74] 369 0x20007434 int32_t
[75] 367 0x20007438 int32_t
[76] 690 0x2000743C int32_t
[77] 672 0x20007440 int32_t
[78] 688 0x20007444 int32_t
[79] 693 0x20007448 int32_t
[80] 14755 0x2000744C int32_t
[81] 347 0x20007450 int32_t
[82] 362 0x20007454 int32_t
[83] 678 0x20007458 int32_t
[84] 694 0x2000745C int32_t
[85] 670 0x20007460 int32_t
[86] 362 0x20007464 int32_t
[87] 361 0x20007468 int32_t
[88] 342 0x2000746C int32_t
[89] 658 0x20007470 int32_t
[90] 642 0x20007474 int32_t
[91] 641 0x20007478 int32_t
[92] 647 0x2000747C int32_t
[93] 14750 0x20007480 int32_t
[94] 342 0x20007484 int32_t
[95] 389 0x20007488 int32_t
[96] 711 0x2000748C int32_t
[97] 704 0x20007490 int32_t
[98] 694 0x20007494 int32_t
[99] 347 0x20007498 int32_t
[100] 364 0x2000749C int32_t
[101] 361 0x200074A0 int32_t
[102] 678 0x200074A4 int32_t
[103] 696 0x200074A8 int32_t
[104] 672 0x200074AC int32_t
[105] 696 0x200074B0 int32_t
[106] 14744 0x200074B4 int32_t
[107] 340 0x200074B8 int32_t
[108] 363 0x200074BC int32_t
[109] 681 0x200074C0 int32_t
[110] 666 0x200074C4 int32_t
[111] 665 0x200074C8 int32_t
[112] 347 0x200074CC int32_t
[113] 342 0x200074D0 int32_t
[114] 362 0x200074D4 int32_t
[115] 675 0x200074D8 int32_t
[116] 642 0x200074DC int32_t
[117] 669 0x200074E0 int32_t
[118] 659 0x200074E4 int32_t
[119] 14733 0x200074E8 int32_t
[120] 339 0x200074EC int32_t
[121] 371 0x200074F0 int32_t
[122] 715 0x200074F4 int32_t
[123] 690 0x200074F8 int32_t
[124] 711 0x200074FC int32_t
[125] 347 0x20007500 int32_t
[126] 370 0x20007504 int32_t
[127] 345 0x20007508 int32_t

Как видим из фалов, в массиве присутствуют шумы и повторение кодирования логических нулей и единиц отличаются. 

Написал код:

uint8_t search_key(void) // поиск ключа
{
        static uint8_t error_cade = 0; // код ошибки
        counter_T = 0;
        for(i = 0; i < 128 - 1; i++){
        if((captur_0[i+1] - captur_0[i]) > captur_0[i]){
         switch(counter_T){
         case 0: T1 = i+1; counter_T ++; break; // координата пилотного периода 1
         case 1: T2 = i+1; counter_T ++; break; // координата пилотного периода 2
         case 2: T3 = i+1;                      // координата пилотного периода 3
         if(((T3 - T2) == (T2 - T1)) && ((T3 - T2) >= 12)){ // меньше 12 бит не видал ключей
           T1 ++;
           T2 ++;
           T3 ++;
           counter_T ++;
           for(j = 0; j < (T3 - T2) - 1; j++){
           if(!(((captur_0[j+T3] - captur_1[j+T3]) - (captur_0[j+T2] - captur_1[j+T2])) > -64 && ((captur_0[j+T3] - captur_1[j+T3]) - (captur_0[j+T2] - captur_1[j+T2])) < 64)){
           counter_T = 0;
           error_cade = 0;
           break;
           }
           else{
           if((((captur_0[j+T3] - captur_1[j+T3]) - (captur_0[j+T2] - captur_1[j+T2])) > -64 && ((captur_0[j+T3] - captur_1[j+T3]) - (captur_0[j+T2] - captur_1[j+T2])) < 64)){
             
              if (CheckValue(320, captur_1[j+T2]) && CheckValue(640, (captur_0[j+T2] - captur_1[j+T2]))) // valid 1
              {
              set_bit(BARRIER_LIST[0].key,j);
              }
              else if (CheckValue(640,  captur_1[j+T2]) && CheckValue(320, (captur_0[j+T2] - captur_1[j+T2]))) // valid 0
              {
              clear_bit(BARRIER_LIST[0].key,j);
              }
              
              error_cade = 1;
            }
          }
          }
          
          if(error_cade == 0 && i > 72){
          return(error_cade);
          }
          __NOP();
          
         }
         else{ counter_T = 0; }
         break;
         }
         }
       }
       
       return(error_cade);
}

Код работает, проверял повторяемость получаемого ключа. Но мне код не нравится. Думаю что есть что-то более простое и надежно и с быстрым поиском ключа.

 

рис.1.jpg

рис2.jpg

Share this post


Link to post
Share on other sites

Упорядочить массив. "Бинарный поиск". Но имеет ли это все смысл для такого "большого" его размера, в 128 значений ?

Если я "идею" вопроса понял. (?)

 

Share this post


Link to post
Share on other sites

Я так понял, что под "поиск ключа" следует понимать не поиск, а выделение кадра из потока данных.

Quote

Также сигнала имеет пилотный период равный примерно 15 000 мкс

Ваша задача сводится к конечному автомату, который изначально находится в состоянии "ожидаю пилотный период примерно 15000мкс". Перебираем данные, пока не встретили этот период.

Quote

Преамбула сигнала составляет 320 мкс.

После того, как мы нашли этот пилотный период автомат переходит в состояние "ожидаю преамбулу сигнала" и если следующие поступившие на вход данные являются преамбулой то переходит в состояние "считываю ключ"

В состоянии "считываю ключ" он с заданной точностью считывает нули и единицы из потока, считывая либо ровно 12бит, либо пока ему не встретится еще одна преамбула сигнала или пилотный период.

В любой непонятной ситуации(когда на входе получилось то, что не ожидалось) автомат переходит в состояние "ожидаю пилотный период примерно 15000мкс".. И начинает всё сначала.

То, что получится на выходе и будет ключ. 

Описание протокола у вас не очень точное, картинок нет. От того и моё описание автомата дано с такой-же точностью. Чисто чтобы проиллюстрировать идею.

Share this post


Link to post
Share on other sites

Не нужно мерять периоды, все гораздо проще - нужно взвести прерывание по фронту, в его обработчике стартует таймер на 480 мкс, по истечении которого уровень на линии определяет информационный бит. При приеме преамбулы с такого декодера пойдут одинаковые биты, после чего прием "плавно" перейдет в накопление ключа, которое стартует при приеме первого бита, отличного от преамбулы.

Ещё, как правило, такие посылки содержат контрольный бит (четности или др.), таким образом, событие "принят ключ" наступает после цепочки событий "накоплено N битов преамбулы" -> "накоплено 12 бит" -> "совпал бит четности".

Share this post


Link to post
Share on other sites
14 часов назад, gerber сказал:

Не нужно мерять периоды, все гораздо проще - нужно взвести прерывание по фронту, в его обработчике стартует таймер на 480 мкс, по истечении которого уровень на линии определяет информационный бит.

По уму нужно этот сигнал фронта завести не на прерывание по фронту, а на вход таймера, запускаемого фронтом сигнала (и тактируемого от внутреннего источника clk). И ISR нужен только один - вызываемый по истечению таймаута этого таймера, в котором и значение на пине защёлкнуть можно и по новой перепрограммировать таймер для следующего старта по следующему фронту.

PS: Впрочем - можно и вообще без прерываний на каждый бит обойтись....

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this