PIC18LF4680 y usb ttl para comunicación usart/serie

Quiero saber si es posible conectar un dispositivo ttl directamente a mi PIC18LF4680 para la comunicación en serie a través de USART. Puedo conectar el dispositivo ttl directamente a mi Arduino Uno sin problemas. Este es mi hardware:

Asignación de pines PIC18LF4680

adaptador ttl

El dispositivo ttl tiene 6 pines (dtr, rxd, txd, vcc (3.3v o 5v), cts, gnd).

Tengo dos fragmentos de códigos diferentes a continuación que realizan la comunicación USART.

La versión uno (I) utiliza la biblioteca periférica "usart.h". La versión dos (II) utiliza "TXREG" y "RCREG" para enviar y recibir datos.

Ambas versiones funcionan bien en mi entorno virtual (Proteus 8 Professional), pero no en el entorno del mundo real. ¿Me estoy perdiendo un paso? ¿Necesito una biblioteca especial? ¿O no es posible con este chip?

Versión 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;
        }
    }

}

-------------------------------------------------- --- Versión 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
    }
}

Toda y toda ayuda es apreciada. ¡Gracias!

verifique el voltaje de suministro de PIC PIC18LF4680 provisto y el nivel de voltaje en el pin Tx RX del convertidor USB a TTL. Parece que, a partir de la imagen, el convertidor USB TTL tiene la opción de elegir el nivel de voltaje (3,3 V o 5 V)
Sí, puedo cambiar los niveles de voltaje. Estoy usando 5v.
¿Puedes mostrarnos cómo tienes los dispositivos conectados?

Respuestas (2)

hardware parlante:

  1. asegúrese de conectar MCLR_ a VDD (directamente o mediante una resistencia pullup)
  2. si la foto está funcionando a 5V, use el USB TTL con modo 5V y no 3.3V
  3. debe medir VDD en RC6 si su código inicializó UART correctamente
  4. asegúrese de que sus conexiones sean correctas. sepa qué significan RXD y TXD del convertidor. ¿RXD es el receptor para el lado de la PC o el lado del dispositivo? puede verificar que todo esté conectado correctamente con un voltímetro.

firmware:

  1. asegúrese de que sus bits de configuración sean correctos, especialmente los bits de configuración del oscilador. asegúrese de programar la imagen para usar el oscilador interno. agregue un LED parpadeante a su principal solo para asegurarse de que su imagen realmente se esté "ejecutando"

  2. Deben configurarse TRISC6 y TRISC7. Inicialmente, después de un reinicio de encendido, esos bits están configurados, pero asegúrese de no borrar TRISC7 en algún lugar de su código.

Mis programas independientes de 'parpadeo' funcionan, por lo que creo que las configuraciones de reloj/oscilador están bien. Intentaré insertar un 'parpadeo' en mi función principal para ver qué obtengo. Gracias.
Más de una vez he encontrado que las etiquetas de los convertidores USB están completamente equivocadas. Suponga que Tx y Rx pueden transponerse,
Según @KalleMP, el pin Tx (salida) mostrará un voltaje más alto que el pin Rx (entrada).

No está claro a qué te refieres con "dispositivo TTL". Recuerde que TTL especifica el tipo de lógica, en este caso lógica de transistor a transistor .

Por lo tanto, la pregunta es si los niveles lógicos y los niveles de la unidad son lo suficientemente compatibles para conectarse al PIC, que utiliza la lógica CMOS. La respuesta generalmente es sí, siempre que ambos funcionen con el mismo voltaje de suministro.

Hay 4 casos para ver:

  1. TTL --> PIC, lógica baja
  2. TTL --> PIC, lógica alta
  3. TTL <-- PIC, lógica baja
  4. TTL <-- PIC, lógica alta

TTL conduce activamente bajo, con un voltaje máximo de unos pocos 100 mV como máximo. El caso 1 funciona bien.

El caso 2 es realmente el único problema posible. TTL conduce activamente alto, pero no hasta el suministro. Verifique el voltaje mínimo garantizado cuando TTL conduce alto y el voltaje mínimo requerido para que el PIC interprete la entrada como alta. El valor más alto para las entradas de PIC suele ser el 80 % de Vdd. Para un PIC que se ejecuta a 5 V, eso es 4 V. Si la salida TTL no puede garantizar 4 V, entonces esto no funcionará o debe agregar un pullup o algo así.

Los casos 3 y 4 funcionarán sin problemas, ya que las salidas del PIC CMOS se acercan a los rieles de alimentación en cualquier dirección. La lógica TTL no tendrá problemas para interpretar correctamente las señales CMOS.

Como mencionó el UART, tal vez realmente esté solicitando algún tipo de convertidor entre las señales UART y otros lugares. Si ese otro lugar es un puerto COM de una PC estándar, entonces quiere algo como mi RSLink2:

Se conecta directamente al PIC UART, la alimentación y la tierra en el lado izquierdo, y se puede enchufar a un puerto COM de la PC en el lado derecho (aunque generalmente usaría un cable de extensión RS-232).

En este caso, las señales UART del lado izquierdo también usan lógica CMOS, por lo que definitivamente son compatibles con las señales PIC UART.