You can post now and register later.
If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.
Как говорили коллеги, да и по коду так похоже, что задний ИК просто светит или не светит. (строки 698 - 707) И еще в паре мест он включается, но там тоже тупо на on/off.
// STOP RED SIGNALS *****************************************************************************
if ((clcstopsignals==0)&&(stopsignalson==0))
{
PORTD&=0b11111101; // Stop RED led OFF
}
if ((clcstopsignals>=stopsignals)||(stopsignalson==1))
{
PORTD|=0b00000010; // Stop RED led ON
clcstopsignals=stopsignals;
}
Отличная мысль! Прочитал сейчас статью на вики, и да, очень похоже на то, что вы написали в разделе "Кодирование". Только этих кодировок сейчас на одной вики, вон, штук 15 написано. Но все равно спасибо, надо глянуть.
И да. Светофор посылает пакеты с частотой примерно 3 Гц. Конечно логично иметь какой-то байт синхронизации, т.к. если машинка выезжает из за поворота, то может поймать только кусок пакета. Но я в упор не нахожу по коду место, где он определяется как "стартовый" или как-либо еще. Тут очень здорово, что код написан чисто на регистрах, безо всяких кастомных библиотек, исходники которых ушли вместе с челом который это придумывал) По коду я вижу вот что (строки 226 - 259):
while (1) { // НАЧИНАЕМ БЕСКОНЕЧНЫЙ ЦИКЛ
y=ACSR&0b00100000; // IR start Read FrontIR ******************************************************** // ПОДСКАЗКА ЧТО НАЧИНАЕМ ЧИТАТЬ ПЕРЕДНИЙ ПРИЕМНИК НА ТАЧКЕ
if (y==0) { // НАЧИНАЕМ ЗДОРОВЕННЫЙ if (НА 300 СТРОК, НО ЭТО НЕ ВАЖНО)
adr=0; // ОБНУЛЯЕМ ПЕРЕМЕННУЮ adr В КОТОРУЮ БУДЕМ СОХРАНЯТЬ ПОЛУЧЕННЫЕ БИТЫ
x1=0; // х1 и х2 ПОТОМ СКЛЕЯТСЯ В ОДИН (х1 - СТАРШИЙ БИТ HIGH, х2 - МЛАДШИЙ LOW)
x2=0;
_delay_us(19775); // ЗАДЕРЖКА 20 мс КРАТНА 2мс, Т.Е. МЫ ПРОПУСКАЕМ "СТАРТОВЫЕ" 10 БИТ? ТАК ЧТО ЛИ?
y=ACSR&0b00100000; // bit 0 // ВООБЩЕ НА СКОЛЬКО Я ПОНЯЛ ASCR ЭТО РЕГИСТР ВНУТРЕННЕГО КОМПАРАТОРА, МЫ ЕГО ЧИТАЕМ...
if (y==0) adr|=0b00000001; // И ЕСЛИ ОН РАВЕН НУЛЮ, ТО ЗАПИСЫВАЕМ 1 В НУЛЕВОЙ БИТ БАЙТА adr? А ЕСЛИ НЕ РАВЕН, ТО ЧТО? НЕ ПОЙМУ
_delay_us(7910); // ТУПО ЖДЕМ 8 мс (ПРИ ДЛИТЕЛЬНОСТИ 1 БИТА В 2 мс ЭТО КАК-ТО МНОГОВАТО). ТОЖЕ НЕ ПОНЯТНО.
y=ACSR&0b00100000; // bit 1 // НУ И ТАК ЕЩЕ 7 РАЗ
if (y==0) adr|=0b00000010;
_delay_us(7910);
y=ACSR&0b00100000; // bit 2
if (y==0) adr|=0b00000100;
_delay_us(7910);
y=ACSR&0b00100000; // bit 3
if (y==0) adr|=0b00001000;
_delay_us(7910);
y=ACSR&0b00100000; // bit 4
if (y==0) adr|=0b00010000;
_delay_us(7910);
y=ACSR&0b00100000; // bit 5
if (y==0) adr|=0b00100000;
_delay_us(7910);
y=ACSR&0b00100000; // bit 6
if (y==0) adr|=0b01000000;
_delay_us(7910);
y=ACSR&0b00100000; // bit 7
if (y==0) adr|=0b10000000;
Я курсорами осциллографа прополз всю осциллограмму, четко шаг по 2 мс получается по дельта-Т
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.