Termostat pre liahen

Pochváľte sa ostatným čo zaujímave ste vyrobili alebo práve vyrábate!

Moderátori: psichac, Moderátori

Používateľov profilový obrázok
xmilos
Ultimate člen
Ultimate člen
Príspevky: 3671
Dátum registrácie: 04 Máj 2011, 00:00
Bydlisko: Povazie

Termostat pre liahen

Príspevok od používateľa xmilos » 06 Mar 2014, 14:48

Tak prispejem niecim mensim.
Bol som osloveny s poziadavkou na opravu termostatu v domacej liahni. Jednalo sa o klasicku spolahlivu mechaniku - kombinacia mikrospinaca + duta membrana s nakym plynom + kontrolne neranie klasickym ortutovym teplomerom. Regulator ako taky fungoval, ale mal vacsiu hystereziu ako bolo dovolene (< 1°C). Obhliadkou bolo zistene, ze oprava povodneho riesenia je nerealna
Kedze bolo na to dost casu ( doviezol som to niekedy pred rokom ) priebezne som analyzoval rozne navrhy. Dolezite bolo aby sa dali vyuzit "suplikove zasoby", pripadne dostupny material. V dnesnej dobe vsak "dostupny material" je asi vsetko. Potom vystava otazka co volit z toho nepreberneho mnozstva. Preto vzislo niekolko navrhov, v ziadnom pripade si nemyslim ze prave najoptimalnejsich. Samotne zapojenie, konstrukcia ma tiez do dokonalosti daleko.
Navrh c.1
Najst "nieco"v malom puzdre s integrovanym meracom teploty a binarnym vystupom. To sa jednorazovo naprogramuje - hotovo. Podarilo sa mi nieco najst, ( nechcite po mne typ ) ale navrh zapadol pre komplikovane programovanie.
Navrh c.2
To same ako c.1, ale vyuzit k tomu integrovany snimac teploty v PIC - ku. Ako volba teploty by sluzil potenciometer s nakou stupnicou. Meranie teploty nemolo potrebne, elektronika by nahradzala povodny mechanicky termostat s porovnavanim nakej ciselnej hodnoty z tepelneho snimaca s polohou potenciometra. Mal som k dispozicii nake PIC 16F1xxx v DIL 16, ktore toto meranie malo integrovane. Skusanie dopadlo vcelku dobre, rozlisenie bolo zhruba 0.5 °C co pre dane ucely postacovalo. Problem bol vsak v zotrvacnosti. Tak prisiel pokus s PIC v puzdre DIL8. Zotrvacnost mensia, avsak stale velka. Povodne som uvazoval aj s SMD, ale k tomu uz nedoslo.
Navrh c.3
Tak nakoniec som otvoril suplik a nasiel z jedneho velmi stareho projektu nake snimace a jeden tento: http://www.analog.com/static/imported-f ... P03_04.pdf. Prve pokusy dopadli nad ocakavanie. Staci presne ociachovat oscilator a meria to na desatinu °C. Tak volba padla na klasiku MCU + LCD + .... Rozpocet som neriesil, bolo jasne ze oprava je absolutne nerentabilna a pustil som sa do toho skor ako studium moznosti PIC a ako nova vyzva - regulacia. Okolo regulacie teploty sa toho popisalo vela, projektikov som videl dost, ale nestretol som sa s dostatocnym dotiahnutim samotneho procesu regulacie, tak som si to chcel skusit.
Regulacia.
Uz ked prislo na riesenie c MCU a meranim teploty, regulacia sa dala zrealizovat akakolvek.
Dvojpolova ( zehlickova ) regulacia:
Velmi zauzivane pohodlne riesenie. Avsak ak tam je uz MCU pride mi to ako riesenie v casovej tiesni, inak len tak trosku lajdackost.
Spojita PID regulacia linearnych systemov.
Je pravda, ze pre dane ucely je tento sposob regulacie zbytocny, ale ako som spominal, islo skor o studijny projekt. O PID je popisane mnoho a ak uz mam v tych svaboch naky volny matematicky vykon, treba sa do nej pustit. Malo kedy sa vsak stretavam ( a zial aj v profesionalnej praxi ) o skutocne dotiahnutom odladenom systeme spojitej regulacie. Spojite riadenie vykonu tepelneho telesa som volil "PWM" spinanie s periodou (1/50Hz) * 255 samozrejme so spinanim v nule. Zapojenie je uplne bezne, nie je k tomu co dodat. Rozobral bych navrh samotneho PID regulatora.
Navrh PID.
Samotny navrh je slusna matematicka alchimia ( riesenie diferencialnych rovnic ), preto sa pokusim velmi zjednodusene popisat strucny navod ( nieco na studim: people.tuke.sk/ivo.petras/tar/spojite/TAR_SKR1a3.pdf‎ )
Zaklad je dostatocna nalyza sustavy - poznanie co idem regulovat ( v nasom pripade "hrniec liahne" s vyhrievacou spiralou a meranim ). Pre tepelne deje postaci vysetrenie prechodovej charakteristiky ( ako sa zmeni teplota v case po zapnuti spiraly na X% z plneho vykonu ). Pri jej vysetrovani je potrebna funkcna cast PWM ovladania kurenia. Spustil som kurenie na 25%, nechal ustalit teplotu, zvysil na 75% a zaznamenaval teplotu az do ustalenia. O pociatocnych a konecnych hodnotach pri tomto vysetrovani sa literatury roznia. Je dolezite, aby sa tato ch-ka robila pri priblizne rovnakych podmienkach ako bude zariadenie pracovat. V mojom pripade sa tu vniesla urcita chyba, pretoze som to meral v chladnej dielni. Z tejto ch-ky sa priamo pomocou niektorej z metod ( Strejc, Broid,... ) najde "vzorec" reprezentujuci nasu sustavu, tkoru sa pokusime regulovat. Z predchadzajuceho studia som mal k dispozicii SW ( DP ), ktory umoznoval z nameranej prechodovej ch-ky vysetrit sustavu, urcit priamo koeficienty P,I,D, aj ich doladit pomocou vysledneho priebehu regulacie. Zial tento SW je nedotiahnuty, obsahuje chyby, takze parametre P, I, D som urcil len priblizne. Prisiel na rad vsemocny internet, nejake simulacne programy som nasiel, nic vsak co by riesilo moj projekt. Tu stoji za zmienku jediny kvalitny volne pristupny SW pre navrh PID avsak iba pre Raspberry-pi http://www.pidlab.com/cs/. Tak neostalo nic ine, len siahnut po nakej simulacii - dostal som tip na scilab. Takze nastudovat a modelovat. Vysledok z modelovania:
Sim2.png
a nasimulovany priebeh regulacie ( aky bude vyvoj teploty po zadani skokovej zmeny poziadavky - uz so zapojenym regulatorom! )
Odozva.png
Zial ak je na projekt dostatok casu, clovek to stale odklada az do doby, nez je nan malo casu :--). Tos potom sa musi ponahlat a na tu najdolezitejsiu cast mi neostalo moc casu. Navrhnuta regulacia ( ku dnu prvej zmienky tu ) iba PI splnuje s prehladom poziadavky liahne ( po ca 60 minutach sa hodnota ustali na presnych nastavenych ( testoval som 35.0 ) dalej sa nemeni a nemeni sa podla simulacie ani integracna zlozka, avsak prechody potrebuju este dopracovat.
Prílohy
Reg1.png
IMAG0531.png
0
Naposledy upravil/-a xmilos v 06 Mar 2014, 15:54, upravené celkom 2 krát.

Používateľov profilový obrázok
xmilos
Ultimate člen
Ultimate člen
Príspevky: 3671
Dátum registrácie: 04 Máj 2011, 00:00
Bydlisko: Povazie

Re: Termostat pre liahen

Príspevok od používateľa xmilos » 06 Mar 2014, 15:17

Schema ma jednu chybu, na vystup z U2 ( TMP03 ) je nutne zavesit do + este jeden odpor, PulUp nestaci.
Hodnoty su asi jasne.
Zaujemcom poskytnem zdrojak PCB, zial aj v nom je este chybicka. Privitam aktivnu ucast na upravach.
Prílohy
Schema.png
Pcb.png
0

Softy
Stály člen
Stály člen
Príspevky: 199
Dátum registrácie: 18 Mar 2007, 00:00
Vek: 33

Re: Termostat pre liahen

Príspevok od používateľa Softy » 06 Mar 2014, 20:08

Pekná práca !
Ja len upozorním, do budúcna:
Nie je možné riešiť spojitý prenos (prenosová funkcia v "s" oblasti) v diskrétnych zariadeniach (uPC) takto napriamo. PID je spojitý regulátor (analógový) tj. je možné ho zostaviť napr. pomocou operačných zosilňovačov... Kdežto pre riadenie v uPC je potrebný tzv. PSD. Parametre PID (K,Ti,Td) sa dajú pomocou jednoduchých vzorcov prepočítať na par. PSD (q0,q1,q2 alebo ine označenia) ... Rozdiel je v tom že pri PSD sa počíta i s periódou vzorkovania celého systému, tá musí byť dostatočne nízka na to aby regulátor stíhal reagovať na zmeny, inak môžu nastať oscilácie. Tu to funguje - práve pre to, lebo tá liaheň je pomerne pomalá.

Inak čo sa týka identifikácie systému, tepelný systém sa zvyčajne aproximuje prenosovou f. 1. rádu, ak snímač a AČ nie sú lineárne, tak možno ešte 2. až 3. rádu (záleží od požiadaviek/presnosti atd.). Teda ak stačí 1 rád, tak najjednoduchšie je odmerať si prechodovú char. a pomocou Tu,Tn cez Ziegler -Nichols vypočítať PI parametre. Ak 2. rád tak nájsť inflexný bod -> Tu,Tn a potom ZN alebo iná.
Pri vyšších rádoch je už potrebná nejaká regresná metóda. V Matlabe to ide veľmi ľahko cez ARX / ARMAX, no myslím že free asi nie je (nepozeral som).

To len tak v skratke :)
0
Teória bez praxe je nanič.

