Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Przerwania w HT PICC. symbol _main is defined more than once.

Masster 04 Nov 2007 16:51 1368 4
  • #1
    Masster
    Level 32  
    Witam.

    Mam problem z obsługą przerwań (PIC12f675). Napisałem procedury zgodnie z manualem i przykładami ale kompilator wywala mi błąd:

    Quote:
    Executing: "C:\Program Files\HI-TECH Software\PICC\STD\9.60\bin\picc.exe" -oodbierz.cof -modbierz.map odbierz.obj delay.obj rs232.obj --chip=12F675 -P -q -g --asmlist "--errformat=Error [%n] %f; %l.%c %s" "--msgformat=Advisory[%n] %s" "--warnformat=Warning [%n] %f; %l.%c %s"
    Error [482] ; . symbol "_main" is defined more than once in "odbierz.obj"
    Error [482] ; . symbol "_wyslijrs" is defined more than once in "odbierz.obj"
    Error [482] ; . symbol "_main" is defined more than once in "odbierz.obj"
    Error [482] ; . symbol "_wyslijrs" is defined more than once in "odbierz.obj"


    W programie są zdefiniowane trzy procedury main, wyslijrs i przerwanie. Próbowałem zmieniać ich kolejność ale to nic nie daje.

    Drugi problem występuje podczas ustawiania przerwania zewnętrznego na GPIO2. Żeby wybrać z której nóżki ma brać przerwanie muszę wpisać do rejestru IOC wartość 0x04 (przynajmniej tak zrozumiałem opis z książki) kłopot w tym, że kompilator krzyczy, że nie ma zdefiniowanej zmiennej IOC pomimo, że w pliku nagłówkowym jest.

    krótki opis działania: po wykryciu zbocza opadającego na GP2 ma w przerwaniu zacząć mierzyć czas timerem 0 (preskaler 1:1) w momencie zniknięcia stanu niskiego sczytuje wartość z licznika i coś tam robi dalej (nie ważne co).

    Code:
    #include <htc.h>
    
    #include "delay.h"

    unsigned char RX_RF=0;
    static bit odebrano=0;



    void wyslijrs (unsigned char w) {

    (... procedura wysyłania przez RS232 ...)

    }

    void main () {

    OPTION = 0b00011000;
    GIE = 1;
    GPIE = 1;
    INTE = 1;
    TRISIO = 0x04;
    GPIO = 0x00;
    IOC = 0x04;      //<= tu drugi problem

    while(1) {

    if(odebrano) {
       wyslijrs(RX_RF);
       odebrano=0;
       }
      }
    }


    #pragma interrupt_level 1       // <= to samo zarówno jak ta linijka jest jak i bez niej
    static void interrupt radio(void) {   //<= to samo jak jest static jak i bez
    if (INTE && INTF) {
       INTF=0;

       (... tu procedura wykonywana w przerwaniu ...)
       }
    }
  • Helpful post
    #2
    piti___
    Level 23  
    Czy nie masz przypadkiem do projektu dodanego pliku rs232.c a w nim zadeklarowanych funkcji main, wyslij ?

    W tej linijce
    Executing: "C:\Program Files\HI-TECH Software\PICC\STD\9.60\bin\picc.exe" -oodbierz.cof -modbierz.map odbierz.obj delay.obj rs232.obj
    widac 3 obiekty odbierz.obj delay.obj rs232.obj.
  • #3
    Masster
    Level 32  
    piti strzał w dziesiątkę problem rozwiązany.

    Teraz tylko nie wiem co z tym rejestrem IOC. Jest zdefiniowany w pliku nagłówkowym do mojego mikrokontrolera a mimo to pisze, że nie jest.

    Quote:
    Executing: "C:\Program Files\HI-TECH Software\PICC\STD\9.60\bin\picc.exe" -C D:\Winda\Pulpit\projekt\odbierz.c --chip=12F675 -P -q -g --asmlist "--errformat=Error [%n] %f; %l.%c %s" "--msgformat=Advisory[%n] %s" "--warnformat=Warning [%n] %f; %l.%c %s"
    Error [192] D:\Winda\Pulpit\projekt\odbierz.c; 37.1 undefined identifier "IOC"
  • Helpful post
    #4
    piti___
    Level 23  
    Trudno mi powiedziec co jest nie tak, moze includuj plik pic12rf675.h zamiast htc.h ?
    Jak nie ma tego co napisalem to poszukaj w katalogu include kompilatora, moze sie troche nazwa roznic.
  • #5
    Masster
    Level 32  
    Znów pomogło :D podaj mi model i producenta Twojej kryształowej kuli to też sobie taką sprawię :D