Problémy s AVR Studiem

Ja o tom diskutovat ani nechci, je to davno vyresene a pricina byla odhalena :wink: Proto jsem se te po tehle zkusenostech jen zeptal.

To, v čem jsi už dělal, AVR Studio a ASM. Já vím, je to řehole, ale funguje to na 100% a procák máš plně pod kontrolou do posledního bitu. Dělám v tom už 11 let a vytovřené aplikace mi dodnes fungují bez jakéhokoli škobrtnutí MCU.

99,9% chyb pochází od programátora. Ještě se mi nestalo, aby se poškodil MCU tak, že by zlobily porty. Koneckonců funkci portů mužeš ověřit jednoduchým prográmkem v ASM, je to jen pár řádků.
Simulátory nebo emulátory prakticky nepoužívám. U Atmela to chodí jen na jednoduchoučké příklady, ale jakmile se vytvoří vlastní komplikovanější program, využívající více periferie a interuptů najednou, nikdy to nefunguje, jak má. Je to opravdu na hovno. Zastaví-li breakpoint vykonávání programu, nezastaví timery. Ty přerečou a vyvolají přerušení. Následné krokování je vždy skok na nějaké přerušení. Na většinu chyb se dá přijít, podívá-li se na to človek druhý den ráno s čistou hlavou.

Pokud ti zlobí relé připojené na port, do kterého by program neměl mluvit, může to být např. chybně definovaným pointerm, či deklarací nebo přerušením. Metoda, kterou používám k odhalení chyb, spočívá v postupném zablokování částí programu (pomocí znaku /* */ ) až do okamžiku, kdy to přestane zlobit. Je to sice zdlouhavé, ale vždy to vede k lokalizaci části programu, která to způsobuje.

To kuto: To co píšeš o relátkách, že cvakala jak o život i bez napětí na cívce mi příjde jako z říše pohádek. Promiň, ale příčina je určitě někde jine, než v semotném relé. Nejspíš jde o indukovené napětí do bází spínacích tranzistorů a v důsledku toho relé samovolně přitahovala. Relé nemůže přitáhnou svou kotvu bez zdroje energie, zvláště jde-li o relé na 230V. Kde by se ta energie mohla vzít?

Mno v ASM bych psát moh. Nemám na tom sice tolik praxe jako ty, sice jen asi rok a půl, ale i tak mi to nečiní potíže. Ale pravda je, že třeba aplikaci, kterou píšu nyní pro m644 s grafickým LCD a PS2 klávesnicí a další spoustou periferií, byhc v ASM opravdu psát nechtěl.
Metodu částečného zkoušení programu znám a používám. AVR-GCC neni jediný progra. jazyk, který znám, a tyhle finty mám nacvičené třeba z těch dalších jazyků.
Ten výše zmiňovaný program jsem zkoušel řádek po řádku, až do chvíle, kdy mi opravdu začlo kolidovat _delay_ms() s definicí fce, která v programu nebyla použitá. Když se jedna z těhle dvou věcí zakomentovala, program běžel. Ale to mi nepomohlo.
Program jsem tedy rozkopal a napsal od nuly znova za asi 5 hodin. Nyní to drží tak to snad vydrží.

EDIT: Už tehdy co jsem psal v ASM jsem jednou narazil na problém, kdy kompileru vadil určitý sled instrukcí. Tenhle zdroják byhc ale ještě možná našel, pokud by měl zájem to někdo rozlousknout, proč mi to nešlo. (celý problém spočíval ve vložení jedné instrukce NOP, bez které to nefungovalo)

Tak to se mi taky stalo. Stačilo přidat nebo ubrat několik instrukcí a fungovalo to jinak. A myslím že to bylo zrovna na m644. Po dlouhém trápení a léčení ze stavu nepříčetnosti jsem na to přišel. Instrukce neseděli přesně na přerušovacích vektorech. Některé MCU používají RJMP pro odskok do přerušení tedy kratší 2byteovou instrukci, některé delší JMP 4byteovou instrukci. Použil jsem někde RJMP a NOP a někde JMP. Jenomže někde jsem to NOP vynechal a došlo k posunutí vektorů o jeden word a průšvih byl na světě.
Misto odskoku na JPM došlo na skok do půlky instrukce JMP tedy do jejího druhého wordu, což je adresa iterpretovaná jako kód instrukce.
Se změnou programu se změnil i label této instrukce a tudíž se to pokaždé chovalo jinak.

