Program pro PIC16F84A
Moderátor: Moderátoři
- forbidden
- Příspěvky: 9442
- Registrován: 14 úno 2005, 00:00
- Bydliště: Brno (JN89GF)
- Kontaktovat uživatele:
Program pro PIC16F84A
Jakmile mi délka programu přesáhne nějakou hranici, odhadem 450 B. Začne mi program havarovat na Stack ower flow. Na začátku programu volám nějaký procedury co mám někde u konce. Začalo to tak, že jsem přidal doprostřed programu nějakou tabulku, která se zatím vůbec nepoužívá, takže i kdyby v ní byla chyba, neprojeví se. Prostě, jako kdybych si ty procedury odsunul někam, kam na ně nedosáhnu, nebo co. Přitom paměť programu je až 1024 B, takže mám ještě bohatě místa.
Nějak to nechápu, v programování jsem "věčnej začátečník" akorát teď jsem se pustil do takovýho většího díla.
Díky za pomoc.
- forbidden
- Příspěvky: 9442
- Registrován: 14 úno 2005, 00:00
- Bydliště: Brno (JN89GF)
- Kontaktovat uživatele:
Jen pro upřesnění, píšu to v assembleru a v prostředí MPLAB 8.43.
forbidden píše:Volání procedur z jiných procedur si celkem hlídám, to mám tak maximálně do tří, nebo čtyř úrovní. Mě hlavně zaráží to, že ta část, kterou jsem tam vložil se zatím vůbec nepoužívá, takže to vnoření ani nemá jak ovlivnit. Bez ní to funguje dobře.
Jen pro upřesnění, píšu to v assembleru a v prostředí MPLAB 8.43.
A jak ti to může havarovat na stack overflow, když to píšeš v assembleru? To ti padá překladač nebo simulátor?
- forbidden
- Příspěvky: 9442
- Registrován: 14 úno 2005, 00:00
- Bydliště: Brno (JN89GF)
- Kontaktovat uživatele:
Bez toho vloženýho kusu kódu, se to po spuštění simulace zastaví na testu stisknutí tlačítka, což je v pořádku. Když tam dám ten kus nesouvisejícího kódu, tak to zhavaruje v čekací smyčce.
Tak už to vůbec nechápu, hraju si s krokováním, animacema běhu a zjistil jsem, že mi program z neznámýho důvodu skáče na začátek paměti programu ORG 0. Proto se to pak zacyklí, ale ve stacku návratovou adresu 0 nevidím
Zrušil jsem všechny čekací smyčky, abych nemusel vyskakovat při krokování z cyklů ale stejně jsem na nic nepřišel.
Kdyby byl někdo ochotnej a uměl v MPLABU odkrokovat ten program a zjistit, proč to skáče kam nemá, byl bych moc vděčnej.
Tak poslední vývoj je takovej, že jsem odmazával části nepotřebnýho kódu a při 406 slovech programu to funguje, ale při 407 slovech už ne. A je jedno co je to za instrukce, klidně NOP. Takže mu asi vadí skoky přes moc dlouhý kusy kódu
Pokud je to blbost tak mě omluvte...
https://chiptron.cz - novinky ze světa elektro (Arduino, Raspberry Pi, ESP8266, STM32, ESP32...)
Peťus
forbidden píše:petus píše:...musel se použít dlouhý.
Tím to asi nebude, takovou instrukci neznám. Zatím jsem trochu pokročil. Vypadá to, že za to může příkaz RETLW. Ten by měl skočit zpět na místo odkud byl volán, ale skočí úplně jinam, nechápu...
A nepodtejká ti ten zásobník? Skutečně máš ten RETLW na konci kódu který voláš CALLem?
- forbidden
- Příspěvky: 9442
- Registrován: 14 úno 2005, 00:00
- Bydliště: Brno (JN89GF)
- Kontaktovat uživatele:
MOVLW D'0' (opravena chybička)
CALL TABULKA
-
-
-
TABULKA ADDWF PCL,F
RETLW B'01010101'
No a po vykonání instrukce RETLW se to nevrátí pod CALL TABULKA, ale někam doprostřed programu.
Ale jen, pokud je mezi CALL TABULKA a TABULKou hodně kódu.