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.

[Atmega32][Bascom] Zawieszanie programu

niezly 29 Lis 2011 10:23 1101 3
  • #1 29 Lis 2011 10:23
    niezly
    Poziom 10  

    Witam.
    Nie mam już pomysłu, może ktoś z was coś podsunie.
    Problem leży prawdopodobnie w złym zarządzaniu pamięcią.
    Program to miernik energii elektrycznej. Może zamiast kodu przedstawie schemat blokowy.
    Cały program znajduje się w pętli, nie używam zadnych gosubów i innych podprogramów. Jest tylko 1 przerwanie co sek i tylko zmiana 1 zmiennej.
    1. Program najpierw zapisuje próbki do zmiennych
    Dim Utab(200) As Integer
    Dim Itab(200) As Integer
    Próbek jest po 180 dla napięcia i prądu. Czytane są z 2 zawnętrznych przetworników.
    2. Potem wstępne obliczenia i przepisanie danych do zmiennych
    ( Proces 1 i 2 wykonywany jest ok 15 razy na sek, probki do tablicy zawsze wpisywane są od nowa, znów obliczenia i przepisanie danych do zmiennych)
    3. Kolejne obliczenia ale co 1 sek ze zmiennych z punktu 2
    4. obsługa przycisków, wyświetlacza.

    Przyciski i wyświetlacz mozna pominąć, musze najpierw rozwiązać problem zwieszania.

    I teraz ........ niezrozumiałym dla mnie elementem są te tablice i wpisywanie do nich próbek. Zadeklarowanych jest 200 zmiennych 2 bajtowych dla napięcia i tak samo dla prądu. Wydaje mi się że tak jest prawidłowo. Na 100% nie przekraczana jest ta liczba któa w praktyce wynosi 180. Tymczasem przy takiej deklaracji program wiesza sie po paru minutach poprawnego działania. Przy zadeklarowaniu 400
    Dim Utab(400) As Integer
    Dim Itab(400) As Integer
    program potrafi działać parę godzin.
    Max co mogę zadeklarować to 450. Potem kompilator pluje się że brak pamięci.

    Mój wniosek to że brakuje ramu, w programie jest ok 25 zmiennych single, sporo operacji matematycznych włącznie z pierwiastkowaniem. Być może program potrzebuje sporo ramu albo coś bascom partoli. Nie rozumiem co może byc przyczyną dłuższego działania programu przy deklaracji 400.
    Zastanawiam się jeszcze nad konfiguracją
    $hwstack
    $swstack
    $framesize
    ale nie wiem jak to ugryźć.

    0 3
  • #2 30 Lis 2011 08:47
    piotr5000
    Poziom 21  

    1 Czy używasz timerów ?
    2 25 zmiennych single i dużo operacji matematycznych ?

    Jeśli masz timery i dużo liczysz to może czas obliczeń przekracza czas trwania timera i program
    " idzie w krzaki "

    Sprawdź czy jeśli zmienne single zamienisz na np. double lub long
    ( nie dbając o prawidłowy wynik ) program też zawiśnie

    podaj kod może wymyślimy coś więcej

    0
  • #3 30 Lis 2011 09:11
    Fredy
    Poziom 27  

    zapewne masz problem ze stosem.
    Jeśli po ograniczeniu ilości zmiennych które deklarujesz program działa , a tylko zmiana wielkości rozmiaru tablicy wpływa na to że program się wiesza to napewno tak jest.
    Spróbuj albo dać większy procek (z większym Ramem) lub też zwiększ rozmiar stosu. W bascomie służą do tego te polecenia
    $hwstack
    $swstack
    $framesize

    Spróbuj np tak:
    $hwstack = 150
    $framesize = 150
    $swstack = 150

    a jeśli nie pomoże to jeszcze więcej

    0
  • #4 01 Gru 2011 07:46
    niezly
    Poziom 10  

    Wygląda na to że problem był ze stosem, po zwiększeniu działa idealnie.
    Dzieki.

    0