Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Продукция MICROCHIP

Продукция MICROCHIP Технические вопросы по всей продукции Microchip

Ответ
 
Опции темы Опции просмотра
Старый 18.12.2007, 12:35   #1
AlHakim
Member
 
Регистрация: 06.09.2007
Сообщений: 31
Вес репутации: 100/49
AlHakim will become famous soon enoughAlHakim will become famous soon enough
По умолчанию Uart 4520 не выдает и не принимает первые несколько символов по включению

и снова вернулся к вам с вопросом и снова ранее приведенный код
на скорости 19200 (частота кварца 4МГц)вроде бы работает нормально и не проявляется эфект, а вот при повышение до 38400 уже проявляется след. образом:
1. по включению, (может пройти n-oе кол-во секунд, просто можно сказать при передаче первых дайт данных), несколько передаваемых байт искажаются
2. на приеме. первые один - два байта не принимаются, вернее прерывание генерится, а вот в буфере мусор...

Ищется причина!!!
Код:
volatile near unsigned char TxWrByte, TxRdByte, RxWrByte, RxRdByte;
unsigned char TxBuffer[UART_BUFFER_SIZE];
unsigned char RxBuffer[UART_BUFFER_SIZE];
 
void interrupt HI_ISR(void)
{   unsigned char RxData, dummy;
//    asm("btg    latb,6");
    if((RCIE)&&(RCIF)){                         //receive interrupt routine
        if ( RCSTA & 0x06 ){                    //Mask out unwanted bits Check for errors
            RxData = RCREG;                     // Read the received data
            CREN = 0;   CREN = 1;}              // clear error flags  FRE, ORE, and PE flag Serial Status Register (SSR).
        else{
             RxData = RCREG;                    // Read the received data
//             dummy = RxRdByte;
//             if ((RxWrByte + 1) != dummy){
//                RxWrByte = (RxWrByte + 1) & UART_BUFFER_MASK;
//                RxBuffer[RxWrByte] = RxData;
//             }
             dummy = (RxWrByte+1) & UART_BUFFER_MASK;
             if (dummy != RxRdByte){
                RxWrByte = dummy;
                RxBuffer[RxWrByte] = RxData;
             }
        //RxFrame(RxData);                      // разгребаем входные данные, ищем начало пакета по протоколу WakeUp
        }
    }
}
 
void interrupt low_priority LOW_ISR(void)
{   unsigned char TmpByte,TmpByte1;
    float TempSensor;
    if((TXIE)&&(TXIF)){                         //transmit interrupt routine
//        asm("btg    latc,2");
        //if (!(EventFlags & fDebugVersion)) {pRS485En = 1; pRS485Re = 1;}               //перекл. направление приемопередатчиков
        TxRdByte = ++TxRdByte & UART_BUFFER_MASK;
        TXREG = TxBuffer[TxRdByte];
        if (TxWrByte == TxRdByte){
            UART_DISABLE_TX_INTERRUPT;
//            if (EventFlags & fFindEndFrame)   //выставляем флаг помещения последнего байта пакета в сдвиговый регист Tx
//                {EventFlags |= fEndTxFrame;}  //1 - последний байт пакета передан надо переключить приемопередатчики RS485
        }
    }
}
 
