Importstul XC8 MPLAB-X

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Pajn
Inlägg: 1160
Blev medlem: 6 juni 2008, 19:14:29
Ort: Nyköping
Kontakt:

Importstul XC8 MPLAB-X

Inlägg av Pajn »

Jag lyckas aldrig komma överens med MPLAB X och XC8, men
för att slippa Windows så har jag nu bestämt mig för att göra
ett riktigt försök. Och genast stöter jag på problem...

Den här gången handlar det om import.
1. xc.h kan bara inkluderas från main.c, om jag inkluderar den
ifrån en annan fil säger MPLAB att den inte lyckas hitta importen.

2. En funktion som deklareras i en annan fil går inte att importera.
interrupts.c:

Kod: Markera allt

#include "interrupts.h"
#include <xc.h>

void init_interrupts() {
    // Enable priority interrupts
    IPEN = 1;
    // Enable GIEH, GIEL, TMR0 interrupt
    INTCON = 0b11100000;
    // TMR0 low priority
    INTCON2 = 0b10000000;
    // Disable other interrupts
    INTCON3 = 0b00000000;
    // Enable TMR0 @ 50Hz
    T0CON = 0b11001000;
    TMR0 = 56;
    // Enable TMR2 @ 250Hz
    T2CON = 0b00001110;
    PR2 = 250;
}
interrupts.h:

Kod: Markera allt

#ifndef INTERRUPTS_H
#define	INTERRUPTS_H

void init_interrupts();

#endif	/* INTERRUPTS_H */
main.c:

Kod: Markera allt

#include <xc.h>
#include "interrupts.h"

void init_processor() {
    // Use 8MHz int osc
    OSCCON = 0b01111111;
    // Disable USB
    UCON = 0;
    UTRDIS = 1;

    init_interrupts();
    init_pins();
}

void main() {
    init_processor();
}
Och felet jag får är:

Kod: Markera allt

:0: error: undefined symbol:
        _init_interrupts()
Pajn
Inlägg: 1160
Blev medlem: 6 juni 2008, 19:14:29
Ort: Nyköping
Kontakt:

Re: Importstul XC8 MPLAB-X

Inlägg av Pajn »

Buggiga jävla skitkompilator.

Gjorde ett nytt projekt och kopierade in koden, som fungerade perfekt.
Så då skapar jag en ny fil, men när jag försöker kalla funktioner i den så
tror den att jag försöker deklarera funktionen och gnäller på att jag inte
specificerat typ så den kör på int åt mig. Efter det krashar den för att jag
har deklarerat en funktion två gånger fast den ena egentligen bara försöker
kalla funktionen.

Har jag gjort något katastrofalt fel eller är den så här kass?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Importstul XC8 MPLAB-X

Inlägg av sodjan »

Jag är ingen hejare på C, men behöver du importera interrupts.h
i interrupts.c !? H-filen är ju för att beskriva för *andra* C-filer vad
som finns i interrupts.c, är den inte ? interrupts.c behöver den (väl) inte.

Sen så skulle jag vara lite försiktig med egan filnamn typ "interrupts",
det finns en liten risk att man kolliderar mer interna filnamn eller
symboler i kompilatorn. Får du samma problem om du kallar den
något helt annat?
Pajn
Inlägg: 1160
Blev medlem: 6 juni 2008, 19:14:29
Ort: Nyköping
Kontakt:

Re: Importstul XC8 MPLAB-X

Inlägg av Pajn »

Man måste, eller bör importera filers headerfil ifrån source filen.
http://stackoverflow.com/questions/1199 ... to-include

Som jag skrev i mitt andra inlägg funkar det jättebra när jag
skapade ett nytt projekt med samma kod (och samma namn på
filerna). Nu är det istället en annan fil som strular p.g.a. att
kompilator hittar på och lägger till kod som den tycker passar.
Det felet har jag faktiskt hittat på Google. Uppdatera
kompilatorn säger dem, jäkligt lätt när man redan sitter på
den senaste.

