TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: hernanfire en 10 de Noviembre de 2009, 15:45:23
-
Holas a todos :), Tengo un problemita que no puedo solucionar.
La idea es transmitir con un 18F4550 atravez de un wenshing 433 conectado por usb al ordenador.
Este funciona en CDC con interfaz VB6, se envia caracteres con botones y se muestran (lo que llega de la interfaz en el LCD) pero el problema es que
no manda por el RS232 el aviso de Contro por RC, esto solo lo uso para probar si envia algo y asi conectarlo al RX para
asegurarme que llegan los caracteres enviados por el TX al RX.
Los fuses estan para usar un Cristal de 4Mhz la cuestion es que para que funcione el RS232 cambio el cristal de 4mhz a 48 (en propiedades del PIC en Proteus) y los fuses a estos y funciona el RS232 pero no la parte de USB!!! :mrgreen:
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOPBADEN,NOBROWNOUT
#use delay(clock=48000000)//48MHz
HSPLL ( era XTPLL) y PLL1 (era PLL5) la consulta es.... :(
Hay combinacion de fuses para que funcionen ambas, si es si sigo buscando en el datasheet :shock: !!!
GRACIAS POR SU ATENCION
Adjunto el programa original abajo.... lo que no manda es printf("*** Control Robot por RC 433Mhz ***\r\n") antes de enumerar al PIC.
#include <18F4550.h>
#fuses XTPLL,NOMCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,VREGEN,NOPBADEN
#use delay(clock=48000000)
#USE RS232 (baud=9600,bits=8,parity=N,xmit=PIN_C6,rcv=PIN_C7)
#byte RCSTA= 0xFAB // Registro de recepcion de la usart
#byte RCREG= 0xFAE // Aquí se recibe el dato de la usart
#byte TMR1L= 0xFCE// Byte bajo del timer1
#bit CREN= RCSTA.4 // Se activa para recepción continua
#bit OERR= RCSTA.1 // Error de Overrun
#define use_portb_lcd TRUE
#define USB_CON_SENSE_PIN PIN_E3
#include <lcd.c>
#include "usb_cdc.h"
#include <string.h>
#byte PORTA = 0xF80// Son las direcciones de memoria de los puertos en este PIC
#byte PORTB = 0xF81
#byte PORTC = 0xF82
#byte PORTD = 0xF83
#byte PORTE = 0xF84
#include <string.h>
/////////////////////////////////////// PRINCIPAL /////////////////////////////////////
void main()
{
char LETRA;
usb_cdc_init(); // llamadas necesarias para iniciar el módulo USB
usb_init_cs(); // inicia el USB y sale. va a la par con usb_task()
lcd_init(); // llamadas necesarias para iniciar la LCD
output_high(PIN_C0); //LED ROJO ENCENDIDO
output_low(PIN_C1); //LED VERDE APAGADO
disable_interrupts(INT_TIMER1);
disable_interrupts(GLOBAL);
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
printf("*** Control Robot por RC 433Mhz ***\r\n");
while(true){
usb_task(); // configura el USB
if(usb_cdc_connected()){
// espera a detectar una transmisión de la PC (Set_Line_Coding)
if (usb_enumerated()) // aquí se hace el acceso HOST<->PC y después sale
output_low(PIN_C0); //LED ROJO APAGADO
output_high(PIN_C1); //LED VERDE ENCENDIDO
if(usb_cdc_kbhit()){
LETRA=usb_cdc_getc();
if(LETRA=='*'){
lcd_putc("\f");
}
else{
lcd_putc(LETRA);
printf(usb_cdc_putc,LETRA); // envia una respuesta al Host
}
}
}
}
GRaCIAs! :-/
}
-
Yo lo he hecho funcionar perfectamente los dos canales, el USB CDC y la USART Serie.
Pero los fuses eran los necesarios para el USB, que es el que requiere los megaherzios correspondientes, y como yo tenía un cristal de 20 Mhz utilizaba el HSPLL y el PLL5 para dividir los 20 Mhz por 5 y así la entrada del PLL tenía los a 4 Mhz que debe tener.
No entiendo porqué no te va a funcionar a tí. :shock:
-
Gracias, por responder RedPic :-/. Queria saber si se podia, porque quizas me faltaba configurar algo, si tu me decis que pudistes entonces seguire mirando el datasheet, :shock: o tendre en cuenta los fuses que me mencionas para poder usar ambas.
El codigo que pegue, pudiste observarlo??¿¿ tiene algun error o piensas que combiando los fuses deberia funcionar!!!!
Lo probare en proteus con tus indicaciones. Gracias !!! :mrgreen:
-
:?
El USB funciona en el proteus sin importar el valor del cristal que le pongas en propiedades -el lo asume solito-, lo que no te va a funcionar es en real. Que cristal pensas ponerle? ya que de eso depende mucho la configuracion de los bits de configuracion o #fuses
Saludos
-
Hola foreros!
Estoy ententando hacer lo mismo, comunicacion CDC e RS-232, con el mismo PIC.
Pero no consigo enviar datos por el RS-232!
El codigo para test del RS232:
#include <18F4550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOBROWNOUT
#use delay(clock=48000000)
#USE RS232 (baud=9600,bits=8,parity=N,xmit=PIN_C6,rcv=PIN_C7)
void main() {
printf("\r\n PIC18F4550 - RS-232 ok!" );
}
Lo simulo en Proteus, conecto los dos COM con el Virtual Serial Port, y recibo datos con un programa en C#...
Pero me sale: "????????????" en la recepcion.
Con un PIC 16F, y otra configuracion, funciono correctamente, por esso creo que es un fallo en los fuses o algo asi...
Alguien lo sabe?
Gracias!
-
USB por ahora no estas usando, si usarás un cristal de 20MHz los fuses estarían bien. Lo único que puedas estar errando es en proteus colocar una frecuencia al PIC distinta de 48MHz.
Saludos!
-
QUE RAPIDO!!!
jejeje!
Funcionó correctamente! Genial!!!!
Muchisimas gracias!
-
Hola, tengo una pequeña duda con la configuracion de los fuses, utilizo el 18f2680, y estos son los fuses que estan disponibles para este pic:
LP Low power osc < 200 khz
XT Crystal osc <= 4mhz
HS High speed Osc (> 4mhz)
RC Resistor/Capacitor Osc with CLKOUT
EC External clock with CLKOUT
EC_IO External clock
H4 High speed osc with HW enabled 4X PLL
RC_IO Resistor/Capacitor Osc
PROTECT Code protected from reads
NOPROTECT Code not protected from reading
BROWNOUT_NOSL Brownout enabled during operation, disabled during SLEEP
BROWNOUT_SW Brownout controlled by configuration bit in special file register
NOBROWNOUT No brownout reset
BROWNOUT Reset when brownout detected
WDT1 Watch Dog Timer uses 1:1 Postscale
WDT2 Watch Dog Timer uses 1:2 Postscale
WDT4 Watch Dog Timer uses 1:4 Postscale
WDT8 Watch Dog Timer uses 1:8 Postscale
WDT16 Watch Dog Timer uses 1:16 Postscale
WDT32 Watch Dog Timer uses 1:32 Postscale
WDT64 Watch Dog Timer uses 1:64 Postscale
WDT128 Watch Dog Timer uses 1:128 Postscale
WDT Watch Dog Timer
NOWDT No Watch Dog Timer
BORV21 Brownout reset at 2.1V
BORV28 Brownout reset at 2.8V
BORV43 Brownout reset at 4.3V
BORV46 Brownout reset at 4.6V
PUT Power Up Timer
NOPUT No Power Up Timer
CPD Data EEPROM Code Protected
NOCPD No EE protection
NOSTVREN Stack full/underflow will not cause reset
STVREN Stack full/underflow will cause reset
NODEBUG No Debug mode for ICD
DEBUG Debug mode for use with ICD
NOLVP No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
LVP Low Voltage Programming on B3(PIC16) or B5(PIC18)
WRT Program Memory Write Protected
NOWRT Program memory not write protected
WRTD Data EEPROM write protected
NOWRTD Data EEPROM not write protected
IESO Internal External Switch Over mode enabled
NOIESO Internal External Switch Over mode disabled
FCMEN Fail-safe clock monitor enabled
NOFCMEN Fail-safe clock monitor disabled
PBADEN PORTB pins are configured as analog input channels on RESET
NOPBADEN PORTB pins are configured as digital I/O on RESET
BBSIZ1K 1K words Boot Block size
BBSIZ2K 2K words Boot Block size
WRTC configuration registers write protected
NOWRTC configuration not registers write protected
WRTB Boot block write protected
NOWRTB Boot block not write protected
EBTR Memory protected from table reads
NOEBTR Memory not protected from table reads
EBTRB Boot block protected from table reads
NOEBTRB Boot block not protected from table reads
CPB Boot Block Code Protected
NOCPB No Boot Block code protection
LPT1OSC Timer1 configured for low-power operation
NOLPT1OSC Timer1 configured for higher power operation
MCLR Master Clear pin enabled
NOMCLR Master Clear pin used for I/O
XINST Extended set extension and Indexed Addressing mode enabled
NOXINST Extended set extension and Indexed Addressing mode disabled (Legacy mode)
INTRC Internal RC Osc
INTRC_IO Internal RC Osc, no CLKOUT
WDT256 Watch Dog Timer uses 1:256 Postscale
WDT512 Watch Dog Timer uses 1:512 Postscale
WDT1024 Watch Dog Timer uses 1:1024 Postscale
WDT2048 Watch Dog Timer uses 1:2048 Postscale
WDT4096 Watch Dog Timer uses 1:4096 Postscale
WDT8192 Watch Dog Timer uses 1:8192 Postscale
WDT16384 Watch Dog Timer uses 1:16384 Postscale
WDT32768 Watch Dog Timer uses 1:32768 Postscale
BBSIZ4K 4K words Boot Block size
Necesito hacer una comunicación serie donde solo envia string's, el reloj es de 8mhz y funciona a 115200baudios, alguien me puede decir que fuses necesitare activa/seactivar
Gracias
Un saludo foreros!!
-
Pues si son 8MHz, creo que toca el HS .... pero recuerdo que por ahí hubo comentarios acerca de fallos en la comunicación cuando se usaban otro tipo de relojes diferentes a 4, 12 y 20MHz.
saludos