Používateľov profilový obrázok
xmilos
Ultimate člen
Ultimate člen
Príspevky: 3671
Dátum registrácie: 04 Máj 2011, 00:00
Bydlisko: Povazie

Re: Termostat pre liahen

Príspevok od používateľa xmilos » 06 Mar 2014, 21:03

Som rad, ze sa niekto fundovany ozval.
Ano operator (s) je pre spojite systemy. Ale tymto sposobom som opisal iba regulovanu sustavu ( ktora je analogova ) a riadim ju procesom, ktory som diskretizoval, bez pouzitia (z) . A to skor koli rychlosti, pretoze nemam scilab nastudovany a shcel som proces napodobnit kodu, ktory tam mam. Schemu v simulacii uz mam doplnenu o D zlozku, riesim este pociatocny stav I zlozky, resp optimalizujem Wind Up.
Myslis, ze bys mohol tuto situaciu na "matlabit" :--) ?
Mne z prechodovej ch-ky vysla sustava 2. radu. Na zaciatku je tam mierne oneskorenie ( pocitam zotrvacnost telesa ).
Prechodova.png
Inak podla p. Cecha z uvedeneho web - u sa ma robit prechodovka na "drobnejsie" (0-20%, 20 - 40% ...)
Mno a zaujimavost, v skole nas ucili ze zosilnenie je (Yoo - Yo)/(Xoo - Xo) a asi to ma byt Yoo/Xoo.
Kedze som ziskal este tyzden, budem este optimalizovat.

