PIC18LF4680 y usb ttl para la comunicación usart / serial

2

Quiero saber si es posible conectar un dispositivo ttl directamente a mi PIC18LF4680 para 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:

Eldispositivottltiene6pines.(dtr,rxd,txd,vcc(3.3vo5v),cts,gnd).

TengodosfragmentosdecódigodiferentesacontinuaciónquerealizanlacomunicaciónUSART.

Laversiónuno(I)utilizalabibliotecadeperiféricos"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 un especial ¿biblioteca? ¿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 la ayuda es apreciada. Gracias!

    
pregunta newbie 14

2 respuestas

1

hardware parlante:

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

firmware:

  1. asegúrese de que los bits de configuración sean correctos, especialmente los bits de configuración del oscilador. Asegúrese de haber programado la imagen para utilizar el oscilador interno. agregue un LED parpadeante a su pantalla principal para asegurarse de que su imagen está realmente "corriendo"

  2. TRISC6 y TRISC7 deben estar configurados. Inicialmente, después de un reinicio de encendido, se configuran esos bits, pero asegúrese de no borrar TRISC7 en alguna parte de su código.

respondido por el fhlb
-1

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

Por lo tanto, la pregunta es si los niveles lógicos y los niveles de la unidad son lo suficientemente compatibles como para conectarse al PIC, que utiliza la lógica CMOS. La respuesta es generalmente sí, siempre que ambos estén funcionando con la misma tensión de alimentación.

Hay 4 casos a considerar:

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

Los impulsores TTL son activamente bajos, con un máximo de 100 mV de voltaje máximo. El caso 1 funciona bien.

El caso 2 es realmente el único problema posible. TTL conduce de forma activa alta, pero no todo el camino hasta el suministro. Verifique el voltaje mínimo garantizado cuando el TTL es alto y el voltaje mínimo requerido para que el PIC interprete la entrada como alta. El más alto para las entradas 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 deberá agregar un pullup o algo así.

Los casos 3 y 4 funcionarán sin problemas, ya que las salidas PIC CMOS se acercan a los rieles eléctricos 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é pidiendo algún tipo de convertidor entre las señales de UART y en otros lugares. Si ese otro lugar es un puerto COM de una PC estándar, entonces quieres algo como mi RSLink2:

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

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

    
respondido por el Olin Lathrop

Lea otras preguntas en las etiquetas