Цитата(fot0n @ May 13 2009, 13:50)

есть программа отправки посылки, но она не отправляет посылку на реальном, устройстве, может кто-нибудь посмотреть и сказать в чем проблема....
Кто работал с Xe1202, помогите.
прикрепил проект...
Вот писал программу для XM1203 + PIC18
Программа отправляет и принимает пакеты. Микросхема запущена в режиме кода баркера. Отправка и прием реализованы через прерывание, основная программа не загружается обработкой отправки и приема - а тупо либо ждет флага что пакет пришел. Либо формирует пакет и выставляет флаг для инициализации отправки.
В пакете реализован программный паттерн (каждый пакет должен начинаться с байтов 0x96,0x81,0x7E,0x69). затем идет байт в котором лежит длина пакета, затем сам пакет и в конце CRC, посчитанная по алгоритму реализованному в шине 1-wire.
Вот код прерывания, в котором и идет вся работа:
Код
void interrupt engen(void)
{
if(INT1IF==1)
{
INT1IF=0; // обнуляем флаг
if((PreMode==RF_SW_RECEIVER)&&(DCLK)){ // если режим приема, ищем передний фронт
if(priem==0){ // ищем pattern
temp=temp<<1;
if (DATA==1) temp=temp|0x00000001;
if (temp==0x96817E69) {
priem=1;
bitn=0;
byten=0;
}
}else{ // принимаем пакет
packet[byten]<<=1;
if (DATA==1) packet[byten]|=1;
bitn++;
if(bitn>=8){
bitn=0;
byten++;
if(byten>=1){
if(byten>=packet[0]){priem=0;newpacket=1;}
}
}
}
}else if((PreMode==RF_SW_TRANSMITTER)&&(DCLK==0)){
if(peredacha==0){
byten=0;
BitCounter=0x80;
}else if(peredacha==1){
packet_tx[4]+=2; // +2, т.к. 1 байт sizeof + 1 байт CRC
packet_tx[packet_tx[4]+4-1]=CalcCRC_1Wire(&packet_tx[4],packet_tx[4]-1); // байт с номером sizeof(packet)+4-1 crc от пакета (включая sizeof)
peredacha++;
}else{
if(packet_tx[byten]&BitCounter)
DATA = 1;
else
DATA = 0;
BitCounter>>=1;
if(BitCounter==0){
BitCounter=0x80;
byten++;
if (byten>=packet_tx[4]+4) peredacha=0;
}
}
}
}
}
Для того чтобы отправить байт нужно сделать следующее:
Код
SetRFMode(RF_SW_TRANSMITTER);
Delay_ms(100);
packet_tx[4]=3; //Размер пакета
packet_tx[5]=packet[1]; // Адрес устройства
packet_tx[6]=packet[2]; //Команда считать температуру
packet_tx[6]=0xAA; //температура
peredacha=1;
while(peredacha);
чтобы принять пакет, делаем так:
Код
SetRFMode(RF_SW_RECEIVER);
newpacket=0;
while(newpacket==0); // ждем прихода пакета
//далее распечатываем принятый пакет
printf("\r\n");
for(i=1;i<(packet[0]-1);i++){
printf(" %02.2X",packet[i]);
}
Переписать под 1202 и 16-ый пик думаю не составит труда, разбирайтесь.
Проект на Hi-Tech PICC18 (В рассматриваемом примере программа всегда стоит на приеме и ждет определенный пакет - на который она отвечает)