Mal som jeden zaujimavy problem a chcel bych poziadat o radu:
pri zaruseni vystupu z U2 ( prstom ) okrem spatneho merania mi procesor nak havaroval. Nemam spusteny watch dog, kod nie je ani zdaleka optimalizovany. "PWM" z U2 je rozpoznavane Gate funkciou Timer1.
0

Softy
Stály člen
Stály člen
Príspevky: 199
Dátum registrácie: 18 Mar 2007, 00:00
Vek: 33

Re: Termostat pre liahen

Príspevok od používateľa Softy » 06 Mar 2014, 22:44

Nemusíš nutne riešiť celu sústavu v "z" pokiaľ nechceš použiť algoritmy na priamy výpočet koef. PSD (Dead-Beat s/bez obmedzenia, PolePlacement, Modálne riadenie).
V niektorých prípadoch (ako aj tento) sa koef. môžu prepočítať. Tak dostaneš fyzikálne rovnocenný (ekvivalentný) diskrétny reg. k analogovému.
Počiatočné podmienky sa vzťahujú na počiatočný stav sústavy, tj. v čase 0. Preto ak sústava začína (zapne sa napájanie) napr. z izbovej teploty 20°C, udáva sa táto. Ale to sa udáva pre integračnú zložku - PP integrátora, v PSD je sumačná. (Ale prásknuť do kódu 20 nemusí fungovať, môžeš pracovať s inými "inžinierskymi jednotkami").
Anti-WindUp je len blbé orezanie - obmedzenie sumačnej/integračnej zložky regulátora aby regulátor sa "nezahltil" po rýchlom spáde teploty a teda nasčítavania regul. odchýlky, to spôsobuje to, že regulátor dáva na výstup maximum čo vie aby rýchlo vykompenzoval chybu, avšak i po zmenšení reg. odchýlky práska na výstup vysoké hodnoty lebo integračná zložka je stále veľká a klesá pomalšie. Z toho plynie záver že stačí tu sumačnú zložku jednoducho NULOVAŤ, a to vtedy ak vypočítané hodnoty akč. zásahu sú väčšie/menšie ako maximálne/min možné. Tj ak je vypočítaná hodnota 120 a výstup je v rozsahu 0 - 100 tak vynulujeme sum. zložku, to iste ak vyšlo -10.
Nasimulovať sa v Matlabe dá všetko ohľadom tohto.

