Jump to content

    

Передача данных с PIC12F679 в ПК

Это шутка? Если да, то обозначьте ее смайликом, если нет- то дайте развернутый ответ, включающий определение понятий "ядрёные", "высококачественные", "плесневеют" и прочих перлов, не имеющих общепринятой расшифровки применительно к передаче данных.

Ну Вы же пишете "В крайнем случае можно и только RX/TX оставить, но качество сильно пострадает." без всяких смайлов и расшифровки. Считаю мой совет ничем не хуже.

Share this post


Link to post
Share on other sites
перепроверил, точно PIC12F629

А нам приходится в который раз переспрашивать — зачем для домашней поделки в единственном числе нужна программная возня с МК без нужного аппаратного порта, тогда как сейчас практически в любом магазине этого добра вёдрами на любой вкус.

Share this post


Link to post
Share on other sites
Блин, перепроверил, точно PIC12F629.

Не очень хороший выбор- там UART нету. Почему именно он? Намучаетесь сильно, лучше возьмите что-нибудь с аппаратным UART, сэкономите кучу времени и сил.

 

А в Вашем случае- лучше с двумя портами, так как у Вас два канала связи: с USB и с ИК приемником.

Правда, ПИКи с двумя аппаратными UART начинаются с 20 ножек (PIC24F08KA101, $2.40 в розницу на DigiKey).

 

Кстати, в далеком прошлом для похожих развлечений хватало ИК приемника (пластмассовое трехногое из телевизора), подключенного к RS-232 порту и нескольких деталек.

Может быть, и сейчас что-то похожее сделать, но уже подключившись подобным приемником к RX/TX входам этого USB преобразователя? Тогда процессор вообще не нужен, а все программирование сосредотачивается на разборках пакетов данных в компьютере.

 

 

А еще интереснее, только сейчас увидел:

MCP2150

На входе IRDA, на выходе- UART с расшифрованными данными :)

Подозреваю, что подобного товара много, я уж не говорю про готовые стики USB-IRDA.

 

Ну Вы же пишете "В крайнем случае можно и только RX/TX оставить, но качество сильно пострадает." без всяких смайлов и расшифровки. Считаю мой совет ничем не хуже.

Пожалуйста, научитесь читать сообщение целиком, там еще есть три строчки. Понимаю что много, но попытайтесь. Там написано, какие дополнительные усилия нужны, чтобы качество все-таки не пострадало. Из чего следует (это довольно простой логический вывод), что если эти аппаратные или программные приемы не применять, то качество будет хуже.

Под "качеством" подразумевается передача данных без потерь и искажений. Под передачей данных без потерь и искажений я имею в виду такую передачу данных, во время которой все единицы передаваемой передатчиком информации принимаются приемником в неискаженном виде и полностью.

Так понятнее?

Share this post


Link to post
Share on other sites
В нём нет аппаратного UART'а, так что придётся софтово.

А это - не более 4-6 kBps. А у Вас процессор ещё и декодированием ИрДы должен заниматься.

Можно, конечно, увеличить частоту, поставив внешний кварц, но это две ноги дополнительные. Если более никаких входов не использовать, то, вроде хватает.

 

Делать UART на устройстве с RC генератором бессмысленно. Либо кварц либо керамический резонатор обязательны.

В середине 90х делал коммерческий продукт, который до сих пор на рынке на PIC16C71. У него при системном клоке 1 мегагерц без особого напряга было 9600.

 

 

Правда, ПИКи с двумя аппаратными UART начинаются с 20 ножек (PIC24F08KA101, $2.40 в розницу на DigiKey).

 

DigiKey присылают в Россию?

Share this post


Link to post
Share on other sites
Под "качеством" подразумевается передача данных без потерь и искажений. Под передачей данных без потерь и искажений я имею в виду такую передачу данных, во время которой все единицы передаваемой передатчиком информации принимаются приемником в неискаженном виде и полностью.

Хм, а если нули принимаются в искажённом виде и не полностью - то это на качество не влияет?

Множество образцов промышленной аппаратуры содержит неполную реализацию RS232 в виде всего двух линий TX/RX и вполне себе стабильно работает.

А заботу о каком-то качестве передачи единиц, да даже и нулей, путём добавления аппаратного контроля потока, в домашней наколенной разработке лично я считаю ничем не обоснованным излишеством.

Share this post


Link to post
Share on other sites
DigiKey присылают в Россию?

Только на юр.лицо с растаможкой.

Share this post


Link to post
Share on other sites
Хм, а если нули принимаются в искажённом виде и не полностью - то это на качество не влияет?

Мда. случай запущенный. Я имел в виду единицу информации, а не логический уровень (единица или ноль).

 