Ty nepoužíváš .ORG direktivy a nopuješ to ručně? (prasisto :slight_smile: )
Na odskoky z vektorů jsem používal zásadně a vždy rjmp a direktivy ORG.

Teď odbočím od AVR, protože se mi to stalo na x51. Tam totiž bylo “jmp” nahrazováno podle toho, co zrovna stačilo.
Když má člověk v plánu použít několik vektorů za sebou a očekává určitou délku instrukce(překladač si holt někdy najde jinou protože mu zrovna kratší stačí) s tím, že to vyjde, může se to pak stát. Ovšem po takové “nehodě” jsou tam ORGy rychle doplněny :slight_smile:.

Jesli ten program najdeš - kde byl tvůj problém?

Zděšeně jsem zjistil, že ten zdroják od toho zařízení nemůžu najít… Což mě docela štve. Jeden z mých nejleších projektů v AVR-ASM.
kdf.mff.cuni.cz/tabor/2009/image … somira.pdf
Tak se aspoň podívejte, co to bylo. :confused:

:arrow_right: administrator: přiloženy externí soubory
:arrow_right: (Myslím, že zrovna tenhle soubor jentak nezmizí :slight_smile: )
dokumentace_konferencni_casomira.pdf (222 KB)

Techniku ver, never :slight_smile: Nedumej nad tim, nejsem zacatecnik, abych si neporadil s relatkem. Ja tu nehledam radu, ale pisu to jako fakt.
Uz jsem psal, ze alektronika pred relatkama vcetne tranzistoru makala perfektne, denne delam se zarusenym prostredim v prumyslu a tohle identifikovat dokazu. Proste ty kontakty kmitaly samy. Stacil jim pruchod 230V u vedlejsiho relatka. V ty konstrukci slo o prostor, tak tam ten autor dal nejaky drobny relatka Nejakej cinan vyrobil maly relatko a do datasheetu napsal neco co neni pravda (coz je u cinanu mimochodem pravidlo, staci kopie vykonovych tranzistoru z GM, GES, ktery nevydrzej ani katalogovy zatizeni, natoz nejakou rezervu).
Po vymene relatek vsechno v poradku. Ber to jako fakt :slight_smile: Treba si na to nekdy vzpomenes :wink: Snad je to k tomuhle vsechno.

Posílám zdroják knihovny pro PS2_Klavesnici na které pracuji už od ledna tohoto roku. :slight_smile:

Soubor je připojen k příspěvku.

Stručně ke knihovně: Funkce ReadKey a KeyPressed jsou analogické k těm z Pascalu. KeyPressed je true, byla-li stisknuta klávesa; ReadKey čeká na stisk klávesy, a po jejím stisku vrací její kód.

