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:
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!
hardware parlante:
firmware:
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"
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.
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:
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.
Usuario323693
novato 14
mjh2007