Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Keil C

krzysiek40 08 Lip 2004 09:49 2679 16
  • #1 08 Lip 2004 09:49
    krzysiek40
    Poziom 22  

    Ostatnio otrzymalem taka wskazowkę:

    Najedź w lewym okienku na nazwę Twojego pliku źródłowego. Prawym przyciskiem myszy i wybierz "Options for ...".
    Tam, w zakładce Properties wyłącz "Assemble SRC files" oraz "Generate assembler SRC file".
    Jak to jest włączone to program się kompiluje inaczej. W pamięci umieszczane jest wszystko kolejno. Wówczas robisz tak, jak TDV zasugerował. Niestety, żeby robić wstawki asemblerowe musisz mieć te opcje włączone.
    Jeżeli te opcje są wyłączone, funkcje umieszczane są w pamięci zgodnie ze zdrowym rozsądkiem.

    Marmur99

    tymczasem gdy tak robie to w kodzie wynikowym *.hex nic sie nie zmienia:

    prosze by mi ktos skompilowal cos takiego tymi dwoma sposobami i pokazal roznice

    #include <reg51.h>

    void main(void) {
    EX0=1;
    EA=1;
    IT0=1;

    while(1);
    }

    void add(void) interrupt 0 {
    P1++;
    }

    0 16
  • #2 09 Lip 2004 10:53
    marmur99
    Poziom 17  

    Ale słuchaj, czy ten program działa tak, jak sobie tego życzysz?
    Przy takim programie nie zobaczysz różnicy przy kompilowaniu z "Assemble ..." a bez tego. Pisałem Ci w poprzednim poście jaka jest różnica. Żeby sprawdzić czy program działa prawidłowo (i jak został poskładany) uruchom sobie debuggera. Tam najlepiej wychwycisz różnicę pomiędzy kompilacjami.

    Marmur99

    0
  • #3 12 Lip 2004 14:52
    Vassili Zaicev
    Poziom 11  

    A co to w ogole jest P1?
    A INT0 to przerwanie zewnetrzne ?

    0
  • #4 12 Lip 2004 22:50
    Vassili Zaicev
    Poziom 11  

    Nie wiem co to za przerwanie int0, P1 to prawdopodobnie 8-bit port nr 1 , ale lepiej sprawdz definicje bo to moze byc tez "ala ma kota".

    Jesli podejmujesz obsluge przerwania to powinienes dmuchac na zime i dbac o te znaczniki.
    Jak na moj gust Powinienes na koncu obslugi przerwania wyzerowac flage jego zgloszenia.

    0
  • #5 20 Lip 2004 17:24
    krzysiek40
    Poziom 22  

    w debuggerze nie wideze zadnej roznicy chyba ze nie wiem na co patrzec.
    a czy moglby mi ktos skompilowac ten program i przeslac hex-a alb bin-a tak bym mogl go wgrac w proca i wtedy zobaczyc?

    0
  • #6 23 Lip 2004 20:37
    krzysiek40
    Poziom 22  

    wreszcie po pol roku zmagan przerwania mi dzialaja ale pod reisonance a z keil chyba sie pozegnam :)

    0
  • #7 23 Lip 2004 21:05
    SACZI
    Poziom 16  

    krzysiek40, ja tez walczyłem z przerwaniami i udało mi się to przebrnąć. Problem okazał sie prosty; chodzi oczywiście o napisanie funkcji obsługi przerwania.
    Polecam Ci jednak Keila z tego względu, że używaja go profesjonaliści. Nie znam żadnego elektronika, który pisałby w innym niz Keil kompilatorze na '51. Sam równiez uczyłem sie na Keilu i jeżeli przyjdzie mi pracowac, również będe chciał uzywac Keila.
    Nie mam nic przeciwko innym kompilatorom (a mam chyba większość: Reisonance, Tasking, Ashlilng, IAR), ale Keil wydaje mi sie najlepszy.

    0
  • #8 23 Lip 2004 23:39
    krzysiek40
    Poziom 22  

    to moze w keilu trzeba ustawic jakies opcje o kturych nie wiem coz jeszcze z nim powalcze

    a mozesz mi napisac funkcje przerwania ktora obsluguje np to co w pierwszym poscie napisalem bo w reisonance to dziala bez zadnych zmian ?

    0
  • #9 24 Lip 2004 01:20
    Vassili Zaicev
    Poziom 11  

    Znam dobrze jezyk C ale mikrokontrolery poznaje od niedawna.
    W 51-kach zewnetrzne przerwania jednak czyszcza swoje flagi sprzetowo (wlasnie doczytalem..)
    Wiec blad masz na pewno w konfigu a nie w ISR-routine.

    0
  • #10 24 Lip 2004 09:35
    krzysiek40
    Poziom 22  

    w takim razie jak to skonfigurowac ???

    0
  • #11 24 Lip 2004 09:40
    Tdv
    Poziom 33  

    Zapodaj tu pliki .hex uzyskane z keila i reisonace.
    Jaki masz programator?

    0
  • #12 24 Lip 2004 10:33
    krzysiek40
    Poziom 22  

    tak wyklada reisinance

    :03000000020006F5
    :0300030002001DDB
    :0F000600758110E4787FF6D8FD75A0FF02001514
    :08001500D2AFD288D2A880FE10
    :0E001D00C0E0C0D075D0080590D0D0D0E03241
    :00000001FF

    a tak keil

    :08080C00D2AFD288D2A880FE11
    :03000300020814DC
    :030814000590321A
    :03000000020800F3
    :0C080000787FE4F6D8FD75810702080C33
    :00000001FF

    0
  • #13 24 Lip 2004 11:19
    Tdv
    Poziom 33  

    A używasz pewnie programatora PROGAT czy jakoś tak się to nazywało??
    To wina leży po stronie programatora, a nie kompilatora. Zawartość hex'a ma postac:
    :iiaaaattddddddddddddcc gdzie:
    ii - ilosc danych w rekordzie,
    aaaa adres od którego należy zacząć upychać w pamięci dany rekord,
    tt - typ rekordu,
    dddd - dane (jest ich tyle ile wskazuje ii),
    cc - suma kontrolna rekordu.

    Jak widać hex wynikowy z Keila ma rekordy poukładane nie po kolei według adresów (reisonance ma po kolei z adresami).

    Oryginalny hex keila (dodaje numerki linii:

    1 :08080C00D2AFD288D2A880FE11
    2 :03000300020814DC
    3 :030814000590321A
    4 :03000000020800F3
    5 :0C080000787FE4F6D8FD75810702080C33
    6 :00000001FF

    Poukładaj je w kolejności 4,2,5,1,3,6 , czyli:
    :03000000020800F3
    :03000300020814DC
    :0C080000787FE4F6D8FD75810702080C33
    :08080C00D2AFD288D2A880FE11
    :030814000590321A
    :00000001FF

    I powinno zadziałać:D.

    BTW to ten temat wałkowałem na elektrodzi już kilkanaście razy, ostatnio nawet kolega po objaśnieniach zorganizował w C program na PC, który segreguje plik hex według rosnących adresów.
    Zapodał mi linka ze źródłem do niego ale napisał, że do własnego użytku, więc nie będę go tu umieszczał.
    Postarm się zaraz ustalić kto to jest i podać jakieś namiary.

    Obiecane namiary:
    użytkownik arcu https://www.elektroda.pl/rtvforum/profile.php?mode=viewprofile&u=24298

    0
  • #14 24 Lip 2004 14:59
    krzysiek40
    Poziom 22  

    rzeczywiscie uzywam progata (zapomnialem dopisac). naprawde wielkie dzieki przerwania spedzaly mi sen z powiek a teraz wszystko sie wyjasnilo. bede sie z tym bawil. pozdrawiam :)

    0
  • #15 24 Lip 2004 15:50
    SACZI
    Poziom 16  

    krzysiek40, ja Twój programik zapisałem tak:

    Code:

    #include <reg51.h>

    void add(void) interrupt 0
    {
       IT0 = 0;
       P1++;
    }

    void main(void)
    {
       EA=1;
       EX0=1;
       IT0=1;

       while(1)
          {
             ;
          }
    }

    różnica polega na zerowaniu znacznika przerwania (mimo, że jest zerowany sprzętowo) po przyjęciu jego zgłoszenia.

    Po kompilacji plik HEX wyglada tak:
    Code:

    :03000300020814DC
    :05081400C288059032CE
    :08080C00D2AFD2A8D28880FE11
    :03000000020800F3
    :0C080000787FE4F6D8FD75810702080C33
    :00000001FF

    czyli znowu jest jakies inne ułożenie adresów.


    PS Tdv, podaj z łaski swojej linki do dyskusji na ten temat. Zaciekawiło mnie to zagadnienie.

    0
  • #16 24 Lip 2004 16:16
    Vassili Zaicev
    Poziom 11  

    To bardzo ciekawe co pisze TDV, najprawdopodobniej to jest wlasnie przyczyna , w pracy uzywam Keila bardzo czesto i nie mialem wiekszych problemow z przerwaniami.
    W domu programuje na razie tylko AT89S52, i np timer dziala bez problemu.
    Uzywam programatora AEC_ISP, dosowski.

    Jesli IT0 jest flaga tego przerwania to na pewno zapis :
    EA=1;
    IT0=1;
    jest pozbawiony sensu
    sensowniej byloby:
    IT0 = 0;
    EA = 1;

    0
  • #17 24 Lip 2004 16:50
    krzysiek40
    Poziom 22  

    a czy moglby ktos zamiescic lub wyslac mi krzysiek400(malpa)op.pl taki program do sortowania. na stronie praktycznego elektronika jest ale z tego co widze to w wersji niskompilowanej a ja nie mam kompilatora pascala

    0
  Szukaj w 5mln produktów