Я хочу знать, возможно ли подключить устройство ttl напрямую к моему PIC18LF4680 для последовательной связи через USART. Я могу без проблем подключить устройство ttl напрямую к моему Arduino Uno. Это мое оборудование:
Устройство 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
}
}
Любая помощь приветствуется. Спасибо!
говорящее оборудование:
прошивка:
убедитесь, что ваши биты конфигурации верны, особенно биты конфигурации генератора. убедитесь, что вы запрограммировали изображение на использование внутреннего генератора. добавьте мигающий светодиод к вашему основному, чтобы убедиться, что ваша картинка действительно «работает»
Должны быть установлены TRISC6 и TRISC7. Первоначально после сброса при включении питания эти биты устанавливаются, но убедитесь, что вы не очищаете TRISC7 где-то в своем коде.
Непонятно, что вы подразумеваете под «устройством TTL». Помните, что TTL определяет тип логики, в данном случае транзисторно-транзисторная логика .
Следовательно, вопрос заключается в том, достаточно ли совместимы логические уровни и уровни привода для подключения к PIC, который использует логику CMOS. Ответ, как правило, да, если оба работают от одного и того же напряжения питания.
Есть 4 случая, на которые стоит обратить внимание:
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.
Пользователь323693
новичок 14
mjh2007