Bootloader PIC18F2550 con CCS PIC C Compiler

¿El dtr y cts del ftdi deben conectarse al pic para este procedimiento?
No, únicamente Tx y Rx.
Tal vez tengas algo mal en el código que estás usando.

Dos opciones:
Sube el programa que estás usando para el Bootloader, o si gustas subo el que yo tengo funcionando.
 
Última edición:
Saludos.

He estado usando el ejemplo del ex_bootloader, le quite la identificación del 16f por ahora, por si eso me causaba algún conflicto.

PHP:
#include <18F2550.h> 
#fuses NOWDT 
#use delay(clock=8000000,internal=8000000) 
// #use delay(crystal=20MHz) 
#use rs232(baud=9600, xmit=PIN_B0, rcv=PIN_B1,errors) 
#define PUSH_BUTTON PIN_A1 
#define LED1 PIN_C0

#define _bootloader 

#include <bootloader.h> 
#include <loader.c> 

#org LOADER_END+2,LOADER_END+4 

void application(void) { 
  while(TRUE); 
} 

void main(void) { 
   printf("\r\nTest 1.0\r\n"); 
   delay_ms(2000); 
   if(!input(PUSH_BUTTON)) 
   { 
      //printf("\r\nBootloader Version 1.0\r\n"); 
    
      // Let the user know it is ready to accept a download 
      printf("\r\nWaiting for download..."); 
      load_program(); 
   } 

   application(); 
} 

#int_global 
void isr(void) { 
   jump_to_isr(LOADER_END+5*(getenv("BITS_PER_INSTRUCTION")/8)); 
}
Este es el código que cargo al pic:
PHP:
#include <18F2550.h> 
#fuses NOWDT 
#use delay(clock=8000000,internal=8000000) 
#use rs232(baud=9600, xmit=PIN_B0, rcv=PIN_B1,errors) 
#define LED_PIN PIN_C0 

#include <bootloader.h> 


void main(void) { 
   int i = 0; 
   while(true){ 
      printf("Test %u\r\n",i++); 
      output_toggle(LED_PIN); 
      delay_ms(500); 
      output_toggle(LED_PIN); 
      delay_ms(500); 
   } 
}
Este es el que intento cargar mediante siow o teraterm:

En el principio del código del bootloader.h y loader.c solo puse esto para que tenga la misma configuración:
PHP:
#include <18F2550.h> 
#fuses NOWDT 
#use delay(clock=8000000,internal=8000000) 
// #use delay(crystal=20MHz) 
#use rs232(baud=9600, xmit=PIN_B0, rcv=PIN_B1) 
#define PUSH_BUTTON PIN_A1
En el loader.c he puesto que se encienda y apague un led para ver si entra a las rutinas de buffer y si parpadea respectivamente, igual en el osciloscopio.

No sé si sea un problema al cargarse y hacer el reset del pic-
 

Adjuntos

  • Captura de pantalla 2016-03-30 20.18.20.jpg
    Captura de pantalla 2016-03-30 20.18.20.jpg
    86.6 KB · Visitas: 14
Última edición por un moderador:
OK. Lo que está mal es la palabra de configuración.

Este es el programa para el Bootloader que yo uso:
PHP:
#include <18f2550.h>
#fuses   NOUSBDIV,PLL2,NOVREGEN,NOFCMEN
#use     delay(internal = 8MHz)
#use     rs232(UART1)

#define  PUSH_BUTTON PIN_A0

#ignore_warnings  205

#define _bootloader
//#define BOOTLOADER_MODE2X

#include <bootloader.h>
#include <loader.c>

#org LOADER_END + 2,LOADER_END + 4

void bucle_programa (void)
{
   while (true);
}


void main(void)
{
   delay_ms(2000);            // Dar un tiempo para que se presione el botón.
   
   if(!input(PUSH_BUTTON))
   {
      printf("\r\nCCS Bootloader V1.0\r\n");
      // Indicar al usuario que se está listo para recibir una descarga.
      printf("\r\nEsperando la descarga del programa...\r\n");
      load_program();
   }

   bucle_programa();
}

#int_global
void isr(void)
{
   jump_to_isr(LOADER_END + 5 * (getenv("BITS_PER_INSTRUCTION") / 8));
}
Lo modifiqué un poco, pero un detalle importante es el retardo que puse para dar tiempo de que se presione el pulsador después de dar el reset.
Sin ese retardo, recuerdo que el SIOW mostraba varios mensajes de error.

Como programa de prueba, usé este:
PHP:
#include <18f2550.h>
#fuses   NOUSBDIV,PLL2,NOVREGEN,NOFCMEN
#use     delay(internal = 8MHz)
#use     rs232(UART1)