Множество образцов промышленной аппаратуры содержит неполную реализацию RS232 в виде всего двух линий TX/RX и вполне себе стабильно работает.

Это хорошо, что Вы понимаете разницу между "Вполне стабильно" и "стабильно."

И, кстати, что это за аппаратура? неужели действительно "промышленная" ? Хоть пример приведите, где в "промышленной" аппаратуре такое.

 

А заботу о каком-то качестве передачи единиц, да даже и нулей, путём добавления аппаратного контроля потока, в домашней наколенной разработке лично я считаю ничем не обоснованным излишеством.

Это два противоположных подхода к одной задаче. Вы изначально считаете надежную конструкцию извращением, я же извращением считаю необоснованное уменьшение надежности.

 

Как я уже писал в моем первом посте, надобность в сигналах управления потоком я прочуствовал на собственной шкуре, причем именно при конвертировании USB-RS232. А так как из MAX232 два конвертера не выкинешь, то так и развожу 4 сигнала, а не два практически всегда. Раз в пару лет это вдруг становится востребованным (при подключении к каналообразующей аппаратуре, например).

 

DigiKey присылают в Россию?

Ну, это как ориентир. Понятно, что исходить нужно из окружения. Есть Гамма/Тритон, наверное Терраэлектроника, еще куча всяких продаванов.

Про дижикей: извиняюсь, постараюсь не сыпать соль на рану. Но наверняка есть конторы которые в Россию доставляют, да и внутри России, уверен, много чего достать можно. МайкрочипДирект в Россию шлет?

Share this post


Link to post
Share on other sites
Делать UART на устройстве с RC генератором бессмысленно. Либо кварц либо керамический резонатор обязательны.

В середине 90х делал коммерческий продукт, который до сих пор на рынке на PIC16C71. У него при системном клоке 1 мегагерц без особого напряга было 9600.

Значит я одна такая бестолковая? Всегда думала, что допуска на частоту около пары процентов достаточно для такой короткой посылки... Как-то работает у меня до 115200. Просто везет?

Share this post


Link to post
Share on other sites

Ребят, я просто спросил, как реализовать ПРОГРАМНО передачу по UART в 11 посте!!!

Прочитав всё, я так и не увидел ответа...

Share this post


Link to post
Share on other sites
Ребят, я просто спросил, как реализовать ПРОГРАМНО передачу по UART в 11 посте!!!

 

Давно говнокодил на PIC12. Так что ежели что, ногами не пинайте.

#define serial_out    0x20

///    --- 4 MHz CPU Fosc definition -----------------------------------
//
#ifdef    CPU_FOSC_4MHZ
//#define FOSC 4000000L
#define XMIT_DELAY (((FOSC/4)/19200)-12)
// for 4mHz internal oscillator
unsigned char delayus_variable;
#define DelayDivisor 4
#define WaitFor1Us asm("nop")
#define Jumpback asm("goto $ - 2")
    
#define DelayUs(x) { \
            delayus_variable=(unsigned char)(x/DelayDivisor); \
            WaitFor1Us; } \
            asm("decfsz (_delayus_variable)&0ffh,f"); \
            Jumpback;
#endif
///    --- 8 MHz CPU Fosc definition -----------------------------------
//
#ifdef    CPU_FOSC_8MHZ
//#define    FOSC 8000000L
#define XMIT_DELAY (((FOSC/4)/19200)-18)
// for 8mHz internal oscillator
unsigned char delayus_variable;
#define DelayDivisor 4
#define WaitFor1Us asm("nop"); asm("nop")
#define Jumpback asm("goto $-3")

#define DelayUs(x) { \
            delayus_variable=(unsigned char)(x/DelayDivisor)-3; \
            WaitFor1Us;    \
            WaitFor1Us; } \
            asm("decfsz (_delayus_variable)&0ffh,f"); \
            Jumpback;
#endif

///    --- init software COM hardware -------------------------------------------
//
void 
InitComms(void) 
{
    
   TRISIO &= ~serial_out;   // Tris GP2 - set as output
   cTmpSerial = GPIO;
   cTmpSerial |= serial_out;
   GPIO = cTmpSerial;
}

