COMPILAR PROGRAMA ASM CON GPASM Y PROGRAMARLO CON PICKIT2

Bueno a los que todavia nos sigue gustando programar en ensamblador y en entorno bajo Linux va dirigido este post.

En el post anterior creabamos un programa en ensamblador con MPlabx y lo compilabamos para luego programar mediante el comando pk2cmd y Pickit2, bueno pues en este post lo que hacemos es quitarnos del programa Mplabx y directamente con la comando gpasm compilamos ese programa anterior haciendo solo una ligera modificacion, en la forma de escribir el fichero de inclusion y la definicion del pic.

Decir que para compilar con gpasm, lo que hize fue compilar la nueva version de gputil y que si el sistema operativo que esta utlizando es Puppy Linux nos la podemos bajar de:

gputils-1.5.0-i486.pet

Congiendo el programa asm del post anterior en:

https://misterelectronico.wordpress.com/2017/04/16/programar-pic-bajo-linux-con-mplabx-pickit2-y-comando-pk2cmd/

Y cambiando solamente la dos primeras lineas de definicion del Pic, quedaria el programa como se ve.

**************************************************************************************

; Solo he modificado las dos siguientes lineas el resto queda igual.

processor p18f4550
include “p18f4550.inc”

; CONFIG1L
CONFIG  PLLDIV = 1            ; PLL Prescaler Selection bits (No prescale (4 MHz oscillator input drives PLL directly))
CONFIG  CPUDIV = OSC1_PLL2    ; System Clock Postscaler Selection bits ([Primary Oscillator Src: /1][96 MHz PLL Src: /2])
CONFIG  USBDIV = 1            ; USB Clock Selection bit (used in Full-Speed USB mode only; UCFG:FSEN = 1) (USB clock source comes directly from the primary oscillator block with no postscale)
; CONFIG1H
CONFIG  FOSC = INTOSCIO_EC    ; Oscillator Selection bits (Internal oscillator, port function on RA6, EC used by USB (INTIO))
CONFIG  FCMEN = OFF           ; Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor disabled)
CONFIG  IESO = OFF            ; Internal/External Oscillator Switchover bit (Oscillator Switchover mode disabled)

; CONFIG2L
CONFIG  PWRT = OFF            ; Power-up Timer Enable bit (PWRT disabled)
CONFIG  BOR = OFF             ; Brown-out Reset Enable bits (Brown-out Reset disabled in hardware and software)
CONFIG  BORV = 3              ; Brown-out Reset Voltage bits (Minimum setting)
CONFIG  VREGEN = ON           ; USB Voltage Regulator Enable bit (USB voltage regulator enabled)

; CONFIG2H
CONFIG  WDT = OFF             ; Watchdog Timer Enable bit (WDT disabled (control is placed on the SWDTEN bit))
CONFIG  WDTPS = 32768         ; Watchdog Timer Postscale Select bits (1:32768)

; CONFIG3H
CONFIG  CCP2MX = ON           ; CCP2 MUX bit (CCP2 input/output is multiplexed with RC1)
CONFIG  PBADEN = ON           ; PORTB A/D Enable bit (PORTB pins are configured as analog input channels on Reset)
CONFIG  LPT1OSC = OFF         ; Low-Power Timer 1 Oscillator Enable bit (Timer1 configured for higher power operation)
CONFIG  MCLRE = OFF           ; MCLR Pin Enable bit (RE3 input pin enabled; MCLR pin disabled)

; CONFIG4L
CONFIG  STVREN = OFF          ; Stack Full/Underflow Reset Enable bit (Stack full/underflow will not cause Reset)
CONFIG  LVP = OFF             ; Single-Supply ICSP Enable bit (Single-Supply ICSP disabled)
CONFIG  ICPRT = OFF           ; Dedicated In-Circuit Debug/Programming Port (ICPORT) Enable bit (ICPORT disabled)
CONFIG  XINST = OFF           ; Extended Instruction Set Enable bit (Instruction set extension and Indexed Addressing mode disabled (Legacy mode))

; CONFIG5L
CONFIG  CP0 = OFF             ; Code Protection bit (Block 0 (000800-001FFFh) is not code-protected)
CONFIG  CP1 = OFF             ; Code Protection bit (Block 1 (002000-003FFFh) is not code-protected)
CONFIG  CP2 = OFF             ; Code Protection bit (Block 2 (004000-005FFFh) is not code-protected)
CONFIG  CP3 = OFF             ; Code Protection bit (Block 3 (006000-007FFFh) is not code-protected)