//#define BOOTLOADER_MODE2X

#include <bootloader.h>

void main (void) 
{   
   delay_ms(100);
   
   puts("\r\nPrograma de prueba ejecutandose.\r\n");
   puts("Debe destellar un LED por el pin RA3 cada 250 ms.\r\n");

   while(TRUE)
   {
      output_toggle(PIN_A3);
      delay_ms(250);
   }
}
Así como están funcionan correctamente a 8 MHz con oscilador interno y también usando un adaptador de USB a RS-232 (TTL)

Suerte.
 
OK. Lo que está mal es la palabra de configuración.

Este es el programa para el Bootloader que yo uso:
PHP:
#include <18f2550.h>
#fuses   NOUSBDIV,PLL2,NOVREGEN,NOFCMEN
#use     delay(internal = 8MHz)
#use     rs232(UART1)

#define  PUSH_BUTTON PIN_A0

#ignore_warnings  205

#define _bootloader
//#define BOOTLOADER_MODE2X

#include <bootloader.h>
#include <loader.c>

#org LOADER_END + 2,LOADER_END + 4

void bucle_programa (void)
{
   while (true);
}


void main(void)
{
   delay_ms(2000);            // Dar un tiempo para que se presione el botón.
   
   if(!input(PUSH_BUTTON))
   {
      printf("\r\nCCS Bootloader V1.0\r\n");
      // Indicar al usuario que se está listo para recibir una descarga.
      printf("\r\nEsperando la descarga del programa...\r\n");
      load_program();
   }

   bucle_programa();
}

#int_global
void isr(void)
{
   jump_to_isr(LOADER_END + 5 * (getenv("BITS_PER_INSTRUCTION") / 8));
}
Lo modifiqué un poco, pero un detalle importante es el retardo que puse para dar tiempo de que se presione el pulsador después de dar el reset.
Sin ese retardo, recuerdo que el SIOW mostraba varios mensajes de error.

Como programa de prueba, usé este:
PHP:
#include <18f2550.h>
#fuses   NOUSBDIV,PLL2,NOVREGEN,NOFCMEN
#use     delay(internal = 8MHz)
#use     rs232(UART1)

//#define BOOTLOADER_MODE2X

#include <bootloader.h>

void main (void) 
{   
   delay_ms(100);
   
   puts("\r\nPrograma de prueba ejecutandose.\r\n");
   puts("Debe destellar un LED por el pin RA3 cada 250 ms.\r\n");

   while(TRUE)
   {
      output_toggle(PIN_A3);
      delay_ms(250);
   }
}
Así como están funcionan correctamente a 8 MHz con oscilador interno y también usando un adaptador de USB a RS-232 (TTL)

Suerte.

saludos, gracias por la respuesta.

había probado la siguiente configuración y lo probe por partes desde ver el tiempo con un led, hasta identificar un caracter del serial para verificar que la comunicación y todo estuviera funcionando por separado

Código:
#include <18F2550.h> 

#FUSES NOWDT          //No Watch Dog Timer 
#FUSES CPUDIV1        //No System Clock Postscaler 
#FUSES NOBROWNOUT     //No brownout reset 
#FUSES NOLVP          //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O 
#FUSES NOXINST        //Extended set extension and Indexed Addressing mode disabled (Legacy mode) 
#fuses PLL1           //No PLL PreScaler
#fuses NOUSBDIV       //USB clock source comes from primary oscillator
#fuses INTRC          //Internal RC Osc
#fuses HS             //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#fuses NOPUT          //No Power Up Timer
//#fuses NOMCLR         //Master Clear pin used for I/O
#fuses MCLR           //Master Clear pin enabled
#fuses NOSTVREN       //Stack full/underflow will not cause reset
#fuses NOWRTB         //Boot block not write protected
#fuses NOWRTD         //Data EEPROM not write protected
#fuses NOWRTC         //Configuration registers not write protected
#fuses NOWRT          //Program memory not write protected
#fuses NOEBTR         //Memory not protected from table reads
#fuses NOEBTRB        //Boot block not protected from table reads

#use delay(internal=8MHz) 

#use FIXED_IO( A_outputs=PIN_A1,PIN_A0 ) 
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=PC,ERRORS) 

#define PUSH_BUTTON PIN_A1

los ultimos registros se los puse por si tenía bloqueada alguna instrucción de escritura, lo que me hacía en el siow despues de copiar el codigo HEX y pegarlo en la terminal es que veía que respodía el pic pero al finalizar no cargaba el programa.

Usando la terminal tera term, me cargaba el archivo y se reiniciaba el pic pero aún así cargaba el mismo programa y no el nuevo.

Probe el código que proporcionas solo le agreuge esta línea

