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:
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!
sprechende Hardware:
Firmware:
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".
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.
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:
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.
Benutzer323693
Neuling 14
mjh2007