void InitUart(void)
{   unsigned char RxData;
    RxWrByte = 0;   RxRdByte = 0;
    TxWrByte = 0;   TxRdByte = 0;
    #if (Rez_BRG16 == 1)
        SPBRGH = DIVIDER_HI;
        SPBRG  = DIVIDER_Lo;                    //0x33
    #else
        SPBRGH = 0;
        SPBRG  = DIVIDER;                       //0x33
    #endif
//    TXSTA  = (SPEED|NINE_BITS|TXEN|BRGH);     //BRGH = BRGH: High Baud Rate Select bit
//    RCSTA  = (SPEN|NINE_BITS);
    TXSTA  = (SPEED|NINE_BITS|0x20);
    RCSTA  = (NINE_BITS|0x90);
    #if (Rez_BRG16 == 1)                        //BRG16: 16-bit Baud Rate Register Enable bit
        BRG16 = 1;
        WUE = 1;
    #else                                       //0 = 8-bit Baud Rate Generator - SPBRG only (Compatible mode), SPBRGH value ignored
        BAUDCON = 0;
    #endif
//    WUE = 1;
    RCIDL = 1;
    RxData = RCREG;                             // Read the received data
    CREN = 0;     CREN = 1;                     // clear error flags  FRE, ORE, and PE flag Serial Status Register (SSR).
    TRISC6 = 0;   TRISC7 = 1;
}
//
//  Read and write functions
//
unsigned char UartGetChar( void )
{
    while (RxWrByte == RxRdByte) {} // Wait for incomming data
    RxRdByte = ++RxRdByte & UART_BUFFER_MASK;
    return RxBuffer[RxRdByte];         // Return data
}
void UartPutChar(unsigned char TxData)
{   unsigned char dummy;
    //UART_DISABLE_TX_INTERRUPT;
    dummy = (TxWrByte + 1) & UART_BUFFER_MASK;
    while (dummy == TxRdByte) {asm("btg    latd,2");} // Wait for incomming data
    TxBuffer[dummy] = TxData;
    TxWrByte = dummy;
    if(TRMT) UART_ENABLE_TX_INTERRUPT;
}
void UartPutStr(unsigned char *str)
{   unsigned char dummy;
//    while(*str) UartPutChar(*str++);  //*s++=Tmpchar;
    while(*str){
        dummy = (TxWrByte + 1) & UART_BUFFER_MASK;
        while (dummy == TxRdByte) {asm("btg    latd,2");} // Wait for incomming data
        TxBuffer[dummy] = *str++;
        TxWrByte = dummy;
        if(TRMT) UART_ENABLE_TX_INTERRUPT;
    }
}
void UartPutStrConst(const unsigned char *str)
{   unsigned char dummy;
//    while(*str) UartPutChar(*str++);  //*s++=Tmpchar;
    while(*str){
        dummy = (TxWrByte + 1) & UART_BUFFER_MASK;
        while (dummy == TxRdByte) {asm("btg    latd,2");} // Wait for incomming data
        TxBuffer[dummy] = *str++;
        TxWrByte = dummy;
        if(TRMT) UART_ENABLE_TX_INTERRUPT;
    }
}
AlHakim вне форума   Ответить с цитированием
Старый 18.12.2007, 12:50   #2
fantom
Senior Member
 
Регистрация: 27.02.2007
Адрес: Рязань
Возраст: 44
Сообщений: 2,610
Вес репутации: 2570/101
fantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond repute
По умолчанию Re: Uart 4520 не выдает и не принимает первые несколько символов по включению

Попробуй на старте программы, поставить задержку по времени. Чтоб напряжение питания, гарантированно успело стабилизироваться.
fantom вне форума   Ответить с цитированием
Старый 18.12.2007, 12:58   #3
AlHakim
Member
 
Регистрация: 06.09.2007
Сообщений: 31
Вес репутации: 100/49
AlHakim will become famous soon enoughAlHakim will become famous soon enough
По умолчанию Re: Uart 4520 не выдает и не принимает первые несколько символов по включению

Цитата:
Сообщение от fantom Посмотреть сообщение
Попробуй на старте программы, поставить задержку по времени. Чтоб напряжение питания, гарантированно успело стабилизироваться.
В плане организации задержки нет никаких проблем,
и, вообщем-то,для передачи, может быть как-то и видится в этом рациональность и корень проблем

Но вот как быть с премом данных
Первый байт может появится и через час, и все равно он не принемается (причем процессор даже не находится в режиме "SLEEP")
!!! Вот как с этим то быть, думаю что на приеме , что на передачу. это две вазимосвязанные вещи и причина у них одна(быть может и мои корявые ручки , вот это и хотелось найти и исправить)
AlHakim вне форума   Ответить с цитированием
Старый 18.12.2007, 13:31   #4
fantom
Senior Member
 
Регистрация: 27.02.2007
Адрес: Рязань
Возраст: 44
Сообщений: 2,610
Вес репутации: 2570/101
fantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond repute
По умолчанию Re: Uart 4520 не выдает и не принимает первые несколько символов по включению

Может дело вообще не в программе? Попробуй уменьшить длину соединения.
fantom вне форума   Ответить с цитированием
Старый 18.12.2007, 13:34   #5
AlHakim
Member
 
Регистрация: 06.09.2007
Сообщений: 31
Вес репутации: 100/49
AlHakim will become famous soon enoughAlHakim will become famous soon enough
По умолчанию Re: Uart 4520 не выдает и не принимает первые несколько символов по включению

Цитата:
Сообщение от fantom Посмотреть сообщение
Может дело вообще не в программе? Попробуй уменьшить длину соединения.
да нет, длина проводов маленькая,

