logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

AT89C51: Funkcja `main` ignorowana, program działa tylko z `zwieksz`

krzysiek40 04 Mar 2004 17:20 1623 15
REKLAMA
  • #1 531362
    krzysiek40
    Poziom 22  
    Posty: 629
    Pomógł: 9
    Ocena: 11
    od niedawna programuje w keil C51 i moje programy na symulatorze uVision dzialaja O.K problem zaczyna sie gdy wdram program do proca.
    np.

    #include <reg51.>

    void main(void){
    unsigned char i;
    while(1){
    for(i=0;i<0xffff;i++); P1++; }
    }

    takie cudo dziala i zwieksza zawartość portu w eleganckich odstepach czasu ale takie dziwo:

    #include <reg51.>

    void zwieksz(void){
    P1++;
    }

    void main(void){
    unsigned char i;
    while(1){
    for(i=0;i<0xffff;i++); zwieksz(); }
    }

    to juz jest porazka procek zachowuje sie jak by programem glownym byla funkcja zwieksz(); a main'a w ogole nie widzi

    co ciekawsze:

    void zwieksz(void){
    P1++;
    }

    cos takiego dziala tak samo.
    Oczywiszcie kompilator wywala ostrzezenie no ale w uVision to nie dziala a na procu owszem. Dla niego main moze nie istniec przez to cale zamieszanie nie moge obslugiwac przerwan i to mnie bardzo boli.

    czy ktos moze mi cos poradzic????????!!!!!!!!!!!!!
    moze chodzi o podpiecie do nozek proca czego np +Ucc czy cos innego, moze to wina programatora.Programuje w progatcie z PE (dziala mi zreszta tylko pod DOS'em )
    Pomozcie jak znacie przyczyne!!!!!!!!!!!!!!!!!!!!
  • REKLAMA
  • #2 532530
    Tdv
    Poziom 34  
    Posty: 2237
    Pomógł: 150
    Ocena: 53
    Sprobuj zrobic tak:
    #include <reg51.>

    void zwieksz(void);

    void main(void){
    unsigned char i;
    while(1){
    for(i=0;i<0xffff;i++); zwieksz(); }
    }

    void zwieksz(void){
    P1++;
    }
  • REKLAMA
  • #3 532617
    praw
    Poziom 17  
    Posty: 192
    Pomógł: 17
    Ocena: 10
    krzysiek40 napisał:


    #include <reg51.>

    void main(void){
    unsigned char i;
    while(1){
    for(i=0;i<0xffff;i++); P1++; }
    }

    takie cudo dziala i zwieksza zawartość portu w eleganckich odstepach czasu ale takie dziwo:



    bo powinno dzialac - wiec tak w petli while masz 2 oddzielne funkcje jedna to for druga to p1++, for nic nie robi, tylko zajmuje czas procka no a p++ wiadomo.

    Drugi przyklad nie dziala prawidlowo, bo nie powinien dzialac :) - wywal tam srednik po for......

    po prostu z tego co pamietam o c++ to po for-rze nie ma srednika, tylko sa podawane funkcje, ktore maja byc wykonywane - w obydwu przykladach w petli for nic nie jest wykonywane, ale wpierwszym sprawe zalatwia while - dlatego dziala.

    Usuniecie tego srednika powinno pomoc.

    ps. to wszystko co mowie jest o programowaniu w c++ ogolnie, mopze w tym pakiecie jest to inaczej rozwiazane - najlepiej przejrzyj w dokumentacji jak wykorzystywac for-a, ale jak na moj gust na 99% powinno byc tak jak opisalem. Mam nadzieje, ze to wyjasnilo twoje watpliwosci

    pozdro
  • #4 532643
    Tdv
    Poziom 34  
    Posty: 2237
    Pomógł: 150
    Ocena: 53
    praw: nie zgodze sie z toba. Petla for daje opoznienie czasowe i srednik po nim musi byc bo inaczej procek wykonywal by 0xFFFF razy instrukcje P++, po czym od nowa (z racji while(1)). Dzieki srednikowi prcek ma 0xFFFF razy nic nie robic, po czym inkrementowac P i znowu 0xFFFF razy nic nie robic, po czym P++ i tak w nieskonczonosc.
  • #5 532691
    praw
    Poziom 17  
    Posty: 192
    Pomógł: 17
    Ocena: 10
    chm.... nie domyslilem sie :( (co do tego for-a

    No coz na programowaniu uC sie nie znam za bardzo, wiec juz sie nie bede odzywal :)
  • REKLAMA
  • #6 532764
    lechoo
    Poziom 39  
    Posty: 5161
    Pomógł: 377
    Ocena: 546
    Moim zdaniem masz spierdzielony (być może źle skrakowany) kompilator. Używam uVision, coparawda jakiegoś starego (v1.21), ale z funkcją main() nigdy nie miałem takich cyrków, to co napisałeś powyżej musi działać poprawnie.

    Update:
    Sorry nie doczytałem dokładnie, w błąd wprowadziły mnie również wypowiedzi przedmówców. Myślałem że chodzi o problem z kompilatorem, a nie programatorem.
    Ten programator prawdopodobnie nie posiada funkcji weryfikacji i odczytu flasha, więc w takim przypadku trudno jest określić kiedy działa poprawnie...
  • #7 533105
    krzysiek40
    Poziom 22  
    Posty: 629
    Pomógł: 9
    Ocena: 11
    programator ma weryfikacje bledow bo przykladowo gdy podczas programowania wyjme proca to wywala zonka poza tym w opisie ukladu jest ze ma weryfikacje a programy ktore napisalem na poczatku oczywiscie musza dzialac (programuje w ANSI C 1,5 roku ale na uP od miesiaca i cos mi nie idzie). moze mi wzocisz ktos tu krzysiek400(_at_)op.pl kompilator dzieki ktorym bedzie mi to dzialac na procu!!!!!
    A moze problem jest gdzie indziej . Czy ktos ma pojecie???/
  • REKLAMA
  • #8 533277
    lechoo
    Poziom 39  
    Posty: 5161
    Pomógł: 377
    Ocena: 546
    Jeśli masz wersję demo tego uVision to poza ograniczeniem wielkości kodu do 2kB charakteryzuje się on również tym, że program jest kompilowany (umieszczany w pamięci programu) od adresu 4000h. Zobacz w debuggerze czy na początku nie ma przypadkiem LJMP 4000h. Na maila wysyłam Ci pliczek z moim działającym poprawnie kompilatorem (1,9MB).
  • #9 534404
    krzysiek40
    Poziom 22  
    Posty: 629
    Pomógł: 9
    Ocena: 11
    jeszcze raz dzieki za pilczek no coz cos takiego dziala
    #include <reg51.h>

    void zwieksz(void);

    void main(void){
    unsigned int i;
    while(1){
    for(i=0;i<0xffff;i++);zwieksz(); }
    }

    void zwieksz(void) {
    P1++;
    }


    ale nie dzialaja mi przerwania czyli np. taki programik

    #include <reg51.h>

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

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

    czy ktos ma pomysl?????
  • #10 534454
    lechoo
    Poziom 39  
    Posty: 5161
    Pomógł: 377
    Ocena: 546
    Zrób tak: zaprogramuj procka, później odczytaj jego zawartość i porównaj z plikiem który wgrałeś do niego. Mi to wygląda na problem z programatorem.
    Osobiście używam gównianego programatora AVT-320 (nie działa z szybkimi prockami) ale nie miałem nigdy problemów z poprawnością zapisu do uC.
  • #11 534597
    krzysiek40
    Poziom 22  
    Posty: 629
    Pomógł: 9
    Ocena: 11
    moim zdaniem wyglada tak samo. moze tego proca jokos sie podlacza "specjalnie" podpiolem wszystkie nozki do +Ucc ale i to nic nie pomaga reset niby dziala dobrze do kwarcu mam podpiete 33pF powinno byc dobrze ale i tak lipa. walcze z tym od miesiaca nawet drugiego proca kupilem ale to nic nie pomoglo
  • #12 535455
    krzysiek40
    Poziom 22  
    Posty: 629
    Pomógł: 9
    Ocena: 11
    no i co nikt nie ma pomyslu moze to tylk na AT89C51 tak paskudnie chodzi ?
  • #13 535963
    krzysiek40
    Poziom 22  
    Posty: 629
    Pomógł: 9
    Ocena: 11
    no widze ze juz nikt madrego pomyslu nie ma je tez nie
  • #14 537077
    Tdv
    Poziom 34  
    Posty: 2237
    Pomógł: 150
    Ocena: 53
    Metodologia ta sam do wszystkiego, przed funkcją main() deklarujesz naglowki wszystkich funkcji (tych od przerwan tez), a same funkcje umieszcasz po funkcji main(). Jezlei nie zadeklarujesz wczesniej naglowka to funkcja umieszczona ponizej main'a nie zostanie w ogole skompilowana...
  • #15 540428
    krzysiek40
    Poziom 22  
    Posty: 629
    Pomógł: 9
    Ocena: 11
    dzieki sproboje choc dopiero za dwa tygodnie bo tu gdzie teraz jestem nie mam sprzetu i mam ograniczony dostep do sieci
  • #16 556704
    krzysiek40
    Poziom 22  
    Posty: 629
    Pomógł: 9
    Ocena: 11
    no niestety przerwania mi nie chodza to i co teraz????

Podsumowanie tematu

✨ Problem dotyczy programowania mikrokontrolera AT89C51 w Keil C51 oraz uVision, gdzie funkcja main() jest ignorowana, a program działa tylko przy bezpośrednim wywołaniu funkcji zwieksz(). W kodzie z pętlą for z średnikiem po niej opóźnienie czasowe działa poprawnie, a inkrementacja portu P1 jest widoczna. Jednak przy wywołaniu funkcji zwieksz() z main() mikrokontroler zachowuje się tak, jakby main() nie istniał. Dyskusja wskazuje, że średnik po pętli for jest konieczny, aby uzyskać opóźnienie, a problem może wynikać z błędów programatora lub kompilatora, zwłaszcza w wersji demo uVision, która umieszcza kod od adresu 4000h. Użytkownik otrzymał działający przykład kodu z deklaracją funkcji przed main() i implementacją po niej. Mimo to, przerwania nie działają poprawnie, co może być spowodowane brakiem właściwej deklaracji funkcji obsługi przerwań lub problemami sprzętowymi, np. złym podłączeniem nóżek mikrokontrolera, resetem lub kwarcem. Zalecane jest sprawdzenie poprawności zapisu do pamięci flash przez odczyt i porównanie zawartości oraz deklarowanie prototypów funkcji przerwań przed main(). Problem z przerwaniami pozostaje nierozwiązany, a użytkownik podejrzewa, że może to być specyficzne dla modelu AT89C51 lub programatora.
Podsumowanie wygenerowane przez AI na podstawie treści dyskusji.
REKLAMA