Хочется попросить уважаемых программистов помочь довести прошивку LTK от 13.12.11
Необходимо найти ошибку в прошивке. Связался с tommy - у него сейчас совсем нет времени, да и на форуме он пропал
Сама прошивка тут
http://www.open-tag.ru/download/ltk_miles_13_12_11.rarИз переговоров с tommy выяснил, что ошибка где-то в самом приеме сигнала
в p_miles.c, вот текст кода (может кто сразу увидит):
/*****************************************************
File: p_miles.c - milestag protocol
ToDo:
- убрать мусор от p_simple;
- дописать хоть какие-нить команды;
*****************************************************/
//http://www.lasertagparts.com/mtformat-2.htm
#include "globals.h"
#ifdef PROTOCOL_MILES
#include "p_common.h"
#include <util/delay.h>
uint g_bSigInProcess=0; //флаг, что мы в процессе приёма
uchar bOvertime=0; //было-ли переполнение таймера (нужно лишь чтобы выключить приём, когда таймер переполнится дважды
uchar nPrevTime=0; //предыдущее значение таймера
uint nRecievingInfo=0; //формируемый пакет (в процессе)
uchar nBitsCount; //кол-во принятых бит (для отладки/проверки или учета принятого пакета)
uint nPrevBit;
//всё прерывание по переполнению счетчика0 нужно лишь для сброса флага принятой информации после как минимум одного периода простоя
ISR (TIMER0_OVF_vect) {
if (g_bSigInProcess!=0) {
if (bOvertime==1) {
g_bSigInProcess = 0;
bOvertime = 0;
} else {
bOvertime++;
};
};
g_nTime++;
}
// Процедура приёма IR. вызывается из прерывания,
SIGNAL (SIG_INTERRUPT0)
{
uchar nCurTime = TCNT0;
uchar nCurBit = 0;
if (PinIRR) {
nCurBit = 1;
};
uchar dTime;
dTime = nCurTime - nPrevTime;
nPrevTime = nCurTime;
//интересуют только перепады с 0 на 1 (концы ШИМ отрезков)
//в простом (этом - без учета помех) случае надо было сменить инициализацию прерывания на возрастание уровня,
//но по уму надо просто считать длительности нулевых и единичных отрезков с игнорированием всплесков от солнца,
//тогда можно и без всяких crc обойтись. но то как солнце фонит надо сначала снять и посмотреть, да
//т.ч. пускай такое будет прерывание
if (nCurBit) {
if (g_bSigInProcess!=0) {
if ((dTime>13)&&(dTime<25)) { // 0 - 448us..832us
nRecievingInfo <<= 1;
nRecievingInfo |= 0;
nBitsCount++;
} else if ((dTime>32)&&(dTime<48)) { // 1 - 1056us..1568us
nRecievingInfo <<= 1;
nRecievingInfo |= 1;
nBitsCount++;
} else {
//пришел мусор. не считаем за бит и прекращаем приём ("пуля прошла рядом"?)
g_bSigInProcess = 0;
nBitsCount = 0;
};
//приняли 14 бит. заканчиваем приём и обрабатываем что вышло
if (nBitsCount==14) {
g_bSigInProcess = 0;
if (nIRPackage==0) { //проверка чтоб успеть обработать предыдущий, прежде чем задавать новый (надо подумать)
if (nRecievingInfo & 0b10000000000000) {
//пришла команда - надо дождаться ещё пару бит и сделать трансляцию команд во внутреннее представление
//сейчас просто игнорируем это.
} else {
//разбираем майлс-выстрел на составляющие
uchar weapon = nRecievingInfo&0b00001111;
uchar team = (nRecievingInfo>>4)&0b00000011;
uchar id = (nRecievingInfo>>6)&0b01111111;
//и собираем обратно в свой формат, заодно обрезаем id до 6бит
nIRPackage = (id&0b00111111)<<7|team<<4|weapon;
};
};
};
} else {
//2400us - это 75 тиков с частотой 31250Гц
//запас +-480us на всякий случай
if ((dTime>60)&&(dTime<90)) {
g_bSigInProcess = 1;
nBitsCount = 0;
nRecievingInfo = 0;
};
};
};
bOvertime=0;
} // конец автомата обработки ИК датчика
void SendStart() {
onIRx;
_delay_us(2400);
offIRx;
_delay_us(600);
};
void Send1() {
onIRx;
_delay_us(1200);
offIRx;
_delay_us(600);
};
void Send0() {
onIRx;
_delay_us(600);
offIRx;
_delay_us(600);
};
void SendBits (uchar data, uchar mask) {
while (mask) {
if (data&mask) {
Send1();
} else {
Send0();
};
mask>>=1;
};
};
//14бит
//0ppppppppttwwww
void SendIRFire (uchar team, uchar id, uchar weapon) {
SendStart();
Send0();
SendBits(id, 1<<6);
SendBits(team, 1<<1);
SendBits(weapon, 1<<3);
offIRx;
};
//17бит
//1 mmmm mmmm pppp pppp - команда _m_ с параметром _p_
void SendIRCommand (uchar cmd, uchar param) {
};
void InitIR () {
// Fout = Кварц/(2*(N+1)) => N = Кварц/(2*Fout) - 1;
// соотв. при Кварц=8000КГц, значения N:
// 36Кгц, N = 110
// 40Кгц, N = 99
// 56Кгц, N = 70
OCR2 = 99;
};
#endif