думаю что тут проблема, программно решаемая, но вот как
можно , конечно . отсылать первые два байта левыми (типа <CR>), но это в крайнем случае
AlHakim вне форума   Ответить с цитированием
Старый 18.12.2007, 18:23   #6
Илья
Senior Member
 
Регистрация: 26.02.2007
Адрес: SPb
Сообщений: 1,228
Вес репутации: 1853/80
Илья has a brilliant futureИлья has a brilliant futureИлья has a brilliant futureИлья has a brilliant futureИлья has a brilliant futureИлья has a brilliant futureИлья has a brilliant futureИлья has a brilliant futureИлья has a brilliant futureИлья has a brilliant futureИлья has a brilliant future
По умолчанию Re: Uart 4520 не выдает и не принимает первые несколько символов по включению

Проверяются флаги FERR и OERR?
Илья вне форума   Ответить с цитированием
Старый 19.12.2007, 07:47   #7
AlHakim
Member
 
Регистрация: 06.09.2007
Сообщений: 31
Вес репутации: 100/49
AlHakim will become famous soon enoughAlHakim will become famous soon enough
По умолчанию Re: Uart 4520 не выдает и не принимает первые несколько символов по включению

Цитата:
Сообщение от Илья Посмотреть сообщение
Проверяются флаги FERR и OERR?
конечно
Код:
    if((RCIE)&&(RCIF)){                         //receive interrupt routine
        if ( RCSTA & 0x06 ){                    //Mask out unwanted bits Check for errors
            RxData = RCREG;                     // Read the received data
            CREN = 0;   CREN = 1;}              // clear error flags  FRE, ORE, and PE flag Serial Status Register (SSR).
        else{
             RxData = RCREG;
ХЗ. но как ни крути на первый переданный внешним девайсом символ, принимается моим контроллером как два байта: 0x00 (обязательно появляется) и <Любой другой байт - мусор>

Вот, как ни крути, просто реши забить на это и ввести программную проверку и отфильтровывание двух первых принятых байт данных (это я проделываю по вкл. питания, пересбросу или выхода из слип)
Хотя этого эфекта нет при скорости 19200, т.е не используя
BRG16: 16-bit Baud Rate Register , где-то тут, коненечно, закралась ошибка, но... искать себе дороже(нервы, ночи бессоные, сроки, злобные работодатели...)
AlHakim вне форума   Ответить с цитированием
Старый 19.12.2007, 10:11   #8
Илья
Senior Member
 
Регистрация: 26.02.2007
Адрес: SPb
Сообщений: 1,228
Вес репутации: 1853/80
Илья has a brilliant futureИлья has a brilliant futureИлья has a brilliant futureИлья has a brilliant futureИлья has a brilliant futureИлья has a brilliant futureИлья has a brilliant futureИлья has a brilliant futureИлья has a brilliant futureИлья has a brilliant futureИлья has a brilliant future
По умолчанию Re: Uart 4520 не выдает и не принимает первые несколько символов по включению

Вы проверяете оба, а если один из??
И тем более их лучше проверять отдельно, а не после того как установился RCIE, а то еще и правильный байт потеряете.
Илья вне форума   Ответить с цитированием
Старый 19.12.2007, 13:46   #9
AlHakim
Member
 
Регистрация: 06.09.2007
Сообщений: 31
Вес репутации: 100/49
AlHakim will become famous soon enoughAlHakim will become famous soon enough
По умолчанию Re: Uart 4520 не выдает и не принимает первые несколько символов по включению

Цитата:
Сообщение от Илья Посмотреть сообщение
Вы проверяете оба, а если один из??
И тем более их лучше проверять отдельно, а не после того как установился RCIE, а то еще и правильный байт потеряете.
Я проверяю наличие хотя бы одного из флагов, так что тут все нормально, имхо
AlHakim вне форума   Ответить с цитированием
Старый 19.12.2007, 14:02   #10
fantom
Senior Member
 
Регистрация: 27.02.2007
Адрес: Рязань
Возраст: 44
Сообщений: 2,610
Вес репутации: 2570/101
fantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond repute
По умолчанию Re: Uart 4520 не выдает и не принимает первые несколько символов по включению

Цитата:
Сообщение от AlHakim Посмотреть сообщение
Я проверяю наличие хотя бы одного из флагов, так что тут все нормально, имхо
Да. Проверка нормальная. Только вот сработает ли прерывание, при ошибке?
Сейчас тоже занимаюсь с модулем EUSART. При внешней простоте, много нюансов выплывает.
fantom вне форума   Ответить с цитированием
Старый 19.12.2007, 14:09   #11
AlHakim
Member
 
Регистрация: 06.09.2007
Сообщений: 31
Вес репутации: 100/49
AlHakim will become famous soon enoughAlHakim will become famous soon enough
По умолчанию Re: Uart 4520 не выдает и не принимает первые несколько символов по включению

Цитата:
Сообщение от fantom Посмотреть сообщение
Да. Проверка нормальная. Только вот сработает ли прерывание, при ошибке?
Сейчас тоже занимаюсь с модулем EUSART. При внешней простоте, много нюансов выплывает.
да вообщем-то специально сегодня тестил уарт на предмет вышеописанного бага, (сохранял в массив хначения регистров Ю данный приходящие, прочую инфу и потом уже средствами внутреннего монитора после остановки выполнения задач (не путать с RTOS ) разгребал)

Вот даже при описанной ошибке
Цитата:
ХЗ. но как ни крути на первый переданный внешним девайсом символ, принимается моим контроллером как два байта: 0x00 (обязательно появляется) и <Любой другой байт - мусор>
состояние регистра RCSTA = 0x90
да и если и возникнет сбой приема фрейма или переполненение я думаю что вполне корестно описано ибо биты сбрасываются при прочтение RCREG
AlHakim вне форума   Ответить с цитированием
Старый 19.12.2007, 15:39   #12
fantom
Senior Member
 
Регистрация: 27.02.2007
Адрес: Рязань
Возраст: 44
Сообщений: 2,610
Вес репутации: 2570/101
fantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond repute
По умолчанию Re: Uart 4520 не выдает и не принимает первые несколько символов по включению

Программа у вас, уж больно наворочена. Я бы вернулся в начало. Сделать минимальный код, который просто принимает данные. Без всяких проверок и обработок. Скорее всего, тогда что-то прояснится.
fantom вне форума   Ответить с цитированием
Старый 19.12.2007, 15:43   #13
AlHakim
Member
 
Регистрация: 06.09.2007
Сообщений: 31
Вес репутации: 100/49
AlHakim will become famous soon enoughAlHakim will become famous soon enough
По умолчанию Re: Uart 4520 не выдает и не принимает первые несколько символов по включению

Цитата:
Сообщение от fantom Посмотреть сообщение
Программа у вас, уж больно наворочена. Я бы вернулся в начало. Сделать минимальный код, который просто принимает данные. Без всяких проверок и обработок. Скорее всего, тогда что-то прояснится.
Обычный рабочий код, причем работающий и в др. проектах на др. чипах
а какие проверки вы предлагаете выкинуть, вроде бы все по минимуму, все остальные проверки вынесены в основной цикл.
это как в песне "... Остановите самолет, я слезу"

работает и то ладно, хотя понятно что в процедурках типа
void UartPutChar(unsigned char TxData)
надо было бы ввести защиту от зацикливания, в основном цикле у меня есть строчка, которая тоже родилась в муках (этот EUSART. мать его)
if ((TxWrByte != TxRdByte) && TRMT) UART_ENABLE_TX_INTERRUPT;
в новых чипах расчитывать на флаг TXIF уже как-то нельзя. были вначале зависания передачи
AlHakim вне форума   Ответить с цитированием
Старый 19.12.2007, 20:28   #14
2AplusA
Senior Member
 
Аватар для 2AplusA
 
Регистрация: 26.02.2007
Адрес: Penza
Возраст: 39
Сообщений: 1,383
Вес репутации: 1267/75
2AplusA has much to be proud of2AplusA has much to be proud of2AplusA has much to be proud of2AplusA has much to be proud of2AplusA has much to be proud of2AplusA has much to be proud of2AplusA has much to be proud of2AplusA has much to be proud of2AplusA has much to be proud of
По умолчанию Re: Uart 4520 не выдает и не принимает первые несколько символов по включению

Цитата:
Сообщение от AlHakim Посмотреть сообщение
ХЗ. но как ни крути на первый переданный внешним девайсом символ, принимается моим контроллером как два байта: 0x00 (обязательно появляется) и <Любой другой байт - мусор>
А у Вас наводок нет ли на линии, когда передатчик внешнего девайса включается? Достаточно лишь помехи, которая пойдет за стартовый байт! У меня встречались такие "фишки"!
Цитата:
Сообщение от AlHakim Посмотреть сообщение
Вот, как ни крути, просто реши забить на это и ввести программную проверку и отфильтровывание двух первых принятых байт данных (это я проделываю по вкл. питания, пересбросу или выхода из слип)
Хотя этого эфекта нет при скорости 19200, т.е не используя
BRG16: 16-bit Baud Rate Register , где-то тут, коненечно, закралась ошибка, но... искать себе дороже(нервы, ночи бессоные, сроки, злобные работодатели...)
Сам не встречал, но мой напарник и друг бодался с этим. Он выяснил странную фишку с EUSART, если стоит 16-ти битный режим SPBRG и старший байт SPBRGH =0, то EUSART начинает периодически сбиваться. Как так получалось мы так и не выяснили и в errata по этому поводу ничего нет. Но просто сделали так, что 16-ти битный режим использовали только для скоростей 1200 и 2400, потому что на 40МГц тактовой частоте, такие скорости по-другому не задать, и как раз на этих скоростях SPBRGH ненулевой!
__________________
Лучше день потерять, потом за час долететь!
2AplusA вне форума   Ответить с цитированием
Старый 20.12.2007, 07:24   #15
AlHakim
Member
 
Регистрация: 06.09.2007
Сообщений: 31
Вес репутации: 100/49
AlHakim will become famous soon enoughAlHakim will become famous soon enough
По умолчанию Re: Uart 4520 не выдает и не принимает первые несколько символов по включению

Цитата:
Сообщение от 2AplusA Посмотреть сообщение
А у Вас наводок нет ли на линии, когда передатчик внешнего девайса включается? Достаточно лишь помехи, которая пойдет за стартовый байт! У меня встречались такие "фишки"!

Сам не встречал, но мой напарник и друг бодался с этим. Он выяснил странную фишку с EUSART, если стоит 16-ти битный режим SPBRG и старший байт SPBRGH =0, то EUSART начинает периодически сбиваться. Как так получалось мы так и не выяснили и в errata по этому поводу ничего нет. Но просто сделали так, что 16-ти битный режим использовали только для скоростей 1200 и 2400, потому что на 40МГц тактовой частоте, такие скорости по-другому не задать, и как раз на этих скоростях SPBRGH ненулевой!
Внимательное прочетение даташитов привело к положительному результату
Код:
void InitUart(void)
{   unsigned char RxData;
    RxWrByte = 0;   RxRdByte = 0;
    TxWrByte = 0;   TxRdByte = 0;
    TRISC6 = 0;   TRISC7 = 1;
 
    #if (Rez_BRG16 == 1)                        //BRG16: 16-bit Baud Rate Register Enable bit
        SPBRGH = DIVIDER_HI;
        SPBRG  = DIVIDER_Lo;                    //0x33
        BRG16 = 1;
    #else                                       //0 = 8-bit Baud Rate Generator - SPBRG only (Compatible mode), SPBRGH value ignored
        SPBRGH = 0;
        SPBRG  = DIVIDER;                       //0x33
        BAUDCON = 0;
    #endif
 
    TXSTA  = (SPEED|NINE_BITS|0x20);
    RCSTA  = (NINE_BITS|0x90);
//    WUE = 1;
    RxData = RCREG;                             // Read the received data
    CREN = 0;     CREN = 1;                     // clear error flags  FRE, ORE, and PE flag Serial Status Register (SSR).
}
Ошибка закралась в том, что я при инициализации выставлял бит WUE = 1
и получалось, что первый старт бит вызывал прерывание (RXIF).
Переделал и перед переходом контроллера в SLEEP выставляю
WUE=1, при этом надо проверить бит RCIDL и если он = 0, то только тогда:
Код:
     WUE = 1; 
     asm("sleep");
в противном случае дожидаюсь следующего условия, позволяющего перейти в SLEEP

При этом, как я уже и писал, первые два байта при выходе из SLEEP я не помещию в буфер приема ("мусор", связанный с:
1. прерывание вызванное стартовым битом (wue = 1))
2. искаженный первый байт данных

В итоге я пришел к решению, всегда посылать первым байтом символ "пробел", поскольку он у меня все равно программно вырезается из посылки.

Вот, щастье всем
AlHakim вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чем/как отлаживать код написаный на Си в WinAVR Yokel Микроконтроллеры других производителей 49 30.09.2014 09:48
что за зверь - Скатерограмма Edua Общетехнические вопросы 17 01.03.2013 23:33
Присоветуйте тип и способ управления MOSFETом "верхнего" плеча dr_Sash Источники питания и силовая электроника 37 08.09.2012 18:50


Часовой пояс GMT +3, время: 13:49.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd. Перевод: zCarot