Čo sa týka tej prechodovej charakteristiky, nie je tam zrejmá ustálená hodnota (trebalo počkať), viem, na tepelných systémoch to trvá i hodiny a medzitým sa zmenia vonkajšie podmienky.
A áno, so vším všudy (snímač + akčný člen + sústava) to vypadá na druhý rád.
To čo vás učili v škole je dobre, akurát je to pre odchýlkový model, tj. model pre konkrétny pracovný bod. Zosilnenie sa určuje ako pomer y(nekonečno) ku u(nekonečno).

Čo sa týka toho, koľko dať na vstup ako jednotkový skok. Matematicky je to jedno, tam sa to vynásobí, obmedzenie je jednak v HW, na 100% vstupu to asi dlhodobo nezvládne. Alebo narazíme na nelinearity - ustálená hodnota/model by bola príliš vzdialená od toho nášho pracovného bodu - pracovnej teplote.
Ak by si vypočítal hoc i 4 prenosovky pre 4 jednotkové skoky pri u(0.2) ,u(0.4),u(0.6) vyšli by ti mierne odlišné koefic. nie len kvôli šumu/rušeniu a zmenených vonkajších podm. ale i kvôli nelinearite samotného systému. Silne nelineárny systém je problém regulovať v celom rozsahu len s jednými koefic. PSD/PID. Preto sa linearizuje v pracovných bodoch , pre každý z nich iné koef. a rieši sa to napr i prepínaním koef. regulátora za behu. Ale to nie je tvoj problém, to len na okraj píšem.

Tu je napríklad mnou nameraný priebeh teploty mikropájky pre jednotkový vstup - 10,88V cca. Nie je to nijako kalibrované, len som to meral pre študijné účely, v čase keď som ešte mal čas si rozpracovávať projekt adaptívneho PSD regulátora teploty s fuzzy.
X osa je čas v sekundách, Y teplota v °C
Obrázok

EDIT: 1
0
Naposledy upravil/-a Softy v 07 Mar 2014, 16:21, upravené celkom 1 krát.
Teória bez praxe je nanič.

Používateľov profilový obrázok
xmilos
Ultimate člen
Ultimate člen
Príspevky: 3671
Dátum registrácie: 04 Máj 2011, 00:00
Bydlisko: Povazie

Re: Termostat pre liahen

Príspevok od používateľa xmilos » 07 Mar 2014, 07:07

Softy
diky za prispevok.

Ano, co sa tyka krivky mohol som este pockat ( meranie trvalo 72 minut ), ten narast bol uz minimalny. Nemam presny obraz a problem je v okolitej teplote. Krivku som meral v dielni, kde je chladno, skusku som robil v byte a je to poznat.

S tym Wind - upom je pekny dokument: http://www.isep.pw.edu.pl/ZakladNapedu/ ... windup.pdf.
Tento dokument naznacuje, viacero rieseni. Zaujimave je ze nestaci iba obmedzit integracnu znozku, ale jej hodnota je "obrazom" e{t} a u(t). Simuloval som pre rozne pociatocne hodnoty integracnej zlozky ( podla schemy ) a kontroloval vyvoj samotnej I zlozky a samo vystupu. Ukazalo sa, ze pre rozne pozadovane teploty, resp rozne ocakavane konecne hodnoty I v ustalenom stave je potrebne menit jej pociatocnu hodnotu. Realizacia je jendoducha, bud staticky nahodit konstanty pre kazdu pozadovanu hodnotu zo simulacie, ziskat ich z prevadzky ( ukladat do eeprom po ustaleni ), alebo najst zavislost.

Simuloval som odozvu pre model so ciastocne zmenenou jednou konstantou a hladal naku zavislost ako inspiraciu pre adaptivnu regulaciu. Ono totiz pocas liahnutia sa pravdepodobne dost vyrazne menia podmienky.

Ale mal bych dalsiu otazku. Pri kontrole simulacie som narazil na potrebu digitalizacie ( zaokruhlenie na cele cislo ) integracnej zlozky mno a system prestava byt stabilny ( v ustalenej casti dochadza ku skokom + - 1 digit integracnej aj regulovanej hodnoty). Predpokladam, ze bude treba zvysit rozlisenie PWM akcneho clena.
Tvoj nazor?
0

Softy
Stály člen
Stály člen
Príspevky: 199
Dátum registrácie: 18 Mar 2007, 00:00
Vek: 33

Re: Termostat pre liahen

Príspevok od používateľa Softy » 07 Mar 2014, 14:32

