реклама на сайте
подробности

 
 
> Кодер Декодер, или как передать код на расстояние
SergeyM
сообщение Nov 29 2005, 13:20
Сообщение #1


Участник
*

Группа: Свой
Сообщений: 68
Регистрация: 1-05-05
Из: Снежинск
Пользователь №: 4 654



Народ привет!
Возникла проблема, нужно передать код через радио канал. На данном этапе стоит задача отработать передачу данных напрямую через короткий проводок на макетке. Дак вот наблюдается нестабильность в получении кода, что на пике , что на авр. Может кто реализовывал типичную проблему, так не подскажите как лучше это сделать? Посылку произвожу манчестерским кодом со стартовым битом, по которому и определяю начало пакета. Вобщем вот два кода.
Код кодера на пике:
Код
// Функция передачи пакета кода
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++;  
}
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 19:33
Рейтинг@Mail.ru


Страница сгенерированна за 0.01402 секунд с 7
ELECTRONIX ©2004-2016