; CONFIG5H
CONFIG  CPB = OFF             ; Boot Block Code Protection bit (Boot block (000000-0007FFh) is not code-protected)
CONFIG  CPD = OFF             ; Data EEPROM Code Protection bit (Data EEPROM is not code-protected)

; CONFIG6L
CONFIG  WRT0 = OFF            ; Write Protection bit (Block 0 (000800-001FFFh) is not write-protected)
CONFIG  WRT1 = OFF            ; Write Protection bit (Block 1 (002000-003FFFh) is not write-protected)
CONFIG  WRT2 = OFF            ; Write Protection bit (Block 2 (004000-005FFFh) is not write-protected)
CONFIG  WRT3 = OFF            ; Write Protection bit (Block 3 (006000-007FFFh) is not write-protected)

; CONFIG6H
CONFIG  WRTC = OFF            ; Configuration Register Write Protection bit (Configuration registers (300000-3000FFh) are not write-protected)
CONFIG  WRTB = OFF            ; Boot Block Write Protection bit (Boot block (000000-0007FFh) is not write-protected)
CONFIG  WRTD = OFF            ; Data EEPROM Write Protection bit (Data EEPROM is not write-protected)

; CONFIG7L
CONFIG  EBTR0 = OFF           ; Table Read Protection bit (Block 0 (000800-001FFFh) is not protected from table reads executed in other blocks)
CONFIG  EBTR1 = OFF           ; Table Read Protection bit (Block 1 (002000-003FFFh) is not protected from table reads executed in other blocks)
CONFIG  EBTR2 = OFF           ; Table Read Protection bit (Block 2 (004000-005FFFh) is not protected from table reads executed in other blocks)
CONFIG  EBTR3 = OFF           ; Table Read Protection bit (Block 3 (006000-007FFFh) is not protected from table reads executed in other blocks)

; CONFIG7H
CONFIG  EBTRB = OFF           ; Boot Block Table Read Protection bit (Boot block (000000-0007FFh) is not protected from table reads executed in other blocks)

org 00h
goto star

star
org 60h

movlw 0ffh
movwf TRISB
movwf TRISA
movwf TRISC

clrf PORTC
clrf LATC

movlw 0h
movwf TRISC        ; HACE RB0 A RB3 SALIDAS Y RB4 A RB7 SAIDAS.

luces
movlw 0ffh
movwf PORTC
call retardo

movlw 0h
movwf PORTC
call retardo

goto luces

retardo
movlw 0ffh
movwf 20h
movwf 21h
movlw 01h
movwf 22h
loop
decfsz 20
goto loop
decfsz 21
goto loop
decfsz 22
goto loop
return
end

**********************************   FIN DE CODIGO *******************************

Bueno si salvamos este archivo por ejemplo   eje01.asm  , el compilarlo es tan sencillo como :

   gpasm eje01.asm

Y listo nos encontraremos un archivo  eje01.hex   que es con el que programaremos el pic mediante  el pickit2.

Para hacerlo seguiremos los mismos pasos que en el post anterior:

https://misterelectronico.wordpress.com/2017/04/16/programar-pic-bajo-linux-con-mplabx-pickit2-y-comando-pk2cmd/

Espero sea util …. un Saludo.

PROGRAMAR PIC BAJO LINUX CON MPLABX – PICKIT2 – Y COMANDO PK2CMD

El programador PICKIT2 es bastante baratito viene costando entre 7 y 8 euros en los chinos, yo tengo el ICD2 y el ICD3 con los cuales puedes programar en Linux directamente con el programa de MPLABx que lo podemos bajar de Microchip, estos programadores suelen ser caros cuestan alrededor de 170 euros, y la verdad es que a mí me han llevado a la desesperación con su funcionamiento bajo Linux mas de una vez y a tirarme de los pelos.

Si se está trabajando con Puppy Linux bajarse el programa Pet del siguiente enlace:

pk2cmdv_1.20-i-i486.pet

Este post es para leerlo con mucha atención por qué cualquier cosa que no se tenga en cuenta hará que nos tiremos de los pelos mas de una vez.

IMPORTANTE: yo utilizo el PICKIT2 con su alimentación propia y corto toda alimentación exterior a la placa, por este motivo yo ya queme un ICD3 programador, así que alimentación fuera, bien es verdad que si se quiere hacer Debug del circuito, es del todo necesario pero para el caso que estoy tratando no lo hago ya que el MPLABX no puede trabajar con el PICKIT2.

