Zaslal: so březen 03 2012, 8:12 Předmět: Přetečení SRAM
Zdravím. Požívám mikroprocesor atmega32 a mám problémy s zaplněním paměti, která se při každé další smyčce programu víc zapňuje místo toho, aby se jen přepsala....následuje pád programu. Nevíte někdo co s tím? Napadlo mě donutit ho nějak, aby při zaplnění začal paměť přepisovat zase od začátku, ale nemám tušení, jak na to. Dík za radu
nevím, jestli se v tom někdo vyzná, ale když to řeknu stručně, tak různým servům přiřazuji proměnné. Pokud se nerovná požadované hodnotě, tak skočí na část programu, kde se zvýší nebo zmenší o 1 po 5 ms intervalech (abych dosáhl zpomalení otáčení serv,které jakoby krokuje po 5ti ms)...jakmile jsou podmínky splněny, tak skočí dál, kde chci přiřadit proměnným jiné hodnoty a tak zase přičítá nebo odečítá. Tohle všechno pak dělá stále dokola, ale zároveň přitom pořád zaplňuje paměť, dokud není plná, pak se sekne a zblázní. Přikládám program a hned se neděste, bylo to už mnohokrát přepisováno...ve výsledku by to měl být robot.
Led Alias Porta.7 ' přiřazení názvu ---> LED na PORTA.7
Enable Interrupts ' povolení přerušení
' proměnná
Dim Nskd As Byte ' proměnná
Dim Nskm As Byte ' proměnná
Dim Nskc As Byte ' proměnná
Dim Nskk As Byte ' proměnná
Dim Nskp As Byte ' proměnná
Dim Nskl As Byte ' proměnná
Dim Psc As Byte ' proměnná --> směrovací číslo návěstí
Declare Sub Rozcest ' návěstí --> rozcestí
Declare Sub Postaveni ' návěstí
Declare Sub Postaveni_jedna ' návěstí
Declare Sub Postaveni_dva ' návěstí
Declare Sub Postaveni_tri ' návěstí
Declare Sub Postaveni_ctyri ' návěstí
Declare Sub Sed ' návěstí
Declare Sub Sed_jedna ' návěstí
Declare Sub Sed_dva ' návěstí
Declare Sub Sed_tri ' návěstí
Declare Sub Nskm_plus ' návěstí
Declare Sub Nskm_minus ' návěstí
Declare Sub Nskc_plus ' návěstí
Declare Sub Nskc_minus ' návěstí
Declare Sub Nskk_plus ' návěstí
Declare Sub Nskk_minus ' návěstí
'-------------------------------- program --------------------------------------
Nskd = 34 ' přiřazení hodnot proměnným ---> min. krajní výchylka serva
Nskm = 81 ' přiřazení hodnot proměnným ---> střední poloha serva
Nskc = 143 ' přiřazení hodnot proměnným ---> max. krajní výchylka serva
Nskp = 95 ' přiřazení hodnot proměnným ---> natočení serva ke konci
Nskk = 120 ' přiřazení hodnot proměnným ---> natočení serva ke konci
Nskl = 107 ' přiřazení hodnot proměnným ---> natočení serva ke konci
Rozcest:
Sed:
Psc = 1 'psc návěstí sed je 1
Servo(1) = Nskm
Servo(4) = Nskm + 7
Servo(7) = Nskm
Servo(10) = Nskm
Servo(2) = Nskc - 5
Servo(5) = Nskc
Servo( = Nskc - 7
Servo(11) = Nskc
Servo(3) = Nskk
Servo(6) = Nskk - 5
Servo(9) = Nskk - 7
Servo(12) = Nskk + 5 ' přiřazení proměnných servův
Sed_jedna:
Psc = 2 ' psc návěstí sed1 je 2
If Nskm < 81 Then Nskm_plus: ' pokud je nskm < 81 skoč na nskm_plus
If Nskm > 81 Then Nskm_minus: ' pokud je nskm > 81 skoč na nskm_minus
Sed_dva:
Psc = 3 ' psc návěstí sed2 je 3
If Nskk < 117 Then Nskk_plus: ' pokud je nskk < 120 skoč na nskk_plus
If Nskk > 117 Then Nskk_minus: ' pokud je nskk > 120 skoč na nskk_minus
Sed_tri:
Psc = 4 ' psc návěstí sed3 je 4
If Nskc < 143 Then Nskc_plus: ' pokud je nskc < 143 skoč na nskc_plus
If Nskc > 143 Then Nskc_minus: ' pokud je nskc > 143 skoč na nskc_minus
Wait 1 'čekání na nastavení serv
Goto Postaveni: ' když jsou splněny podmínky výše, skoč na návěstí...
Nskm_plus:
Incr Nskm
Waitms 5
If Psc = 2 Then Sed_dva: ' nskm + 1,počkej pár ms a podle psc skoč dál
Nskm_minus:
Decr Nskm
Waitms 5
If Psc = 2 Then Sed_dva: ' nskm - 1,počkej pár ms a podle psc skoč dál
Nskc_plus:
Incr Nskc
Waitms 5
If Psc = 4 Then Sed:
If Psc = 9 Then Postaveni_dva: ' nskc + 1,počkej pár ms a podle psc skoč dál
Nskc_minus:
Decr Nskc
Waitms 5
If Psc = 4 Then Sed:
If Psc = 9 Then Postaveni_dva: ' nskc - 1,počkej pár ms a podle psc skoč dál
Nskk_plus:
Incr Nskk
Waitms 5
If Psc = 3 Then Sed_tri:
If Psc = 6 Then Postaveni:
If Psc = 8 Then Postaveni_ctyri: ' nskk + 1,počkej pár ms a podle psc skoč dál
Nskk_minus:
Decr Nskk
Waitms 5
If Psc = 3 Then Sed_tri:
If Psc = 6 Then Postaveni:
If Psc = 8 Then Postaveni_ctyri: ' nskk - 1,počkej pár ms a podle psc skoč dál
Goto Nskk_minus
Já tedy v Bascomu neprogramuju, ale předpokládám, že když napíšeš
If Nskc < 95 Then Nskc_plus:
Tak to Nsck_plus je volání procedury s tím názvem (nikoliv skok, ten je GOTO) a protože ta procedura není nikde ukončená (není napsaná jako procedura), nedojde k uvolnění návratové adresy ze zásobníku a ten se postupně zaplňuje až zaplní celou paměť.
to už jsem ověřil a tím to není ...dělá to příkaz DECR, proměnná (1 - preměnná) a INCR; proměnná (1+ proměnná) ...tyhle dva příkazy mi neustále zaplňují paměť, jak jsem před chvílí zjitil
Napadlo mě donutit ho nějak, aby při zaplnění začal paměť přepisovat zase od začátku
A nebylo by lepší postavit program tak, aby k žádnému zaplnění nedocházelo a program korektně pracoval s proměnnými, jak má?
Ty deklaruješ podprogramy, ale v programu je nemáš definovány jako
Sub
..........
..........
End Sub,
takže jako by tam nebyly a ty názvy jsou tam fakt jen jako labely, nic víc. Příslušná pasáž programu pokračuje jen podle podmínky. Návrat z podprogramu za původní příkaz se nikdy nekoná.
K definování jednotlivých bitů portu n je příkaz Config PINn.x, příkaz Config PORTn nastaví všechny bity v portu.
nebo nastav celý port příkazem DDRn =&Bxxxxxxxx , n je název portu, x=1 je výstup, 0 je vstup
'deklarace procedur a funkcí
Declare Sub Cekej ' deklarace procedury Cekej
''''''''''''''' HLAVNI PROGRAM '''''''''''''''''''''''''''''''''''''''''''''''
'různé konfigurace,
'kód který se nemusí opakovat při každém běhu hlavní smyčky
Config Portb.1 = Output
'--------------------------------------------------------------------------
Do ' hlavní smyčka Do-Loop
Set Portb.1
Cekej ' nebo Call Cekej
Reset Portb.1
Cekej
Loop ' jdi na Do
''''''''''''''' KONEC HLAVNIHO PROGRAMU ''''''''''''''''''''''''''''''''''''''
End
'kód podprogramů, procedur a funkcí píšeme až za koncové "End"
'procedura Cekej
Sub Cekej
For I = 1 To 200000
Next
End Sub
Nemůžete odesílat nové téma do tohoto fóra. Nemůžete odpovídat na témata v tomto fóru. Nemůžete upravovat své příspěvky v tomto fóru. Nemůžete mazat své příspěvky v tomto fóru. Nemůžete hlasovat v tomto fóru. Nemůžete připojovat soubory k příspěvkům Můžete stahovat a prohlížet přiložené soubory
Informace na portálu Elektro bastlírny jsou prezentovány za účelem vzdělání čtenářů a rozšíření zájmu o elektroniku. Autoři článků na serveru neberou žádnou zodpovědnost za škody vzniklé těmito zapojeními. Rovněž neberou žádnou odpovědnost za případnou újmu na zdraví vzniklou úrazem elektrickým proudem. Autoři a správci těchto stránek nepřejímají záruku za správnost zveřejněných materiálů. Předkládané informace a zapojení jsou zveřejněny bez ohledu na případné patenty třetích osob. Nároky na odškodnění na základě změn, chyb nebo vynechání jsou zásadně vyloučeny. Všechny registrované nebo jiné obchodní známky zde použité jsou majetkem jejich vlastníků. Uvedením nejsou zpochybněna z toho vyplývající vlastnická práva. Použití konstrukcí v rozporu se zákonem je přísně zakázáno. Vzhledem k tomu, že původ předkládaných materiálů nelze žádným způsobem dohledat, nelze je použít pro komerční účely! Tento nekomerční server nemá z uvedených zapojení či konstrukcí žádný zisk. Nezodpovídáme za pravost předkládaných materiálů třetími osobami a jejich původ. V případě, že zjistíte porušení autorského práva či jiné nesrovnalosti, kontaktujte administrátory na diskuzním fóru EB.