Jag antar att jag måste starta ett nytt projekt igen och återigen
kopiera in allt för att det ska funka. Ska man behöva göra så för
varje ny fil?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Importstul XC8 MPLAB-X

Inlägg av sodjan »

> Man måste, eller bör importera filers headerfil ifrån source filen.

OK. :-)
My bad, verkar ju helt OK och även rekomenderat...

Har det något med *hur* du lägger till filer efter att projektet
har skapats från början? Jag funderar på om något händer så
att nya filer inte kommer med i projektet på rätt sätt?

> Det felet har jag faktiskt hittat på Google.

Jag vet inte hur du tycker, men det skulle kunna vara
intressant att se vad du har sett...

Sen så hemlighåller du även de fel som uppstår o.s.v
så det bli mycket gissningar här...
Pajn
Inlägg: 1160
Blev medlem: 6 juni 2008, 19:14:29
Ort: Nyköping
Kontakt:

Re: Importstul XC8 MPLAB-X

Inlägg av Pajn »

>My bad, verkar ju helt OK och även rekomenderat...
Ja, det kan tyckas lite märkligt. Men med tanke på åldern på
språket kan man väl ta det, moderna språk slipper helt headerfilerna

>Jag vet inte hur du tycker, men det skulle kunna vara
>intressant att se vad du har sett...
Självklart. Ska sluta gnälla och plocka fram "rätt" saker istället.

Här är alltså länken. Den snackar visserligen om en gammal hi-tech,
men XC8 är ju hi-techs kompilator. xc.h inkluderar bara htc.h vilken
var den filen man skulle inkludera med hi-techs version.

http://www.microchip.com/forums/m558733-print.aspx

Här är alltså outputen:

Kod: Markera allt