MPLABX no puede programar con el PICKIT2 ya que para el está obsoleto, con lo cual yo lo que hago es si crear el archivo hex con MPLABx y luego con el comando pk2cmd que si funciona bajo Linux programo el Pic.

Por qué las cosas se pueden complicar tanto que por ejemplo me voy a WINDOWS y mediante una versión de MPLAB que si reconoce y programa el PICKIT2 creo el ejecutable HEX y programo y funciona de maravilla.

Bueno luego desde Linux cojo ese mismo archivo HEX creado con el MPLAB de WINDOWS y lo programo con el mismo PICKIT2 y con el comando pk2cmd y te llevas la sorpresa que no funciona. ¿POR QUE?.

Evidentemente, en el proceso de programación el programa MPLAB de windows, realiza operaciones de grabado en el PIC que no están el archivo HEX y estos son entre otros algunos de los bits de configuración del PIC.

Conclusión lo que hago es anotar esos valores de las configuración de los bits y bajo Linux abro el MPLABX, abro el mismo archivo de código asm y lo que le hago en la configuración de los bits dentro de MPLABX  :

Barra Menus > Windows >  Pic Memory Views  > Configuration Bits

Y aquí pongo todos los bits iguales que los pongo en el MPLAB versión antigua de Windows, y una vez que ya están todos igual le doy al boton  “Generate Code Source”  y esto nos hará que aparezca el código que tendremos que incluir dentro nuestro archivo asm justo debajo de     #include  “pic18f4550.inc”    para este caso que es el mío que estoy programando un pic18f4550

Bueno voy a poner el ejemplo en ensamblador de un programa que lo único que hace es encender y apagar los leds conectados al PORTC con una cadencia más o menos de 1 segundo.

IMPORTANTE a tener en cuenta en este código es que anulo la función MCLR, esto lo hago por qué el PICKIT2 se le puede más adelante hacer que meta la tensión de alimentación de 5 V para este pic si programos el pic y comprobamos que funciona siempre que el requerimiento de nuestro circuito no requiera mucho consumo.

Si dejamos la función MCLR activa lo que hará es que cuando lo estemos probando el PICKIT2 nos deja esta tensión a cero con lo cual el PIC estará reseteado todo el tiempo, y a mi en particular me estuvo volviendo loco por un tiempo bastante largo.

Es por lo cual anulo la función MCLR en esta patilla y la dejo PORT RE3 creó.

Por otro lado y cuando estoy con microcontroladores como este que tiene oscilador interno, y cuando es un proyecto de una placa que esta recien montada, puede que el oscilador a cristal no vaya muy bien y creyendo que va a funcionar el cristal pues no funciona, por esta razón para comprobar que al principio funciona escojo en este tipo de Pic con oscilador interno el oscilador interno.

El código para un Pic 18F4550 quedaría de la siguiente forma completo.

**************************************************************************************    list p=18f4550
#include “p18f4550.inc”

; CONFIG1L
CONFIG  PLLDIV = 1            ; PLL Prescaler Selection bits (No prescale (4 MHz oscillator input drives PLL directly))
CONFIG  CPUDIV = OSC1_PLL2    ; System Clock Postscaler Selection bits ([Primary Oscillator Src: /1][96 MHz PLL Src: /2])
CONFIG  USBDIV = 1            ; USB Clock Selection bit (used in Full-Speed USB mode only; UCFG:FSEN = 1) (USB clock source comes directly from the primary oscillator block with no postscale)
; CONFIG1H
CONFIG  FOSC = INTOSCIO_EC    ; Oscillator Selection bits (Internal oscillator, port function on RA6, EC used by USB (INTIO))
CONFIG  FCMEN = OFF           ; Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor disabled)
CONFIG  IESO = OFF            ; Internal/External Oscillator Switchover bit (Oscillator Switchover mode disabled)

; CONFIG2L
CONFIG  PWRT = OFF            ; Power-up Timer Enable bit (PWRT disabled)
CONFIG  BOR = OFF             ; Brown-out Reset Enable bits (Brown-out Reset disabled in hardware and software)
CONFIG  BORV = 3              ; Brown-out Reset Voltage bits (Minimum setting)
CONFIG  VREGEN = ON           ; USB Voltage Regulator Enable bit (USB voltage regulator enabled)

