Program pro PIC16F84A

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
forbidden
Příspěvky: 9442
Registrován: 14 úno 2005, 00:00
Bydliště: Brno (JN89GF)
Kontaktovat uživatele:

Program pro PIC16F84A

#1 Příspěvek od forbidden »

Dělám teď na jednom programu a mám zajímavej problém, nejspíš začátečnickej.
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.
Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 00:00

#2 Příspěvek od Andrea »

Ten krám má 8-úrovňový hardwarový stack, možná máš příliš mnoho volání procedur vnořených do sebe. A paměť programu není u PICů v bytech, ale ve slovech, v tomhle případě 14 bitů širokých.
Uživatelský avatar
forbidden
Příspěvky: 9442
Registrován: 14 úno 2005, 00:00
Bydliště: Brno (JN89GF)
Kontaktovat uživatele:

#3 Příspěvek od forbidden »

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.
Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 00:00

#4 Příspěvek od Andrea »

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?
Uživatelský avatar
forbidden
Příspěvky: 9442
Registrován: 14 úno 2005, 00:00
Bydliště: Brno (JN89GF)
Kontaktovat uživatele:

#5 Příspěvek od forbidden »

Padá simulátor a i když ten program nacpu do aplikace, tak vidím, že se zacyklí.
Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 00:00

#6 Příspěvek od Andrea »

A to v tom simulátoru nevidíš co to dělá, kdy a proč to cpe něco do zásobníku?
Uživatelský avatar
forbidden
Příspěvky: 9442
Registrován: 14 úno 2005, 00:00
Bydliště: Brno (JN89GF)
Kontaktovat uživatele:

#7 Příspěvek od forbidden »

Až tak dobře zatím v MPLABu dělat neumím, Hardware Stack jsem si zobrazil, ale když spustím simulaci, tak to po záseku ukazuje Stack Level 0 Empty a ostatní levely s nějakýma adresama, aly ty tam jsou i po resetu stejný, takže nevím jak to myslí.

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 8O
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 :evil:
Uživatelský avatar
petus
Příspěvky: 594
Registrován: 12 led 2009, 00:00
Bydliště: Pelhřimov
Kontaktovat uživatele:

#8 Příspěvek od petus »

PICům vůbec nerozumím ,takže to co napíšu může být blbost.Ale u atmelu (89C2051-assembler{Nebo to byla ATmega8???}) byli rozdělený skoky na dlouhé a krátké a pokud skok přesáhl určitou hranici, krátký skok "nefungoval" a musel se použít dlouhý.
Pokud je to blbost tak mě omluvte... :)
Pokud něco chcete a neodpovídám,pošlete SZ :)
https://chiptron.cz - novinky ze světa elektro (Arduino, Raspberry Pi, ESP8266, STM32, ESP32...)
Peťus
Uživatelský avatar
Crifodo
Příspěvky: 14779
Registrován: 11 říj 2005, 00:00

#9 Příspěvek od Crifodo »

Andrea píše:Ten krám má 8-úrovňový hardwarový stack, možná máš příliš mnoho volání procedur vnořených do sebe. A paměť programu není u PICů v bytech, ale ve slovech, v tomhle případě 14 bitů širokých.

kdybyste se drželi slušných tradičních procesorů... :evil:
Uživatelský avatar
forbidden
Příspěvky: 9442
Registrován: 14 úno 2005, 00:00
Bydliště: Brno (JN89GF)
Kontaktovat uživatele:

#10 Příspěvek od forbidden »

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...
Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 00:00

#11 Příspěvek od Andrea »

Crifodo píše:kdybyste se drželi slušných tradičních procesorů... :evil:

Já to říkám pořád, PIC není normální procesor :twisted:
Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 00:00

#12 Příspěvek od Andrea »

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?
Uživatelský avatar
forbidden
Příspěvky: 9442
Registrován: 14 úno 2005, 00:00
Bydliště: Brno (JN89GF)
Kontaktovat uživatele:

#13 Příspěvek od forbidden »

Nic nepodtíká, teď si to krokuju. Nefunguje mi třeba toto:

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.
Naposledy upravil(a) forbidden dne 20 bře 2010, 22:02, celkem upraveno 1 x.
Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 00:00

#14 Příspěvek od Andrea »

ADDWF PCL,F modifikuje program counter ne? Tak to skočí někam podle hodnoty ve W a to záleží kolik máš ve W. A pokud při tom sčítání dojde k přetečení, tak to se ignoruje, nepřene se se do PCH.
Uživatelský avatar
forbidden
Příspěvky: 9442
Registrován: 14 úno 2005, 00:00
Bydliště: Brno (JN89GF)
Kontaktovat uživatele:

#15 Příspěvek od forbidden »

Chybička se vloudila, místo ADDLW, má být MOVLW.

Funguje to tak, že do W dám pozici dat v tabulce, kterou chci zase ve W při návratu z tabulky najít. Chyba může nastat, když ve W je větší hodnota jak tabulka, to pak zhroutí program, ale to mám ohlídaný
Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“