PIC18LF4680 и usb ttl для usart/последовательной связи

Я хочу знать, возможно ли подключить устройство ttl напрямую к моему PIC18LF4680 для последовательной связи через USART. Я могу без проблем подключить устройство ttl напрямую к моему Arduino Uno. Это мое оборудование:

Распиновка PIC18LF4680

ттл адаптер

Устройство ttl имеет 6 контактов (dtr, rxd, txd, vcc(3.3v или 5v), cts, gnd).

У меня есть два разных фрагмента кода ниже, которые выполняют связь USART.

Первая версия (I) использует периферийную библиотеку usart.h. Вторая версия (II) использует «TXREG» и «RCREG» для отправки и получения данных.

Обе версии хорошо работают в моей виртуальной среде (proteus 8 professional), но не в реальной среде. Я пропустил шаг? Нужна ли мне специальная библиотека? Или с этим чипом нельзя?

Вариант I ------------------------------------------------------

#include "fuses.h"
#include <p18lf4680.h>
#include <stdio.h>
#include <stdlib.h>
#include <plib/usart.h>


void main(void) {

    TRISB = 0x00;
    OSCCON = 0x76;          // 8mhz (0111 0110)

     LATBbits.LATB4 = 0; 
    LATBbits.LATB1 = 0; 
    LATBbits.LATB0 = 0; 

    unsigned char txt1[] = "Hello World \r\n";
    unsigned char txt2[] = "Enter a number.... \r\n";

    CloseUSART();

    OpenUSART(USART_TX_INT_OFF &
            USART_RX_INT_OFF &
            USART_ASYNCH_MODE &
            USART_EIGHT_BIT &
            USART_CONT_RX &
            USART_BRGH_HIGH &
            USART_ADDEN_OFF ,
            52);


    for(int x=0;x<=20;x++){__delay_ms(50);}

    // write/send intro to PC

    while(BusyUSART());
    putsUSART((char *)txt1);

    for(int x=0;x<20;x++){__delay_ms(50);}

    while(BusyUSART());
    putsUSART((char *)txt2);

    for(int x=0;x<20;x++){__delay_ms(50);}


    while(1){
        sdata = ReadUSART();

        switch(sdata){
            case '1':
                LATBbits.LATB4 = 1; 
                LATBbits.LATB1 = 0; 
                LATBbits.LATB0 = 0;

            break;

            case '2':
                LATBbits.LATB4 = 0;
                LATBbits.LATB1 = 1; 
                LATBbits.LATB0 = 0; 

            break;

            case '3':
                LATBbits.LATB4 = 0; 
                LATBbits.LATB1 = 0; 
                LATBbits.LATB0 = 1; 

            break;


            default:
                LATBbits.LATB4 = 0;
                LATBbits.LATB1 = 0;
                LATBbits.LATB0 = 0; 


            break;
        }
    }

}

-------------------------------------------------- --- Версия II-----------------------------------------------------------

#include "fuses.h"
#include <p18lf4680.h>
#include <stdio.h>
#include <stdlib.h>

#define STRLEN 12

volatile unsigned char t;
volatile unsigned char rcindex;
volatile unsigned char rcbuf[STRLEN];

void USART_init(void){

    TXSTAbits.TXEN = 1;     // enable transmitter
    TXSTAbits.BRGH = 1;     // high baud rate mode
    RCSTAbits.CREN = 1;     // enable continous receiving

    // configure I/O pins
    TRISCbits.TRISC7 = 1;     // RX pin is input
    TRISCbits.TRISC6 = 1;     // TX pin is input (automatically configured)

    SPBRG = 52;            

    PIE1bits.RCIE = 1;      // enable USART receive interrupt
    RCSTAbits.SPEN = 1;     // enable USART


}

void USART_putc(unsigned char c)
{
    while (!TXSTAbits.TRMT); // wait until transmit shift register is empty
    TXREG = c;               // write character to TXREG and start transmission
}

void USART_puts(unsigned char *s)
{
    while (*s)
    {
        USART_putc(*s);     // send character pointed to by s
        s++;                // increase pointer location to the next character
    }
}

void main(void) {

    OSCCON = 0x76;          // 8mhz (0111 0110)

    USART_init();

    USART_puts("Init complete! \n");

    INTCONbits.PEIE = 1;    // enable peripheral interrupts
    INTCONbits.GIE = 1;     // enable interrupts

    while(1)
    {

    }

}