; CONFIG2H
CONFIG  WDT = OFF             ; Watchdog Timer Enable bit (WDT disabled (control is placed on the SWDTEN bit))
CONFIG  WDTPS = 32768         ; Watchdog Timer Postscale Select bits (1:32768)

; CONFIG3H
CONFIG  CCP2MX = ON           ; CCP2 MUX bit (CCP2 input/output is multiplexed with RC1)
CONFIG  PBADEN = ON           ; PORTB A/D Enable bit (PORTB pins are configured as analog input channels on Reset)
CONFIG  LPT1OSC = OFF         ; Low-Power Timer 1 Oscillator Enable bit (Timer1 configured for higher power operation)
CONFIG  MCLRE = OFF           ; MCLR Pin Enable bit (RE3 input pin enabled; MCLR pin disabled)

; CONFIG4L
CONFIG  STVREN = OFF          ; Stack Full/Underflow Reset Enable bit (Stack full/underflow will not cause Reset)
CONFIG  LVP = OFF             ; Single-Supply ICSP Enable bit (Single-Supply ICSP disabled)
CONFIG  ICPRT = OFF           ; Dedicated In-Circuit Debug/Programming Port (ICPORT) Enable bit (ICPORT disabled)
CONFIG  XINST = OFF           ; Extended Instruction Set Enable bit (Instruction set extension and Indexed Addressing mode disabled (Legacy mode))

; CONFIG5L
CONFIG  CP0 = OFF             ; Code Protection bit (Block 0 (000800-001FFFh) is not code-protected)
CONFIG  CP1 = OFF             ; Code Protection bit (Block 1 (002000-003FFFh) is not code-protected)
CONFIG  CP2 = OFF             ; Code Protection bit (Block 2 (004000-005FFFh) is not code-protected)
CONFIG  CP3 = OFF             ; Code Protection bit (Block 3 (006000-007FFFh) is not code-protected)

; CONFIG5H
CONFIG  CPB = OFF             ; Boot Block Code Protection bit (Boot block (000000-0007FFh) is not code-protected)
CONFIG  CPD = OFF             ; Data EEPROM Code Protection bit (Data EEPROM is not code-protected)

; CONFIG6L
CONFIG  WRT0 = OFF            ; Write Protection bit (Block 0 (000800-001FFFh) is not write-protected)
CONFIG  WRT1 = OFF            ; Write Protection bit (Block 1 (002000-003FFFh) is not write-protected)
CONFIG  WRT2 = OFF            ; Write Protection bit (Block 2 (004000-005FFFh) is not write-protected)
CONFIG  WRT3 = OFF            ; Write Protection bit (Block 3 (006000-007FFFh) is not write-protected)

; CONFIG6H
CONFIG  WRTC = OFF            ; Configuration Register Write Protection bit (Configuration registers (300000-3000FFh) are not write-protected)
CONFIG  WRTB = OFF            ; Boot Block Write Protection bit (Boot block (000000-0007FFh) is not write-protected)
CONFIG  WRTD = OFF            ; Data EEPROM Write Protection bit (Data EEPROM is not write-protected)

; CONFIG7L
CONFIG  EBTR0 = OFF           ; Table Read Protection bit (Block 0 (000800-001FFFh) is not protected from table reads executed in other blocks)
CONFIG  EBTR1 = OFF           ; Table Read Protection bit (Block 1 (002000-003FFFh) is not protected from table reads executed in other blocks)
CONFIG  EBTR2 = OFF           ; Table Read Protection bit (Block 2 (004000-005FFFh) is not protected from table reads executed in other blocks)
CONFIG  EBTR3 = OFF           ; Table Read Protection bit (Block 3 (006000-007FFFh) is not protected from table reads executed in other blocks)

; CONFIG7H
CONFIG  EBTRB = OFF           ; Boot Block Table Read Protection bit (Boot block (000000-0007FFh) is not protected from table reads executed in other blocks)

org 00h
goto star

star
org 60h

movlw 0ffh
movwf TRISB
movwf TRISA
movwf TRISC

clrf PORTC
clrf LATC

movlw 0h
movwf TRISC        ; HACE RB0 A RB3 SALIDAS Y RB4 A RB7 SAIDAS.

luces
movlw 0ffh
movwf PORTC
call retardo

movlw 0h
movwf PORTC
call retardo

goto luces

retardo
movlw 0ffh
movwf 20h
movwf 21h
movlw 01h
movwf 22h
loop
decfsz 20
goto loop
decfsz 21
goto loop
decfsz 22
goto loop
return
end

**********************************   FIN DE CODIGO *******************************