/// --- putchar -----------------------------------------------------
//
void putbyte(unsigned char byte)
{
static bit    bGIE_Save = 0;
unsigned char bit_count;
    ///
    InitComms();
    __wdt_reset();
    if(GIE)                                                                            // Test GIE bit
    {                                                                                        // IF GIE bit is SET!
        GIE = 0;                                                                    // Disabled GLIBAL Interrupt
        bGIE_Save = 1;                                                        // Set GIE Temporary bit
    }
    //
    asm("nop");
    bit_count = 11;                                                            // Send S 8bit N P
    cTmpSerial &= ~serial_out;                                    // Send Start bit
    GPIO = cTmpSerial;
    WaitFor1Us;
    WaitFor1Us;
    do{
        DelayUs(XMIT_DELAY);
        if(byte & 0x01) 
        {
              cTmpSerial |= serial_out;
              GPIO = cTmpSerial;
          }
        else 
        {
              cTmpSerial &= ~serial_out;
              GPIO = cTmpSerial;
          }
          byte = (byte >> 1) | 0x80;
    }while (--bit_count);
    //
    if(bGIE_Save) GIE = 1;                                            // restore GIE bit
    asm("nop");
    DelayUs(XMIT_DELAY/2);
}

///    --- bin to HEX convertor ----------------------------------------
//    Send Binary to ACII convert
//
void sendBYTE( unsigned char data )
{
    /*
    putbyte (0x30);
    putbyte ('x');
    */
    //Send high nibble
    if( (data>>4) > 9 )
        putbyte( 'A' - 10 + (data>>4) );
    else
        putbyte( '0' + (data>>4) );
    //Send low nibble
    if( (data&0x0F) > 9 )
        putbyte( 'A' - 10 + (data&0x0F));
    else
        putbyte( '0' + (data&0x0F) );
}

Share this post


Link to post
Share on other sites
Значит я одна такая бестолковая? Всегда думала, что допуска на частоту около пары процентов достаточно для такой короткой посылки... Как-то работает у меня до 115200. Просто везет?

 

А вы попробуйте посылать пакеты по 200 байт или длиннее, да так, чтобы после стоп бита сразу шел старт бит и чтобы был один стопбит, а не два. В одном случае и при определенной температуре это может и заработает, но с перебоями. Я всегда отвергал решения непригодные для массового производства.

 

 

Ребят, я просто спросил, как реализовать ПРОГРАМНО передачу по UART в 11 посте!!!

Прочитав всё, я так и не увидел ответа...

 

А UART надо делать программно?

 

На какой скорости?

Share this post


Link to post
Share on other sites

O.L., спасибо за код!

Хоть до этого пока даликовата, но общие представления я получил.

Share this post


Link to post
Share on other sites
Делать UART на устройстве с RC генератором бессмысленно. Либо кварц либо керамический резонатор обязательны.

 

Та ладно вам людей пугать. Серийный порт спокойно работает на пиках без кварца и керамики. Проверено собвственноручно на многих тысячах устройств. максимальная скорость 100000. Если вы спокойно посчитаете погрешность допустимую для нормальной работы уарта, вы увидите, что 1% точности встроенного RC в 3-4 раза лучше чем надо.

 

Передачу на bit-bang сделать на пике элементарно. Прием тоже делал, немного сложнее но тоже реально.

 

А вы попробуйте посылать пакеты по 200 байт или длиннее, да так, чтобы после стоп бита сразу шел старт бит и чтобы был один стопбит, а не два.

 

А зачем делать 1 стоп бит, а не два? Длина пакетов роли не играет, они синхронизируются в начале каждого байта.

Share this post


Link to post
Share on other sites
Та ладно вам людей пугать. Серийный порт спокойно работает на пиках без кварца и керамики. Проверено собвственноручно на многих тысячах устройств. максимальная скорость 100000. Если вы спокойно посчитаете погрешность допустимую для нормальной работы уарта, вы увидите, что 1% точности встроенного RC в 3-4 раза лучше чем надо.

 

Передачу на bit-bang сделать на пике элементарно. Прием тоже делал, немного сложнее но тоже реально.

 

1% точности позволяет на 100 битной последовательности сделать ошибку в 1 бит. Если считать стартовый и стоповый биты, то это случится через 10 байт переданных подряд. На 100 байтах это будет ошибка в 10 бит. Синхронизация вначале байта осуществляется если есть пауза между байтами. В моих устройствах это не было позволено почти никогда. Представьте, что передатчик работает на 1% быстрее приемника.

 

А зачем делать 1 стоп бит, а не два?

 

Разные бывают системы. Зачастую надо выжать как можно более высокую скорость передачи, а периферийное устройство достигло уже своего потолка в 115200, а лишний стоп бит отнимает 10% времени.

 

 

Длина пакетов роли не играет, они синхронизируются в начале каждого байта.

даже когда байты идут подряд и передатчик передает быстрее чем принимает приемник?

Edited by Tarbal

Share this post


Link to post
Share on other sites
даже когда байты идут подряд и передатчик передает быстрее чем принимает приемник?

А там старт и стоп бит между байтами. которые имеют разную полярность.

Как только выполз за фрейм, вместо старта получишь стоп или наоборот.

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this