Fórum témák
» Több friss téma |
Fórum » PIC - Miértek, hogyanok haladóknak
Sziaszok
Van egy dsPic30F4013-asom, ANALÓG jelet szeretnék vele feldolgozni, de sehogy sem akar sikerülni, átnéztem már az összes doksit, de nem jövök rá hol a hiba a programban, vagy a beállításokban. A légyeg, hogy egy analóg bemenetről szeretnék automatikusan mintavételezni és konvertáni. Inicializálás:
Feldolgozás:
A port irány be van állítva. Ha valaki belenézne és segítene, hálás lennék Köszönöm
Szia!
Nem feltétlenül kell multiplexálni. Tegyük fel 4 kimeneted van. Gondold a négy kimenetet egy négyzet négy csúcsának. Minden élre és minden átlóra két szebefordított LED-et képzelj párhuzamosan. Ekkor az ábrán 12 LED van. A portok felé mindegyik csúcs egy-egy áramkorlátozó ellenállással kapcsolódik. (ld. kép.) A port bitek megfelelő alacsony és magas szintre állításával valamint a nagyimpedanciós állapot beállításával a 12 LED mindegyike kivilágosítható.
Szia!
Idézet: „Ha tudtok fejből akkor...” Fejből éppenséggel nem tudok, de a Google segített. 1 a 16- ból multiplexer/demultiplexer -> CD4067 1 a 8- ból multiplexer/demultiplexer -> CD4051 Üdv.
Szia!
Szerintem nem jó ez az elrendezés. Pl. D2, D10 LED- nél nem működhet úgy, hogy csak egy LED világítson (Többet nem vizsgáltam). Üdv.
Ja most látom, hogy Te a TRIS biteket is állítgatnád! Úgy már egész más a helyzet, jó ötlet!
Bár egy kicsivel bonyolultabb lesz a firmware, de nem kell multiplexerekkel szórakozni. Üdv.
Hello Mindenkinek!
Én még egy kezdő vagyok, (illetve leszek ha belefogok ebbe a PIC témába), és indulás előtt szeretném áttanulmányozni az itt elérhető anyagokat, hogy tudjam mire is vállalkozok. Már van két darab PIC18F4550-es MCU-m, amiket régebben vásároltam, de még programozni nem tudom őket (egyrészt tudás hiánya miatt, másrészt a hardverek sincsenek még meg hozzá). Az itt (hobbielektronika.hu/cikkek) talált leírások (főleg az assembly nyelvű programok) "sajnos" mind a 16F szériás PIC-ekre íródtak, és a 18F-hez képest vannak eltérések. Ezek miatt szeretnék egy két kérdést feltenni. 1. A 18F4550-ös PIC-en a kimenő jelet a LATx regiszterben írjuk, a bemenő jelet pedig a PORTx regiszterben olvassuk, a kimenet és bemenet közötti váltásokért ugyanúgy a TRISx regiszter felelős? 2.A MOVFF parancs segítségével itt már el lehet kerülni a MOVFW majd MOVWF procedúrát, (hogy akksiba adat be, onnan másol a célregiszterbe?), e helyett egy lépésben megadom a forrást és a célt és már működik is? 3. Az interroupt-okkal is van egy két bizonytalanságom, főként amiatt hogy az én PIC-em adatlapjában a regiszterek között átcsoportosítások vannak a 16F-es picek regisztereihez képest, és pl ebben már nem létezik olyan regiszter hogy OPTION_REG, (ha van akkor én vagyok vak és elnézést kérek) , helyette van INTCON2 sőt 3-is. 4. Az PORTB4:7 megszakítás esetén hogy lehet megkülönböztetni, hogy melyik port-ról érkezett a megszakítási kérelem? Azt olvastam az adatlapban, hogy az INTCON regiszter RBIF (0.) bitje jelzi azt, ha a 4-7 port valamelyikéről jön a jel. Gondolom egy regiszter segítségével lehet megkülönböztetni a jel forrását, de melyikkel? 5. Ha óra építéshez "órajel oszcillátort" kötök be külső oszcillátornak, akkor azon nem kell osztást állítani a másodperc pontos meghatározásához, ugye? (van egy 32,768 KHz-es órajel oszcillátorom) 6. A PWM és az analóg-digitális konverter használatára hol találhatnék olyan forráskódot ami esetleg magyarul kommentározva van?, (a magyar leírást meg sem merem említeni). Másik idevonatkozó kérdésem, hogy azt már megértettem hogy a kimenő áram feszültségét és áramerősségét a kimeneten lévő jel gyors ki-be kapcsolgatásával éri el, de ez nem teszi tönkre a rá kötött fogyasztókat? 7. Az USB-s kommunikációhoz szükséges programot assemblyben nagyon banyolult megírni?, vagy mire elér az ember arra a szintre hogy megvalósít egy PC->USB->PIC kommunikációt, addigra úgyis meg kell tanulnia a C-t? Elképzelhetőnek tartom, hogy a kérdéseim egy részére már megvan a válasz itt a fórumon, sőt van olyan amire már én magam is megtaláltam a választ, de amiben nem voltam biztos azt megkérdeztem mégegyszer. Így utólag is elnézést kérek! Előre is köszönöm a segítséget! Üdv. Olala
Heló!
Van valakinek vmi jó ötlete, hogy hogy lehet pergés mentesítést írni programban? Mivel nekem az Int-re kellene ez, én a megszakításban írtam egy kb fél másodperces késleltetést, abban bízva, hogy míg a késleltetés lefut, addig meg történik mindenféle pergés. Lehet triviális dolog, de sikeresen megfigyeltem azt, hogy a pic megjegyzi, hogy hány megszakításkérés érkezett, akkor is ha még fut a megszakítás. Így meg bukott a mutatvány.
Egyet szögezzünk le: a külső megszakítás nem a pergésre hajlamos jelek számára van kitalálva! Pergésmentesítésre alapvetően két lehetőség van:
1. Ha mégis a külső megszakításlábat használod, akkor a megszakítás bebillenése után vársz valamennyi időt, majd ismét megnézed a lábat, hogy abban a helyzetben van-e, amiben lennie kell. Ha igen, akkor lereagálod, ha nem, akkor ismét vársz. Amikor már stabil, akkor megint törlöd az INTF flaget. Na ez azon bukik el, hogy arra vársz, hogy a láb stabillá váljon, és ez előre nem látható (legfeljebb saccolható), hogy mennyi idő alatt fog megtörténni. Ha ráadásul a megszakítási rutinban vársz, akkor abból egy kicsit komolyabb alkalmazásra nézve akár katasztrofális dolgok is kisülhetnek (anélkül is, de azzal biztosan). Ezért ha így csinálod, akkor sosem szabad a programmegszakítást engedélyezni az INT láb számára, csak a főprogram végtelen ciklusában kell figyelni az INTF bitet. 2. Timerrel időzítve beolvasod a láb állapotát nagyságrandileg 1-10ms időnként. Ha a láb állapota egyezik az előző beolvasás állapotával, akkor csökkentesz egy számlálót, ha nem egyeznek, akkor a számlálót visszaállítod pl. 10-re. Ha a számláló leér nullára, az azt jelenti, hogy a láb stabil, ki lehet értékelni. Ekkor összehasonlítod az előző stabil állapottal, és az összehasonlítás eredményétől függően vagy csinálsz valamit, vagy nem, valamint visszaállítod a számlálót 10-re. Ennek a kapcsolásnak a firmware-jében láthatod az utóbbi módszert alkalmazni. Igaz, hogy C-ben van, de asm-ben is ugyanennyiből áll megcsinálni. Idézet: „a pic megjegyzi, hogy hány megszakításkérés érkezett, akkor is ha még fut a megszakítás” Pedig elméletileg ilyen nemigen létezhet, mivel megszakítás elfogadásakor a PIC úgy tudom, letiltja a további megszakításokat. Tehát elvileg nem kellene sehol megjegyeznie, hogy közben befutott még egy megszakítás ugyanarról a forrásról. Próbáld meg azt, hogy törlöd a gombnyomásos megszakítás-rutin elején (sőt, próbáld ki majd azt is, hogy a rutin végén! is törlöd ) az adott megszakítás folyamatát/bekövetkezését jelző flag-bitet.
Sziasztok!
Szeretném megépíteni ezt a kapcsolást.Bővebben: Link.A problémám ezzel kapcsolatban a basic-ben irt és mellékelt programot nem tudom lefordítani,mindig a mellékelt hibaüzenet jelenik meg.Mi lehet a hiba, mert szerintem ennek működnie kellene. Minden segítséget szívesen veszek! Idézet: „sőt, próbáld ki majd azt is, hogy a rutin végén! is törlöd” Pontosan ez történik, a megszakítási rutin alatt újból bebillen a flag, és amikor kilép a megszakítási rutinból, akkor ismét bele is lép, mert a flag be van billenve.
Köszi szépen!
Első körben kipróbálom, hogy végén is törlöm az INTF-et, ha úgy nem jönne össze, akkor neki látók Potyo általa javasolt 2. számú megoldásnak.
Én régebben így csináltam a dspic30f4013-as A/D kezelését, igaz C-ben. Az a lényeg hogy rá lehet venni őkelmét hogy folyamatosan több csatorna A/D átalakítását is csinálja meg és az egyes csatornák eredményeit tegye be az ADCBUFx regiszterekbe. A programomban 8 A/D csatorna van használva, ahol az Initben mind a 8-at beolvastatom, a Polling-ban viszont egyszerre csak 1 csatornával foglalkozom. A feltételes fordítás csak azért van benne, mert debuggoláskor kihagytam az ICD/Pickit felé menő lábakat az A/D átalakításból hogy ne zavarja a kommunikációt.
Üdv mindenkinek!
Építettem egy PIC égetőt 16F877-hez Bővebben: Link Lemartam a nyákot megépítettem tökéletes működik(ött)! Felprogramoztam az IC-t minden jól ment felismerte megirta. Másnap viszont már nem ismerte fel a PIC-t Lehet hogy kinyirtam a PIC-t? Három led van a programozon üresen mindhárom led villog keresi a PIC-t. Viszont ha beteszem a PIC-t akkor csak a zöld és piros (power, programm) villog 2x a CLOCK nem. A CLOCK mit jelez nekem vissza? A kapcsolást átnéztem nincs baja és amint mondtam irtam is vele de most nem ismeri fel a PIC-t.
Szerintem már vagy százszor be lett linkelve watt írása, hogy miért nem működik mindig a JDM égető?
Sziasztok!
A propeller óra bővítése során 16F876 kontrolleren az MSSP modullal sikerült az I2C RTC kezelése. Át szerettem volna térni a 16F886 típusra. A már megírt programmal a 16F876 jól működik, a 16F886-on nem tudja kezelni az RTC-t. Ugyan abban a készülékben, ugyan azzal az MSSP (I2C master FOSC/4), TRISC (Scl és Sda input) beállítással, órajel leosztással (FOSC 20MHz, SSPADD 0x31), programozott (nem megszakításos) kiolvasó rutinokkal próbálkozom. Az adatlapon eltérés, amit találtam, hogy a 16F886-nak van SSPMSK regisztere, de annak csak slave módban van hatása. Az Errata-ban arra térnek csak ki, a master módban ha a slave nyújtani akarja a Scl jelet, akkor a modul rosszul működik. Csak a pic és az RTC van az I2C buszon. Ugyan azokon a lábakon (RC3 - Scl, RC4 - Sda) szoftveres I2C kezeléssel a 16F886 is kezelni tudja az RTC-t 5us SCL alacsony és 5us magas időzítéssel. Milyen beállítási különbség van a két típus között?
Értem!
Nem rossz ez a C nyelv, sokmindent leegyszerűsít főleg a matematikai műveleteket, talán egyszer beletanulok majd abba is. Lassan eljutok oda hogy leteszteljem a műszer pontosságát, csak még a jeladó felfogatásán dolgozok.
Szia Olala,
Szerintem tul sok mindent kerdeztel egyszerre, talan nem tudtak a tobbiek hol vagy hol erdemes kezdeni a valaszokat es ezert nem reagaltak. Erdemesebb lenne inkabb kisebb lepesekben tanulni vagy haladni es egyesevel kerdezni mint igy omlesztve. Idézet: „1. A 18F4550-ös PIC-en a kimenő jelet a LATx regiszterben írjuk, a bemenő jelet pedig a PORTx regiszterben olvassuk, a kimenet és bemenet közötti váltásokért ugyanúgy a TRISx regiszter felelős?” Igen, TRIS a felelos tovabbra is es ugyanugy amogy a 16F-eknel a port labakat mas belso periferiak is hasznalhatjak ugyhogy azt is erdemes az adatlapbol kiolvasni hogy hogyan kell az adott portot inicializalni. Ami a LAT-ot illeti, az a Latency szobol ered, talan kesleltetesnek lehet magyarra forditani, de szerencsesebb az "arnyek" szo hasznalata. Magyaran csak annyi a kulonbseg, hogy mikor a LATx-ba irsz, akkor amit ebbe a regiszterbe tettel azt megjegyzi es kozben atmasolja a PORT-ra. Ezzel az un RMW hibat kuszobolik ki es teszik egyszerubbe az eletunket. Idézet: „2.A MOVFF parancs segítségével itt már el lehet kerülni a MOVFW majd MOVWF procedúrát, (hogy akksiba adat be, onnan másol a célregiszterbe?), e helyett egy lépésben megadom a forrást és a célt és már működik is?” Igen, de mas elonye is van, pl, hogy nem kell bank szelekciot csinalni hozza. Idézet: „3. Az interroupt-okkal is van egy két bizonytalanságom, főként amiatt hogy az én PIC-em adatlapjában a regiszterek között átcsoportosítások vannak a 16F-es picek regisztereihez képest, és pl ebben már nem létezik olyan regiszter hogy OPTION_REG, (ha van akkor én vagyok vak és elnézést kérek) , helyette van INTCON2 sőt 3-is.” Ez minden PIC-nel igy van, marmint hogy a regiszterek atkerulhetnek mashova ill funkciok maskepp kezelodnek le. Ezt mindig az adatlapbol ki kell olvasni, ez a legjobb modszer. De azt is tanulmanyozd at, hogy a 18F-nel lehet ket szintu interruptokat is kezelni es bizonyos szuk hatarok kozott lehet automatikus kontextus mentest is csinaltatni. Idézet: „4. Az PORTB4:7 megszakítás esetén hogy lehet megkülönböztetni, hogy melyik port-ról érkezett a megszakítási kérelem? Azt olvastam az adatlapban, hogy az INTCON regiszter RBIF (0.) bitje jelzi azt, ha a 4-7 port valamelyikéről jön a jel. Gondolom egy regiszter segítségével lehet megkülönböztetni a jel forrását, de melyikkel?” Le pollozod... Azaz bejon a megszakitas, a megszakitas kezeloben lekerdezed mi okozta a megszakitast, rajossz az RBIF magas tehat a port 4-7 valamelyike okozta, es akkor BTFSS-el (vagy mas modszerrel) megnezed melyik portlab magas... Idézet: „5. Ha óra építéshez "órajel oszcillátort" kötök be külső oszcillátornak, akkor azon nem kell osztást állítani a másodperc pontos meghatározásához, ugye? (van egy 32,768 KHz-es órajel oszcillátorom)” 16 bites timernel egy ilyen kvartzcal epp 2 mp-enkent kapsz megszakitast... Most keso van es lusta vagyok bele nezni az adatlapba, hogy hova lehet az ora kvartzot kotni, de pl olyan trukk is elhangzott itt (sajnos nem emlekszem mar kitol, elnezest!) hogy a CCP modullal vizsgaljak az 1 ill fel masodkperc elteltet. De gondolom itt meg nem tartasz, hogy ezen gondolkozz... Idézet: „6. A PWM és az analóg-digitális konverter használatára hol találhatnék olyan forráskódot ami esetleg magyarul kommentározva van?, (a magyar leírást meg sem merem említeni).” Erre nem tudok valaszolni, valahol volt egy magyarra forditott (vagy ujra irt?) adatlap (datasheet) 16F84-hez, meg egy magyar site is volt valahol de most nem tudom elo banyaszni. Idézet: „Másik idevonatkozó kérdésem, hogy azt már megértettem hogy a kimenő áram feszültségét és áramerősségét a kimeneten lévő jel gyors ki-be kapcsolgatásával éri el, de ez nem teszi tönkre a rá kötött fogyasztókat?” Igy van, ez a PWM... Egy adott frekvenciaval dolgozik, az utem elejen felmegy a jel, es ha az utem vegeig kitart akkor 100%-os a kitoltottsege (100%-os munka fazisa van), ha pedig epp a felenel lemegy, akkor kapod a szabalyos negyszog jelet (50%-os munka fazis). Ha pl 5V-tal dolgozol, akkor a 100% reprezentalja az 5V-ot es az 50% a 2.5V-ot... A fogyasztoknal csak arra kell ugyelni, hogy a kapcsolo elemek az adott frekvenciat kapcsolni legyenek kepesek. De ez a frekvencia viszonylag alacsony, alkalmazastol fuggoen lehet 50Hz - 400kHz. Hallhato tartomanyban azonban nem szoktak dolgozni mivel ez esetben zavaro sipolo hangot is hallhatsz (pl rakapcsolt tekercsek miatt). Magas tartomannyal meg elektro magnezes interferencia alakulhat ki, de ez valoszinuleg egyenlore nem fog nagyon erdekelni. Idézet: „7. Az USB-s kommunikációhoz szükséges programot assemblyben nagyon banyolult megírni?, vagy mire elér az ember arra a szintre hogy megvalósít egy PC->USB->PIC kommunikációt, addigra úgyis meg kell tanulnia a C-t?” Igen. Szilva sem ma kezdte, en sem, bar mindkettonknek ujdonsag volt USB-s eszkozt csinalni, az assembly USB framework megirasa vagy masfel honapig tartott ugy, hogy szinte minden nap hajnali 3-ig gornyedtunk es napkozben is legtobbszor a konyveket olvastuk hogy estere ki tudjuk probalni az elkepzelesekett. Van jopar USB framework keszen, legtobbje C-ben, es azokat erdemes hasznalni. Meg a Microchip-nek is van ilyen framework-je, de a PIC-ekkel torteno ismerkedest nem itt kezdenem. Ha mar a LED villogtatason kivul jopar kommunikacios projecten tul vagy (marmint olyanon amit Te csinaltal, nem aminek kapcsolasi rajzat es firmware-et letoltod a netrol) akkor utana az USB-nek is neki foghatsz -- ez csak egy barati jotanacs.
Szerintem a LAT inkább a latch rövidítése, ami zárat, biztonsági zárat jelent a szótár szerint, de elektronikában talán (átmeneti) tárolóként lehetne lefordítani. Tárolja azt az állapotot, amit kiírtunk a portra.
Ezek analóg multiplexerek, nem igazán ilyenre valók. Én inkább a 74154-est (4-ről 16-ra) vagy 74159-est (szintén 4-ről 16-ra, de OC kimenet, LED-ekhez jobb választás), esetleg 74138-ast (3-ról 8-ra) ajánlanék. Esetleg ezeknek a CMOS változatát.
Szerk: a 7445/74145 és variációi is alkalmasak még a feladatra (4-ről 10-re), ezek kifejezetten nagy áramot képesek (80mA) nyelni a kimeneteken, szintén jók LED-ekhez. Idézet: „Szerintem a LAT inkább a latch rövidítése, ami zárat, biztonsági zárat jelent a szótár szerint, de elektronikában talán (átmeneti) tárolóként lehetne lefordítani. Tárolja azt az állapotot, amit kiírtunk a portra.” Teljesen igazad van. Szoktam is hasznalni a latch szot, nem ertem miert irtam latency-t
A hibaüzenet arra vonatkozik, hogy a próbaverziós fordítóban nincs engedélyezve a 32 bites "long" változók használata.
Szia Trudnai!
Már utólag én is rájöttem, hogy majdnem egy fél oldalt foglal el csak az én egyetlen hozzászólásom, és jobb lett volna egyenként megkérdezni a dolgokat. Köszönöm, hogy te azért vállalkoztál a feladatra és megválaszoltad a kérdéseimet. A tanácsodat az alapos tanulással kapcsolatban megfogadom és nem akarok egyből világot megrengető dolgokba fogni, amikhez úgy sincs még kellő tudásom. Nagyjából megértettem amiket írtál, és beszerzem a szükséges dolgokat, hogy el tudjam kezdeni a próbálkozást. Majd élesben kiderül, hogy hol vannak még a nagyon homályos részek. Üdv. Olala
Hétvégén csináltam egy progit a mikro c-ben,
Most is szerettem volna probálkozni, de azt írja ki, hogy 356 main function is not defined "356 hiba kód main függvény nincs definálva." Ezt aaz üzenetet akkor is meg kapom ha nincs semmi a progranban csak a void main() szükséges sor. Mit állítottam el?
Én úgy tudom, hogy ez a hiba akkor van, ha nem kreáltál a programhoz projectet.
Próbáld meg a Project->New Project -tel; ha így sem sikerül, akkor nem tudom. Idézet: „356 main function is not defined "356 hiba kód main függvény nincs definálva." Ezt aaz üzenetet akkor is meg kapom ha nincs semmi a progranban csak a void main() szükséges sor.” Nem tudom, hogy a MikroC-nél hogy van, de rendes C fordítóknál a void main() csak deklaráció, nem pedig definíció. A definícióhoz a függvény implementációját is meg kell adni, ami minimálisan egy {} zárójelpár. Így mit mond?
Készítettem hozzá új project-et,
Úgy van nekem is ahogy a mintát írtad. De ha a példát fordítom le akkor nem ír ki ilyet. Csináltam egy új project-et igy már jó köszi
Mikro c-ben, hogy tudom azt beállítani hogy a pl a D port 2-es lába legyen bemenet?
"ccs-ben pin_a0" leírásban nem találtam. Valaki tud segíteni? Köszi |
Bejelentkezés
Hirdetés |