K Anti-WinUp, to čo som napísal vyššie je reálne riešenie, ktoré sa používa. A ako som tiež napísal, zložka sa neobmedzuje (chápeme ako saturácia - v dokumente čo si zavesil, to sú riešenia dá sa povedať do 8 ) ale úplne sa nuluje. Riešenie 10 je +- riešenie čo som opisoval vyššie.
Počiatočné podmienky sme my nikdy nejako moc neriešili. To čo som napísal vyššie platí, ale nech nastavíš PP akékoľvek, systém sa sám po pár iteráciách dostane tam kde treba, v žiadnom prípade by to nemalo mať vplyv na ustálený stav - pracovný bod. Tj. ak nastavíš divoké PP tak pár iterácií od štartu budú hodnoty regulátora lietať ale ustália sa nakoniec. PP sa nastavujú len v integrátore a aj to len v spojitom! Ak budeš stále bežať v simulácií na spojitom, tak nesimuluješ ten HW čo máš...
Takto vypadá PSD v simulátore, ale nie je tam anti-windUp.(Akčný zásah sa vypočítava: u(k) = u(k-1) + delta u(k);)
Obrázok

Rozlíšenie AČ s tým súvis nebude mať. Dostatočné rozlíšenie potrebuješ vo výpočte akčného zásahu. Riešenie je buď počítať všetko ako 1000 násobok skutočnej hodnoty (dostaneš presnosť na 3 desatinné) v 16bit integer a výsledok potom už aplikovať na rozlíšenie AČ, alebo to počítať vo floatoch.
0
Teória bez praxe je nanič.

Používateľov profilový obrázok
burizon
Pokročilý člen
Pokročilý člen
Príspevky: 571
Dátum registrácie: 07 Nov 2007, 00:00
Bydlisko: Vranov nad Topľou

Re: Termostat pre liahen

Príspevok od používateľa burizon » 07 Mar 2014, 19:02

Chlapi,
vôbec som netušil, že kvôli termostatu pre liaheň sa bude viesť akademická diskusia. Myslel som, že na vyliahnutie kurčiat stačí hocijaký termostat, ktorý sa nastaví na potrebnú teplotu a je to vyriešené, ale po "letmom" prebehnutí tejto témy som v rozpakoch. Už v druhej vete som nevedel o čom je reč, takže ak chcem nejaký termostat, musím veľa študovať.
0

Používateľov profilový obrázok
eurobastler
Ultimate člen
Ultimate člen
Príspevky: 3903
Dátum registrácie: 19 Apr 2009, 00:00
Bydlisko: BA
Vek: 35

Re: Termostat pre liahen

Príspevok od používateľa eurobastler » 07 Mar 2014, 20:38

+ za vlastný návrh, tiež som čakal len regulátor s hysteréziou a niekto si dal záležať, čo sa cení :wink:
0
Obrázok

Používateľov profilový obrázok
5ko
Power user
Power user
Príspevky: 10144
Dátum registrácie: 18 Feb 2010, 00:00
Vek: 68

Re: Termostat pre liahen

Príspevok od používateľa 5ko » 08 Mar 2014, 10:34

Chúďa KVOČKA, ani len netuší ,aké je ona vlastne zložité zariadenie. :D
0
Lenivosť je matka pokroku.Lenivý človek rozmýšla,ako by si robotu uľahčil a tak niečo vynájde.
Ku každému čínskemu výrobku by mali pribaliť jedného číňana, aby som ho mohol nakopať do ....,ked sa to pokazí.

Používateľov profilový obrázok
xmilos
Ultimate člen
Ultimate člen
Príspevky: 3671
Dátum registrácie: 04 Máj 2011, 00:00
Bydlisko: Povazie

Re: Termostat pre liahen

Príspevok od používateľa xmilos » 08 Mar 2014, 12:58

Ano, je to risenie zbytocne komplikovane, pre povodne urcenie staci dvojpolohova regulacia.
Ale ako som spomenul, zobral som to tiez ako "studijny projekt" a ked som tam vopchal MCU, nech teda maka.
Urcite tiez ako priprava na dalsie projekty.
Mal som moznost mat v oprave jeden termostat a fakt som cumel. Nastavis 190°C tak je tam 190.
0

mato3000
Power user
Power user
Príspevky: 9767
Dátum registrácie: 04 Jan 2009, 00:00
Bydlisko: BA

Re: Termostat pre liahen

Príspevok od používateľa mato3000 » 08 Mar 2014, 18:14

to som nepochopil , čo na ňom malo byť okrem nadstavenej teploty ?
Hádam je to normálne, že ak na termostate nadstavíš požadovanú teplotu, tak tam aj bude.
0

