Autor Tema: PIC18F67J50 con bootloader (no funciona un programa sencillo)  (Leído 4997 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado jcastillo227

  • PIC10
  • *
  • Mensajes: 12
PIC18F67J50 con bootloader (no funciona un programa sencillo)
« en: 31 de Diciembre de 2019, 08:05:41 »
Buenos días,

tengo un PIC18F67J50 con puerto USB y bootloader, el del siguiente enlace: http://www.superrobotica.com/S310442.htm

Resulta que he hecho un programa muy sencillo utilizando MPLAB X IDE y XC8, básicamente consiste en configurar 3 salidas digitales, 2 que parpadean alternativamente cada 500ms, y otra activa en todo momento. El código del programa en C es el que sigue:


// PIC18F67J50 Configuration Bit Settings

// 'C' source line config statements

// CONFIG1L
#pragma config WDTEN = OFF      // Watchdog Timer Enable bit (WDT disabled (control is placed on SWDTEN bit))
#pragma config PLLDIV = 1       // PLL Prescaler Selection bits (No prescale (4 MHz oscillator input drives PLL directly))
#pragma config STVREN = ON      // Stack Overflow/Underflow Reset Enable bit (Reset on stack overflow/underflow enabled)
#pragma config XINST = OFF      // Extended Instruction Set Enable bit (Instruction set extension and Indexed Addressing mode enabled)

// CONFIG1H
#pragma config CPUDIV = OSC1    // CPU System Clock Postscaler (No CPU system clock divide)
#pragma config CP0 = OFF        // Code Protection bit (Program memory is not code-protected)

// CONFIG2L
#pragma config FOSC = INTOSCPLL // Oscillator Selection bits (INTOSC with PLL enabled, Port function on RA6 and RA7)
#pragma config FCMEN = ON       // Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor enabled)
#pragma config IESO = ON        // Two-Speed Start-up (Internal/External Oscillator Switchover) Control bit (Two-Speed Start-up enabled)

// CONFIG2H
#pragma config WDTPS = 32768    // Watchdog Timer Postscaler Select bits (1:32768)

// CONFIG3L

// CONFIG3H
#pragma config CCP2MX = DEFAULT // ECCP2 MUX bit (ECCP2/P2A is multiplexed with RC1)
#pragma config MSSPMSK = MSK7   // MSSP Address Masking Mode Select bit (7-Bit Address Masking mode enable)

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

#include <xc.h>
#define _XTAL_FREQ 48000000

void main(void) {
    TRISA=0;
    while(1){
        PORTAbits.RA0=1;
        PORTAbits.RA3=0;
        __delay_ms(500);
        PORTAbits.RA0=0;
        PORTAbits.RA3=1;
        __delay_ms(500);
    }
    PORTAbits.RA2=1;
    return;
}

Hecho esto (el programa en C), compilo (le doy a clean and build) mostrándose el siguiente resultado en la pantallita de abajo:

CLEAN SUCCESSFUL (total time: 12ms)
make -f nbproject/Makefile-default.mk SUBPROJECTS= .build-conf
make[1]: Entering directory 'C:/Users/Carmen y Javi/MPLABXProjects/pruebas.X'
make  -f nbproject/Makefile-default.mk dist/default/production/pruebas.X.production.hex
make[2]: Entering directory 'C:/Users/Carmen y Javi/MPLABXProjects/pruebas.X'
"C:\Program Files (x86)\Microchip\xc8\v2.10\bin\xc8-cc.exe"  -mcpu=18F67J50 -c    -fno-short-double -fno-short-float -memi=wordwrite -O0 -fasmfile -maddrqual=ignore -xassembler-with-cpp -mwarn=-3 -Wa,-a -DXPRJ_default=default  -msummary=-psect,-class,+mem,-hex,-file  -ginhx032 -Wl,--data-init -mno-keep-startup -mno-download -mdefault-config-bits   -std=c99 -gdwarf-3 -mstack=compiled:auto:auto:auto     -o build/default/production/HolaMundo.p1 HolaMundo.c
"C:\Program Files (x86)\Microchip\xc8\v2.10\bin\xc8-cc.exe"  -mcpu=18F67J50 -Wl,-Map=dist/default/production/pruebas.X.production.map  -DXPRJ_default=default  -Wl,--defsym=__MPLAB_BUILD=1    -fno-short-double -fno-short-float -memi=wordwrite -O0 -fasmfile -maddrqual=ignore -xassembler-with-cpp -mwarn=-3 -Wa,-a -msummary=-psect,-class,+mem,-hex,-file  -ginhx032 -Wl,--data-init -mno-keep-startup -mno-download -mdefault-config-bits -std=c99 -gdwarf-3 -mstack=compiled:auto:auto:auto      -Wl,--memorysummary,dist/default/production/memoryfile.xml -o dist/default/production/pruebas.X.production.elf  build/default/production/HolaMundo.p1     

Memory Summary:
    Program space        used    4Eh (    78) of 1FFF8h bytes   (  0.1%)
    Data space           used     2h (     2) of   F40h bytes   (  0.1%)
    Configuration bits   used     3h (     3) of     3h words   (100.0%)
    Data stack space     used     0h (     0) of   EE0h bytes   (  0.0%)

make[2]: Leaving directory 'C:/Users/Carmen y Javi/MPLABXProjects/pruebas.X'
make[1]: Leaving directory 'C:/Users/Carmen y Javi/MPLABXProjects/pruebas.X'

BUILD SUCCESSFUL (total time: 1s)
Loading code from C:/Users/Carmen y Javi/MPLABXProjects/pruebas.X/dist/default/production/pruebas.X.production.hex...
Loading completed

Y hecho lo cual, tengo ya el código en hexadecimal el cual muestro a continuación:


:020000040000FA
:04000000D7EFFFF047
:020000040001F9
:10FFAE000001DAEFFFF0000E926E808080961F0E39
:10FFBE00026E710E016E1E0EE82EFED7012EFCD7BC
:10FFCE00022EFAD700D0809080861F0E026E710E20
:10FFDE00016E1E0EE82EFED7012EFCD7022EFAD78A
:0AFFEE0000D0DCEFFFF000EF00F0A0
:06FFF800AEF7C2FFF8F9AC
:00000001FF

Cargo el programa con el bootloader, aparece que todo se ha cargado correctamente pero hago las conexiones con los pin correspondientes y no funciona.

en el único sitio que consigo que se encienda el led que conecto es conectando las patillas a los pines de 3,3V y 0V.

Muchísimas gracias de antemano.

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:PIC18F67J50 con bootloader (no funciona un programa sencillo)
« Respuesta #1 en: 01 de Enero de 2020, 18:09:00 »
El Bootloader ocupa desde la posición 0x0000 a la posición 0x0fff

Salvo que uses el scrip de Microchip para que el Linker sepa que tiene que compilar para el bootloader tienes que decirle al compilador que relocalice los vectores de reset y de interrupciones, esto se haría agregando lo siguiente después del #define xtal
Código: C
  1. \\ Reubica los vectores.
  2. #build(reset=0x1000,interrupt=0x1008,interrupt=0x1018)
Luego reservas el espacio del bootloader para que el compilador no compile nada en esas posiciones de flash:
Código: C
  1. \\ Espacio reservado, ocupado por el bootloader. No se reescribirá.
  2. #org 0x0000,0x0fff {}
Con estas dos directivas debería funcionarte.

 lo que me llama la atención es que te está compilando y generando el hex para ser cargado al final de la flash, pero los vectores sin embargo parece que no los apunta.

 Te graba al principio un goto a la dirección FFF0.  Cuando eso debería hacerlo el bootloader, nunca la aplicación que creas.

  Ponle las dos lineas de arriba a ver qué tal.

  Saludos.
« Última modificación: 01 de Enero de 2020, 19:46:47 por remi04 »

Desconectado jcastillo227

  • PIC10
  • *
  • Mensajes: 12
Re:PIC18F67J50 con bootloader (no funciona un programa sencillo)
« Respuesta #2 en: 03 de Enero de 2020, 11:53:07 »
Muchas gracias Remi04. Tiene todo el sentido del mundo lo que dices y seguro que es ese el fallo pero estoy programando con MPLAB IDE y no me reconoce ni #build... ni #org..., lo escribo y sale subrayado en rojo como que el código no está bien. También las barras para los comentarios están mal porque son en el otro sentido pero eso no tiene importancia.

He estado investigando por ahí, y también pone que con XC8 se podría utilizar la opción codeoffset y configurarlo ahí, pero la verdad tampoco logro localizarlo.

muchas gracias de nuevo y quedo pendiente de tu respuesta, eres mi única esperanza. ¡feliz 2020!http://

Desconectado uZYNQ

  • PIC16
  • ***
  • Mensajes: 123
Re:PIC18F67J50 con bootloader (no funciona un programa sencillo)
« Respuesta #3 en: 03 de Enero de 2020, 13:23:15 »
Si usas MPLABX con ese bootlooder, una opción es modificar la configuración del linker de la siguiente manera.
1. Under the build configuration-->XC8 global options-->XC8 linker-->Option categories:Additional options
   the "Codeoffset" must be set to: 0x1000
   See the "Required_Application_Project_Codeoffset_Linker_Settings_for_XC8.png" image for example view.

2. Under the build configuration-->XC8 global options-->XC8 linker-->Option categories:Memory model,
   the "ROM ranges" must be set to: default,-0-FFF,-1006-1007,-1016-1017
   See the "Required_Application_Project_ROM_Ranges_Linker_Settings_for_XC8.png" image for example view.


Ese bootloader esta hecho con las librerias de microchip para aplicaciones (MLA), disponible para descargar desde el sitio de microchip y donde tienes los ejemplos de uso tanto de la aplicación como del bootloader y donde saque lo que publique.

Por otro lado, veo que no configuras los pines del puerto A que estas utilizando como digitales ya que por defecto son Analogicos.   

Desconectado jcastillo227

  • PIC10
  • *
  • Mensajes: 12
Re:PIC18F67J50 con bootloader (no funciona un programa sencillo)
« Respuesta #4 en: 03 de Enero de 2020, 19:47:32 »
Muchas gracias uZYNQ,

ya configuré lo de codeoffset (antes lo intenté pero no encontraba donde). No obstante, ¿se podría escribir en el código tipo a lo que dijo remi04?

por otra parte, también configuré lo de ROMranges (adjunto pantallazo a ver si lo he hecho bien), lo que pasa que según comentarios que se ven abajo debería seleccionar bytewrite ya que el micro es de 8 bits y que las otras 2 opciones son para 16bits, ¿correcto?

por último, en la documentación del conjunto microchip-USB dice "High/Low interrupt Vectors are at 0x1008/0x1018", ¿eso no tengo que introducirlo en ningún lado?

por último, para configurar el puerto RA2 como digital es así no "ANCON0bits.PCFG2=1;"¿????

gracias (pregunto porque sigue sin funcionar).

Desconectado uZYNQ

  • PIC16
  • ***
  • Mensajes: 123
Re:PIC18F67J50 con bootloader (no funciona un programa sencillo)
« Respuesta #5 en: 03 de Enero de 2020, 21:13:27 »
Esa configuración de  la imagen es la que da microchip para los para los micros 18F tal como aparece recuerda que es la ROM (PIC18F87J94 en ese ejemplo). Por otro lado, la escritura a RA2 nunca se da por antes tienes un ciclo while infinito. los que debes confirar como digitales son RA0 y RA3, que son los leds que enciendes y apagas.

Desconectado jcastillo227

  • PIC10
  • *
  • Mensajes: 12
Re:PIC18F67J50 con bootloader (no funciona un programa sencillo)
« Respuesta #6 en: 04 de Enero de 2020, 09:40:51 »
Hola de nuevo uZYNQ, además de con el puerto digital RA2 también lo hice con los otros 2, y para descartar problemas de que no me funcione algo por temas del oscilador de frecuencia... active la salida del puerto digital antes del bucle while (y no después como estaba antes, tiene sentido lo que dices, nunca se llegaría a ejecutar).

Respecto a lo que dices que es la imagen que da microchip para los micros 18F genérico, porque después haces referencia que es para el PIC18F87J94, ¿tengo que tenerlo en cuenta de alguna manera?

por otra parte, ¿sabes si las funciones #org y #build se podrían escribir? no me las reconoce el programa.

por último, te pregunto una vez más porque no me respondiste y no me queda claro, en la documentación del conjunto microchip-USB dice "High/Low interrupt Vectors are at 0x1008/0x1018", ¿eso no tengo que introducirlo en ningún lado? es que eso no es referente al microchip, sino al conjunto que compré de microchip en una placa con USB, pines accesibles y un bootloader, así que entiendo que eso tengo que introducirlo sí o sí por algún lado.

pongo el código tal como quedó:


// PIC18F67J50 Configuration Bit Settings

// 'C' source line config statements

// CONFIG1L
#pragma config WDTEN = OFF      // Watchdog Timer Enable bit (WDT disabled (control is placed on SWDTEN bit))
#pragma config PLLDIV = 1       // PLL Prescaler Selection bits (No prescale (4 MHz oscillator input drives PLL directly))
#pragma config STVREN = ON      // Stack Overflow/Underflow Reset Enable bit (Reset on stack overflow/underflow enabled)
#pragma config XINST = OFF      // Extended Instruction Set Enable bit (Instruction set extension and Indexed Addressing mode enabled)

// CONFIG1H
#pragma config CPUDIV = OSC1    // CPU System Clock Postscaler (No CPU system clock divide)
#pragma config CP0 = OFF        // Code Protection bit (Program memory is not code-protected)

// CONFIG2L
#pragma config FOSC = INTOSCPLL // Oscillator Selection bits (INTOSC with PLL enabled, Port function on RA6 and RA7)
#pragma config FCMEN = ON       // Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor enabled)
#pragma config IESO = ON        // Two-Speed Start-up (Internal/External Oscillator Switchover) Control bit (Two-Speed Start-up enabled)

// CONFIG2H
#pragma config WDTPS = 32768    // Watchdog Timer Postscaler Select bits (1:32768)

// CONFIG3L

// CONFIG3H
#pragma config CCP2MX = DEFAULT // ECCP2 MUX bit (ECCP2/P2A is multiplexed with RC1)
#pragma config MSSPMSK = MSK7   // MSSP Address Masking Mode Select bit (7-Bit Address Masking mode enable)

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

#include <xc.h>
#define _XTAL_FREQ 48000000

void main(void) {
    ANCON0bits.PCFG0=1;
    ANCON0bits.PCFG2=1;
    ANCON0bits.PCFG3=1;
    TRISA=0;
    PORTAbits.RA2=1;
    while(1){
        PORTAbits.RA0=1;
        PORTAbits.RA3=0;
        __delay_ms(500);
        PORTAbits.RA0=0;
        PORTAbits.RA3=1;
        __delay_ms(500);
    }
    return;
}

Desconectado uZYNQ

  • PIC16
  • ***
  • Mensajes: 123
Re:PIC18F67J50 con bootloader (no funciona un programa sencillo)
« Respuesta #7 en: 04 de Enero de 2020, 14:00:35 »
Lo del PIC18F87J94 era para que veas que esta configurado para un pic18F. microchip da esa misma imagen para los pic18F y pic18FxxJxx. Para los 16F y pic24F si es diferente.
lo de las directivas #org y #build no lo se, puede ser que sea para otro compilador.

respecto a lo de los vectores de interrupción, estos deberian quedar remapeados a las nuevas direcciones si se usa el codeoffset. En tu ejemplo no se estan usando por lo que deberia funcionar el parpadeo de los leds.


Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:PIC18F67J50 con bootloader (no funciona un programa sencillo)
« Respuesta #8 en: 04 de Enero de 2020, 18:21:25 »
Las
Directivas build y org en principio para el compilador CCS.  Pensé que funcionaría también en xc8

  De todas formas como te han comentado ya, habiendo configurado el codeoffset ya es suficiente. El compilador sabe donde están los vectores de interrupción .

  ¿Puedes poner el hex que te genera?

Desconectado jcastillo227

  • PIC10
  • *
  • Mensajes: 12
Re:PIC18F67J50 con bootloader (no funciona un programa sencillo)
« Respuesta #9 en: 04 de Enero de 2020, 20:12:19 »
Muy buenas, os comento (y gracias por la ayuda, estoy empezando y estoy muy pegado).

continuando con la investigación a ver por qué leches no me funciona el programa, en el data sheet del PIC vi lo de la primera foto, donde ya me direis si me equivoco, pero entiendo que únicamente los puertos B y C conducir en directo un LED (quizás sea una tentería, ya me direis) por lo que probé a hacer que conduzcan algunos de esos bits, y ésto tampoco me funcionó.

El hex que se genera es:


:020000040000FA
:0410000004EF08F001
:061008000001D0EFFFF033
:020000040001F9
:10FFA000C180C184C186000E926E000E936E000E59
:10FFB000946E8084818C828A808080961F0E026E6F
:10FFC000710E016E1E0EE82EFED7012EFCD7022EFA
:10FFD000FAD700D0809080861F0E026E710E016EDF
:10FFE0001E0EE82EFED7012EFCD7022EFAD700D027
:08FFF000DCEFFFF000EF08F068
:06FFF800AEF7C2FFF8F9AC
:00000001FF

Dicho esto, como seguía sin funcionarme tal como he comentado arriba, en el bootloader (segunda imagen) activé la casilla "allow configuration word programming", ante lo cual el PC ya no me reconoce la placa, creo que me he cargado el bootloader o no se que pasa sino, a ver que pensais.

A parte de todo lo anterior, me he dado cuenta que en la página del fabricante de la placa USB con el PIC 18F67J50 pone un pantallazo donde usa el HIDBootLoader versión 2.6, y me he dado cuenta que yo estaba utilizando la versión 2.3, ¿puede esto tener algo que ver con que no funcionaran los programas.

Por último, la pregunta es, si es que me he machacado el bootloader, necesitaré pues un quemador. ¿cuál debería adquirir para volver a grabarlo? ¿y qué debería grabar exactamente? decidme por favor uno compatible con  dicho microchip y con MPLAB. Adjunto las 2 últimas imágenes con pantallazos de MPLAB y datasheet para ver compatibilidades. Iba a comprar pickit3 pero claro, no lo veo en el datasheet y digo a ver si lo voy a comprar y no me va a valer.

gracias.

Desconectado uZYNQ

  • PIC16
  • ***
  • Mensajes: 123
Re:PIC18F67J50 con bootloader (no funciona un programa sencillo)
« Respuesta #10 en: 05 de Enero de 2020, 01:16:28 »
La aplicación HIDBootloader 2.6 también es una versión antigua para windows. Con el compilador que estas usando el MPLABX te recomiendo una versión mas actualizada, al menos la version 2.9j que viene con el MLA de 15-06-2013 o la versión 2.15 del MLA de fecha 06-03-2017. Estas vienen para windows y para linux.

Si vas a comprar el programador ya puedes descargar tus programas sin necesidad del bootloader, esto incluso te facilita el desarrollo, además ya le puedes hacer debug. Pero si es que necesitas grabar el bootloader, lo puedes hacer con los archivos del fabricante que estan en la pagina web. http://www.robot-electronics.co.uk/htm/dev-p182432.htm. especificamente deberias grabar el archivo, HID Bootloader PIC18F87J50 Family.hex. tal como se ve en la imagen El pickit3 puede ser utilizado.

Desconectado uZYNQ

  • PIC16
  • ***
  • Mensajes: 123
Re:PIC18F67J50 con bootloader (no funciona un programa sencillo)
« Respuesta #11 en: 05 de Enero de 2020, 01:33:50 »
Incluso puedes utilizar el pickit4 que esta mas actualizado y puedes utilizarlo con dispositivos nuevos. Una versión de bajo costo es el snap que también lo puedes utilizar tal como se ve en la imagen. Si lo compras en la tienda de microchiphttps://www.microchip.com/Developmenttools/ProductDetails/PG164100 te lo dan con un 50% con el codigo de descuento  404Discount quedando en 7.475$

Desconectado jcastillo227

  • PIC10
  • *
  • Mensajes: 12
Re:PIC18F67J50 con bootloader (no funciona un programa sencillo)
« Respuesta #12 en: 05 de Enero de 2020, 07:28:40 »
Gracias, el bootloader sabes si me lo he cargado por pulsar "allow configuración word programming? O acaso eso no tiene nada que ver con que el pc no reconozca el dispositivo? Es que el pickit 3 me tardará unos días en llegar y si hubiera otra alternativa para continuar trabajando...

Desconectado uZYNQ

  • PIC16
  • ***
  • Mensajes: 123
Re:PIC18F67J50 con bootloader (no funciona un programa sencillo)
« Respuesta #13 en: 05 de Enero de 2020, 07:57:05 »
En las notas de uso del bootloader dice:
In addition to the above, make certain that all configuration bit settings
between the bootloader firmware project, and the application firmware project,
match 100% exactly

Al cambiar los bits de configuración el bootloader si puede dejar de funcionar por diferentes razones, por ejemplo si configuras el oscilador usb a un valor diferente ya no se podra comunicar con la pc, etc. Por lo que se recomienda tener los mismos en el programa de aplicación, sobretodo para cuando se trabaja sin bootloader todo funcione igual.

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:PIC18F67J50 con bootloader (no funciona un programa sencillo)
« Respuesta #14 en: 05 de Enero de 2020, 21:49:58 »
En las notas de uso del bootloader dice:
In addition to the above, make certain that all configuration bit settings
between the bootloader firmware project, and the application firmware project,
match 100% exactly

Al cambiar los bits de configuración el bootloader si puede dejar de funcionar por diferentes razones, por ejemplo si configuras el oscilador usb a un valor diferente ya no se podra comunicar con la pc, etc. Por lo que se recomienda tener los mismos en el programa de aplicación, sobretodo para cuando se trabaja sin bootloader todo funcione igual.

  El byte de configuración “fuses “, ¿Se puede modificar en tiempo de ejecución?  Tengo entendido que no.  Por ello, un bootloader por mucho que quiera no va a poner grabar nada en el config byte. Esta placa me temo que tiene que trabajar si o si con la configuración con la cual se le haya quemado su bootloader.   Para cambiarlo va a necesitar si o si un pickit.

  Por mucho que en la aplicación pongas fuses, estos van a ser ignorados ya no por el boltloader sino por la propia función write_program_memory()  o equivalente que use xc8.

    Esto lo digo desconociendo si en ese micro es escribible el config byte en tiempo de ejecución. Insisto en que creo que no.


 

anything