Возникла проблема, нужно передать код через радио канал. На данном этапе стоит задача отработать передачу данных напрямую через короткий проводок на макетке. Дак вот наблюдается нестабильность в получении кода, что на пике , что на авр. Может кто реализовывал типичную проблему, так не подскажите как лучше это сделать? Посылку произвожу манчестерским кодом со стартовым битом, по которому и определяю начало пакета. Вобщем вот два кода.
Код кодера на пике:
Код
// Функция передачи пакета кода
void code(unsigned int Low,unsigned int Hi)
{
unsigned int c;
if(DataOutCount < PAKET){
if ((DataOutCount < HPAKET) && (DataReady == 12) ){
if (stop){
c = Low;
LowDataOut >>= 1;
//DataOutCount++;
}
}
else if ((DataOutCount >= HPAKET) && (DataReady == 12)){
if (stop){
c = Hi;
HiDataOut >>= 1;
//DataOutCount++;
}
}
switch (DataReady)
{
case 10: if (i < 4){
RB2 = 0;
i++;
}
else{
i = 0;
DataReady++;
}
break;
case 11: DataReady++;
RB2 = 1;
break;
case 12: if ((c & DataCheck) == DataCheck){
RB2 = 0;
DataReady--;
}
else
{
if (i < 1){
stop = 0;
RB2 = 0;
i++;
break;
}
else{
i = 0;
stop = 1;
DataReady--;
}
}
//LowDataOut >>= 1;
DataOutCount++;
break;
default: DataReady++;
RB2 = 1;
break;
}
}
else{
RB2 = 1;
DataShow = 0;
DataReady = 0;
DataOutCount = 0;
}
}
void code(unsigned int Low,unsigned int Hi)
{
unsigned int c;
if(DataOutCount < PAKET){
if ((DataOutCount < HPAKET) && (DataReady == 12) ){
if (stop){
c = Low;
LowDataOut >>= 1;
//DataOutCount++;
}
}
else if ((DataOutCount >= HPAKET) && (DataReady == 12)){
if (stop){
c = Hi;
HiDataOut >>= 1;
//DataOutCount++;
}
}
switch (DataReady)
{
case 10: if (i < 4){
RB2 = 0;
i++;
}
else{
i = 0;
DataReady++;
}
break;
case 11: DataReady++;
RB2 = 1;
break;
case 12: if ((c & DataCheck) == DataCheck){
RB2 = 0;
DataReady--;
}
else
{
if (i < 1){
stop = 0;
RB2 = 0;
i++;
break;
}
else{
i = 0;
stop = 1;
DataReady--;
}
}
//LowDataOut >>= 1;
DataOutCount++;
break;
default: DataReady++;
RB2 = 1;
break;
}
}
else{
RB2 = 1;
DataShow = 0;
DataReady = 0;
DataOutCount = 0;
}
}
Код декодера, реализовывал на пике и на авр, один к одному, изменив только переменные железа
Код
interrupt [EXT_INT0] void ext_int0_isr(void)
{
//SaveRTC = CurrentRTC;// Place your code here
switch (MCUCR){
case 0x0E: GIMSK=0x80;
MCUCR = 0x0F; // установили на фронт
SaveRTC = ((Count & 0x0FF) << 8) + TCNT0;
GIMSK=0xC0;
break;
case 0x0F: GIMSK=0x80;
MCUCR = 0x0E;
GIMSK=0xC0;
CurrentRTC = ((Count & 0x0FF) << 8) + TCNT0;
PeriodRTC = CurrentRTC - SaveRTC;
SaveRTC = PeriodRTC;
if (SaveRTC < 0)
SaveRTC = 0 - SaveRTC;
if ((SaveRTC > 700) && (SaveRTC < 1000)){// определили что это стартовый бит
//PORTB = 0x01;
DataInCount = PAKET;
LowDataIn = 0;
HiDataIn = 0;
}
if ((SaveRTC > 30) && (SaveRTC < 250) || (SaveRTC > 480) && (SaveRTC < 490)){ // это 1
if (DataInCount <= HPAKET)
LowDataIn = (LowDataIn << 1) + 1; // получена 1
else if (DataInCount > HPAKET)
HiDataIn = (HiDataIn << 1) + 1;
if (--DataInCount == 0)
DataReady = 1;
}
if ((SaveRTC > 250) && (SaveRTC < 480)){ // это 0
if (DataInCount <= HPAKET)
LowDataIn = LowDataIn << 1;
else if (DataInCount > HPAKET)
HiDataIn = HiDataIn << 1;
if (--DataInCount ==0)
DataReady = 1;
}
//GIMSK=0xC0;
SaveRTC = 0;
break;
}
//CurrentRTC++;
}
{
//SaveRTC = CurrentRTC;// Place your code here
switch (MCUCR){
case 0x0E: GIMSK=0x80;
MCUCR = 0x0F; // установили на фронт
SaveRTC = ((Count & 0x0FF) << 8) + TCNT0;
GIMSK=0xC0;
break;
case 0x0F: GIMSK=0x80;
MCUCR = 0x0E;
GIMSK=0xC0;
CurrentRTC = ((Count & 0x0FF) << 8) + TCNT0;
PeriodRTC = CurrentRTC - SaveRTC;
SaveRTC = PeriodRTC;
if (SaveRTC < 0)
SaveRTC = 0 - SaveRTC;
if ((SaveRTC > 700) && (SaveRTC < 1000)){// определили что это стартовый бит
//PORTB = 0x01;
DataInCount = PAKET;
LowDataIn = 0;
HiDataIn = 0;
}
if ((SaveRTC > 30) && (SaveRTC < 250) || (SaveRTC > 480) && (SaveRTC < 490)){ // это 1
if (DataInCount <= HPAKET)
LowDataIn = (LowDataIn << 1) + 1; // получена 1
else if (DataInCount > HPAKET)
HiDataIn = (HiDataIn << 1) + 1;
if (--DataInCount == 0)
DataReady = 1;
}
if ((SaveRTC > 250) && (SaveRTC < 480)){ // это 0
if (DataInCount <= HPAKET)
LowDataIn = LowDataIn << 1;
else if (DataInCount > HPAKET)
HiDataIn = HiDataIn << 1;
if (--DataInCount ==0)
DataReady = 1;
}
//GIMSK=0xC0;
SaveRTC = 0;
break;
}
//CurrentRTC++;
}