Používateľov profilový obrázok
xmilos
Ultimate člen
Ultimate člen
Príspevky: 3671
Dátum registrácie: 04 Máj 2011, 00:00
Bydlisko: Povazie

Re: Termostat pre liahen

Príspevok od používateľa xmilos » 08 Mar 2014, 18:29

Ide o to, ze pre svoju pracu nepotrebuje kolisat okolo nastavenej teploty.
Ale potreboval bych analyzu od asembleristov tejto funckie:

Kód: Vybrať všetko

void displ_d(unsigned int val)
{
    unsigned char i=0;
    while(val >= 100){val -= 100; ++i;}
    displ[2] = segm[i];
    i = 0;
    while(val >= 10) {val -= 10;  ++i;}
    displ[1] = segm[i];
    displ[0] = segm[val];
}
Preco tento kod pri zobrazeni vacsieho cisla ako 999 resetuje procesor ?
Je jasne, ze i presiahne rozmer pola a tym padom cita mimo rozsah, ale preco reset?
0

Používateľov profilový obrázok
muziker
Ultimate člen
Ultimate člen
Príspevky: 6267
Dátum registrácie: 10 Mar 2009, 00:00
Bydlisko: BA, KE, RV, Praha, Toronto,
Vek: 75

Re: Termostat pre liahen

Príspevok od používateľa muziker » 08 Mar 2014, 18:34

No bežné termostaty mali v minulosti chybu +/- 0,1°C cez +/- 1°C až +/- 2 a viac°C. Hysterézia bola tiež rôzna. Myslím si však, že na liaheň bohato stačí hocaký termostat , lebo kvočka sediaca na vajciach má "chybu termostatu" aj "hysteréziu" podstatne vyššiu. Ale zaujímavé a sympatické na celom je to, že z primitívneho zariadenia akým je termostat v liahni kurčiat sa pri troche snahy môže stať niečo sofistikovanejšie, naviac riadené uPC a súce priam pre kozmický výskum. :)
0
muziker

Používateľov profilový obrázok
rudko
Power user
Power user
Príspevky: 2339
Dátum registrácie: 28 Dec 2012, 08:33
Vek: 37

Re: Termostat pre liahen

Príspevok od používateľa rudko » 08 Mar 2014, 18:56

xmilos napísal:Ide o to, ze pre svoju pracu nepotrebuje kolisat okolo nastavenej teploty.
Ale potreboval bych analyzu od asembleristov tejto funckie:

Kód: Vybrať všetko

void displ_d(unsigned int val)
{
    unsigned char i=0;
    while(val >= 100){val -= 100; ++i;}
    displ[2] = segm[i];
    i = 0;
    while(val >= 10) {val -= 10;  ++i;}
    displ[1] = segm[i];
    displ[0] = segm[val];
}
Preco tento kod pri zobrazeni vacsieho cisla ako 999 resetuje procesor ?
Je jasne, ze i presiahne rozmer pola a tym padom cita mimo rozsah, ale preco reset?
xmilos nie je to zrovna kod v asm, ale povedal by som ze ide o specificke spravanie uC pri danom type "nepovolenej" operacie. co je to za procak? mne kedysi davno dajaky motorolacny bazmek zalozeny na x51 robil to iste
edit: tak pozeram ze PIC :-). mno o tych vela neviem, tak snad sa vyjadri niekto fundovany ...
0
Drink coffee. Do stupid things faster with more energy...

Používateľov profilový obrázok
xmilos
Ultimate člen
Ultimate člen
Príspevky: 3671
Dátum registrácie: 04 Máj 2011, 00:00
Bydlisko: Povazie

Re: Termostat pre liahen

Príspevok od používateľa xmilos » 08 Mar 2014, 19:12

no nie je :--)
to mi nak doslo :--)
Som chcel od MPLAB - istov mrknut do listingu. Ale oki, davam sem. Je to pre 16F1826
ale tato verzia je uz s testom

