Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:
SALUDOS....
Estoy desarrollando el control de un brazo robótico por medio de la tarjeta SSC32, la tarjeta la he podido probar con el programa LynxTerm y funciona Correctamente, sin embargo ahora necesito realizar la comunicación con el Microcontrolador PIC18F4550 para enviarle los comandos desde este mismo. Al hacerlo observo que el LED indicador titila como si estuviera recibiendo información y la tengo configurada a una velocidad de 115200, pero no se mueve el brazo he leído mucho el manual de la tarjeta y siempre encuentro que los camandos son: "#0p1500s200<cr>" y esto es lo que envío desde el micro utilizando la librería USART de este micro así: WriteUSART("#0p1500s200<cr>").
voy a adjuntar mi código que es muy simple pero que necesito me ayuden a revisar necesito esto urgente y leo y leo y no consigo que funcione.
#ifdef __cplusplus
extern "C" {
#endif
//******************************************
//FUSES USADOS CON CRISTAL DE 20MHZ Y USO DE PROGRAMADOR PICKIT3,
#pragma config PLLDIV=5 // (CRISTAL DE 20 MHz),Divide by 5 (20 MHz oscillator input)
#pragma config USBDIV=2 //USB clock source comes from the 96 MHz PLL divided by 2
#pragma config CPUDIV=OSC1_PLL2 //Primary Oscillator Src/1][96 MHz PLL Src/2] cpu trabajara a 48Mhz.
#pragma config FOSC=HSPLL_HS //HS oscillator, PLL enabled (HSPLL)
#pragma config FCMEN=OFF //Fail-Safe Clock Monitor disabled
#pragma config IESO=OFF //Oscillator Switchover mode disabled
#pragma config PWRT=ON //Power-up Timer Enable bit
#pragma config BOR=OFF //Brown-out Reset Enable bits: Brown-out Reset
//enabled in hardware only (SBOREN is disabled)
#pragma config BORV=0 //Brown-out Reset Voltage bits,Maximum.
#pragma config VREGEN=ON // USB voltage regulator enabled
#pragma config WDT=OFF //WDT disabled (control is placed on the SWDTEN bit)
#pragma config WDTPS=32768 //Watchdog Timer Postscale Select bits>> 1:32768
#pragma config MCLRE=ON //MCLR pin enabled; RE3 input pin disabled
#pragma config LPT1OSC=OFF //Timer1 configured for higher power operation
#pragma config PBADEN=OFF //PORTB<4:0> pins are configured as digital I/O on Reset
//If i need to use the RBx as analog in/out set this bit to ON
#pragma config STVREN=OFF //Stack full/underflow will not cause Reset
#pragma config LVP=OFF //PROGRAMACION EN BAJO VOLTAJE
#pragma config XINST=OFF // Instruction set extension and Indexed Addressing mode enabled
//the above bit is used enterely for debug program in circuit (ICPORT)
#pragma config CP0=OFF //Code Protection bit disable for 0,1,2
#pragma config CP1=OFF //
#pragma config CP2=OFF //
#pragma config CPB=OFF //Boot Block Code Protection bit:
#pragma config CPD=OFF //Data EEPROM Code Protection bit.
#pragma config WRT0=OFF //Write Protection bit for 0,1,2 is not write-protected
#pragma config WRT1=OFF
#pragma config WRT2=OFF
#pragma config WRTB=OFF //PROTECCI?N DE ESCRITURA PARA EL BLOCK DE BOOT
#pragma config WRTC=OFF //Configuration Register Write Protection bit,disable
#pragma config WRTD=OFF //Data EEPROM Write Protection bit,is not write protected
#pragma config EBTR0=OFF //000800-001FFFh
#pragma config EBTR1=OFF //Boot Block Table Read Protection bit,disable between
#pragma config EBTRB=OFF //000000-0007FFh and 002000-003FFFh
#pragma config CCP2MX=OFF
//#pragma config DEBUG = ON //ENABLE FOR PICKIT 3
//DISABBLE THE DEBUG OPTION WHEN You're going to do the proper deployment.
#ifdef __cplusplus
}
#endif
#endif /* FUSES_H */
//ARCHIVO config.c CONFIGURACION USART
//USART SETTINGS
OpenUSART(USART_TX_INT_OFF&
USART_RX_INT_OFF&
USART_ASYNCH_MODE&
USART_EIGHT_BIT&
USART_CONT_RX&USART_BRGH_HIGH,25);
TXREG=0x00;
RCSTAbits.SPEN=1; //PUERTO SERIAL HABILITADO
RCSTAbits.CREN=1; //HABILITAR RECEPCIÓN
TXSTAbits.TXEN=1; //TRANSMISION HABILITADA
TXSTAbits.BRGH=1; //SELECCION DE RATA ALTA
TXSTAbits.TRMT=1; //REGISTRO DE TRANSMISION VACÍO
TXSTAbits.TX9=0; //BIT DE HABILITACION-TRANSMISION DE 9 BITS
//TXSTAbits.TX9D=0; // SE ASIGNA EL BIT, SÍ SE ACTIVO LA TRANSMISIÓN DE 9 BITS
//BAUDCONbits.TXCKP=0; //CLOCK AND DATA POLARITY SELECT BIT INVERTED=1, NOT INVERTED=0 BAUDCONbits.BRG16=0; //
//SPBRG=0X19; //TRANSMISION A 115200bps=0x19,25/PARA 9600=0X138,312
//MAIN PROGRAMA PRINCIPAL
#include <p18f4550.h>
#include <delays.h>
#include <adc.h>
#include <usart.h>
#include <xlcd.h>
//Librerias Propias ver includes.txt
#include "Fuses.h" //FUSES DEFINITIONS
#include "config.h" //PORTS, TRIS AND OTHER FLAVORS.
// pw[]="#0p1500s200<cr>";
void main(void)
{
InitPorts();
while(1)
{
putrsUSART("#0p1500s200<cr>");
Delay10KTCYx(60);
putrsUSART("#0p2000s200<cr>");
Delay10KTCYx(60);
}
CloseUSART();
}
Este es masomenos el código porque pues no lo puse todo es bastante largo, pero esta parte no logro que me funcione si alguien ha programado este micro para esa tarjeta por favor ayúdenme necesito esto con urgencia es mi Proyecto de Grado!!!!!!
Gracias...
Creo que el problema lo tienes en la variable "var"
Un tipo char es un sólo carácter, si quieres que sean más de uno la tendrás que definir como string.
S2
Ranganok Schahzaman
Pues mira estuve comprobando las tramas por medio del terminal serial del arduino y el problema no es la variable char el problema es que cuando envio esto:
char var="1500";
putrsUSART("#0p");
putsUSART(var);
putrsUSART("s200r");
obtengo esto en la salida-----:#0p 1500 s200
// cada ves que se ejecuta la función putsUSART o putrsUSART se genera por default un espacio en la cadena y lo que necesito que salga es toda la cadena junta sin ningún espacio así como esta:#0p1500s200
Ojala me puedas ayudar no se me ocurre como arreglarlo la verdad. Gracias
Yo no uso ni los compiladores ni el ide antiguos, uso los nuevos XC con el ide MPLABX, así que no sé si servirá, pero por si acaso.
Los strings se definen de este modo (usando los corchetes):
char var [] = "1500"
En la ayuda del mplabx no me sale nada de las funciones putsUSART ni putrsUSART, la mas parecida que sale es: putsUART y no debería añadir ningún espacio. Revisa la ayuda sobre esas dos funciones que usas tú, a ver donde puede estar el fallo si es que no es debido a que no defines bien el string.
También te diré que a mi, esta librería para enviar strings nunca me funcionó bien y al final opté por usar "printf" que va perfecto y da mucho más juego a la hora de formatear la salida (formatted output):
printf("P=%6d V=%6d, P=%5d V=%5dn",POS1CNTL,VEL1CNT,POS2CNTL,VEL2CNT);
Con "%" y los caracteres que inmediatamente le siguen configuras la cantidad de dígitos y el tipo de variable. Si no quieres que deje espacios no los pones y ya está.
Eso sí, uso siempre puertos serie por hardware. No sé si printf serviría para enviar a través de un puerto serie definido por software.
Pues mira yo si la declare como string solo que no lo puse en el comment pasado la tengo tal cual tu la pusiste.
Y lo de utilizar la de printf puede ser una opción solo que hasta ahora en el compilador que utilizo no encuentro la librería que me permita utilizarla. sin embargo, volveré a buscar o sino pues mirar si puedo cambiar de compilador sin que me afecte todo lo que he hecho.
Acerca de la forma de utilizar esa función yo ya la he trabajado en DevC++ pero no tengo claro esto: P=%6d, tiene que ver con el número de caracteres que quiero poner o para que se utiliza?
Voy a intentar esa opción y espero me resulte.Gracias
En la ayuda del mplab busca "formatted output" y allí lo encontrarás. Te resumo mucho lo que yo puse:
"P=", "V=" es un texto cualquiera, podría haber puesto "Pulsos:", "Velocidad ->" pero era más largo y el envío de datos a través de puerto serie ralentiza mucho el microcontrolador.
"%" es el caracter de control que usa printf para dar formato a la salida cuando se le pasa una variable.
"5" se refiere al número de dígitos que se mostrarán de la variable. Es independiente del valor y se alinea a la derecha por defecto.
"d" es el modificador y, normalmente, define el tipo de variable (int, float, long, char, ..., aunque tiene más opciones). Tiene que coincidir con el tipo de variable que hayas definido.
printf es una especie de función intermedia que da formato al texto (muy útil a la hora de hacer debug por puerto serie, por ejemplo) y que después usa la función "putch()" para enviar el texto byte a byte. Por lo que he leído:
http://microchip.wikidot.com/faq:29
Si te creas tú esa función puedes redirigir el envío de caracteres a cualquier otro periférico o pin del micro, pero como ya te comenté, nunca lo he probado.
Se supone que microchip cumple el ANSI C standard, así que la implementación de "printf" debería ser igual que en otros compiladores de C.