Muy buenas, hace muchísimo tiempo intenté programar con SDCC PIC y la verdad es que me resultó muy frustrante porque había muy poca información y la verdad es que tampoco este mini lenguaje de programación no da mucha cobertura a los microcontroladores PIC.
Pero bueno, hace poco me puse a volver a intentar programar de nuevo, y buscando información por ahí, y probando multitud de veces y también con ayuda de la inteligencia artificial, he conseguido hacerme con una colección de programas que resultan interesantes.
La verdad es que a estas alturas intentar programar PIC con SDCC cuando existen placas de microcontroladores ESP32, RSP2040, STM32, etc... puede que no resulte muy interesante.
Siempre me resultó agradable compilar en Linux un programa mediante una línea de comando, que ocupa solo unos megas, y luego programar el PIC con el PICkit2 también a través de una línea de comando, sin tener que recurrir a programas muy grandes.
En cualquier caso, ahí lo dejo por si acaso todavía hay todavia alguien que le pueda interesar esto...
Comentar que compilo los programas en Linux y programo el Pic con el Pickit2 mediante el comando pk2cmd, no se que tal iran este compilador bajo Windows o si existe como tal el comando pk2cmd para windows.
Comentar tambien algunos veces tambien en linux he observado que algunos paquetes de instalacion de SDCC no funcionan bien y no encuentran las ruta.
He creado un paquete de instalacion para Debian de los programas necesarios que serian SDCC-4.5.0, gnutils y pk2cmd, que los subire proximamente, aunque yo habitualmente utilizo Puppy Linux.
Estos programas estan echos para el PIC18F4550 pero se podrian trasladar a un monton de PIC con los que se puede compilar en el SDCC.
Para compilarlo:
sdcc --use-non-free -mpic16 -p18f4550 --use-crt=crt0.o -D_XTAL_FREQ=40000000 EJERC_01.c
Para programar el Pic como comentaba yo lo hago atraves del PIckit2 supongo que tambien se podra hacer con el PIckit3 pero no lo he probado.
Hay que tener instalado el programa pk2cmd y las gputils.
Tener conectado el Pickit al microcontrolador y ejecutar:
pk2cmd -P PIC18F4550 -X -M -F EJERC_01.hex
Aqui dejo el primer programa de Blink.
// Compilar con:
// sdcc --use-non-free -mpic16 -p18f4550 --use-crt=crt0.o -D_XTAL_FREQ=40000000 EJERC_01.c
// EJERC_01.c PARA VER EL BLINK O APAGAR Y ENCENDER UN LED CADA MEDIO SEGUNDO CONECTADO A
// LA PATITA RC0 DEL MICROCONTROLADOR.
#include <pic18f4550.h>
// Configuración del oscilador para 8 MHz con PLL a 48 MHz
#pragma config FOSC = HSPLL_HS // Oscilador HS con PLL habilitado
#pragma config PLLDIV = 2 // 8 MHz / 2 = 4 MHz → PLL x24 = 96 MHz
#pragma config CPUDIV = OSC1_PLL2 // Usa PLL como fuente (CPU = 40 MHz)
#pragma config USBDIV = 2 // Divide PLL para USB (48 MHz)
// Otras configuraciones importantes
#pragma config PWRT = OFF // Power-up Timer OFF
#pragma config BOR = OFF // Brown-out Reset OFF
#pragma config BORV = 3 // BOR Voltage Level (3=2.0V)
#pragma config VREGEN = OFF // Voltage Regulator OFF
#pragma config STVREN = ON // Stack Overflow Reset ON
#pragma config LVP = OFF // Low-Voltage Programming deshabilitado
#pragma config ICPRT = OFF // ICSP Port OFF
#pragma config XINST = OFF // Extended Instruction Set OFF
#pragma config WDT = OFF // Watchdog Timer deshabilitado
// Delay aproximado para milisegundos (ajustado para SDCC)
void delay_ms(int ms) {
int i, j;
for (i = 0; i < ms; i++) {
for (j = 0; j < 1500; j++) { // 1428 iteraciones ≈ 1 ms
__asm__("nop"); // 1 ciclo (0.1 µs)
}
}
}
void main() {
PORTA = 0x00;
LATA = 0x00;
CMCON = 0x07;
ADCON1=0x0F;
TRISA = 0x00; // Todos los pines de PORTA como salidas
// ¡El PLL se habilita automáticamente con FOSC = HSPLL_HS!
// No es necesario tocar OSCTUNE manualmente.
while (1) {
PORTAbits.RA5 = 0; // LED OFF
delay_ms(500); // 1s
PORTAbits.RA5 = 1; // LED ON
delay_ms(500); // 1s
}
}
_______________________________________________________________________________________________________________________________________________________________________________________________
Telgram:https://t.me/electronica_puppy