Poradí mi někdo, proč následující konstrukce funguje správně, dochází ke správnému dekódování Extended Keys? (ale smyčka programu je pozastavována, čeká se totiž na stisk klávesy. Já potřebuju smyčku programu mít stáleběžící.

while (1) { PS2_Poll(); i = PS2_ReadKey(); zpracuj(i); }

Následující konstrukcu ale nefunguje. Jednou readkey vrátí číslo klávesy správně (správně dek´duje extended key code z klávesnice) a pak zas třeba několikrát vrátí nesprávně dekódované číslo, a extended key vezme jako normální klávesu. Vypadá to na problém ten, že fukce KeyPressed jakýmsi záhadným zpsůboem (jen někdy, náladově) zasahuje do proměnné PS2_Flag, a maže příznak PS2_EXT, který určuje zda jde o extended nebo standard key.

while (1) { PS2_Poll(); if (PS2_KeyPressed()) { i = PS2_ReadKey(); zpracuj(i); } }

Kdo se bude ochotný mě na to podívat, budu mu vděčný !!
Díky moc!

EDIT: Někdo tu už výše inzeroval, že za podobné věci může špatné zacházení s pointery. Pravda je, že tohle v Cčku moc neovládám.
Ale co konkrétně znamená Warning: “pointer differ in signedness” ? Já si to dovedu akorát přeložit, že mám konfilkt v tom, že někde mám adresu (pointer) se znaménkem a někde bez.
Tam kde si to stěžuje mám vstupy do funkce jako PGM_P, a když do toho vrazím adresu od dat definových pomocí PROGMEM, tak to hází tu chybu s tím “signedness”.
Další zarážející věc je ta, že občas se mi program přeloží, bez jediného warningu, a jindy jich tam mám všech 12 warningů. TO taky nechápu, proč to upozorňuje na tytéž věci jen při některých překladech. Že by zase překladač robil boty ?
EDIT2: warning signedness jsem vyměnil za “makes integer from pointer without a cast”, ale na funkčnosti programu, respektive problémech s PS2_Flag se nezměnilo nic. To jak to blbne vypadá, jak když je to ovlivňováno asynchronní událostí, třeba v přerušení. To tam sice mám, ale všechny proměnné pečlivě definované jako volatile. Jinak to přerušení s PS2_Flag nesouvisí nijak.
EDIT3: Přerušením to není. Teď jsem jej zkusil vypnout. Krom toho že mi nefungovaly věci co na něm byly závislé (logicky, že) se na funkčnosti té knihovny pro klávesnici zas nezměni lo nic. Pořád to vrací náladové výsledky.
PS2kbd.h (6.85 KB)

A k čemu taková komplikace. Jakmile dáš první CSEG, je počítadlo adres nastaveno na 0. následuje jmp RESET a pak přerušovací vektory. Naco zbytečně komplikovat zápis vektorů, když jej můžeš rovnou okopírovat z datasheetu.
Pokud použiješ ORG v DSEGmentu, může dojít k překryvu proměnných a nejsem si jist, že tě na to překladač upozorní.
Stejně tě ORG neochrání před “jistou blbostí”, když použiješ podobný typ MCU, nějaký nový klon, a vektory okopíruješ ze starého programu domnívaje se, že je to stejmé.

To kuto: Jestli si vzpomeneš, napiš co to bylo za relé. Podle toho co píšeš, taky by mohlo dojít k sepnutí např. úderem do desky, mají-li relé příliš měkké kontakty. To by se pak jednalo o prvotřídní aušus.

Na prvni pohled tam nic spatne nevidim, jen michas signed a unsigned hodnoty. Treba funkce readkey je char, ale vraci PS2_ASCII, ktera je unsigned char. U tech kodu extend klaves mas nastaveny 7.bit, coz u signed je znaminko. Vetsinou si s tim kompiler poradi, ale muze to byt v tom. Zkus tem extend klavesam dat volny kody pod 128 nebo sjednotit vsechno na unsigned, protoze 128 v signed je zaporny cislo.

Ano, máš pravdu, míchám tam signed/unsigned.
Defaultní char je ale unsigned (pro rýpaly: mám to tak nastavené), takže by to ničemu vadit nemělo. Přesto to díky za nápad, zkusím co to provede, ale nejspíš nic.
Kdybys rozumněl ascii, bys věděl, že pod 128 tomu dát nemůžu. Ale díky za připomínku. I taky by to nebylo řešení problému, ale dělání rovnáku na ohýbák.
Díky, že ses na tu knihovnu podíval.

Z ceho vychazis, ze si myslis ze nevim co je ascii? :laughing:
V tom tvym programu to klidne pod 128 dat muzes, protoze minimalne polovinu kodu tam mas jako “0”. A taky urcite nebudes pouzivat vsechny kody 0-31, coz jsou vetsinou ridici znaky terminalu. Jde jen o to, si tem klavesam priradit kody, ktery jinak pouzivat nebudes, zadny rovnak na ohybak. Ale jak myslis :slight_smile: Netvrdim, ze je to reseni, jen napad po prohlidnuti toho kodu. Ale jestli mas urcite vsechny chary unsigned, tak to tim nebude no.

Ja bych tu obsluhu klavesnice ale delal jinak. Vadilo by mi tam to zbytecny volani PS2_Pool. Je to tam tak nejak navic. Dal bych to rovnou do toho preruseni a chtelo by to i nejaky buffer, takhle by mohly nektere stisky klaves zmizet ve ztracenu.

Je to rovnák na ohýbák, protože je to zcela úmysné obcházení problému, ne však jeho řešení.
To že tam mám zatím nuly neznamená, že tam budou pořád.

ok, tvuj nazor :slight_smile: Az na to prijdes, dej vedet.
Ptal ses na kod, ktery jsi postnul, a tam jsem videl nuly. Tudiz jsem z toho vychazel :wink:

No můj názor, ale uznej sám, že řešit problém tím, že ho obejdu snížením rozsahu použitých čísel, spíš řešení není. Ty nuly tam jsou proto, že vyrábět tyhle dekod. tabulky je opravdu meganuda. Zvlášť proto, že na netu nejsou.
Však v pohodě. Mě spíš zajmá, co má být to, že mi to pro extended key jednou vrátí správně dekodované dle tabulky specials, a podruhé to vrátí ascii kod dle ten tabulky standardni. A ještě ten jev, že je to jaksi “náhodné”, jaký který kód mi to vrátí.

Zkus vyradit to volani PS2_Pool v tom PS2_readkey, pokud pred tim mas keypressed. To uz vis, ze klavesa stisknuta byla. Se mi zda, ze se tam hadaj ty 2 volani Poolu. Jednou pred keypressed a znova v readkey. Jestli ti to volani v readkey nezmeni ty promenny.
Na to by bylo dobry nejakym zpusobem si vypisovat hodnoty tech promennych, abys videl kdy presne se zmenily. Ja to resim pres uart a terminalem ve win. Nebo na nejaky displej, jestli u toho mas.

EDIT: Nebo jeste moznost… vracet kod klavesy rovnou pomoci keypressed a 0 mit jako nestisknuto. Nebo 255, kdyz mas v ty tabulce hodnoty 0, to uz je jedno. Proste mit tam jen jedno volani Pool od testovani stisku az po precteni kodu.

To neni Pool (bazén) ale Poll (~získej).
Však pokud vím, že už klávesa stisknutá byla (třeba se předem zeptám tím keypressed), tak mám nastavený flag EVDOWN, a ten vnitřek cyklu while se nespouští. Ten cyklus while (Poll-ování) tam být musí, aby se funkce readkey dala využít jako “čekej na klávesu”.
Jsou to fce analogické k těm v Pascalu. To znáš ?

jj, tu podminku v tom while jsem nejak prehlid :slight_smile: Nejakej debug system na vypisy si udelej stejne, je to dobra vec.
Ano pascal znam, zacinal jsem s nim nekdy pred 20 lety. Ze se ty funkce podobne jmenujou, jeste nic neznamena.

Jinak otazky typu “to znas?” nebo “kdybys znal ascii” pusobi trosku samolibe a vypada to, ze vlastne vis vsechno sam nejlip :wink:

Takze hodne stesti pri tvem snazeni, snad to brzy rozchodis.

*Nejakej debug system na vypisy * - tím se myslelo co ?
Mě připadáš trochu zmatený. Nejdřív mi řekneš, abych Poll vyhodil z té fce readkey a potom mi řekneš že jsi to vlastně přehlédl. Tak co tedy?
Když už jsi načal tu samolibost, cos myslel tím Ze se ty funkce podobne jmenujou, jeste nic neznamena. ? To jako že nebudu schopný naprogramovat obdobně pracující funkce ? (O tom, že by to měly být analogie na ta Pascalské, jsem se tu už někde zmiňoval, domnívám se, že v příspěvku ke kterému jsem připojil soubor té knihovny).

Opravdu nemám zapotřebí se tady s tebou hádat.