Kód: Vybrať všetko

  1917 ;; *************** function _displ_d *****************
  1918 ;; Defined at:
  1919 ;;		line 325 in file "main.c"
  1920 ;; Parameters:    Size  Location     Type
  1921 ;;  val             2    3[COMMON] unsigned int 
  1922 ;; Auto vars:     Size  Location     Type
  1923 ;;  i               1    6[COMMON] unsigned char 
  1924 ;; Return value:  Size  Location     Type
  1925 ;;		None               void
  1926 ;; Registers used:
  1927 ;;		wreg, status,2, status,0
  1928 ;; Tracked objects:
  1929 ;;		On entry : 0/0
  1930 ;;		On exit  : 0/0
  1931 ;;		Unchanged: 0/0
  1932 ;; Data sizes:     COMMON   BANK0   BANK1   BANK2
  1933 ;;      Params:         2       0       0       0
  1934 ;;      Locals:         1       0       0       0
  1935 ;;      Temps:          1       0       0       0
  1936 ;;      Totals:         4       0       0       0
  1937 ;;Total ram usage:        4 bytes
  1938 ;; Hardware stack levels used:    2
  1939 ;; Hardware stack levels required when called:    1
  1940 ;; This function calls:
  1941 ;;		Nothing
  1942 ;; This function is called by:
  1943 ;;		_main
  1944 ;; This function uses a non-reentrant model
  1945 ;;
  1946                           
  1947                           
  1948                           ;psect for function _displ_d
  1949  0385                     _displ_d:	
  1950                           
  1951                           ;main.c: 326: unsigned char i=0;
  1952                           
  1953                           ;incstack = 0
  1954                           ; Regs used in _displ_d: [wreg+status,2+status,0]
  1955  0385  01F6               	clrf	displ_d@i
  1956                           
  1957                           ;main.c: 327: if(val > 999) val = 999;
  1958  0386  3003               	movlw	3
  1959  0387  0274               	subwf	displ_d@val+1,w
  1960  0388  30E8               	movlw	232
  1961  0389  1903               	skipnz
  1962  038A  0273               	subwf	displ_d@val,w
  1963  038B  1C03               	skipc
  1964  038C  2B91               	goto	l1408
  1965  038D  30E7               	movlw	231
  1966  038E  00F3               	movwf	displ_d@val
  1967  038F  3003               	movlw	3
  1968  0390  00F4               	movwf	displ_d@val+1
  1969  0391                     l1408:	
  1970                           ;main.c: 328: while(val >= 100){val -= 100; ++i;}
  1971                           
  1972  0391  3000               	movlw	0
  1973  0392  0274               	subwf	displ_d@val+1,w
  1974  0393  3064               	movlw	100
  1975  0394  1903               	skipnz
  1976  0395  0273               	subwf	displ_d@val,w
  1977  0396  1C03               	btfss	3,0
  1978  0397  2BA1               	goto	l1410
  1979  0398  3064               	movlw	100
  1980  0399  02F3               	subwf	displ_d@val,f
  1981  039A  3000               	movlw	0
  1982  039B  3BF4               	subwfb	displ_d@val+1,f
  1983  039C  3001               	movlw	1
  1984  039D  00F5               	movwf	??_displ_d
  1985  039E  0875               	movf	??_displ_d,w
  1986  039F  07F6               	addwf	displ_d@i,f
  1987  03A0  2B91               	goto	l1408
  1988  03A1                     l1410:	
  1989                           
  1990                           ;main.c: 329: displ[2] = segm[i];
  1991  03A1  0876               	movf	displ_d@i,w
  1992  03A2  3E35               	addlw	low (_segm| (0+32768))
  1993  03A3  3184               	movlp	high __stringtab
  1994  03A4  000A               	callw
  1995  03A5  3183               	pagesel	$	;select current page
  1996  03A6  00F5               	movwf	??_displ_d
  1997  03A7  0875               	movf	??_displ_d,w
  1998  03A8  0020               	movlb	0	; select bank0
  1999  03A9  00CD               	movwf	_displ+2
  2000                           
  2001                           ;main.c: 330: i = 0;
  2002  03AA  01F6               	clrf	displ_d@i
  2003  03AB                     l1418:	
  2004                           ;main.c: 331: while(val >= 10) {val -= 10; ++i;}
  2005                           
  2006  03AB  3000               	movlw	0
  2007  03AC  0274               	subwf	displ_d@val+1,w
  2008  03AD  300A               	movlw	10
  2009  03AE  1903               	skipnz
  2010  03AF  0273               	subwf	displ_d@val,w
  2011  03B0  1C03               	btfss	3,0
  2012  03B1  2BBB               	goto	l1420
  2013  03B2  300A               	movlw	10
  2014  03B3  02F3               	subwf	displ_d@val,f
  2015  03B4  3000               	movlw	0
  2016  03B5  3BF4               	subwfb	displ_d@val+1,f
  2017  03B6  3001               	movlw	1
  2018  03B7  00F5               	movwf	??_displ_d
  2019  03B8  0875               	movf	??_displ_d,w
  2020  03B9  07F6               	addwf	displ_d@i,f
  2021  03BA  2BAB               	goto	l1418
  2022  03BB                     l1420:	
  2023                           
  2024                           ;main.c: 332: displ[1] = segm[i];
  2025  03BB  0876               	movf	displ_d@i,w
  2026  03BC  3E35               	addlw	low (_segm| (0+32768))
  2027  03BD  3184               	movlp	high __stringtab
  2028  03BE  000A               	callw
  2029  03BF  3183               	pagesel	$	;select current page
  2030  03C0  00F5               	movwf	??_displ_d
  2031  03C1  0875               	movf	??_displ_d,w
  2032  03C2  0020               	movlb	0	; select bank0
  2033  03C3  00CC               	movwf	_displ+1
  2034                           
  2035                           ;main.c: 333: displ[0] = segm[val];
  2036  03C4  0873               	movf	displ_d@val,w
  2037  03C5  3E35               	addlw	low (_segm| (0+32768))
  2038  03C6  3184               	movlp	high __stringtab
  2039  03C7  000A               	callw
  2040  03C8  3183               	pagesel	$	;select current page
  2041  03C9  00F5               	movwf	??_displ_d
  2042  03CA  0875               	movf	??_displ_d,w
  2043  03CB  00CB               	movwf	_displ
  2044  03CC  0008               	return
  2045  03CD                     __end_of_displ_d:	
  2046                           
  2047                           	psect	intentry
  2048  0004                     __pintentry:	
