Fórum témák
» Több friss téma |
Fordítva:
Leszoktam erről a módszerről. Amúgy két megadás kellett a bit sorszámához és a a bit pozíciójához. Nem használom a pic_as -t.
Szerintem nem értettem jól, amit írtál...
Arra gondoltam, hogy a #define LED PORTC,3 után ha a szimulátorba beteszem a Watch-ba, hogy LED, akkor azt nem ismeri, mint használható szimbólumot, nem látom mellette a bit értékét. A leírásod alapján úgy véltem, hogy most már lehet. Akkor most már megkérdezem "egyenesen": van arra mód, hogy a LED szimbólumot tegyem a watch-ba ?! Idézet: „Leszoktam erről a módszerről.” Miről? A szimulációról vagy... ?!
MpLab 8.92
Ennek a használatáról szoktam le. Ha szimulációban a forrás ablakban a PORTC fölé vitted a kurzort, kiírta a PORTC aktuális értékét. A PORTC regisztert fel tudod venni a Watch listára. Ha bsf LED sorban a LED fölé viszed a kurzort, nem történik semmi. Csak a PORTC regisztert tudod felvenni a Watch listára. A 8.92 gyári telepítésnél a Watch ablakba nem vehető fel a WREG és a STKPTR. Miért? Egyszerűen kitörölték a definíciójukat azokból az állományokból, amik olyan típusokat írtak le, amelyeken nem címezhetők
Az igaz, hogy korábban is működött a #define LED PORTC,3 parancs után az egyszerűsített bitmegadás (bsf LED), de alapból nem tartalmazta ezeket az .inc állomány.
A régi MPLAB-ra már nem emlékszek, de az X-ben a Watches/Variables ablakban megjeleníthetők bitek, ill. speciális regiszterek. Bár a mikrovezérlő fontos regiszterei (PC, SR, W, bank) egyébként is folyamatosan láthatók az ablak tetején. A hozzászólás módosítva: Ápr 9, 2021
Igen, ezt tudtam, azt hittem van lehetőség a LED bitként történő megjelenítésére, de ha jól értem, akkor Zsora Kolléga azt írja, hogy az X alatt már lehet, majd "megsasolom" !
A 8.92 alatt WREG-et simán tudom nézni, a veremmutatót meg így ( bár a proci konkrét típusáról nem beszéltünk...!) ! Köszi a tájékoztatást !
Nem lehet. Csak a Watches ablakban részletezik a regiszterek bitjeit.
Sziasztok!
Hogyan működik a pic-knél az órajelre léptetés?Nem igazán értem,hogy -vegyünk egy esetet- pl. óránként kell egy programban leptetni egy műveletet azt hogyan oldják meg?Programszámláló késleltetése lehetséges vagy a programon belül kell megírni,hogy várjon 1 órát?
Fogsz egy változót ami kezdetben nulla. Ezt szabályos időközönként (több lehetőség is van) növeled. Ha a változó elérte a kívánt értéket, akkor egyrészt nullázod azt, másrészt végrehajtod a kívánt műveletet.
Pl.: PIC16F1825, 8 MHz-es órajel. Timer2: prescaler: 1:64, postscaler: 1:10, PR2: 124. Ezzekkel az adatokkal a Timer2 25 Hz-es megszakítást generál, tehát egy másodperc alatt 25-öt. Ha ezzel a tempóval növelsz egy változót, akkor 90 000-ig kell elszámolnod, hogy kapj egy órás időtartamot. 1 óra = 60 perc = 3600 másodperc = 90 000 Timer2 megszakítás. szerk.: Természetesen lehet várakoztatni is a kontrollert egy órán keresztül de akkor a kontroller csak vár, nem csinálhat semmi mást, mert tulajdonképpen a várakozás egy művelet. A várakozás megzavarható megszakítással, nem javasolt technika. A hozzászólás módosítva: Ápr 11, 2021
Hello! Egy mikrokontroller működését az órajele vezérli. Ez általában egy kvarc, vagy belső órajel generátor. A kontroller az órajel negyedével lépteti a programszámlálót. Azt nem lehet időzíteni, az mindig megtörténik, vagy is automatikusan inkrementálódik állandóan. Maximum "elugrasztani lehet, hogy máshol folytassa. De
Az időzítésre vannak belső Timer számlálók. Azok vagy az órajel negyedével, vagy külső órajelre tudnak lépkedni. A program végrehajtásának időzítéséhez két módszer ven. Egyik, hogy hurokban léptetik a programszámlálót és közben számolod a lépéseket. A hurok végrehajtási idejével szorozva a hurok száma fogja adni az időzítés hosszát. De ekkor a kontroller csak ezzel van elfoglalva, mást nem tud tenni vagy vezérelni. Másik, hogy a Timer számlálók osztását programozod fel, és amikor a számlánc átfordul, megszakítás képződik és azzal/akkor hajtod végre amit szeretnél. A Timer mindig működik a kontroller processzorától függetlenül, de közben a kontroller azt tesz amit akarsz. Tehát a program végrehajtása működhet, pld kijelzőt vezérelhet, vagy bár mit. Persze a Timer nem elég "hosszú" hogy órákat tudna számolni, de a megszakítás bejövetelekor léptethetsz egy szoftver számlálást és amikor az eléri az értéket, törlöd és működteted amit szeretnél..
Ha ilyen nagy időközönként kell bármit csinálnia, akkor szerintem a legegyszerűbb ha olyan PIC-et használsz aminél a Timer1-et lehet külön külső kvarcról hajtani. Ha erre teszel egy 32,764 kHz-es óra kvarcot akkor alapból 2 másodpercenként generál megszakítást. 2 másodperc rengeteg idő, közben csinálhat mást a PIC.
Tehát(csak az elmélete érdekel)lehet a timerrel variálni ,a programon belül ügyeskedni és ha mondjuk külső oszcillátort használok ami pl. 1Hz-es négyszög jel azzal is lehet léptetni?A sebbeség most nem fontos!
A lehetőségeknek szinte csak a fantázia szab határt, a legegyszerűbbeket soroltuk fel eddig.
Szerintem két külön dologról beszéltek. A mikrokontroller órajele, és az egy időközönként végrehajtandó utasítássorozat két dolog. At ifjú kolléga kérdése - értelmezésem szerint - arra vonatkozik, hogy a kontroller órajele, az fOSC lehet-e tetszőlegesen alacsony?
Tudtommal igen.
Szerintem az alapok keverésének/nem ismeretének esete áll fenn. Nem baj, valahol el kell kezdeni.
Hát igen! Tudni kell kérdezni, alaposan, egyértelműen megfogalmazni a problémát.
Anélkül csak elbeszélünk egymás mellett. Tehát: Mi a kérdés?
Nagyon jól látod az eset súlyosságát Bakman.
Nedudgi köszönöm a kiigazítás,erre voltam kíváncsi.Most kezetem érdeklődi a mikrokontrollerek iránt.De nem akarnák túl mélyre ásni.Csak az egyszerű vezérlés érdekelne.Azon gondolkodám lehet e úgy futtatni egy progit,hogy előre a memóriaba betáplált bináris értékeket kiíratni a kontroller párhuzamos portjára-gondolom akkor több helyet foglal- és órajelre lépjen tovább?
Még szép, hogy lehet ilyet csinálni vele.
Sziasztok,
MPLAB X-et használok ( C-ben ) és egy olyan kérdésem lenne, hogy van lehetőség arra, hogy az I/O portokat egy struktúrában tudjam kezelni? pl: typedef struct { uint8_t *GPIO_0; uint8_t *GPIO_1; }gpio_struct; gpio_struct GPIO = { GPIO_0 = &PORTBbits.RB4, GPIO_1 = &PORTAbits.RA3, }; Ez így menne? Van egy olyan sejtésem, hogy nem. Hogy lehet ezt megoldani?
Hali! Nem világos mit szeretnél, gyárilag is struktúra...Nézd meg a megfelelő pic inlude-jában...
(a fórum letiltja az u n i o n szót, nyilván szóközök nélkül kell írni) // bitfield definitions typedef u n i o n { struct { unsigned RA0 :1; unsigned RA1 :1; unsigned RA2 :1; unsigned RA3 :1; unsigned RA4 :1; unsigned RA5 :1; }; } PORTAbits_t; extern volatile PORTAbits_t PORTAbits __at(0x00C); A hozzászólás módosítva: Ápr 11, 2021
Először azt kellene eldöntened, hogy fordítási időben, vagy futásidőben szeretnéd eldönteni, hogy valami funkció melyik lábhoz legyen hozzárendelve?
A fordítási idejű összerendelés esetben javaslom, hogy #define használatával határozd meg, hogy az adott funkció melyik lábhoz legyen hozzárendelve. A futásidejű hozzárendeléshez használhatod azt a módszert, mint amit az arduino-nál használnak, számozd meg a lábakat (legyen pl. 0..7-ig az RA0..RA7, 8..15 az RB0..RB7 stb.). És csinálhatsz hozzá szép kis függvényeket amik a láb azonosítója alapján működtetik az adott portot. Ez utóbbi mondjuk jó lassú lesz (mint ahogy az arduinonál is lassú), ráadásul egy mikrokontroller esetén én nem látom értelmét ennek. Akkor látnám csak értelmét, ha ugyanannak a binárisra lefordított programnak több eltérő hardveren is működnie kellene, és a konfigurációt valami háttértárból kellene betöltenie.
Szia,
Tudom, hogy gyárilag is struktúra, viszont ha 32db I/O-t szeretnék használni, ami nyilván nem mind a LATA-n vagy a PORTA-n lesz, akkor több struktúrát kellene használnom, én ezeket szeretném egybe gyúrni. nem szeretnék 32db #define makrót sem írni az adott lábaknak. pl: GPIO.GPIO_10 // ez mondjuk egy PORTAbits.RA15 GPIO.GPIO_11 // ez mondjuk egy LATBbits.RB4 stb...
Helo.
Valaki el tudja magyarázni nekem hogy ez az osztó algoritmus hogyan is működik? Működik mert leszimuláltam de hülye vagyok hozzá hogy felfogjam mi is benne a mágia. Egy konstanst kéne elosszak periódusidő-fordulatszám átalakítás céljából. A legalsó.
Egyetlen #define-vel is megadhatod a 32db I/O hozzárendelést (ez ugye 64db. paraméter), csak akkor elég sok és hosszú makrót kell írni ami kimazsolázza a megfelelőt belőle.
Ezt hogyan tudom összehozni? Egy példát tudnál írni nekem?
A LEDS definícióban megadhatod a példában szereplő 3 LED és az egy kapcsoló lábhozzárendelését.
Kicsit kacifántos a makrókkal történő tartalom kinyerése, de ha egyszer megcsinálod, akkor úgy módosítgathatod a lábkiosztást, ahogy jól esik.
Pedig define-val a programod átláthatóbb lesz, csak normálisan kell elnevezni a lábakat...
|
Bejelentkezés
Hirdetés |