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

Dlaczego błąd OUT OF INTERNAL MEMORY w BASCOM 51 na AT89C51RD2?

polik80 06 Maj 2006 23:23 1654 10
  • #1 2599919
    polik80
    Poziom 14  
    Posty: 85
    Pomógł: 6
    Ocena: 1
    Mam problem.
    Wydaje mi się że PRAWIE wiem o co chodzi, ale PRAWIE robi wielką różnicę:)
    Kompiluję Program i wyskakuje mi błąd OUT OFF INTERNAL MEMORY jeśli dobrze myślę to oznacza to poza zakresem wewnętrznej pamięci RAM.
    I w tym sęk.
    Jeśli dobrze kombinuję to ram powinien być zajmowany tylko przez zmienne??? A jeśli tak, to dla czego przy ilości zmiennych 30 Bjatów wyskakuje mi ten błąd jeśli procek RAM'u ma aż 256B??? no chyba że coś kręcę.
    Procek AT89C51RD2 - z noty katalogowej - 256 Bytes internal RAM
    jedna tablica (8) as Byte - (8B)
    jedna tablica (2) as Byte - (2B)
    2 zmienne SINGLE - (8B)
    1 zmienna INTEGER - (2B)
    8 zmiennych typu BYTE - (8B)
    8 zmiennych typu BIT - (1B)
    SUMA -29 Bajtów - daje się skompilować jak coś dodam to się wywala.
    Co źle robię lub czemu źle myślę, a może to BASCOM coś chrzani????
    PROSZĘ O POMOC
  • #2 2600140
    szymtro
    Poziom 30  
    Posty: 1421
    Pomógł: 101
    Ocena: 59
    Sprawdż ustawienia komnpilatora
    Options - compiler - misc
    byte end (hex) podaje wartość progową po której kompilator zacznie krzyczeć że ramu zabrakło

    A tak swoja droga to procek ma 128B ram + 128B SFR + 128B dodatkowej pamieci

    Co do pozerania ram to jest to stos i miejsce pożerane przez pocedury bascoma (lcd, print, itd)
  • #3 2600512
    polik80
    Poziom 14  
    Posty: 85
    Pomógł: 6
    Ocena: 1
    Ok
    Dzięki
    W moim programie jest całkiem sporo funkicji LCD, więc może to to, ale pokombinuję również z ustawieniami bascoma.

    Dodano po 32 [minuty]:

    A czy ten "Byte end(hex)" to można tak sobie do woli zmieniać czy jak??? miałem ustawiony 50 zmieniłęm na 60 i jest ok. wydaje mi się że 50 to jest ostatni adres pamięci ram a więc miałem 50 bajtów do zagospodarowania więc jeśli tak to mogę zmienić na 128 z tego co napisał szymtro
    skoro tam jest w hex'ie to 128Dec=80Hex. CZy piszę dobrze czy się mylę ???
  • #4 2600633
    szymtro
    Poziom 30  
    Posty: 1421
    Pomógł: 101
    Ocena: 59
    Ustaw tam narazie max 108 (6C) albo 6F a jak ci kiedyś zabraknie miejsca to sobie dodasz. Teoretycznie jak masz procka z dodatkowym 128B ramu to mozna tam ustawić nawet FF - bascom i tak odwołuje się do zmiennych poprzez adresowanie pośrednie (dla wtajemniczonych @r0 lub @R1) i dlatego program działa wolniej niz w asm.
    N aile masz nastawionego tego procka? 40MHz? Czy on jest tzw x2?
  • #5 2600673
    polik80
    Poziom 14  
    Posty: 85
    Pomógł: 6
    Ocena: 1
    o co chodzi z tym 40 mhz czy x2 ??
    Procek chodzi na oscylatorze zewnętrznym 11.0592MHz w fusebitach narazie nic nie zmieniałem to wszystko co mogę o tym powiedzieć jeśli chodzi ram to narazie mam zostawione 60 i mi wystarcza tak jak napisałeś jak mi zabraknie to sobie dodam
  • #6 2600772
    szymtro
    Poziom 30  
    Posty: 1421
    Pomógł: 101
    Ocena: 59
    Ten uC to tzw: "full wypas", oprócz przetwornika ADC i sprzetowego I2C jest szybszy niż avr'y. W trybie x2 (6 cykli zamiast standardowych 12) i z zegaraem 30MHz naprawdę jest szybki. Do tego ma dodatkowy układ do generowania baud rate dla portu uart.
    Dodatkowo wbudowany XRAM(1792B), bootloader, wersja ED2 ma jeszcze 2kB eeprom'u.

    Wykorzystujesz coś z tych zaawansowanych możliwości?
  • #7 2600908
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    To znów ja - nie śpię ;)
    szymtro napisał:

    ...bascom i tak odwołuje się do zmiennych poprzez adresowanie pośrednie ...

    Czyżby :?:
    
    Dim Aa As Byte , Bb As Word , Cc(5) As Byte
    Aa = 1           'mov 21H,#1
    Bb = 2           'mov 22H,#2
                     'mov 23H,#0
    Bb = Aa         'mov 22H,21H
                     'mov 23H,#0
    Aa = Bb         'mov 22H,21H
    Cc(1) = 7       'mov R0,24H
                     'mov @R0,#7
    Cc(bb) = Aa   'push acc
                   'mov R0,#22H
                   'mov a,@R0H
                   'add a,#23
                   'mov a,R0
                   'pop acc
                   'mov @R0,21H 
    Do : Loop       'ljmp 0065H
    
    


    Piotrek
  • #8 2600970
    polik80
    Poziom 14  
    Posty: 85
    Pomógł: 6
    Ocena: 1
    Ok Przyznaje się jestem raczkujący.
    Moja przygoda z prockami zaczeła się jakieś 2 miesiące temu od at89c2051 bardzo mi się spodobało więc kupiłem sobie RD2 (pomyślałem ten sam rdzeń ten sam program do programowania i może bym tak prace magisterską sobie wreszcie jakąś napisał bo tylko to ze studiów elektrycznych m i pozostało i tak jakoś odciąga się i odciąga....) i teraz go poznaję piszę na niego centralkę domową no wiesz 2 termometry DS1820 alarm deaktywowany pastylką DS1990 do tego RTC na PCF8583 czujniki podczerwieni, gazu i pożaru, sprubuje dołożyć komunikację z PC'tem.
    Narazie wykożystuje jakieś 5% tego procka tzn 50%RAMu i 8% Flasha

    Dzięki bogu jest coś takiego jak ELEKTRODA i SZYMTRO niosący pomoc.

    A teraz do sedna sprawy, więc jak piszesz to najlepiej było by ustawić tryb x2 (już go znalazłem jest jak wół po środku okna programatora - urzywam FLIP'a) i wsadzić kwarc jakieś 32MHz ? zdaje mi się że nie będzie mi to aż tak bardzo potrzebne ale x2 już ustawiłem. Szkoda tylko że nie kupiłem sobie ED2 bo wykożystuje trochę eepromu (zapamiętanie pastylek, ustawiam temperaturę zadziałania jednego wyścia) i układ musiałem trszeczkę rozbudować o 24C04.
    Narazie moje kłopoty się kończą ale pewnie jeszcze dziś wieczorem znowu będę szukał czegoś na elektrodzie a jak nie znajdę to pisał nowy temat
  • Pomocny post
    #9 2601404
    szymtro
    Poziom 30  
    Posty: 1421
    Pomógł: 101
    Ocena: 59
    Jak masz jakieś problemy to wal jak w dym tu na forum. Ja nie uważam, że wiem wszystko - napisałem kiedys sporo programików używajac bascom 8051 i chciałbym powiedzieć, że tu widziałem juz wszystko ale napewno jeszcze nie.

    Są tutaj lepsi ode mnie ale większość z nich używa już albo avr albo C kompilując na 8051.
    Ja w tej chwili używam bascoma jako IDE do pisania w asemblerze - zaczynałem od prostych programów 5 lat temu.
  • Pomocny post
    #10 2601433
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    szymtro napisał:

    ...
    zaczynałem od prostych programów 5 lat temu.

    I tu właśnie jest pies pogrzebany.Jest raczej niemożliwe , by nauczyć się programowania uC-ków po dniu , tygodniu czy miesiącu , od momentu jak się o nich po raz pierwszy usłyszało.W tym miejscu zgadzam się z szymtro w 100% :)

    Piotrek
  • #11 2603119
    polik80
    Poziom 14  
    Posty: 85
    Pomógł: 6
    Ocena: 1
    chopy jesteście super!!!
    ja również uważam że nie ma ludzi nieomylnych i takich którzy wszystko wiedzą, ci którzy tak myślą są w wielkim błędzie. Uczymy się całe życie i dzięki temu nasze życie jest ciekawe Dzięki za słowa otuchy dzięki za Pomoc Temat uważam za zakończony.