0

mato3000
Power user
Power user
Príspevky: 9767
Dátum registrácie: 04 Jan 2009, 00:00
Bydlisko: BA

Re: Termostat pre liahen

Príspevok od používateľa mato3000 » 08 Mar 2014, 19:59

:D no asi ťa sklamem, silno pochybujem že by sa ti niekto v tom chcel hrbať , najme ak ide o funkčnú rutinu ... tvoj problém mi ale nepripadá ako matematický problém, lebo aj pri pretečení užívateľských registrov ti nehrozí RESET. Skôr to vidím na chybu programu a koli tomu sa obráť na C čkarov. Reset ti môže nastať z viacerých stavov, ale všetky by malo riešiť samotné C vo svojej podstate, teda pokiaľ si tam nespravil nejakú chybu.
Ešte nikdy sa mi nestalo, že by sa MCU resetol kôli pretečeniu registrov pri mat. výpočtoch. Samozrejme ak si v programe zle ukončil cyklus a pretiekol ti stack, tak to je o inom , ale to ti skontroluje C čkar.
0

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Termostat pre liahen

Príspevok od používateľa peterple » 08 Mar 2014, 20:30

Kód: Vybrať všetko

  1990                           ;main.c: 329: displ[2] = segm[i];
  1991  03A1  0876                  movf   displ_d@i,w
  1992  03A2  3E35                  addlw   low (_segm| (0+32768))
  1993  03A3  3184                  movlp   high __stringtab
  1994  03A4  000A                  callw
Nie som assemblerista pre PIC ale odpoveď je v tom ako prekladač urobí prístup k tým jednotlivým znakom toho stringu. Robí to tak, že zavolá nejaký kód pre to miesto. A kedže ten kód tam chýba tak je len a len vo hviezdach kam to nakoniec zablúdi.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Používateľov profilový obrázok
jaromir
Power user
Power user
Príspevky: 4538
Dátum registrácie: 08 Júl 2011, 00:00
Vek: 40

Re: Termostat pre liahen

Príspevok od používateľa jaromir » 08 Mar 2014, 21:44

xmilos napísal: Preco tento kod pri zobrazeni vacsieho cisla ako 999 resetuje procesor ?
Je jasne, ze i presiahne rozmer pola a tym padom cita mimo rozsah, ale preco reset?
Pretoze si prekrocil hranice pola. To ako programator nesmies. Vies co je za nim? Preco sa potom cudujes?
Rypanie sa v assembleri je absolutne zbytocne.

Ked si do auta nalejes namiesto benzinu jablkovu stavu a auto nejde, rychlomer ukazuje nulovu rychlost, tak hadam nezacnes opravovat rychlomer.
0

Používateľov profilový obrázok
petersno
Ultimate člen
Ultimate člen
Príspevky: 2774
Dátum registrácie: 06 Aug 2011, 00:00
Bydlisko: ba
Vek: 63

Re: Termostat pre liahen

Príspevok od používateľa petersno » 08 Mar 2014, 22:32

ak mozem, rad by som keby to citanie mimo rozsah pola niekto viac rozviedol. je mi jasne, ze je to programatorova chyba, ale nieje mi jasne, akym sposobom to pri citani moze sposobit "zabludenie" programu. jedine co ma napada je, ak je pole umiestnene na konci pamate. inak mi pripada, ze sa nanajvys nacita nezmysel. alebo nie ?
0

Napísať odpoveď
  • Podobné témy
    Odpovedí
    Zobrazení
    Posledný príspevok