"/opt/microchip/xc8/v1.12/bin/xc8" --pass1  --chip=18F2550 -Q -G --asmlist  --double=24 --float=24 --emi=wordwrite --opt=default,+asm,-asmfile,+speed,-space,-debug,9 --addrqual=ignore -P -N255 --warn=0 --summary=default,-psect,-class,+mem,-hex,-file --runtime=default,+clear,+init,-keep,-no_startup,-download,+config,+clib,+plib "--errformat=%f:%l: error: %s" "--warnformat=%f:%l: warning: %s" "--msgformat=%f:%l: advisory: %s"  -obuild/default/production/main.p1  main.c 
main.c:16: warning: function declared implicit int
main.c:20: warning: function declared implicit int
main.c:31: warning: function declared implicit int
"/opt/microchip/xc8/v1.12/bin/xc8"  --chip=18F2550 -G --asmlist -mdist/default/production/Robocut.X.production.map  --double=24 --float=24 --emi=wordwrite --opt=default,+asm,-asmfile,+speed,-space,-debug,9 --addrqual=ignore -P -N255 --warn=0 --summary=default,-psect,-class,+mem,-hex,-file --runtime=default,+clear,+init,-keep,-no_startup,-download,+config,+clib,+plib "--errformat=%f:%l: error: %s" "--warnformat=%f:%l: warning: %s" "--msgformat=%f:%l: advisory: %s"   -odist/default/production/Robocut.X.production.cof  build/default/production/main.p1 build/default/production/interrupts.p1 build/default/production/engines.p1     
:: advisory: Employing 18F2550 errata work-arounds:
:: advisory:  * Corrupted fast interrupt shadow registers
:: warning: Omniscient Code Generation not available in Free mode
(908) exit status = 1
make[2]: *** [dist/default/production/Robocut.X.production.hex] Error 1
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2
make: Target `build' not remade because of errors.
engines.c:29: error: conflicting declarations for variable "_engines_interrupt" (main.c:16)
Där ser du de tre varningarna där han gör om mina funktionsanrop
till funktionsdeklarationer. :doh:

Och sen koden:
main.c

Kod: Markera allt

/* 
 * File:   main.c
 * Author: rasmus
 *
 * Created on January 28, 2013, 10:48 PM
 */

#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#include "interrupts.h"
#include "engines.h"
#include "bool.h"

void interrupt highInterrupt() {
    engines_interrupt();
}

void interrupt low_priority lowInterrupt() {
    engines_interrupt_low();
}

void init_pins() {
    LATA = 0;
    ADCON1 = 0x0F; //disable analog functions
    CMCON = 0x07; // disable comparators
    TRISA = 0b00011000;
    //LATB = 0;
    //TRISB = 0b00100000;

    engines_stop();
}

void init_processor() {
    // Use 8MHz int osc
    OSCCON = 0b01111111;
    // Disable USB
    UCON = 0;
    UTRDIS = 1;

    init_interrupts();
    init_pins();
}

/*
 * 
 */
int main(int argc, char** argv) {
    init_processor();

    LATA2 = 1;

    while (true) {
    }

    return (EXIT_SUCCESS);
}

engines.c:

Kod: Markera allt

#include "engines.h"
#include "ports.h"
#include "bool.h"

#define backwards 0
#define forward 1
#define left 2
#define right 3
#define back_left 4
#define back_right 5
#define back_around 6
#define forward_left 7
#define forward_right 8

// Servo definition and variables
#define STILL 15
#define CCW_ROTATION 20
#define CW_ROTATION 10
volatile unsigned char cnt = 0;
volatile unsigned char direction_left = STILL;
volatile unsigned char direction_right = STILL;

char go = false;
char dir = forward;
char turn = false;

volatile unsigned int iTurn = 0;

void engines_interrupt() {
    if (TMR2IF) {

        PR2 = 250;
        TMR2IF = 0;

        switch (turn) {
            case forward:
                direction_left = CW_ROTATION;
                direction_right = CCW_ROTATION;
                break;
            case left:
                if (iTurn < 500) {
                    direction_left = CCW_ROTATION;
                    direction_right = CCW_ROTATION;
                    iTurn++;
                } else {
                    turn = forward;
                    iTurn = 0;
                }
                break;
            case right:
                if (iTurn < 500) {
                    direction_left = CW_ROTATION;
                    direction_right = CW_ROTATION;
                    iTurn++;
                } else {
                    turn = forward;
                    iTurn = 0;
                }
                break;
            case back_left:
                if (iTurn < 1000) {
                    direction_left = CCW_ROTATION;
                    direction_right = CW_ROTATION;
                    iTurn++;
                } else {
                    turn = left;
                    iTurn = 0;
                }
                break;
            case back_right:
                if (iTurn < 1000) {
                    direction_left = CCW_ROTATION;
                    direction_right = CW_ROTATION;
                    iTurn++;
                } else {
                    turn = right;
                    iTurn = 0;
                }
                break;
            case back_around:
                if (iTurn < 1000) {
                    direction_left = CCW_ROTATION;
                    direction_right = CW_ROTATION;
                    iTurn++;
                } else {
                    turn = left;
                    iTurn = 0;
                }
                break;
            case forward_left:
                if (iTurn < 1000) {
                    direction_left = CW_ROTATION;
                    direction_right = CCW_ROTATION;
                    iTurn++;
                } else {
                    turn = left;
                    iTurn = 0;
                }
                break;
            case forward_right:
                if (iTurn < 1000) {
                    direction_left = CW_ROTATION;
                    direction_right = CCW_ROTATION;
                    iTurn++;
                } else {
                    turn = right;
                    iTurn = 0;
                }
                break;
        }
    }
}

void engines_interrupt_low() {
    if(TMR0IF) {

        TMR0 = 56;             // Initial Value for 0.1ms Interrupt
        TMR0IF = 0;         // Clear TIMER0 interrupt flag

        if (cnt < direction_left) {
            WHEEL_LEFT = 1;
        } else {
            WHEEL_LEFT = 0;
        }
        if (cnt < direction_right) {
            WHEEL_RIGHT = 1;
        } else {
            WHEEL_RIGHT = 0;
        }
        if (cnt > 200) {
            cnt = 0;
        }
        cnt++;
    }
}

void engines_stop() {
    direction_left = STILL;
    direction_right = STILL;
}
engines.h

Kod: Markera allt

/* 
 * File:   interrupts.h
 * Author: rasmus
 *
 * Created on January 28, 2013, 10:49 PM
 */

#ifndef INTERRUPTS_H
#define	INTERRUPTS_H

#ifdef	__cplusplus
extern "C" {
#endif

void engines_interrupt();
void engines_interrupt_low();
void engines_stop();

#ifdef	__cplusplus
}
#endif

#endif	/* INTERRUPTS_H */
Filerna lägger jag till genom att högerklicka på mappen "source files"
och väljer "C source file" samt "header files" och väljer "c header file"

EDIT:
Kan tillägga att mapparna "header files" och "source files" inte finns i
verkligheten utan verkar vara nått som MPLAB X har fantiserat ihop.
Men eftersom interrupt.c och interrupt.h ligger i dessa och fungerar
bra (nu) så borde det vara så det ska vara.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Importstul XC8 MPLAB-X

Inlägg av sodjan »

> Där ser du de tre varningarna där han gör om mina funktionsanrop
> till funktionsdeklarationer.

Ja, eller, den använder dina funktioner för att göra implicita ("underförstådda")
deklarationer p.g.a att den inte tycker att den har hittat explicita ("uttryckliga")
deklarationer (normalt i en .h fil). Frågan är varför inte...

En "long shoot" bara för att testa... :-)
Vad händer om du plockar bort din hantering av INTERRUPTS_H?
Jag ser inte direkt att du inkl interrupts.h på ett sätt så att den kan köras dubbelt (?).
victor_passe
Inlägg: 2436
Blev medlem: 28 januari 2007, 18:45:40
Ort: Kungsbacka

Re: Importstul XC8 MPLAB-X

Inlägg av victor_passe »

Kod: Markera allt

#ifdef   __cplusplus
extern "C" {
#endif
och

Kod: Markera allt

#ifdef   __cplusplus
}
#endif
bör du inte ha i din h fil.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46978
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Importstul XC8 MPLAB-X

Inlägg av TomasL »

Du bör nog kika på ordningen av dina includes, gissar att xc.h skall vara den första inkluden i main, därefter kommer de andra.
Många c-kompilatorer är känsliga för hur vissa .h filer inkluderas och vilken ordning det görs.
Användarvisningsbild
baron3d
EF Sponsor
Inlägg: 1353
Blev medlem: 1 oktober 2005, 23:58:43
Ort: Torestorp

Re: Importstul XC8 MPLAB-X

Inlägg av baron3d »

Jag brukar kalla definitionen ungefär samma som "header" filen:

I "engines.h" skriver du:

Kod: Markera allt

#ifndef INTERRUPTS_H
#define   INTERRUPTS_H
Jag skulle ha kallat definitionen för ENGINES_H i.s.f. INTERRUPTS_H.

Dessutom finns det risk för att INTERRUPTS_H krockar med den konstanten som troligtvis finns i filen "interrupts.h".
Pajn
Inlägg: 1160
Blev medlem: 6 juni 2008, 19:14:29
Ort: Nyköping
Kontakt:

Re: Importstul XC8 MPLAB-X

Inlägg av Pajn »

@baron3d
Du har rätt. Gud så dum jag känner mig nu :doh:
Hade kopierat interrupts.h men glömda att ändra guardsen.

Självklart funkar det efter att ha ändrat till ENGINES_H.
Skriv svar