Vítejte na Elektro Bastlírn?
Nuke - Elektro Bastlirna
  Vytvořit účet Hlavní · Fórum · DDump · Profil · Zprávy · Hledat na fóru · Příspěvky na provoz EB

Vlákno na téma KORONAVIRUS - nutná registrace


Nuke - Elektro Bastlirna: Diskuzní fórum

 FAQFAQ   HledatHledat   Uživatelské skupinyUživatelské skupiny   ProfilProfil   Soukromé zprávySoukromé zprávy   PřihlášeníPřihlášení 

Přetečení SRAM

 
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Programování PIC, ATMEL, EEPROM a dalších obvodů
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
Vojrik



Založen: Mar 03, 2012
Příspěvky: 8

PříspěvekZaslal: so březen 03 2012, 8:12    Předmět: Přetečení SRAM Citovat

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 Wink
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Andrea



Založen: Sep 07, 2007
Příspěvky: 9340

PříspěvekZaslal: so březen 03 2012, 8:26    Předmět: Citovat

"On" dělá jen to, co ty mu v programu řekneš, aby dělal. A co mu v tom programu říkáš, víš jen ty.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Vojrik



Založen: Mar 03, 2012
Příspěvky: 8

PříspěvekZaslal: so březen 03 2012, 8:33    Předmět: Citovat

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.



$regfile = "m32def.dat" ' mikroprocesor
$crystal = 16000000 ' frekvence v Hz


Config Servos = 12 , Servo1 = Portd.0 , Servo2 = Portd.1 , Servo3 = Portd.2 , Servo4 = Portd.3 , Servo5 = Portd.4 , Servo6 = Portd.5 , Servo7 = Portc.2 , Servo8 = Portc.3 , Servo9 = Portc.4 , Servo10 = Portc.5 , Servo11 = Portc.6 , Servo12 = Portc.7 , Reload = 10
Config Portd.0 = Output
Config Portd.1 = Output
Config Portd.2 = Output
Config Portd.3 = Output
Config Portd.4 = Output
Config Portd.5 = Output
Config Portc.2 = Output
Config Portc.3 = Output
Config Portc.4 = Output
Config Portc.5 = Output
Config Portc.6 = Output
Config Portc.7 = Output
Config Porta.7 = Output ' nastavení portů --> IN, OUT

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(Cool = 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

'-------------------------------------------------------------------------------

Postaveni:
Psc = 5 ' psc návěstí postaveni je 5
Servo(3) = Nskk
Servo(6) = Nskk - 5
Servo(9) = Nskk - 7
Servo(12) = Nskk + 5
Postaveni_jedna:
Psc = 6 ' psc návěstí postaveni je 6
If Nskk < 110 Then Nskk_plus: ' pokud je nskk < 110 skoč na nskk_plus
If Nskk > 110 Then Nskk_minus: ' pokud je nskk > 110 skoč na nskk_minus
Waitus 200
Postaveni_dva:
Psc = 7
Servo(2) = Nskc - 5
Servo(5) = Nskc
Servo(Cool = Nskc - 7
Servo(11) = Nskc
Servo(3) = Nskk
Servo(6) = Nskk - 5
Servo(9) = Nskk - 7
Servo(12) = Nskk + 5
Postaveni_tri:
Psc = 8 ' psc návěstí postaveni je 8
If Nskk < 95 Then Nskk_plus: ' pokud je nskk < 95 skoč na nskk_plus
If Nskk > 95 Then Nskk_minus: ' pokud je nskk > 95 skoč na nskk_minus
Postaveni_ctyri:
Psc = 9 ' psc návěstí postaveni je 9
If Nskc < 95 Then Nskc_plus: ' pokud je nskc < 95 skoč na nskc_plus
If Nskc > 95 Then Nskc_minus: ' pokud je nskc > 95 skoč na nskc_minus
Wait 1
Goto Rozcest:

End
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Andrea



Založen: Sep 07, 2007
Příspěvky: 9340

PříspěvekZaslal: so březen 03 2012, 9:03    Předmět: Citovat

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ěť.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Vojrik



Založen: Mar 03, 2012
Příspěvky: 8

PříspěvekZaslal: so březen 03 2012, 9:10    Předmět: Citovat

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
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Crifodo



Založen: Oct 11, 2005
Příspěvky: 15005

PříspěvekZaslal: so březen 03 2012, 10:05    Předmět: Citovat

Vojrik napsal(a):
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
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
AB1



Založen: Nov 23, 2009
Příspěvky: 312

PříspěvekZaslal: so březen 03 2012, 16:57    Předmět: Citovat

citace:
to už jsem ověřil a tím to není

Jistěže je. Stačí v simulátoru sledovat jak pěkně roste stack.

Celý program mi svým stylem připomíná první programy které se začaly objevovat v Amatérském rádiu někdy v sedmdesátých letech.

Basic udělal od té doby značný pokrok.
Dnes už není třeba poskakovat po kódu sem a tam příkazem goto.

Příklad zápisu programu:
(Všimni si jak správně napsat proceduru.)

kód:
$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 68
$swstack = 32
$framesize = 32

'deklarace proměnných
Dim I As Long

'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
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Vojrik



Založen: Mar 03, 2012
Příspěvky: 8

PříspěvekZaslal: so březen 03 2012, 18:57    Předmět: Citovat

Máte pravdu, tak Vám děkuji, už to konečně funguje a já se můžu pustit do chůze Very Happy Very Happy Very Happy ...snad se povede
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Programování PIC, ATMEL, EEPROM a dalších obvodů Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
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

Powered by phpBB © 2001, 2005 phpBB Group
Forums ©
Nuke - Elektro Bastlirna

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.


PHP-Nuke Copyright © 2005 by Francisco Burzi. This is free software, and you may redistribute it under the GPL. PHP-Nuke comes with absolutely no warranty, for details, see the license.
Čas potřebný ke zpracování stránky 0.20 sekund