Fórum témák
» Több friss téma |
Megmondanád miért volna ez jó neked? A megszakításnak pont az lenne a lényege, hogy nem tudjuk mikor jön "szubrutin" hívás és ugyanonnan folytatjuk ahol abbahagytuk. Szerintem nem várt hibákhoz vezetne. Ha leírod mi a cél talán lehet arra jobb megoldást is kitalálni.
pl. detektálom bejövő impulzus sorozatok végét int0 megszakítással (3 bemenet).
Ha egy bizonyos bemeneten kevesebb impulzus van mint kellene kiértékelés eldobandó ha megfelelő számú, kiértékelő rutin. Ezt a folyamatot kényelmesen meg lehetne oldani, ha a program oda térne vissza ahova én akarom. (a válaszodból azt szűröm le, hogy nem tudod )
Én sem egészen értem a dolgot. Azóta gondolkodom rajta mire kell ez neked miota írtad.
Int0 honnan tudja, hogy az utolsó bejövő impulzus volt? T1G lábra gondoltál? Azzal egy impulzus hosszát tudod lemérni számlálón keresztül. A hozzászólás módosítva: Jún 2, 2016
Fejből nem tudom, de ugyebár megszakításnál eltárolja valahova, hogy honnan ugrott el, így ha ezt felülírod akkor meg tudod oldani. Viszont sokkal jobb megoldás ha a megszakítás eredményét a főprogramban vizsgálod és nem a megszakításban. Tehát letárolod az impulzust, kilépsz a megszakításból, megnézed, hogy az eredmény jó-e neked vagy sem.
Egy 8 színtű Stack ban tárolja a címet. Én azt nem piszkálnám. Inkább a javaslatod második fele lenne helyes a számára.
Szerintem is az a korrekt megoldás, csak jelezni akartam, hogy az is megoldható, de nem véletlen van úgy kitalálva ahogy van.
Konkrétan egy 58 lábú ismeretlen lcd kijelzőt kellene áttenni ledes kijelzésre.
Az lcd-t 2 db pcf2111 ic hajtja meg, ennek 3 vezérlő bemenete van (enable,clock,data). Gondoltam ezeket a bemeneteket bevezetem egy PIC-be és visszafejtem. Folyamatosan jönnek az impulzusok de egy csomag vége az enable vége. Egy enable ciklus alatt 34 óraciklusnak kellene lennie, de periodikusan van amikor kevesebb Tehát utólag kellene kiértékelni és elég gyorsan mert az impulzusok jönnek mint a "meszes". (a piszkáláshoz: PIC-nél aki asm-ban programoz elég sokmindenre kell figyelnie, eggyel több vagy kevesebb már se nem oszt se nem szoroz (én pl. szeretnék mindenhez hozzáférni)).
A 16F sorozatnál nem, a 16F1x és 12F1x valamint a 18F -nél megoldható.
Megoldottam. 16F sorozatnál is megszakítás végén odaugrok ahova akarok (kis trükk) és továbbra is rendesen működik a megszakítás is.
A hozzászólás módosítva: Jún 2, 2016
Értem. Hát emberes feladat lesz visszafejteni. Én biztos nem kezdenék ilyenbe. Inkább túrnám a netet adatlap után , hogy ne legyen ismeretlen az az Lcd.
De azért sok sikert hozzá! ![]() ![]()
Megérdeklődhetem, hogyan oldottad meg?
Néha nekem is jól jött volna már.
minidemo:
ORG 04H ;TMR0 BCF INTCON,TMR0IF INCF ACC_1,F ;csak segéd tároló idő növelés BTFSS STATUS,Z RETFIE ;lényeg: BCF INTCON,GIE goto KEZD ;RETFIE helyett KEZD BSF INTCON,GIE . . Tehát bárhova ugorhatsz ahova akarsz. GIE manipuláció nélkül nem fogadna újabb megszakítást A hozzászólás módosítva: Jún 2, 2016
Üdv!
Ha megnézed a pcf2111 adatlapját, akkor láthatod, hogy CBUS-t használ. Ez olyan mint az I2C. Ha találsz róla olyan adatlapot amiben a protokoll és a parancsok is le van írva, máris nem kell kódfejtőst játszanod.
És mit kezdesz azzal a visszatérési címmel, ami már a veremben van? Csak azért, mert a fordító lefordítja, még nem jelenti azt, hogy nem lesz verem túlcsordulásod.
Ha valójában semmire sem kell neked az interrupt, hagyd a fenébe az interruptot. Lehet bejövő jeleket aszinkron is vizsgálni.
A felesleges veremcím egyszerűen kiesik, eltűnik (itt működik előttem egy órája)
Lehet, csak kényelmesebb az enable végét egy megszakítással detektálni (egyszerűbb lesz a program).
Régen 18F-re én is csináltam hasonlót, bár azon hozzáférhető a verem: preemtív multitask PIC18F-el
Idézet: „A felesleges veremcím egyszerűen kiesik, eltűnik” Hát, szerintem ilyen nincs. ![]() Egyszerűen csak nem veszed észre, hogy túlcsordult a verem. Mi a PIC pontos típusa?
F737. Nehéz nem észrevenni, mert látom. Egy kijelző számol 1 től 10-ig másodpercenként a fő programban.
A megszakitás 8 másodpercenként elsötítéti 8 másodpercre és mindig 1-ről kezdi ahol a főprogram indul.
Ilyen PIC nincsen is.
![]() Szerk.: na, mégis. ![]() A hozzászólás módosítva: Jún 2, 2016
Ezt inkább ne terjesszük!
A programodban több szinten hívhatsz eljárást és bárhol bekövetkezhet a megszakítás. Így nem tudod előre milyen mélységben áll a stack a megszakítás elfogadásakor. Az valóban igaz, hogy a felesleges címeket kilépteti a stack, de köztük értékes is lehet. Egy bonyolultabb programban problémát jelethet, ha nem jó helyre kerül a vezérlés. Ha már ilyen feladatra kerül a sor, használjunk 18F -et. A push utasítás helyet csinál a stack -on A TOSU, TOSH, TOS regiszterekkel módosítani lehet a stack tetején levő értéket. Ha így egy programrész kezdőcímét tettük a stackra a megszakítási rutinban (esetleg máshol), kilépéskor a retfie a módosított címre tér vissza. Persze meg kell oldanumk valamikor, hogy a feltett plusz bejegyzések lekerüljenek a stack -ról. Két megoldás lehetséges: A pop utasítás leszed egy szintet a stackról és "elvész" az adat. Egy return utasítással vissza lehet térni a "régen félbehagyott" munkára. Használtam ilyen megoldást egy DDS jelgenerátorban. A jelalak előállítása 100 százalékban igénybe vette a 18F252 -t. A parancsok az UART -on keresztül érkeztek. A vételi megszakítás "félbehagyatta" a jelalak előállítását, áttért a parancs értelmezőre. Addig várt, amíg beérkezett a teljes parancs, feldolgozta, elvégezte a beállítást, válaszolt és visszatért a jelalak előállításához egy return -nel. A hozzászólás módosítva: Jún 2, 2016
Igen, elgépeltem a gugliban, és nem persze nem vettem észre.
Ez alatt viszont mit értesz? Idézet: „Az valóban igaz, hogy a felesleges címeket kilépteti a stack” Mármint mikor?
Köszi, könnyebb volt az egészet táblázatba tenni.
0-150fok-ig bevittem, elvileg így jó lesz. Elektro.on: Motorba van, de nem a motor ad neki feszültséget. Csak a motor hője változtatja az ellenállását. Más védelemre mi szükség lehet?
Pedig az ilyesmiket terjeszteni kell , hogy a lehető legtökéletesebben ismerjük meg a PIC-ek működését.
Hogy ki, hogy használja, az a saját döntése.
Én az esetleges induktív lökésekre gondoltam. Nem tudom milyen mdon van beépítve a motorba. Pálya kezdő koromba össze futottam egyszer egy ilyen motorral de annak már huszon éve. Nem emlékszem rá.
A stack nem léptet ki semmit. Felülíródik az új adattal.
A cím túlcsordul és már használt cellába történik írás. Mindig a legrégebbi adat (visszatérési cím) veszik el.
Jajj, igaz, valóban.
Viszont szerintem ez így akkor sem valami szép megoldás. Bár, ha nem lesz bővítve a program, akkor hobbi célra jó lehet.
Csak át ne vidd fejlettebb típusra (PIC18 stack ellenőrzés bekapcsolva, PIC24, dsPIC30, dsPIC33, PIC32) vagy más mikrokontroller családra (AVR, I0831 - I8051) - Ugyanis stack hiba miatti kivételkezelésre futhat, resetelődhed, de ami még rosszabb, végigírhatja az adatmemóriát azokon a típusokon, ahol nincs szétválasztva.
|
Bejelentkezés
Hirdetés |