void interrupt ISR(void)
{
    if (PIR1bits.RCIF)  // check if receive interrupt has fired
    {
        t = RCREG;      // read received character to buffer

        // check if received character is not new line character
        // and that maximum string length has not been reached
        if ( (t != '\n') && (rcindex < STRLEN) )
        {
            rcbuf[rcindex] = t; // append received character to string
            rcindex++;          // increment string index
        }
        else
        {
            rcindex = 0;        // reset string index
            USART_puts(rcbuf);  // echo received string
        }

        PIR1bits.RCIF = 0;      // reset receive interrupt flag
    }
}

Любая помощь приветствуется. Спасибо!

проверьте напряжение питания PIC PIC18LF4680 и уровень напряжения на контакте Tx RX преобразователя USB в TTL. Судя по изображению, преобразователь USB TTL имеет возможность выбрать уровень напряжения (3,3 В или 5 В).
Да, я могу переключать уровни напряжения. Я использую 5в.
Можете ли вы показать нам, как вы подключили устройства?

Ответы (2)

говорящее оборудование:

  1. убедитесь, что вы подключаете MCLR_ к VDD (напрямую или через подтягивающий резистор)
  2. если картинка работает на 5В, используйте USB TTL с режимом 5В, а не 3,3В
  3. вы должны измерить VDD на RC6, если ваш код правильно инициализировал UART
  4. убедитесь, что ваши соединения верны. знать, что означают RXD и TXD преобразователя. RXD - это приемник для ПК или устройства? Вы можете дважды проверить, что все подключено правильно, используя вольтметр.

прошивка:

  1. убедитесь, что ваши биты конфигурации верны, особенно биты конфигурации генератора. убедитесь, что вы запрограммировали изображение на использование внутреннего генератора. добавьте мигающий светодиод к вашему основному, чтобы убедиться, что ваша картинка действительно «работает»

  2. Должны быть установлены TRISC6 и TRISC7. Первоначально после сброса при включении питания эти биты устанавливаются, но убедитесь, что вы не очищаете TRISC7 где-то в своем коде.

Мои автономные программы «мигания» работают, поэтому я считаю, что конфигурации часов / генератора в порядке. Я попробую вставить «мигание» в свою основную функцию, чтобы посмотреть, что я получу. Спасибо.
Не раз я обнаруживал, что этикетки на USB-конвертерах совершенно неверны. Предположим, что Tx и Rx могут быть транспонированы,
Согласно @KalleMP, контакт Tx (выход) будет показывать более высокое напряжение, чем контакт Rx (вход).

Непонятно, что вы подразумеваете под «устройством TTL». Помните, что TTL определяет тип логики, в данном случае транзисторно-транзисторная логика .

Следовательно, вопрос заключается в том, достаточно ли совместимы логические уровни и уровни привода для подключения к PIC, который использует логику CMOS. Ответ, как правило, да, если оба работают от одного и того же напряжения питания.

Есть 4 случая, на которые стоит обратить внимание:

  1. TTL --> PIC, низкий логический уровень
  2. TTL --> PIC, высокий логический уровень
  3. TTL <-- PIC, низкий логический уровень
  4. TTL <-- PIC, высокий логический уровень

TTL управляет активно низким уровнем, максимальное напряжение составляет всего несколько 100 мВ. Вариант 1 работает нормально.

Случай 2 — действительно единственное возможное проблемное место. TTL активно повышается, но не до конца питания. Проверьте минимальное гарантированное напряжение, когда TTL приводит к высокому уровню, и минимальное требуемое напряжение для PIC, чтобы интерпретировать вход как высокий. Максимальное значение для входов PIC обычно составляет 80% от Vdd. Для PIC, работающего на 5 В, это 4 В. Если выход TTL не может гарантировать 4 В, то либо это не сработает, либо вам нужно добавить подтягивание или что-то в этом роде.

Случаи 3 и 4 будут работать без проблем, так как выходы PIC CMOS работают близко к шинам питания в любом направлении. Логика TTL без проблем правильно интерпретирует сигналы CMOS.

Поскольку вы упомянули UART, возможно, вы действительно просите какой-то преобразователь между сигналами UART и где-либо еще. Если это COM-порт стандартного ПК, то вам нужно что-то вроде моего RSLink2:

Он подключается непосредственно к PIC UART, питанию и земле с левой стороны и может быть подключен к COM-порту ПК с правой стороны (хотя обычно вы используете удлинительный кабель RS-232).

В этом случае сигналы UART на левой стороне также используют логику CMOS, поэтому они определенно совместимы с сигналами PIC UART.