Fórum témák
» Több friss téma |
Idézet: Nincs jelentősége. Oda teszed, ahová jól esik. Csak a Reset és interrupt vektorokkal ne fedjen át, ha használni akarod azokat! „az Init rész miért a 0x0200-as címen van?”
Az előző hozzászólásban Icserny már leírta a lényeget, én is csak ugyanazt tudnám elmondani.
Idézet: „No meg akkor a főpromram is innen kezdődik, illetve ugye ahol vége van az Init-nek.” Így van. A Reset vektorról elugrunk az inicializációs részre, melyet a program futása során csak egyszer kell lefuttatni, majd a programkód szekvenciális végrehajtása miatt az Init rész utolsó utasítása után a main címkével ellátott sor következik, mely egy végtelen ciklust valósít meg. Ez adja a főprogramot.
Sziasztok!
Az lenne a kérdésem, hogy: Vezérlő billentyűzetet akarok az lcd meghalytó pic-hez. Én úgy gondoltam, hogy az RB portokra teszem a gombokat, mivel ennél a chip-nél mindegyik lába interruptot okoz, tehát a gomb mindig minden nyomásra elvégzi a feladatát, annélkül, hogy külön a program erőfeszítést tenne arra, hogy megnyomtam-e, vagy sem. A fő kérdésem az lenne, hogy a belső RBPU-val bekapcsolt felhúzó ellenállások megfelelnek e a mellékelt képen jelzett piros Rx ellenállásoknak. A másik kérdésem pedig, hogy egyel több gomb kéne, amivel a készülék csipogója ki és be kapcsolható, ennek a fontossága nem annyira elsőrendű, hogy bármely müködése folyamatban érzékelje. Arra vajon melyik portot használjam fel? vagy hogy lehetne megoldani? Bocs, ha picit hosszan fogalmaztam. Köszi
Interruptot csak olyan nyomógombról fogadj, ami eleve pergésmentes, vagy hardveresen pergésmentesített!
A belső felhúzás is megfelel, bár nem tudom, hogy miért pont az ellenállásokon akarsz spórolni... Nem volna haszontalan dolog egy-egy soros ellenállást is berakni, hogy hibás beállítás esetén (vagy programozás közben) se lehessen véletlenül sem rövidrezárni kimeneteket. Idézet: Abszolút mindegy! „Arra vajon melyik portot használjam fel? ”
Csak azért akarok spórolni vele, mert kevés a hely.
Pergésmentesítéses bemenetre így jó? mondjuk a 40106-tal
Nem tudom, hogy jól értem-e, de az első rajzodból úgy tűnik, hogy csak a jobbra fel/le és a balra fel/le gombok kezelése időkritikus. Ha ezekete az RB0..RB3 lábakra teszed, és az Interrupt on Change helyett a külső interruptot használod (INT0...INT3) lefutó élre, akkor Schmitt-triggeres lesz a bemenet, s nem kell a külső logikai kapu. Ha már a helytakarékosság szempont...
A többi gombnál a szoftveres pergésmentesítés is megteszi: pl. egy periodikus timer interrupt 20 ms-onként rájuk néz.
Tehát, ha én is jól értem:
A mozgató gombok, amiket használok, rövid nyomások hadával, az megy a sima bejövő interuptra. És a pályaválasztó gombokat meg az interupt on change lábakra, aztán azt meg ugyis "hosszabban" nyomom majd. És akkor nem kell más csak a külső felhúzó ellenállás. Ha jól értem
Nem így gondoltam, hanem úgy, hogy a négy mozgatógombnál maradjon a második rajzodon szereplő két ellenállás és a kondenzátor is, csak a Schmitt triggert tudjuk lespórolni azzal, hogy az INTx bemeneteket használjuk.
A többi gomb estében pedig továbbra sem javaslom az Interrupt on Change használatát, hanem a mintavételezést ajánlom helyette.
Akkor viszont a többi gomb akár más lábakon is lehet, gondolom. Csak sima bemenetre teszem és kész. Viszont akkor a program futása közben állandóan figyelni kell majd a több bemenet állapotát...
Két kérdésem lenne a hozzáértőkhöz, PIC12F508-al kapcsolatban:
1. Mennyire stabil (egyáltalán elfogadható-e) a Zener-diódás tápellátás, ha pl. 12V-os elemről akarom hajtani az áramkört, a minimális fogyasztás érdekében (és helyhiány miatt)? Egy távirányítót akarok építeni, a gombok kapcsolják a tápot is, és ahogy nézegettem, az 5V-os stabilizátorok saját árama sokkal nagyobb, mint amennyit a PIC fel fog venni (doboz, elem adott). 2. Ha a gomb kapcsolja a tápot, mint azt írtam, kell-e a programban pergésmentesítéssel foglalkozni? Egy HCS300-al szerelt távirányító adta az ötletet minderre, csak sajnos nincs módom visszarajzolni.
Lentebb már írtam,hogy nem "állandóan", hanem időközönként. S nem feltétlenül a főprogramban, hanem pl. egy periodikus timer megszakításban.
Az pedig számodra már mindegy, hogy a gombok egyenként okoznak-e megszakítást, vagy egy megszakítás figyeli a gombok állapotát, hiszen ugyanabban a megszakítás-kiszolgáló eljárásban kell lekezelni... Végeredményben valamilyen állapotváltozót kell beállítanod, az állapotgépként futó főprogram pedig ennek megfelelően ágazik el - gondolom én .....
A Zener-diódás stabilizátor áramfelvétele nagyobb kell, hogy legyen, mint a PIC bármikori maximális áramfelvétele. Ennél tehát jobb egy kis áramfelvételű stabilizátor (pl. MCP1703).
A 12 V-os elem véletlenül nem 9 V-os? Idézet: Ez elég félreérthetően hangzik! Ténylegesen kapcsolják a tápot, vagy csak a mikrovezérlőt ébresztik fel alvásból? „Ha a gomb kapcsolja a tápot, mint azt írtam, kell-e a programban pergésmentesítéssel foglalkozni?”
Sziasztok!
Szerettem volna egy kis programot, ami a 4mhz-es órajel mellett a porta1 porta2 -t 500ms-os váltással 0 és 1 váltást hajt végre. De amikor le akarom fordítani hex-be kiirja hogy error parameter "and" Mit hibáztam el? Már kész vagyok idegileg és nem tudok koncentrálni. A legjobb az lett volna, hogy ha az egyik lába 100kHz-es jelet ad ki a másik meg 10Hz-eset.
Szia!
Sajnos a konfigurációs bitek elnevezése nem egységes: A 16F682A esetén az EEProm memória kódvédelmét _DATA_CP_OFF / _DATA_CP_ON szimbólumokkal lehet ki- / bekapcsolni...
Az mpasm-ommal volt valami. Leszedtem és ujratelepítettem és már megy is.
Tényleg kezdő PIC-es kérdés: egy adott porton belül, lehet-e kimenet és bemenet is?
(pl.: Rb0-Rb3 = kimenetek ; Rb4-Rb7 = bemenetek)
Minden további nélkül lehet. Csak a TRIS regisztert úgy kell beállítani.
0 - Output, 1 - Input
Tehát a Te esetedben:
Ezt az elején kell beírni, de bármikor megváltoztathatod hogy be vagy kimenet legyen az adott pin.
Nagyon szépen köszönöm!
Igazából -nagy valószínűséggel- nem én fogom írni a programot (mert ahhoz nagyon sokat felejtettem már), de a kapcsolás szempontjából volt fontos. Még egyszer köszi!
12V-os (miniatűr) az elem, Sony LR-23A.
Ez az MCP1703 tetszene, csak "készleten" nagy hirtelen nincs, szét kell néznem a bontható panelokon, hátha... A Zener-es megoldással kapcsolatban arra gondoltam, hogy egy tantálkondit is kapcsolnék hozzá, amiben maradhatna annyi energia, hogy a küldés alatt (egyetlen csomag menne ki, nem állandó sorozat) rásegítene a PIC tápellátására. A HCS-nél ténylegesen a tápot kapcsolták a gombok, plusz a bemeneteket is, csak ezt még nem tudom, hogyan oldhatnám meg a mostani kapcsolásban.
Helo
Van egy működő, ezt-azt LCD-n megjelenítő programom. A háttérvilágítást szerettem volna pwm-el megvalósítani, de ha az alábbi kódot beszúrom a program elejére, akkor a háttérvilágítás gyönyörűen működik, viszont minden más nem. Semmi nem jelenik meg a kijelzőn. (18F4321).
Az első sorban engedélyezed, hogy Timer2 periodikusan megszakítsa a programot. Mivel kezeled le?
Az benne maradt az előző próbálkozásaimból. De most kivettem az INT_ONt, de ugyan az a jelenség.
Sziasztok!
Szeretném a segítségeteket kérni.Egy 16f628a-val szeretnék a PC-vel a kommunikálni RS232-n. A hardveres része jó (MAX232), mert úgy sikerült összehoznom, hogy fél másodpercenként elküld egy karaktert a gépnek. Amivel most gondban vagyok az abból áll, hogy a gépről elküldök egy karaktert a pic-nek, ez megszakítással van (lenne) megoldva, és egyel megnöveli a bejövő adatot és visszaküldi. A probléma az az,hogy valamiért nem lép be a megszakításba, pedig szerintem mindent beállítottam...A programot szerintem eléggé bőven kommenteztem, így remélem érthető, hogy mit akarok csinálni. Az RCSTA és TXSTA regiszterek beállításaiban nem vagyok 100%-ig biztos, szóval lehet, hogy ott rejlik a hiba... Még egy kérdésem lenne: Az adatlapban én azt olvastam, hogy a TX és RX lábat is bemenetnek (nagy impedanciásnak) kell állítani és majd a modul váltogatja az állapotát a lábaknak. Ezt jól értelmeztem? Segítségeteket előre is köszönöm!
Szia!
Nos, ez több sebből vérzik. Kommentben azt írod 4 MHz az órajel, a konfigurációs szóban meg HS van megadva. Az SPBRG regiszterbe töltött értéked (dec. 25) arra enged következtetni, hogy 16 MHz az órajel. Ha így van, akkor a BRGH bitnek nem 1- nek, hanem 0- nak kell lennie. Az RCSTA regiszterbe meg jobb lenne 8 bitnyi valós adatot tölteni, nem csak hetet. Hozzátenném, így a soros kommunikáció le van tiltva, meg sem lepődök, hogy nem működik a kód.
Jó bonyolult program, kicsit sok a hibakereséshez!
- OpenTimer2 hívása előtt én beleírnék valamit PR2-be. - A SetOutputPWM1 függvényt nem kellene meghívni?
Köszi az észrevételeket. Így én sem csodálom, hogy nem akar menni Az a 7 bit 8 bit akart lenni valójában, csak beíráskor 1 bittel elcsúsztam és később meg nem tűnt fel. Majd átnézem az RCSTA beállítását.
Az oszcillátor kérdése az viszont érdekes dolog, mivel én tényleg 4 MHz-s kristályt tettem be és 9600-as baud-dal remekül működött a karakter küldése. Most hamar utána néztem (eddig is megtehettem volna már, mert az oszcillátor konfigjával mindig gondban vagyok) és a HS konfig szó 8MHz és afölötti órajelre vonatkozik, de nekem tényleg működött rendesen a kommunikáció így. Még egyszer köszi a segítséget! Remélem ezek után már menni fog.
Szia!
Van még benne a Többiek által említetteken kívül is seb: - RCIF, TXIC programból így nem törölhető. - Ha már egynél több megszakítás engedélyezett, akkor a megszakítási rutinban meg kell nézni, hogy melyik egység kéri. Pl a TXIE engedélyezett és emiatt került a megszakítási rutinba, de a kódod feltétel nélkül olvassa az RCREG-et.... - Az RCREG kiolvasása előtt pontosan egyszer ki kell olvasni a RCSTA értékét és meg kell vizsgálni, hogy történt-e hiba, csak akkor kell a vevőt kikapcsolni, ha ráfutás vagy keretezési hiba történt. - Ahhoz, hogy egy karaktert visszaküldjön, nem feltétlenül kell a megszakításos adás. - Nem a TXSTA,TRMIT bitjét kell vizsgálni, hanem a PIR1,TXIF -et, a karakter beírásakor automatikusan törlődik. - A vevőt sem kell mindig kikapcsolgatni, elég ha a megszakítás kérését tiltod, ha már nincs kimenő adat.
Igazad van, akkor a 4 MHz- re vonatkozó baud rate generátor beállítása megfelelő.
Ezen kívül van még néhány felesleges sor a kódban, de ha minden igaz a működést nem veszélyeztetik. Szerk.: Látom közben Hp41C felhívta a figyelmet a többi problémára is. Hp41C : Ha nincs engedélyezve az adás oldali megszakítás, akkor azt nem kell vizsgálni a megszakítás rutinban sem (ebben az esetben nem volt engedélyezve). |
Bejelentkezés
Hirdetés |