Bueno presionó el botón de  ” Clean and Build Main Proyect” y consiguientemente crea el ejecutable hex.

Este ejecutable se almacena dentro de las subcarpetas de proyecto tal como:

“Directorio_proyecto”/dist/default/production/”nombre_fichero.X.production.hex

Yo hago una copia de este archivo en el directorio principal “Directorio_proyecto” y lo voy a renombrar por ejemplo como :     eje01.hex

Antes de nada tener en cuenta el conexionado que tiene el PICKI2 a las patillas del Pic, el patillaje del PICKIT2 es el siguiente.

img2

Este cable que lo conecto es provisional pero lo voy a anclar muy bien a un puerto DB9 como el de la figura pero que ahora esto es provisional para probar.

img1

Pienso que este tipo de conexión es mucho más segura que le RJ10 o parecido del ICD2 o ICD3 que me parecen muy malos y más de una vez me han dado más de un dolor de cabeza, creo que este método asegurando bien la conexión del los pines de conexión el al PICKIT2 y que estos queden bien anclados y firmes la conexión será bastante segura.

Evidentemente del otro lado del pic tendrá que haber un sub hembra que reciba los datos de este, yo lo que hago es conectarlo a los pines que no concuerdan con los del puerto serie y así este tipo de conexión me hace doble cometido una de programación y otra de comunicación serie, y me parece infinitamente más seguro.

Bueno una vez ya conectado el Pic a nuestro programador PICKIT2 abrimos un terminal donde se encuentra nuestro archivo  “eje01.hex”

Y tecleamos el comando:

# pk2cmd -?V   y se nos presenta el siguiente mensaje en el terminal

img3

Nos da la versión de pk2cmd, la versión del archivo del circuito y la versión del Firmware del Pickit2.

Ahora tecleamos:  #pk2cmd -P

img4

Con esto lo que hace es reconocernos el pic que tenemos conectado al circuito, en este caso nos ha reconocido que es un PIC18F4550  esta forma de escribirlo es importante para las siguientes ordenes.

Ahora lo siguiente es borrar el Pic con cualquier programa grabado previamente, y lo hacemos mediante el comando:

# pk2cmd -P PIC18F4550 -X -E     y si el resultado es satisfactorio será:

img5

Y ahora procederemos a programar el PIC para ello teclearemos el siguiente comando dentro del directorio donde se encuentra el archivo eje01.hex

# pk2cmd -P PIC18F4550 -X -M -F eje01.hex        y si todo sale bien nos dará:

img6

Diciendo que la operación ha sido satisfactoria.

Y con esto ya estaría programado el PIC ahora si nuestra placa es simple y no requiere de una fuerte tensión de alimentación, como es el caso de apagar y encender un led lo que podemos hacer es poner la alimentación del PICKIT2 o VDD en ON y para ello tecleamos la orden:

# pk2cmd  -P PIC18F4550  -T      y veremos lo siguiente:

img7

Con esto veremos que se nos enciende el LED de “TARGET” en el PICKIT2 y esto significa que los 5 Voltios se harán presente en la alimentación y nuestro led si todo va bien empezara a parpadear.

IMPORTANTE:  Mucho ojo con darle correctamente el nombre del pic a esta orden, por qué por ejemplo si estamos  trabajando con PICs con tensiones de alimentación de 3,3 o 3,6 Voltios y le damos la orden por ejemplo anterior para un pic18f4550 nos aparecerán los 5 voltios y nos cargaremos el PIC, y lo mismo a la hora de programarlo, los niveles serán de 5 Voltios.

El PICKIT2 está preparado para funcionar con las dos tensiones de 5 y 3,6 voltios, pero hay que darle correctamente el nombre del PIC.

Si queremos apagar la tensión de alimentación del PICKIT2 lo que haremos es teclear la orden

# pk2cmd  -P PIC18F4550               solamente y veremos

img8

Y veremos que se nos apaga el led de “TARGET” en el PICKIT2 y consecuentemente la tensión de VDD se va a cero.

Espero que sirva de utilidad por qué todo este proceso que principio es bastante sencillo me ha traído más de un quebradero de cabeza hasta que he conseguido enfocarlo correctamente.

Un saludo.

  • Nota : Si queremos quitarnos del programa MPlabx y queremos compilar mediante linea de comando gpasm ver el post siguiente

https://misterelectronico.wordpress.com/2017/04/18/compilar-programa-asm-con-gpasm-y-programarlo-con-pickit2/