Fórum témák
» Több friss téma |
Fórum » PIC - Miértek, hogyanok haladóknak
Nincs, de a gyártó oldalán rengeted - infó - van.
Titkosnak annyiban titkos, hogy egy háromnegyedéig kész diplomamunka. Amiből már csak az usb értelmes lekezelése hiányzik, ezt szeretném megvalósítani a timer1-el, egész pontosan az USBTasks() periódikus hívogatását, ugyanis akad blokkolódó függvényem az alkalmazott rádiós megoldás miatt, amit másképpen viszont nem tudok megoldani.
Ellenben, ha esetleg valakinek van elfekvőben egy MCC18-as működő timer1-es kódja, azt megköszönném.
Köszi , ezt néztem , de ebből én nem tudtam konkrétumot kihámozni, gondoltam esetleg van bevált
párosítás konkrét alkatrész paraméterekkel. Azért köszi!
Vannak már külön topikok is hasonló témában:
Műveleti erősítő műszer elé DC! Műveleti erősítő Mellesleg furcsállom, hogy kapcsolási rajzot kérsz, de a mérendő jelről még semmit sem tudunk (AC/DC, 10V vagy 10000 V?)
A mérendő feszültség nem is fontos mert osztót tudok csinálni én is hanem konkrétan az A/D és előtte álló műveleti erősítő érdekelne, azaz hogyan lehet mondjuk egy PIC-el 100Mohm-os bemeneti ellenállású mérőeszközt csinálni.
Egy otlet: A timer mindig fusson! Abbol indulnek ki, hogy mikor a magnes elhalad, akkor ki kell olvasni a timert, es az elozo erteket kivonni, igy megkapod az aktualis idot. Ebbol sebesseget lehet szamolni ill egy korul fordulas mindenkeppen 1.7m lesz tehat a km szamlalo is menni fog.
Ha ez megvan akkor gondolkozz el mi tortenik mikor a timer tulcsordul, es hogy kezeled le a hibat ill milyen modszerrel lehetne a timer t 16 bitesrol 20, 24 ill 32 bitesre boviteni, melyik lenne a celszeru, es mi tortenik ha a piros lampanal varakozol, magyaran 5 percig nincs jel stb... Ezeket kellene eloszor atgondolni es megfogalmazni, es ha az megvan akkor nekiallni leprogramozni... Mikor ezzel a folyamat megszervezesevel foglalkozol akkor eloszor hagyd figyelmen kivul az erchitekturat, majd mikor a folyamat jonak tunik akkor folyamatosan bontsd le, hogy az adott folyamatot mikent lehetne az architekturan megvalositani... Idézet: „hogyan lehet mondjuk egy PIC-el 100Mohm-os bemeneti ellenállású mérőeszközt csinálni.” Ehhez sem a PIC-nek, sem az ADC-nek nincs köze. Egy kis bemenőáramú (Ib paraméter!) FET bemenetű műveleti erősítő kell a bemenet és az ADC bement közé, ahogy erről korábban már szó volt (Watt konkrét típust is ajánlott, de ezer mást is választhatsz). Az alapkapcsolás pl. ez: Kép: Hivatkozás
A 24 bites ábrázolással a Patriot rakétát működtető szoftver csúnyán befürdött 1991 febr. 25-én: a véges számábrázolás miatt rosszul mérte be a közeledő iraki rakétát, s csúnyán mellélőtt. :yes:
Idézet: „A 24 bites ábrázolással a Patriot rakétát működtető szoftver csúnyán befürdött 1991 febr. 25-én: a véges számábrázolás miatt rosszul mérte be a közeledő iraki rakétát, s csúnyán mellélőtt.” Hehe, ezt nem tudtam Vegulis a fejlesztok voltak a ludasak: Ugy kellett volna csinalni, hogy ha tulcsordulas van vagy barmi mas szoftver hiba akkor egyszeruenn vissza kellett volna iranyitani a raketat a fejleszto merno asztalahoz es igy az a mernok tobb hibat nem kovethetett volna el
Najó, de azért az a 24 bit nagyon sok mindenre elég. A PIC-pákámban is 24 biten ábrázolok egy csomó mindent, igaz, a számolások közben vannak 32 bites részeredmények is, ha jól emlékszem. Itt meg csupán egy számlálóláncról lenne szó.
Szerintem kb. a következőket kellene csinálni ebben a motoros progiban: 1. Engedélyezni a timer1 megszakítást, valamint elindítani a timer1-et állandóra. A beeső megszakításoknál egy 1 byte-os számlálót mindig megnövelni, ez lenne a számlálólánc harmadik byteja, így alakulna ki a 24 bites érték. 2. Minden INT megszakításnál kiolvasni a timer1 24 bites értékét és kivonni az "előzőleg eltárolt" 24 bites értékből, a "különbség"-et letárolni. Az aktuális értéket beírni az "előzőleg eltárolt" értékbe. 3. Továbbá minden INT megszakításnál egy "timeout" számlálót be kell állítani mondjuk 2-re. 4. A timer1 megszakításokban a "timeout" értékét csökkenteni kell, ha az még nem nulla. 5. A főprogram csinálja a többi dolgát, emellett mindig meg kell nézni, hogy a "timeout" nulla-e, mert ha igen, akkor áll a kerék. Ha "timeout" nem nulla, akkor lehet számolni az INT interruptban eltárolt "különbség" értékből a kijelzendő sebességet.
Szerintem meg a CCP1 modult kéne beizzítani, és szépen kivonogatni a "két értéket" egyásból. Ha van TMR1 túlcsordulás, akkor azt számolni kell és hozzáadni a végső kivonáshoz. A TMR1 mindig járna, nem kell kikapcsolni soha. Néhány túlcsordulás után csak akkor számolna, ha a második impulzus érkezne. Szerintem ez a legjobb megoldás.
Jók az 5letek de ma egy kicsit elment a kedvem az egésztől mert már egy egyszerű szöveget sem hajlandó kiírni.
Most nagyon felidegesített az biztos! Írtam egy másik programot amivel vizsgálni akartam a TMR1IF bebillenését úgy hogy ha bebillen kiír egy szöveget de nem működött. Aztán gondoltam megnézem hogy feltétel nélkül kiírja e a szöveget szóval kivettem a feltétel kezelést de így sem írt ki semmit a kijelző üres maradt. És itt még szó sincs megszakításokról mert mindet tiltottam az elején! Gondoltam vissza égetem az előző progit amiben benne van minden hátha a PIC rossz és most kiderül de nem mert azzal van kijelzés. Minden subrutint abból másoltam ki de ennél nincs kijelzés, nem csinál semmit és nem tudom miért! Valaki lát ebben valami fatális hibát amit nem veszek észre?
Nem tiltottad le az AD átalakítót, és annak vannak bemenetei a PORTE-n is. Az ADCON1 regiszterben állítsd át az összes lábat digitálisra.
Ami még ezután jöhet: kijelző kontrasztbeállítása jó? Biztosan vársz eleget két parancs kiküldése között? Hogy biztosra menj, minden CALL LCDPUTCMD után vagy előtt tegyél be egy 1ms-os várakozást. Azután ha működik, akkor ezeket szedegetheted kifelé.
Most nézem, hogy figyeled a busy flaget, szóval az 1ms-os várakozás tárgytalan.
Igazad van, pfff pedig a 628--asnál is ez szivatott meg!
Köszi a tippet! Működik! Mostmár tényleg megnézem annak a flagnek a bebillenését : )
Megírtam a csak sebességmérő programot de továbbra sem hajlandó nullázni!
Kipróbáltam rögtön futó tmr1 el de akkor sem nullázott. Megszakítással induló TMR1-el sem nullázott. Az érték változik de nem vagyopk biztos benne hogy jól mér. Amikor nem hívok több megszakítást túlcsordul a számláló mégsem nullázódik a kijelzés. A flag beáll az biztos mert azt is teszteltem egy külön progival sőt kettővel is. Az egyikben megszakítás függően a másikban tiltott megszakításokkal és mindkét esetben beállt a flag. A szimulátoron is látszik hogy lekezeli a feltételt és nulláz, csak a valóságban nem. Itt a program felkommentezve, remélhetőleg átláthatóbb már mint volt!
Rájöttem!!! Mostmár nullázza a kijelzett értéket ha túlcsordul a tmr1. Ki kellett venni a nullázás után
a BCF PIR1,TMR1IF sort és áttenni a megszakításba! Épp magyaráztam havernak a működését és közben rájöttem hogy nullázza az csak olyan gyorsan hogy nem veszem észre mert viszsabillentem a TMR1IF et és újra kiírja az osztás értékét a számláló futása alatt!
Most akkor leirnad, hogy mit is csinalsz vagy mit is akarsz csinalni? Amit a mostani leirasodbol erteni velek, hogy:
1. Timer alapban nem fut 2. magneselhalad, interrupt beesik 3. ISR-ben timer nullaz es elindit 4. magnes megint elhalad, interrupt ismet beesik 5. timer kiolvas es leallit (?) 6. szamolgat 7. ha timer overflow interrupt van, akkor timer leallit 8. kiiras 9. --> 2. Tehat minden 2. lepesben mersz?
Működik teljes egészében mostmár csak a pontossági tesztek vannak hátra.
Hogy mit is csinálok? Alapban TMR1 nem fut! Elindul a kerék és elindul a TMR1 is! Jön a következő fordulat akkor megállítom TMR1 et és kimentem az értéket ami bekerül az osztásba. Aztán ha a kerék közben megáll akkor nullázom a kijelzést és megállítom tmr1 et. Értelemszerűen a következő fordulat indítja el és az azutániban lesz mért érték. Minden kiolvasás után nullázom a TMR1 et. Minden körben mérek csak az elején kell 2 fordulat hogy elinduljon a számláló. A mentés egyellőre úgy néz ki hogy minden kilométer után ment az eepromba! Elvileg 1000000 írást bír az eeprom ami elvileg egymillió kilométer. Szerintem az még egy autóban is becsületes szám nem hogy egy kismotorban. Bár ezen a mentésen még gondolkodok hogyan kéne! Gondoltam a sleepre is de akkor a kijelzőt meg a jeladókat meg a PIC et egymástól független tápra kell kötni. Olyan lenne mint Pl az autórádióknál hogy lenne egy vezeték ami az akkura menne közvetlen amit nem szakít meg a gyujtáskapcsoló(ez lenen a PIC tápja) és lenne a másik amit megszakít a gyulakapcsoló és ez lenne a kijelző meg a jeladók tápja. Amikor megszűnik a perifériák tápja ezt a PIC egyik lábán érzékelném és ennek megfelelően elküldeném aludni egy sleep el. Amikor ráadom a gyújtást és elindul a kerék akkor felébredne és működne rendesen. Viszont ehhez új panelt kéne maratnom : ( Idézet: „Alapban TMR1 nem fut! Elindul a kerék és elindul a TMR1 is! Jön a következő fordulat akkor megállítom TMR1 et és kimentem az értéket ami bekerül az osztásba.” Magyaran akkor 1 korbe fordulast megmersz, utana 1-et nem mersz? Merthogy megallitod a timert... Idézet: „Aztán ha a kerék közben megáll akkor nullázom a kijelzést és megállítom tmr1 et. Értelemszerűen a következő fordulat indítja el és az azutániban lesz mért érték. Minden kiolvasás után nullázom a TMR1 et.” Igen, tehat a kovetkezo fordulat inditja el... magyaran 1 fordulatot all a meres... Magyaran amit leirtam lepesekben azt csinalod... Idézet: „Minden körben mérek csak az elején kell 2 fordulat hogy elinduljon a számláló.” ...na es akkor most ez az en olvasatomban ellenr mond mindannak amit eddig leirtal, vagy valamit elnezek? Tehat 1. korben a szamlalot az interrupttal elinditod, az ketyeg, jon a masodik interrupt, leallitod, szamolgatsz, es amig megint korbe nem ert a kerek semmit sem csinal a szamlalo...
Bocs azt kihagytam hogy amikor kiolvasom és nullázom újra el is indítom a számlálót!
Az eepromba mentésre lenne egy javaslatom:
Menjen a PIC egy leválasztott tápról, külön pufferrel, és figyeld az egyik lábbal, hogy mikor megy el a feszültség. Amikor elmegy a feszültség az összes külső alkatrész lekapcsol, de a PIC a saját pufferéről még járni fog egy ideig. Amikor elment a táp lesz annyi idő, hogy kimentsd a pontos állást (tehát nem csak a kilométert) és mentés után beküldöd a programot egy végtelen ciklusba, hogy amíg elfogy a feszültség a pufferről ne csináljon semmit. Így nem veszíthetsz a megtett távból 100 métereket.
Szia !
Esetleg van ilyen rajzod SPI busz leválasztására is? És hogy is néz ki ez ha több eszköz van optóval leválasztva, tehát mondjuk 4 AD , mert ugye az opto nem fog tudni 3 állapotot felvenni.
A múltkor írtam, hogy én hogyan valósítanám meg ezt a sebességmérést. Most az új breadboardomon (Bővebben: Link) éppen a Hi-Tech ingyenes C-jét próbálgatom, és megírtam benne a sebességmérő progi vázát. A kijelzés előtti skálázások nincsenek benne, de a működés alapvetően kipróbálható, egy nyomógombról adok neki "kerékimpulzusokat". Forrás a mellékletben.
Az SPI az nem igazan busz, az inkabb egy peer-to-peer. Az I2C-nel pedig az eszkozoknek cimei vannak igy az eszkoz tudni fogja mikor kell pofazia, nem kell annak tobb allapotot felvennie.
Ez igaz, de az SPI-re is felfűzhetek több eszközt és
CS lábbal ugye engedélyezem a chippet amelyikhez éppen szólok. De mivel optóval választanám le ezért az eszköz kimenete vagy le vagy felhúzná a közös lábat(kat). Mondjuk ez 2 OC-s optoval megoldható 1 vezetékre , de hátha van egyszerűbb. Ha I2c-t választok ott sem mondható egyszerűnek a leválasztás.
Sziasztok! Az a problémám, hogy nem indul a program a PIC18F1320 on, amíg az ICSP -n nem piszkálom, pl. : beolvasom a flash tartalmát. Én már mindent kipróbáltam ami eszembe jutott. Valami ötleteket várok arra vonatkozólag, hogy mit tegyek , hogy magától elinduljon a progi! Köszi előre is!
Hat ennel azert kicsit tobbet kellene tudni errol. Kapcs rajz? Forras?
Amit latatlanban mondani lehet: LVP le van-e huzva 5-10k-val a foldre? Config biteknel MCLR, LVP, PWRTE stb ezek jol allnak-e? 100nF ra van-e teve _mindenutt_ a Vdd-Vss-re kozvetlen a PIC labara?
Hali! A rajzot nem adhatom oda sajnos.(Szakdolgozatom) De persze ilyen apróságokkal nem buktázok el. Egyre rosszabb, kezdetben mclr pin disableden volt, akkor történt amit az előbb leírtam, mert nem akartam külsőleg indítani, de ha most meg enabledre állítom, akkor meg ha meg akarom fogni az eszközt mindenféle random karaktereket küld el nekem a com ra.(belátom nehéz megérteni de a lényeg amit csinálnia kéne: A/D konverterel egyet majd azonnal elküldi az eredményt egy ftdi ic n keresztül a COM ra. egyszóval pofon egyszerű dolgot kéne csinálnia) szóval inkább aura érzékelő mintsem egy A/D konvertelő eszköz, én mlg nem láttam ilyet...
Az optocsatolók általában nyitott kollektoros kimenetűek, így felfelé nem húznak, csak lefelé. Lefelé pedig csak akkor, ha a LED-jük aktív, ez pedig nem fordul elő akkor, ha az SPI eszköz CS lába nincs lehúzva. Nem látok tehát problémát a közösítésnél.
|
Bejelentkezés
Hirdetés |