Fórum témák
» Több friss téma |
Fórum » PIC - Miértek, hogyanok haladóknak
Ez így igaz, ha tőle vásároltam volna a WILLEM GQ-4X True USB programozómat, most 25.000 Ft-al rövidebb lennék. Ehelyett inkább megrendeltem Kanadából közvetlenül a gyártótól.
Herótom van az ilyen emberektől.
Nem tudom, hogy ki adja neki az ötlelet az árképzéshez, de elég nehezen tudom elképzelni, hogy ilyen árak mellett bármit is el tud adni...
Szóra sem érdemes... ahogyan az oldal sem...
Egy termosztátot építek, amely SD kártyára rögzíti (percenként) a külső és a belső hőmérsékletet. A PIC 18F452 és mivel felénk nehezen beszerezhető és postaköltséggel meg nem éri meg nem akarok külső óra IC-t alkalmazni, az egyik időzítő segítségével szeretném megoldani a percszámlálást (másodpercre nincs szükségem), tehát elég ha 60mp-enként kapok egy megszakítást. Ezzel kapcsolatban szeretném megkérdezni, mert erre sajnos sehol nem találok információt, hogy milyen módon befolyásolja vagy befolyásolhatja a megszakítás, még ha csak nagyon rövid ASM kód is, amely egyetlen bájt értékét növeli, a hardveres SPI kommunikációt?
Szia!
- A 18F452 helyett használj modernebb 18F4520 -at vagy 18F4620-at - még az utóbbi (64kb program memória és 3968 ram, 1k adat EEProm) is olcsóbb, mint a 18F452... Timer1 felhasználásával 4 másodpercenkénti (8 és 16 mp-kénti is lehetséges, de a 60 nem osztható 8-cal ill. 16 -tal) megszakítás érhető el - ez működik sleep módban is. Ha a pic -nek nem kell sleep módben üzemelnie, akkor a timer2 és egy ccp felhasználásával lehet előállítani a timer1 órajelét, akár 16384 másodpercenkénti megszakítás kérés is lehetséges.
Egy 16F877A 2db ADC lábán olvasok be 1-1 10k potmétert (0-5V).
Ha csak egyiket mozdítom meg, akkor is változik mind a két beolvasott érték. Rámértem, a feszültség állandó azon a lábon aminek nem mozdítom a potméterét, a pic mégis nagy mértékben változó értéket mond. Mit csinálok rosszul? (A tápfesz stabil, próbáltam pickit2-ről, 7805-ről, labortápról, 100n a táplábaknál...) CCSC-ben a kódom:
A feladat jellegétől és a felhasznált eszköz órajelétől függ, hogy megoldható-e két megszakítást okozó feladat kiszolgálása egymás mellett úgy, hogy ne zavarják egymást.
El kell dönteni, mi az ami halaszthatatlan, és azt kell megszakításban lekezelni, majd át kell adni a további műveletet megszakításon kívűlre. Ha a halaszthatatlan lekezelési rész hosszabb időt igényel, mint ami a másik megszakítást okozó esemény bekövetkeztéig eltelik, akkor a feladat nem oldható meg. Ha a timer megszakítás(SD-re mentés) lekezelése elodázható, akkor 18F PIC esetében használható a prioritásos megszakítás kezelés. Alacsony szinten kezelődjön le a Timer és magason az SPI. A Magas megszakítás megszakíthatja az alacsonyat. Ekkor is törekedni kell, hogy csak a legfontosabb műveleteket szabad megszakításban lekezelni. Pl. növelsz egy változót(tipikus timer INT tevékenység), vagy egy jelzést beállítasz(eltelt az idő, megjött a csomag stb.), vagy eltárolod RAM-ba a pillanatnyi értékeket, de nem a megszakításban értékeled ki, mented SD-re, ha elodázható, hanem a fő ciklusodban. Ha ezt jól szervezed, akkor nagyon sok dolog megfér egymás mellett "egyidőben".
Talán ezt szeretnéd?: if ( (speed!==p_speed) || (dir!==p_dir))
Szia!
Az úgy jó volt ... A C -ben az egyenlő-e == , a nem egyenlő-e != ...
Azt hittem, hogy egyenlőséget szeretne vizsgálni...
Akkor miért írtál !== jelet? Amúgy ez sem hülyeség, PHP-ban van ilyen összehasonlítás is
Azért, mert nem figyeltem a felkiáltó jelre, csak az egyenlőség jel lebegett a szemem előtt. Copy-paste és javítás. Kielégít a válaszom, vagy hivatkozzak még a rossz időre, fáradságra, kapkodásra, éhségre, pisilhetnékre, etc...?
Köszönöm szépen a tanácsot.
A 18F452 már megvan, ezen (jelen helyzetben) nem tudok már változtatni, ráadásul 2db-ot vettem.. És tudom is miért, most meg akartam nézni a 18F4520-at ill. 18F4620-at, de egyik sem kapható a hqvideo.hu-n, ahonnan szoktam rendelni, azt hiszem most már dereng, miért maradtam a 452-esnél. A 424-est is szeretem, igaz az egy mozdony Időközben tudatosult az is, hogy a 8MHz-es kristály nem a legjobb ötlet volt... a legtöbb helyen ezzel vagy pl. 4MHz-el találkoztam, de ebből másodpercet, vagy akár 4mp-et, amellyel még osztható a 60 maradék nélkül, nem igen tudok létretrehozni :no:
Azért ne csüggedj, meg lehet azzal is oldani!
Steve Idézet: „a legtöbb helyen ezzel vagy pl. 4MHz-el találkoztam, de ebből másodpercet, vagy akár 4mp-et, amellyel még osztható a 60 maradék nélkül, nem igen tudok létretrehozni” Pedig lehet, csak egy kicsit ügyeskedni kell. Ha Timer2-t használsz, akkor a PR2-t 250-re állítva máris a másodperc egész számú tört része lesz az az idő, amennyi időnként megszakítást ad a Timer2. Aztán ebből már nem nehéz további osztással másodpercet vagy még nagyobb időt kapni.
A kártyára írás nem gond, hiszen azt pont az 1 percenként bekövetkező megszakítás indítaná, és rövidebb ideig tart mint 1 perc. A gondom azzal van, hogy a PIC soros porton össze lesz (remélem) kötve a PC-vel, hogy grafikont és egyéb dolgokat tudjak rajzolgatni illetve fűtési időt, költséget stb. tudjak számítani, igazolván a család előtt a saját készítésű termosztát létjogosultságát
Itt már hosszabb idő is lehet az áttöltés, a rögzített adatok mennyiségétől függően. Én arra gondoltam, hogy darabokban, pl. havi bontásban küldené a PIC az adatokat, majd várna a következő megszakításra, ekkor az új adatok rögzítését követően ha még van küldendő adat, akkor ismét egy hónapnyit áttöltene... Azért a véleményetek meghallgatnám, szerintettek jó-e az elmélet, esetleg nagyon amatőr Én ezt látom a legegyszerűbbnek ugyanakkor biztonságosnak is. Tudom, így az adatlekérés több percet is igénybe vehet(ne) de csak elviekben, hiszen nagy valószínűséggel azért 1-2 havonta, márcsak a kíváncsiság miatt is letölteném "elemzésre" az összegyűlt információt. A programozást illetve a fűtési programot is a PC-n készítem el és onnan kerül áttöltésre a PIC-re, de ez is viszonylag kevés adat, tehát az egy perces "időrésbe" belefér.
kissi, potyo: Köszönöm az ötletet, kellemes hír :yes: ennek utánanézek.
Szia!
Legyen a kvarc frekvenciája 4MHz, ekkor az órajelé 1MHz. A Timer2-vel osszuk el 1000 -rel (4 -es előosztás, PR2= 249), az egyik CCPM -mel PWM üzemmódban adjuk ki ezt az 1KHz -es jelet a timer1 bemenetére. Ha a timer1 átfordulásakor bekövetkező megszakítás a Timer1 regisztereit (65536-1000) -re állitja be, akkor a következő átfordulás 1 másodperc múlva lesz, ha (65536-60000) -re, akkor egy perc múlva.
Igaz, 249 kell a PR2-be, nem 250. Szimulátorban gyorsan kiderült volna.
Viszont felesleges bonyolítani még a Timer1-el is. Azt írja, 8MHz-es kvarc van kéznél, akkor kell 249 a PR2-be, kell 1:4 prescaler és 1:16 postscaler (vagy fordítva), és akkor másodpercenként 125-ször fog túlcsordulni.
Szia!
Használj megszakításos soros adást és vételt, két alkalmas méretű körforgó bufferrrel. A vett karaktereket a megszakítás a vételi bufferbe írja be, az adási megszakítás az adó bufferből vegye ki a következő karaktert, ha van, és küldje el. A feldolgozó program a vételi bufferben levő parancsokat dekódolja, és hajtsa végre, az adatokat az adó bufferbe írja be. Az adatok lekérdezését szervezd blokkosra, egy parancs egy blokkot kérjen le, akkorát, ami belefér az adó bufferbe.
Ha nagy mennyiségű adatot akarsz mozgatni, és kicsit modernebb akarsz lenni, akkor lehet, hogy érdemes lenne az USB vagy az Ethernet felé is szétnézned.
Sziasztok!
Ismét a véleményeteket kérem.. adott egy 18F6680 (autóban, erősen zavart ipari környezet). RB1 lábra egy OC-s kimenetű HALL jeladó csatlakozik a következő képpen: 100n -> GND ; 1k -> +5V ; majd: soros 1k, és a pic lábánál még egy 100n ->GND . A problémám az, hogy RB1 láb néha olyankor is megszakítást generál, amikor nem kellene, szkópon nézve nem látok semmi rendellenes tüskét. Kiegészítettem a progit: INT1 ISR -ben megnézem hogy fel/le-futó élt vártunk(INTCON2,INTEDG1), ezt összehasonlítom PORTB,1 -el, ha különböző, akkor csak tüske(zavar) volt. Ezzel csak az a probléma, hogy a kondik miatt a fesz. "lassan" változik a lábon, és lefutó élnél előbb eljutok ISR -ig, minthogy PORTB változzon. (schmitt-trigger - TTL kaputás miatt) A kondikat nem merem elhagyni, mit tegyek? 2 74HC14 kapu a PIC lába elé jó megoldás? Vagy inkább valami tranzisztoros szintillesztés?
Nem tudom mennyire kell pontosan neked ez a 60s idozites, de akar watchdog timerrel is meg lehet valositani kulso kvartz nelkul ha nem fontos a pontossag. Ha igen akkor vagy RTC aramkor vagy kulso 32768Hz kristaly javallott...
Soros port versus USB: Egyiket sem tudod tul messzire vinni de talan alacsony sebesseggel a soroson nagyobb az eselyed. Azonkivul az USB-hez nagy valoszinuseggel kell kulso kvartz, ha az a cel, hogy azt megsporoldd akkor nem biztos sikerul megvalositanod megbizhato modon...
Ha úgyis OC kimenetről megy a meghajtás, akkor megpróbálkozhatsz egy optocsatolóval. Egy csavart érpáron vitt 10-20 mA-es áramhurok (ami az optocsatoló LED-jét hajtja) talán kevésbé lesz érzékeny a zavarokra.
Most OC-s, de más autó gyári jeladójával is mennie kéne, amit nem szívesen terhelnék ekkora árammal.
De a csavart érárat így érdemes kipróbálnom, hogy nem szimmetrikus? ezt könnyen ki tudnám próbálni..
Ha nem akarod terhelni a jelforrást, akkor tegyél utána valamit (egy tranzisztor, vagy egy OC kapu).
Megnézted, hogy ha lekötöd a jeladót a bemenetről, akkor is keletkezik megszakításnak tűnő esemény? Lehet, hogy nem is a jeladó felől érkezik a zavarjel!
Szia!
- Az is előfordulhat, hogy más egység kéri a megszakítást, de a kiszolgáló rutin nem azonosítja őket rendesen. A megszakítás kérés okát jelző (PIRr.IFxx) bit lehet 1, azonban megszakítás csak akkor lesz belőle, ha a hozzá tartozó engedélyező (PIEr.IExx) bit értéke is 1.
Sziasztok.
Most kezdenék PIC-ezni, de van egy hatalmas gondom. A sok példaprogramban olvasgatom a különféle változókat, amik sehol sincsenek definiálva. Én régebben Pascalban programoztam, és csak pislogni tudok. Ilyenekre gondolok, mint: Delay_ms, PORTB és még egy csomó, ami hirtelen nem jut eszembe. Ahogy nézegettem a PIC adatlapját, arra jutottam, hogy a regiszterek neveire közvetlenül így hivatkozhatok. Jól gondolom? Aztán meg ott vannak az ilyen hivatkozások, értékadások, mint pl. 0bx00 ezt hogyan kell értelmezni? Végül még annyi, hogy a konfigurácíós biteket hogyan állítom. Egy cikkben már olvastam, hogy #Fuses... de honnan veszem, hogy hogyan kell beállítani? A Watchdogot pl miért NOWDT, és miért nem WDT_off? Nem tudom érthetően írtam-e? Végül pedig egy fizika tanáromat idézném: "Hülye kérdés nincs, mert a kérdezőnek abban a pillanatban az a legfontosabb... Legfeljebb tükrözi a kérdező szellemi szinvonalát. "
Idézet: „Ilyenekre gondolok, mint: Delay_ms, PORTB és még egy csomó” Mindez az include vagy header fájlokban van definiálva. A konfigurációs biteket 2 módon lehet alapvetően beállítani. - egyenként bepötyögöd a megfelelő mnemonikokat (mint például PWRTE_ON) - az MPLAB Tools menüjében nyomsz egyet a Configuration bits menüponton, és ott egy lenyíló menüs listahalmazból kiválasztod a neked megfelelő opciókat (ennél a módszernél a hex fájlba nem mentődnek el a beállítások, úgy tudom, szóval nem lesz 100 %-ban hordozható minőségű a gépi kód) |
Bejelentkezés
Hirdetés |