Fórum témák
» Több friss téma |
Fórum » PIC - Miértek, hogyanok haladóknak
Jól látom, hogy RA5-öt mind a kétszer 0-ra vizsgálod?!
Steve
Tökéletesen jól láttad, ki is cseréltem erre:
if (RA5 == 1) { RC0 = 0; } if (RA5 == 0) { RC0 = 1; } De most sem megy! Meggyullad, de nem alszik ki! Tudi valami elemi hülyeséget nem veszek észre. Próbáltam RC-vel is, ott is semmi.
Úgy ellenállás nélkül mi van az RA5-ön?
Az ANSEL és az ANSELH regisztereket hol állítod be?
Idézet: Ez azt jelenti, hogy csak RA0 lesz bemenet. Az általad vizsgált RA5 pedig kimenetként van konfigurálva! Még jó, hogy ellenállással húztad fel,s nem direktben! „TRISA = 1;”
Qt4-hez ért valaki? Az AN1310 PIC16/PIC18 bootloader programletöltőjének van egy terminál ablaka is, s pofátlanul lenyeli a begépelt ő, Ő, ű és Ű betűket (nem küldi ki a soros portra).
A többi ékezetes betűnek csak a kiírásával volt gond (a hexa kódjukat írta ki helyettük), azt már szerencsésen megoldottam. Megjegyzés: csak a Qt4.6-tal fordul (a 2010.01 kiadású SDK kell hozzá)
Sziasztok!
Kapcsoló a PIC bemenetén, lefutó jelre bekapcsol/kikapcsol egy ledet. Ugye a pergés miatt a szerencse kérdése, mikor fog állapotot váltani, mikor nem. Erre kipróbáltam azt, hogy a megszakítás LED-állapotot vált, majd egy -mondjuk- 1 másodperces késleltetés jön. A tapasztalat: királyul átvált, majd az 1mp letelte után (megint szerencse kérdése, hogy vált-e) megcsinálja ugyanazt, mintha nem lene késleltetés. pl. világít; nyomok gombot->kialszik; 1mp letelik; világít. Mi lehet ennek az oka? Köszi előre is!
Valószínűleg a megszakításjelző flag bebillen ismét, és amikor engedélyezed az egy másodperc után a hozzá tartozó megszakítást, akkor le is reagálja azt. Tehát előbb törölt a megszakításjelző flaget, és csak utána engedélyezd ismét. Már persze ha nem akarsz valami tisztességesebb pergésmentesítést csinálni, illetve a külső megszakítást nem épp olyan lassú dolgok számára lett kitalálva, mint pl. a nyomógomb.
Sziasztok nem tudom ki emlékszik még év elején kerestem jelentkezőt két pic-es nyák elkészítésére.
elvileg nem nagy szám led vezérlés 1 vagy 2 pic az egyiknél 3 a másiknál 1 bemenet és egy felhuzórelén átvezetve a kimenetek. Remélem nem írtam marhaságot ha valaki válalkozna rá kérem jelentkezzen és pontosítunk Előre is köszi
Valószínű azért nem kaptál választ, mert ez itt nem az adok-veszek topic...
Próbáld meg, első körben megszakítás nélkül, hogy a lenyomás után egy ciklusban tartod a programot, és onnan csak akkor engeded ki a szálat, amikor a gombot felengedted. A cikluson belül helyezz el egy kis várakozást a gomb állapot detektálások közé, azaz néhány 100 ciklust(nem nagyon írtad milyen nyelven programozol.) Ez egy fapados pergésmentesítés, de első körben megteszi. Azért fapados, mert a megszakításon kívül, a gomb lenyomása és felengedése között eltelt időben más nem hajtódik végre. Meg lehet csinálni úgy is, hogy ez ne így történjem(feltéve hogy az alkalmazás számára ez fontos) de azt majd akkor, ha ez már működik.
Szia, Nem kell 1mp-et varni, eleg nehany tiz milisec is. Amugy nem csatoltad a programot, igy nehez megmondani hogyan oldottad meg, de az a gyanum interrupt rutinban varakozol ami eleve nem szerencses dolog, azonban gyanitom, hogy az interruptot kivalto okot rosszkor torlod. Vagy valamit a fo ciklusban rontottal el? Nehez megmondani a forras latta nelkul...
Szia
Kaptam rá akkor választ csak az meghíusult valami végett, de akkor ezek szerint nem ide való a felvetés, elnézést kérek írom a megfelelő topicba
Oké, inkább elmondom mit akarok, ahelyett, hogy kérdezgetnék, mert sem itt, sem a microchip fórumon nem oldódik meg a kérdésem.
Egy egyszerű szimpla nyomógombot akarok, ami ha lenyomom a gombot bekapcsol egy ledet, ha felengedem, kikapcsol. Persze nem ez a végcél, de C-ben már ez is gondot okoz nekem valamiért. A proci 16f690, HI-TECH C, PICKit 2 RA legyen digitális bemenet Rb legyen kimenet Ha RAx-en, mondjuk RA4-en megnyomom a gombot, akkor RC0-n kapcsoljon be a led. A programom valamiért nem működik és feltételezhető, hogy a config-al van gond, de nem jöttem rá a bibire. #include #include void configure(void) { __CONFIG(LP & WDTDIS & PWRTDIS & UNPROTECT & BORDIS); // __CONFIG(INTIO & WDTDIS & PWRTDIS & BORDIS & MCLRDIS & FCMEN & IESODIS & UNPROTECT); TRISC = 0; TRISA = 0b11111111; IRCF2 = 0; IRCF1 = 0; IRCF0 = 0; SCS |= 1; } void main(void) { configure(); while (1) { if (RA5 == 1) { RC0 = 1; } if (RA5 == 0) { RC0 = 0; } } //while } //main
Mondjuk nem árt az RA4-et vizsgálni és nem az RA5-öt, ha az RA4-en van a nyomógomb.
Valamint ahogy említették, az ANSEL regisztereket is be kellene állítani, hogy az RC0 láb digitális legyen.
Ha mindent jól beállítottál, akkor ez a "program" azt csinálja, hogy ha az RA5-ön 1V a fesz, akkor RC0(Hi-Tech C-ben így kell egy port bitjére hivatkozni?) 1 lesz, és ha 0, akkor 0. Tehát a gombodat úgy kell bekötni, hogy ez teljesüljön. Én fordítva stabilabbnak gondolnám a gomb bekötését(tehát megnyomva 0), akkor meg kéne fordítani a feltételt.
Namost ezen felül ez a programrész, azon kívül hogy elvileg működik, nem jó semmire, de gondolom egyelőre örülnél, ha ez menne. Persze én csak a "programról" beszéltem, a konfigurációt, ahogy potyo írta meg kell tenni, hogy a feltételek adottak legyenek a működéshez!
A végtelen ciklusban szerintem ezt akartad csinálni:
Tulajdonképpen nem is "csak egy pillanat"-tól kell beszélni, mert a PIC I/O lábai végig lebegő állapotban vannak a RESET alatt, illetve utána is, egészen addig, amíg a programvégrehajtás nem ér el odáig, hogy az adott portot kimenetre kapcsolja.
Ha tehát az áramkörben pl. valamilyen külső RESET megoldást használsz (mondjuk egy nyomógombot), akkor amíg az aktív (nyomva tartod), addig folyamatosan fennáll a lebegő állapot. Ezért kell a PIC köré épülő áramkört úgy megtervezni, hogy ez a lebegő állapot biztosan ne okozzon gondot, olyan szintre kell kényszeríteni a PIC által vezérelt vonalakat, amik "biztonságos", vagy "alaphelyzeti" szintet jelentenek. Erre a kényszerítésre a legegyszerűbb megoldás az ellenállásos GND-re vagy Vdd-re húzás, ahogy már mások is leírták.
Én továbbra is hiányolom az ANSEL beállítását. Bár ahogy az adatlapot megnéztem, az RA5 nem tartalmaz analog részt.Épp csak az az OSC1 láb is. Ha nem belső ütemadót használsz ( internal RC ), akkor ez a láb nem használható ki/be menetként.
Assemblyben így szoktam a configot beállítani, ha belső órával akarom használni a 690-es picet:
Próbáltam én mindent, ANSELt is, de ahhor még kell egy include. De most fáradt az agyam, hogy rájöjjek melyik.
Ebből a válaszodból azt érzem, hogy a fordítás nem 690-re történik. A programlistából nem is igazán látom, hogy melyik eszközre készült a lista.
Legalább a programod elejére szúrd már be azt, hogy
Vagy még annyit, hogy ha SDCC fordítót használnál ( én ebben tudok segíteni, ezt használom ), akkor így kezd a programodat:
A fordítás pedig parancssorban: sdcc -mpic14 -p16f690 programom.c Idézet: „icserny írta: A végtelen ciklusban szerintem ezt akartad csinálni: 1. while(1) { 2. while (RA4); // lenyomásra vár 3. DelayMs(30); //pergésmentesítés 4. while (!RA4); // felengedésre vár 5. DelayMs(30); //pergésmentesítés 6. RC0 = 1; //bekapcsolás 7. 8. while (RA4); // lenyomásra vár 9. DelayMs(30); //pergésmentesítés 10. while (!RA4); // felengedésre vár 11. DelayMs(30); //pergésmentesítés 12. RC0= 0; //kikapcsolás 13. }” Köszi, ez segítene, de az a helyzet, hogy ennél én többet szeretnék, csak az nincs ebbe a prgiba beleírva. Problémem kicsi és egyszerű! Megpróbálom most úgy elmagyarázni, hogy megértségek: Ha leírom azt, hogy: if (RC0 = 0) { Delay(50); RC0 = 1; } if (RC0 = 1) { Delay(50); RC0 = 0; } akkor ez működik. Viszont ha lecserélem a kódot így: if (RA5 = 0) { Delay(50); RC0 = 1; } if (RA5 = 1) { Delay(50); RC0 = 0; } Akkor megszűnik működni! Az, hogy most Delay(); vagy DelayMs();-t használok az részletkérdés. Az működik! A gondom vagy a _config-ban van, vagy a port-ok beállításában... vagy hülye vagyok és amikor egy 180 Ohmos ellenállással összekötöm RAx-et a mellette lévő már nem is tudom, hogy +-al vagy minusszal (bocsi, fáradt vagyok), akkor nem jól csinálom. Persze ez nem túl valószínű, de már kezdem ezt is hinni. Most mellékelem az egész programot és akkor láthatjátok, mi a bajom:
Idézet: „Ha nem belső ütemadót használsz ( internal RC ), akkor ez a láb nem használható ki/be menetként.” Internal RC-t használok, ebben már csak azért is vagyok biztos, mert nincs kristály sem a próbapanelomra rakva, sem a prototípusomra. Meg ha minden igaz, akkor
Szerencséd, hogy jó kedvemben vagyok, mert különben most nem írnék neked. Leírom én is, hogy megértsd.
A config szóban az a betűpáros, hogy LP a következőt jelenti a PIC számára: LP oscillator: Low-power crystal on RA4/OSC2/CLKOUT and RA5/OSC1/CLKIN A kikommentelt ( dupla /, azaz per per ), meg azt mondja a fordítónak, hogy azt a sort fordításkor vegye úgy, mintha ott sem lenne. Szóval jobban jársz, ha a programodat így kezded:
A 23 - 24 sorodból meg kiveszed a konfig szó beállítást, mert az oda nem túl szép. Megnéztem már, azt az SCS bitet is. Szóval azt felesleges bizergálni, de azt már nem magyarázom. Idézet: Hát nem jól csinálod, mert nyomógombnál is úgy illek csinálni, hogy egy pillanatra se kerüljön lebegő (tehát határozatlan) állapotba a bemenet. Legyen mindig egy felhúzás rajta (pl. 10 K), a nyomógomb meg vagy lehúzza földre (benyomott állapot), vagy nem (elengedett állapot).„amikor egy 180 Ωos ellenállással összekötöm RAx-et a mellette lévő már nem is tudom, hogy +-al vagy minusszal (bocsi, fáradt vagyok), akkor nem jól csinálom.” Hogy mit szeretnél csinálni, azt lehetőleg ne egy általad is hibás működésűnek tartott programmal próbáld elmondani, hanem világosan érthető mondatokban fogalmazd meg!
Szót fogadtam és lecseréltem a _CONFIGot
Szintén szót fogadtam és RA3-ra (ahol a próbapanelen már van gomb) írtam át a megszakítást. Most már működik is Itt a végleges verzió:
Új kérdéseim:
Az, hogy mi az a Delay, vagy a DelayMs(); azzal azt hiszem tisztában vagyok. Ez egy időszak, amíg a proci csak visszaszámol, ezért nem tud mást csinálni. Előző programaimban így is oldottam meg a led 1 másodperces villogását és hasonlókat. Most viszont szeretném megtanulni mi az a Timer. Még soha nem írtam programot timer-re és nem is nagyon értem, hogyan működik, ezért kis magyarázatnak is örülnék mellé kommentelve. Szeretném, ha segítenétek a következő programot átírni úgy, hogy az a 16f690 timerét használja:
Ezt le lehet írni rövidebben?
Mondanám, hogy zseni vagy, de a C írói a zsenik.
Viszont azt mondhatom, hogy okos és ügyes vagy, mert C-t röviden csak az tud írni, aki tud C-t! Először annyira rövid volt az egy sor, hogy azt hittem ugratsz, vagy kihagytál valamit. Aztán bevillant az agyamba, hogy igazad van! Köszönöm. Következő kérdés: akkor ez működne? Az a led gyulladna ki, amilyik gombot lenyomom?
|
Bejelentkezés
Hirdetés |