Piszę program na AT89C4051 i używam dyrektywy $large.
Nie sposób więc pisać program bez podprogramów SUB.
W moim programie bardzo często odwołuje się do podprogramów, często też robię to w petlach FOR (a więc wielokrotnie).
Bywa też tak, że jeden podprogram odwołuje się do innego podprogramu.
Wszysztko działa sprawnie, ale teraz gdy dodam kolejne odwołanie CALL (trudno policzyć, które z kolei) procesor wykazuje zero reakcji. Zachowuje się tak, jakby nie był on w ogóle zasilany.
Wnioskuję więc, że polecenie CALL można używać skończoną ilość razy.
Czy macie pomysł, jak ominąć ten problem??
Czym się różni odwołanie CALL od GOSUB ??
Bo gdy używam GOSUB, to nie widzę żadnej różnicy.
Rozwiązanie tego problemu ułatwiłoby mi bardzo pisanie, ponieważ wielokrotnie odwołuje się do zapisu do pamięci 24C02, a co za tym idzie czytelność i długość programu.
Proszę o pomoc.
Za każdą podpowiedzć serdeczne dzięki.
Aktyw Forum
Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.
Sprawdź punkty Zarejestruj sięOdwołania CALL i GOSUB, jaka jest różnica ?
Moderatorzy:Jacek Bogusz, robertw, k.pawliczak, Moderatorzy
Witam.
To jest proste
1)Przez Call sub1(x,y,z) możemy przekazać parametry do podprogramu , a przez GoSub , niestety nie.
2) przez GoSub etyk możemy odwołać się do etykiety , przez Call niestety nie.
Przykład:
Prześledź w symulatorze , to powinno wyjaśnic Ci różnicę między Call i GoSub i jak się oszczędza pamięć programu
Jesli chodzi o ilość wywoływanych Call czy GoSub to ograniczeni jesteśmy pamięcia programu , a jeśli masz na myśli głębokść zagnieżdżenia , to ogranicza nas stos , którego wielkość w/w uC jest mizerna i jeśli masz do tego jakieś przerwanie to.... czarno to widzę
Pozdrawiam
Piotrek
To jest proste
1)Przez Call sub1(x,y,z) możemy przekazać parametry do podprogramu , a przez GoSub , niestety nie.
2) przez GoSub etyk możemy odwołać się do etykiety , przez Call niestety nie.
Przykład:
Kod: Zaznacz cały
Dim Aa As Byte , Bb As Byte , Cc As Byte
Declare Sub podprogram(aa As Byte,bb As Byte,cc As Byte)
Do
aa=7
bb=8
cc=9
Gosub Etykb
Call podprogram(1,2,3)
Gosub Etykc
Loop
Sub podprogram(aa,bb,cc) 'procedura
Gosub Etykb
Print Aa
Etyka:
Print Bb
Etykb:
Print Cc
End Sub
Etykc:
GoSub Etyka
Return
Jesli chodzi o ilość wywoływanych Call czy GoSub to ograniczeni jesteśmy pamięcia programu , a jeśli masz na myśli głębokść zagnieżdżenia , to ogranicza nas stos , którego wielkość w/w uC jest mizerna i jeśli masz do tego jakieś przerwanie to.... czarno to widzę
Pozdrawiam
Piotrek
No tak, różnica jest.Witam.
To jest proste
1)Przez Call sub1(x,y,z) możemy przekazać parametry do podprogramu , a przez GoSub , niestety nie.
2) przez GoSub etyk możemy odwołać się do etykiety , przez Call niestety nie.
Przykład:Prześledź w symulatorze , to powinno wyjaśnic Ci różnicę między Call i GoSub i jak się oszczędza pamięć programuKod: Zaznacz cały
Dim Aa As Byte , Bb As Byte , Cc As Byte Declare Sub podprogram(aa As Byte,bb As Byte,cc As Byte) Do aa=7 bb=8 cc=9 Gosub Etykb Call podprogram(1,2,3) Gosub Etykc Loop Sub podprogram(aa,bb,cc) 'procedura Gosub Etykb Print Aa Etyka: Print Bb Etykb: Print Cc End Sub Etykc: GoSub Etyka Return
Jesli chodzi o ilość wywoływanych Call czy GoSub to ograniczeni jesteśmy pamięcia programu , a jeśli masz na myśli głębokść zagnieżdżenia , to ogranicza nas stos , którego wielkość w/w uC jest mizerna i jeśli masz do tego jakieś przerwanie to.... czarno to widzę
Pozdrawiam
Piotrek
Czyli z tego co mówisz wynika, że poprostu nie mogę zbyt głęboko zagnieżdżać podprogramów. Nie używam na szczęście przerwań. Zrezygnowałem z tego, ponieważ mój program jest bardzo obszerny i przerwania nie zdawały egzaminu.
Dzieki za podpowiedź. Spróbuję przekonstruować mój program.
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 16 gości