Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

PIC18F2550 + bootloader: nessun segno di vita

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

1
voti

[1] PIC18F2550 + bootloader: nessun segno di vita

Messaggioda Foto UtenteAndryBest » 30 set 2012, 9:06

Ciao a tutti!
Fino a pochi giorni fa ero solito lavorare in ASM sui PIC16F, tuttavia, essendo incuriosito dalla possibilità di interfacciarmi via USB al computer, ho deciso di passare ai 18F, precisamente al PIC18F2550 (tra l'altro l'unico che avevano nel negozio sotto casa :lol: ). La programmazione in C non è un problema, dato che la uso sul PC da circa 10 anni.
Quindi per prima cosa ho installato l'ambiente di sviluppo (MPLAB X + MAL + C18), quindi ho adattato il bootloader per il 18F4550 (presente nella MAL) cambiando il pin per la selezione della modalità (da RB4 a RB7), i fuse di config e ho rimosso la parte di segnalazione sulla PORTD, assente sul 2550.
Quindi ho compilato e programmato con un TLVP.
Provando a collegare il PIC al PC rilevo correttamente la periferica HID; anche la modifica della selezione su RB7 funziona, infatti mettendolo a VCC non si collega.

Terminato ciò ho iniziato semplicemente accendendo un led, solo che il PIC non da segni di vita!
Il codice è molto semplice:
Codice: Seleziona tutto
void main() {
    TRISAbits.RA0 = 0;
    LATAbits.LATA0 = 0;
    while (1){
        LATAbits.LATA0 = 1;
    }
}


Il bootloader è configurato per saltare alla 0x1000, così ho adattato il file del linker:
Codice: Seleziona tutto
LIBPATH .

FILES c018i.o
FILES clib.lib
FILES p18F2550.lib

CODEPAGE   NAME=bootloader START=0x0                END=0xFFF          PROTECTED
CODEPAGE   NAME=page       START=0x1000             END=0x7FFF


CODEPAGE   NAME=idlocs     START=0x200000          END=0x200007       PROTECTED
CODEPAGE   NAME=config     START=0x300000          END=0x30000D       PROTECTED
CODEPAGE   NAME=devid      START=0x3FFFFE          END=0x3FFFFF       PROTECTED
CODEPAGE   NAME=eedata     START=0xF00000          END=0xF000FF       PROTECTED

ACCESSBANK NAME=accessram  START=0x0               END=0x5F
DATABANK   NAME=gpr0       START=0x60              END=0xFF
DATABANK   NAME=gpr1       START=0x100             END=0x1FF
DATABANK   NAME=gpr2       START=0x200             END=0x2FF
DATABANK   NAME=gpr3       START=0x300             END=0x3FF
DATABANK   NAME=gpr4       START=0x400             END=0x4FF          PROTECTED
DATABANK   NAME=gpr5       START=0x500             END=0x5FF          PROTECTED
DATABANK   NAME=gpr6       START=0x600             END=0x6FF          PROTECTED
DATABANK   NAME=gpr7       START=0x700             END=0x7FF          PROTECTED
ACCESSBANK NAME=accesssfr  START=0xF60             END=0xFFF          PROTECTED

SECTION    NAME=CONFIG     ROM=config
STACK SIZE=0x100 RAM=gpr3


Quindi ho compilato (senza errori) e ho programmato il PIC con il software fornito con la MAL.
Tuttavia quando accendo il PIC (con RB7 a VCC) il led su RA0 resta spento!
Per sicurezza ho disassemblato il file hex, dove i dati iniziavano correttamente a 0x1000.
Come ulteriore conferma ho attaccato il programmatore e ho dumpato il PIC. Anche qui tutto ok: il mio firmware inizia a 0x1000.

Allora, secondo voi, dove può essere il problema?
P.S.: non so se sia utile ma lo preciso: sto lavorando su breadboard...

Grazie in anticipo. O_/
Avatar utente
Foto UtenteAndryBest
25 2
 
Messaggi: 16
Iscritto il: 4 lug 2011, 14:57

2
voti

[2] Re: PIC18F2550 + bootloader: nessun segno di vita

Messaggioda Foto UtenteAndryBest » 30 set 2012, 22:17

Ciao a tutti.
Sono riuscito a risolvere da solo... Scrivo comunque cosa ho fatto, magari può essere utile a qualcuno...

In pratica ho dovuto rimappare il punto di reset usando le direttive pragma. Quindi il codice è diventato:
Codice: Seleziona tutto
extern void _startup (void);
#pragma code _RESET_INTERRUPT_VECTOR = 0x1000
void _reset (void){
_asm goto _startup _endasm
}
#pragma code
#pragma code _HIGH_INTERRUPT_VECTOR = 0x1008
void _high_ISR (void){;}
#pragma code _LOW_INTERRUPT_VECTOR = 0x1018
void _low_ISR (void){;}

#pragma code
void main() {
    TRISAbits.RA0 = 0;
    LATAbits.LATA0 = 0;
    while (1){
        LATAbits.LATA0 = 1;
    }
}


Quindi ho modificato anche la prima parte del linker:
Codice: Seleziona tutto
[...]

CODEPAGE   NAME=bootloader START=0x0                END=0xFFF         PROTECTED
CODEPAGE   NAME=vectors    START=0x1000             END=0x1029        PROTECTED
CODEPAGE   NAME=page       START=0x102A             END=0x7FFF

[...]
Avatar utente
Foto UtenteAndryBest
25 2
 
Messaggi: 16
Iscritto il: 4 lug 2011, 14:57


Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 4 ospiti