Código:
#use     rs232(UART1,ERRORS)

ya que sino lo ponía el serial se trababa y ya no recibía ni enviaba datos. Esto lo probé con un programa aparte usando un osciloscopio para verificarlo.

al cargar el bootloader y ponerlo en espera, le mando el archivo por siow y veo que si responden los XON y XOFF al visualizar el rx y tx pero me sigue el mismo problema que al finalizar la transmisión el pic no se reinicia con el archivo enviado. el flow control lo pongo en both y si concuerdan el xon y xoff del siow con la del bootloader.h

tengo que inicializar los fuses en algún otro lado? lo intenté poniendo en el bootloader.h ya que algunos mencionaban que se debía poner ahí pero con el mismo resultado
 
¿Tengo que inicializar los fuses en algún otro lado? Lo intenté poniendo en el bootloader.h, ya que algunos mencionaban que se debía poner ahí pero con el mismo resultado.
No, no hay que configurar nada extra, ni agregar cosas extra.
Así como está el código que subí, funciona.

Prueba con el archivo .hex que adjunto, y si te funciona, debes actualizar tu compilador.
Si no te funciona, entonces tienes un problema de hardware.
 

Adjuntos

  • Bootloader.rar
    1.5 KB · Visitas: 42
No, no hay que configurar nada extra, ni agregar cosas extra.
Así como está el código que subí, funciona.

Prueba con el archivo .hex que adjunto, y si te funciona, debes actualizar tu compilador.
Si no te funciona, entonces tienes un problema de hardware.

tengo la versión 5.050 del ccs c compiler del siow el 1.2.9

probe el programa que pusiste y lo pongo en modo bootloader y mido el RX y TX para ver si se transfiere pero creo que no está respetando el XOn y Xoff podría ser que este fallando algo en las versiones?
 

Adjuntos

  • Captura de pantalla 2016-04-05 20.47.55.jpg
    Captura de pantalla 2016-04-05 20.47.55.jpg
    76.9 KB · Visitas: 7
  • Captura de pantalla 2016-04-05 20.49.09.jpg
    Captura de pantalla 2016-04-05 20.49.09.jpg
    80 KB · Visitas: 2
  • Captura de pantalla 2016-04-05 20.51.14.jpg
    Captura de pantalla 2016-04-05 20.51.14.jpg
    98.8 KB · Visitas: 3
¿Podría ser que esté fallando algo en las versiones?
No. Por la versión del compilador no es el problema.
Yo utilicé ese mismo programa desde la versión 4 y algo. Ahora tengo la 5.054 y sigue funcionando bien.

Vi algo importante que no había visto antes en una de las imágenes que enviaste.
Veo que usaste el puerto 12 anteriormente y ahora el 14, o sea que tienes puertos virtuales instalados.
Cuando tienes puertos virtuales, por alguna razón el SIOW y otros programas no logran comunicarse con el microcontrolador.
Elimina temporalmente todos los puertos virtuales y haz una prueba.
Posiblemente con eso ya logres realizar la carga del programa.

Suerte.
 
Saludos,

ya pude hacer funcionar el ejemplo y ya carga el bootloader para poder cargar un nuevo programa multiples veces por r232.

Quisiera saber si hay opción de ampliar el tamaño del bootloader para agregarle código extra. eh intentado modificar el parámetro del #define LOADER_SIZE de loader.c y #define LOADER_END del bootloader.h

#build (reset=0x400, interrupt=0x408)
#org 0, 0x3FF {}

Eh visto que algunos ponen este código para mover el vector de interrupciones y guardar el lugar del bootloader.

eh modificado los parametros pero no eh podido quitar el error de compilación del ROM. hay forma de ver más a detalle como hacer esta modificación?
 
Hola, tengo una duda, estoy cargando el bootloader que viene para CCS en el ejemplo EX_USB_BOOTLOADER con las modificaciónes necesarias para el pic18f2550, lo que sucede es que carga el bootloader y los programas cuando los cargo desde SIOW cargan correctamente, a excepcion de los programas que hago con comunicación USB, acaso ¿no se puede usar la comunicación USB cuando tengo un bootloader?, se que no deberia ser así pero les pido su ayuda si alguno ya lo ha logrado por que los programas que tienen comunicación CDC USB no me funcionan

muchas gracias
 
Lo más probable es que no estés definiendo bien la palabra de configuración.
Ésta depende de la frecuencia del cristal que vas a usar, ya que hay que llevar el CPU a 48 MHz. por medio de configuración del prescaler y el postescaler.

Si no usas la configuración correcta, la PC no podrá reconocer el dispositivo porque el módulo USB no estará funcionando correctamente.
 
Atrás
Arriba