PIC18LF4680 und USB TTL für usart / serielle Kommunikation

Ich möchte wissen, ob es möglich ist, ein TTL-Gerät für die serielle Kommunikation über USART direkt an meinen PIC18LF4680 anzuschließen. Ich kann das ttl-Gerät ohne Probleme direkt an meinen Arduino Uno anschließen. Das ist meine Hardware:

PIC18LF4680 Pinbelegung

TTL-Adapter

Das TTL-Gerät hat 6 Pins (dtr , rxd , txd , vcc(3.3v oder 5v) , cts, gnd) .

Ich habe unten zwei verschiedene Code-Snippets, die die USART-Kommunikation durchführen.

Version eins (I) verwendet die Peripheriebibliothek "usart.h". Version zwei (II) verwendet "TXREG" und "RCREG" zum Senden und Empfangen von Daten.

Beide Versionen laufen gut in meiner virtuellen Umgebung (proteus 8 professional), aber nicht in der realen Umgebung. Übersehe ich einen Schritt? Brauche ich eine spezielle Bibliothek? Oder geht das mit diesem Chip nicht?

Version 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;
        }
    }

}

-------------------------------------------------- --- Variante 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
    }
}

Jede Hilfe wird geschätzt. Danke!

Überprüfen Sie die Versorgungsspannung des bereitgestellten PIC PIC18LF4680 und den Spannungspegel am Tx RX-Pin des USB-zu-TTL-Konverters. Aus dem Bild sieht es so aus, als hätte der USB-TTL-Konverter die Möglichkeit, den Spannungspegel (3,3 V oder 5 V) zu wählen.
Ja, ich kann die Spannungspegel umschalten. Ich benutze 5V.
Können Sie uns zeigen, wie Sie die Geräte angeschlossen haben?

Antworten (2)

sprechende Hardware:

  1. Stellen Sie sicher, dass Sie MCLR_ mit VDD verbinden (direkt oder über einen Pullup-Widerstand)
  2. Wenn das Bild mit 5 V läuft, verwenden Sie den USB-TTL mit 5 V-Modus und nicht mit 3,3 V
  3. Sie sollten VDD bei RC6 messen, wenn Ihr Code UART korrekt initialisiert hat
  4. Stellen Sie sicher, dass Ihre Verbindungen korrekt sind. wissen, was RXD und TXD des Konverters bedeuten. RXD ist der Empfänger für PC-seitig oder geräteseitig? Mit einem Voltmeter kannst du überprüfen, ob alles richtig angeschlossen ist.

Firmware:

  1. Stellen Sie sicher, dass Ihre Konfigurationsbits richtig sind, insbesondere die Konfigurationsbits des Oszillators. Stellen Sie sicher, dass Sie das Bild so programmiert haben, dass es den internen Oszillator verwendet. Fügen Sie Ihrer Hauptanzeige eine blinkende LED hinzu, um sicherzustellen, dass Ihr Bild tatsächlich "läuft".

  2. TRISC6 und TRISC7 sollten eingestellt sein. Nach einem Power-On-Reset sind diese Bits zunächst gesetzt, aber stellen Sie sicher, dass Sie TRISC7 nicht irgendwo in Ihrem Code löschen.

Meine eigenständigen „Blink“-Programme funktionieren, daher glaube ich, dass Takt-/Oszillatorkonfigurationen in Ordnung sind. Ich werde versuchen, einen "Blink" in meine Hauptfunktion einzufügen, um zu sehen, was ich bekomme. Danke.
Mehr als einmal habe ich festgestellt, dass die Etiketten auf USB-Konvertern einfach falsch sind. Angenommen, Tx und Rx können transponiert werden,
Per @KalleMP zeigt der Tx-Pin (Ausgang) eine höhere Spannung als der Rx-Pin (Eingang).

Es ist nicht klar, was Sie mit "TTL-Gerät" meinen. Denken Sie daran, dass TTL den Logiktyp angibt, in diesem Fall Transistor-zu-Transistor-Logik .

Die Frage ist daher, ob die Logikpegel und Treiberpegel kompatibel genug sind, um eine Verbindung zum PIC herzustellen, der CMOS-Logik verwendet. Die Antwort ist im Allgemeinen ja, solange beide mit der gleichen Versorgungsspannung betrieben werden.

Es gibt 4 Fälle zu betrachten:

  1. TTL -> PIC, logisch niedrig
  2. TTL -> PIC, logisch hoch
  3. TTL <-- PIC, logisch niedrig
  4. TTL <-- PIC, logisch hoch

TTL treibt aktiv niedrig, wobei die maximale Spannung höchstens einige 100 mV beträgt. Fall 1 funktioniert einwandfrei.

Fall 2 ist wirklich die einzig mögliche Problemstelle. TTL treibt aktiv hoch, aber nicht bis zur Versorgung. Überprüfen Sie die garantierte Mindestspannung, wenn TTL hoch fährt, und die minimal erforderliche Spannung, damit der PIC den Eingang als hoch interpretiert. Der höchste Wert für PIC-Eingänge beträgt normalerweise 80 % von Vdd. Für einen PIC, der mit 5 V läuft, sind das 4 V. Wenn der TTL-Ausgang 4 V nicht garantieren kann, funktioniert dies entweder nicht oder Sie müssen einen Pullup oder so etwas hinzufügen.

Die Fälle 3 und 4 funktionieren ohne Probleme, da die PIC-CMOS-Ausgänge in beiden Richtungen nahe an den Stromschienen liegen. Die TTL-Logik hat kein Problem damit, die CMOS-Signale korrekt zu interpretieren.

Da Sie den UART erwähnt haben, fragen Sie vielleicht wirklich nach einer Art Konverter zwischen den UART-Signalen und anderswo. Wenn das woanders ein COM-Port eines Standard-PCs ist, dann willst du so etwas wie meinen RSLink2:

Es wird auf der linken Seite direkt mit dem PIC-UART, der Stromversorgung und der Masse verbunden und kann auf der rechten Seite an einen PC-COM-Port angeschlossen werden (obwohl Sie normalerweise ein RS-232-Verlängerungskabel verwenden würden).

In diesem Fall verwenden die UART-Signale auf der linken Seite auch CMOS-Logik, sind also definitiv kompatibel mit den PIC-UART-Signalen.