Podsumowanie tematu

✨ Problem dotyczy błędu "OUT OF INTERNAL MEMORY" podczas kompilacji programu w BASCOM-51 dla mikrokontrolera AT89C51RD2. Błąd ten oznacza przekroczenie dostępnej wewnętrznej pamięci RAM, która według dokumentacji wynosi 256 bajtów. Pomimo deklaracji zmiennych zajmujących około 29 bajtów, kompilator zgłasza brak pamięci. Przyczyną jest nie tylko pamięć zajmowana przez zmienne, ale także stos i pamięć wykorzystywana przez procedury BASCOM, np. funkcje LCD i print. Wskazano, że mikrokontroler posiada 128 bajtów RAM, 128 bajtów SFR oraz dodatkowe 128 bajtów pamięci, co razem daje 256 bajtów. W ustawieniach kompilatora w opcji "byte end (hex)" definiuje się próg końca pamięci RAM, po przekroczeniu którego pojawia się błąd. Zmiana tej wartości na wyższą (np. z 0x50 na 0x60 lub 0x6C) pozwala na kompilację większych programów. Zalecane jest ustawienie trybu pracy x2 (skraca cykle maszynowe z 12 do 6) i odpowiednie dobranie częstotliwości oscylatora (np. 11.0592 MHz lub 30 MHz). Mikrokontroler AT89C51RD2 posiada zaawansowane funkcje, takie jak ADC, sprzętowe I2C, dodatkową pamięć XRAM (1792 bajtów), bootloader oraz EEPROM 2 kB w wersji ED2. Użytkownik korzysta z BASCOM-51 i uczy się programowania mikrokontrolerów, wykorzystując m.in. termometry DS1820, układ RTC PCF8583 oraz pastylkę DS1990. Podsumowując, błąd wynika z domyślnych ustawień kompilatora dotyczących limitu pamięci RAM, które należy dostosować do faktycznej dostępnej pamięci i wykorzystywanych funkcji bibliotecznych.
REKLAMA