Fórum témák
» Több friss téma |
Fórum » PIC - Miértek, hogyanok haladóknak
Idézet: „16F877-ről volt szó, ahogy néztem, ott megvan külön a CPU órajelhez a kvarcoszci, plusz a timer1 oszcillátorhoz a T1OSI/T1OSO lábak. Két kvarc lesz a PIC mellett, egyikről dolgozik az utasításvégrehajtás, a másikról jár az ütemet adó timer1.” Igen, en ugy gondolnam, hogy az egyszeruseg kedveert lehetne az ora kvartz maga a PIC orajel generatora is. A timer1-el az a problemam, hogy 16 bites, igy a legkisebb megszakitas 2 masodperces lehet a hagyomanyos 32kHz-s kvartz-al. Mondjuk lehet oda a 3 megasat kellene tenni ilyen megfontolasbol nem tudom. De emlekszem jokorakat szivtal az oraddal, hogy kompenzaldd a 16 bites osztast es hogy hamarabb ebredezzen a keszuleked - valami volt a timer1 ujra toltogetese korul, mert nem volt mindegy mikor vegzed el, melyik FOSC utemben vagy mi volt vele a macera. Gondolom a ket ora interferenciajabol adodo kulonbsegek ezek, azaz a timer1 fut a 32kHz-n, a PIC meg mondjuk 4MHz-n, es akkor mikor jon a timer1 megszakitas akkor a timer1 meg tovabb fut, es ha a kovetkezo timer1 tick elott inicializalod a szamlalot akkor az ido kulonbsegek ossze adodnak. (megprobalom lerajzolni)
Tehat a timer1 interrupt bejon az x-el jelzett helyen, es nem mindegy, hogy az a, b, c vagy d helyen tortenik meg a timer1 szamlalo elore kiszamitott ertekkel torteno felinicializalasa.
Szerintem félreértitek (vagy csak megint elfelejtettem odaírni ) Én nem digi. órát szeretnék, hanem hagyományosat.
Tehát 3 kör, 2 kör 60-as osztással, 1 pedig 12-es osztással. Mindegyik kör más színű. és arra gondoltam, hogy van egy izé (ami szolgáltatja az 1mp-es "lökéseket", és a 877-es (1.) bemenetén, pedig mindig egy másik "case"-re billenti a programot. Ha a 60 mp letelt, akkor küld egy jelet egy másik 877-esnek (2.), ami a percet számolja, és ha megvan 60p, akkor akkor küld egy jelet egy 3. kontrollernek (kisebb lábszámú), ami meg az órát számolja. (melléklet) Remélem értitek! Majd később (ha időm engedi), bővebben kifejtem
A lenyeg az az 'ize' ami lokdosi a 'bize'-idet Azt kell eloszor megvalositanod, utana mar lehet abbol barmi is, teszel 60 db LED-et korbe, vagy propeller orat csinalsz, avagy egy winchester orat csinalsz tok mindegy.
és azt az "izét" hogy tudom megvalósítani? ? ?
Mert 555-sel nem jó, az tény!
Ehh, egy 16F877-tel majdnem egy atomerőművet is el lehet vezérelni, de az biztos, hogy egy sima léptetőregiszternél sokkal többre képes. A blokksémádból nekem az tűnik ki, hogy gyakorlatilag egy léptetőregiszter funkcióját töltené be, egy bitet léptet körbe mondjuk 60 kimeneten.
Ha kicsit "mikrovezérlősebben" gondolkozol, akkor elképzelheted pl. azt, hogy ezek a "kockák" a rajzodban nem önálló alkatrészek a valóságban, hanem csak egy-egy funkció, amit a mikrovezérlőben futó egy-egy programrész (blokk, szubrutin) megvalósít. Aztán ezeket a funkciós blokkokat a programszervezéssel pont olyan kapcsolatba is lehet hozni, mint amilyen kapcsolatban a rajzodon is szerepelnek.
Ha mégis az "izé"-t akarod megvalósítani egy külön ármkörként, akkor javaslom a CD4060-as IC-t tanulmányozni. Abban van egy oszcillátor, amit járathatsz órakvarcról, valamint egy 14 bites osztólánc. 32768Hz-es órakvarc esetén a Q13 kimeneten 2Hz-es órajelet fogsz kapni.
Igen, jól emlékszel, hogy volt ilyen esetem. Ott az történt, hogy a CPU belső, MHz-es nagyságrendű órajelről járt, a timer1 adta a megszakításokat, amik alapján növeltem az időt.
Mivel én mást is csináltam a rendszeres megszakításban (pl. nyomógombok lekezelése), ezért a "szabadon futó" timer1 órakvarcról beadott, 2 mp-enkénti megszakítása nagyon ritka volt, szerettem volna a sűrűséget mondjuk másodpercenként 16-ra növelni. Ennek köztudottan az a módja, hogy a timer1 regiszterét újratölti az ember a megszakítás feldolgozásakor, hogy az ne nulláról induljon felfelé, hanem egy nagyobb értékről, így hamarabb elérve a túlcsordulást. Az én módszerem nem a fix értékkel feltöltés lett, hanem az, hogy a TMR1H regiszter legfelső valahány bitjét egy logikai VAGY-gyal beállítottam. Így kívántam kiküszöbölni azt, hogy a TMR1H:TMR1L érték esetleg a megszakítás bekövetkezte óta már nem nulla, hanem valamennyit számolt. Ha jobban belegondolunk, ez teljesen jól működik, ha 1 legfelső bitet billentek be, akkor 1 mp-enként jön egy interrupt, ha kettőt, akkor fél másodpercenként, és így tovább. A gyakorlatban viszont az volt a tapasztalatom, hogy az óra folyamatosan késett, ha nem csináltam ezt a trükközést, hanem két másodpercenként léptettem az időt a szabadon futó timerrel, akkor meg pontos volt. Ebből azt a következtetést vontam le, hogy nem a kvarcoszci késik, hanem az érték újratöltésénél néha lemarad egy-egy lépésről a timer1 számlálólánca. A megoldás az lett a végén, hogy a TMR1H felső bitjeinek bebillentése előtt az interruptban (rettentő "illetlen módon") megvártam egy tight loop-pal, amikor vált a TMR1L értéke. Így teljesen pontossá vált az óra. Hónapok óta járnak így az óráim, nagyon meg vagyok elégedve velük.
Szia!
Hogyan állítod be az időt (egy nap 86400 másodperc)? Egy 16F877-tel közvetlenül 60 led-et vezérelni nem lehet (nincs ennyi kivezetése), valami kiegészítés mindenképen kell hozzá. A ledeket kellene máshogy vezérelni. Ebben a kontrollerben van SPI vagy I2C illesztő. Felhasználásukkal vagy esetleg 74HC595 -tel és néhány port kivezetéssel az összes ledet lehetne kezelni egy darab kontroller 2-3 kimenetével. A kialakított soros felületre aztán a kellő számú visszaalakító egységet (I2C portbővítő, shift regiszter) feltéve a 240 led meghajtása már nem gond. Amire a kontroller a legjobban felhasználható az az idő, a dátum számítása, a beállító parancsok értelmezése. Mielőtt a 3 darab 40 lábú tokot beforrasztod át kéne gondolni a tervet. Több tokipban találsz programot, ami az időt dátumot számítja, kijelzi.
Jé, valóban. De nem működött az a program sem valamiért, pedig ott még AT parancsokat sem küldtem a modulnak. Ettől függetlenül a puffer megtelhetett mert a modul bekapcsolás után "magától" is küld válaszokat. Pl "call ready"..stb Az a verzió amit a #417294 HSZ ban feltöltöttem tényleg nem tartalmazot késleltető hurkot. Azt akkor raktam bele amikor átírtam a programot hogy az igaz/hamis állapotoknak megfelelően vezéreljen zöld illetve piros ledeket. De hogy az első verziós program sem működött az tuti. No, majd ma éjjel erre is fény derül remélem. Ma nekem addig nincs alvás míg nem működik legalább 1 nyomorult bájt vétele és azonosítása azzal a kis tesztprogrammal...
Rá lehet kötni a 60 ledet, sőt még többet is. 16F877-nek van három 8 bites portja, ezekkel 8*16=144 ledet simán meg lehet hajtani multiplexben, és akkor még maradt kb. 8 láb egyéb célra is. Persze nem direktben a lábakra, hanem 1-1 emitterkövető tranzisztorral kell odakötni a ledeket. A többi már szoftver kérdése. Nem fűznék fel egy rakás portbővítőt, ha ott van egy tokban minden, ami kell, és a kontroller ígyis-úgyis ráér intézni a multiplexelést (ami amúgy nemis egy nagy ördöngősség, miután megértettük).
Sziasztok!
C30-ban szoftveres SPI-nál van egy problémám. A kimenő adatokat maszkolgatással és >> operátorral bitenként sikerült kiküldeni. Viszont a bejövő biteket is csak hasonló módszerrel tudom fogadni? Nincs valami utasítás vagy függvény erre, mint például CCS-ben a SHIFT utasítás? (ASM-ben ez az RRC utasítás lenne, ami a C-n keresztül léptet egy regisztert.)
A >> és a << pont shiftelésre fordítódik, használd nyugodtan. De hogy bitenként kéne, az kicsit túlzás. Írd utána, hogy >>8, és akkor 8-at tol arrébb.
Nekem nem teljesen világos a kérdésed. Valami ilyesmi nem jó?
Idézet: „és azt az "izét" hogy tudom megvalósítani? ? ? Mert 555-sel nem jó, az tény!” De hiszen mar leirtam! Eleg reszletesen azt hiszem! Ha az a gondod, hogy hogyan kell PIC-re firmware-t fejleszteni, akkor javasolnam a kezdoknek szolo temakort, a Konya fele konyvet, meg szamos mas online segitseget. Kezdd a LED villogtatassal, es ha az megy akkor folyamatosan bonyolitsd a feladatot egeszen addig, ameddig mar megerted a timer mukodeset, a megszakitas kezelest, es akkor olvasd vissza amit irtam -- nem b..kepp, de tenyleg ez a menete a dolgoknak.
Szia!
Ha jól olvastam, itt 240 db ledről volt szó, ehhez 30+8 láb kell. Ennyi nincs neki. Egyetértek, hogy nem kell minden egyes ledhez külöálló portbővítő kimenet. 8*16=128
Sziasztok.
Egy újabb kérésem lenne. Egy program részlet kellene 16F628A ra fotó tranzisztort vagy ellenállást szeretnék illeszteni egy kapcsoláshoz. A lényeg hogy sötétedéskor és virradatkor legyen egy szintváltás valamelyik PIC kimeneten. Sajnos a PIC analóg részét nem ismerem ezért ha valaki tud egy ilyen program részletet megköszönném pláne ha lenne a sorok után egy rövid magyarázó szöveg hogy melyik sor mit csinál. Előre is kösz.
Sziasztok!
Mennyire bonyolult C-ben az ADC konverzió implementálása? Főleg az a rész érdekel, amikor ADRESL és ADRESH kezelve van. Köszi
Kb. annyira, mint asm-ben. El kell olvasni az AD átalakítóról szóló részt az adatlapban, és lekódolni az ott írtakat. Hogy asm vagy C, az már harmadrendű...
hm, köszi szépen, elvét tudom
Csak azt a részt láttam nehezebbnek, amit az előbb is írtam,hogyan kezeljem azt a 10 bites adatot, hogy töltsem ezt egy regiszterbe?A C-s kódolást még csak most kezdtem.. Ha nem megy azért írok..
Én nem találkoztam így most gyorsan átfutva, hogy 240 led lenne, 2x60+12(vagy 24) ledről volt szó, ami 132darab (144). Ha 9+16 lábat (vagy 12+12) használ, akkor pontosan megvan a 144 darab led számára a hely, és még mindig megmarad a kontrolleren néhány szabad láb. A 240-et nem csak 8x30 formában lehet előállítani, hanem 15x16 formában is, ami csak 15+16 lábat igényel, azzal épp ki lenne centizve két nyomógomb mellett
Idézet: Ne egybe tedd, hanem kettőbe! 8 biten nem fér el 10!„hogyan kezeljem azt a 10 bites adatot, hogy töltsem ezt egy regiszterbe?” C-ben meg egy 16 bites unsigned int típusú változó megteszi.
Nézz meg néhány példaprogramot és próbáld megérteni azokat. Pl. ott van az a kapcsolásom az autó belső világításának késleltetéséről, annak a firmware-jében szerintem sok alap dolog érintve van.
köszi, már azokat nézem...
Idézet: „Nincs valami utasítás vagy függvény erre, mint például CCS-ben a SHIFT utasítás?” CCS-ben a SHIFT_LEFT() és SHIFT_RIGHT() függvények memóriában letárolt több-bájtos struktúrák vagy tömbök bitforgatására való. Neked nincs erre szükséged, hiszen a standard << és >> operátorok is tudják kezelni a változóidat.
Elkészítettem, viszonylag jó adatot is ad vissza, csatoltam, remélem kb.-ra így gondoltátok az implementálást
És lenne még egy kérdésem, pl: i = a+10*2.3/7 műveletet, hogy tudom elvégezni (a 16 bites szám, cc5x fordító)? Néztem a help-jét, ott azt írják, hogy csak a math16.h-t kell includolnom és megy is.. valamiért nem csinálja, mivel még képeltet (sem) nem csináltam valaki elmagyarázná, ha valamit rosszul gondolok ez ügyben?
Ez így nem lesz jó szerintem:
Az utolsó két sort lehetne így írni:
A képlet jónak tűnik, talán az lehet a gondja, hogy a 10*2.3/7 értéke nem int, hanem float tipusú, és ahhoz kellene a math16.h, hogy azt össze tudja adni az a változóval. A math16.h nekem furcsa, mindig math.h-nak szokták nevezni azt a fájlt. Mi a hibaüzenet? Vagy miből tudod, hogy nem csinálja?
köszi,a válaszod!
ezt írja ki: Error szenzor.c 79: Too complex operation or library required (The right math library can be included by an #include before the operation. A complex expression may have to be splitted into simpler statements, using extra variables to store temporary results) megpróbálom amit írtál, és remélem csak ez én hiányos tudásom miatt nem sikerült eddig még megcsinálnom
Üdv!
Természetesen én is ismerem ezeket az operátorokat (>>,<<). Ezeknek az operátoroknak van egy hátrányuk, mégpedig, hogy a kiforgatott bitet nem tudjuk felhasználni, illetve nem tudunk ezek segítségével biteket beforgatni. Amit potyo írt pár sort valami olyasmit csináltam én is csak egy kicsit bonyolultabban. Azt hittem van valami egyszerű kis utasítás, mert hát hiszen ASM-ben van rá. Köszönöm a válaszokat és a segítséget.
Ugyan nem ismerem a CC5x-et, de az az üzenet nekem azt sugallja, hogy a math.h-t kellene #include-ba tenned, és a math library-t hozzálinkeltetned a fordításkor.
Valószínűleg a tizedestört miatt már lebegőpontos számokkal számolna, ehhez kell neki a math lib. Ez egyébként azért sem túl jó ötlet, mert egy kisebb PIC programmemóriájának jelentős részét el szokták venni a lebegőpontos műveleteket megvalósító szubrutinok. Ezért, ahol csak lehet, inkább érdemes elkerülni a lebegőpontos számokat, és egész számokkal dolgozni. Pl. az "i = a+10*2.3/7" kifejezést írhatod "i = a+10*23/70" alakban, és máris nincs benne tizedestört. |
Bejelentkezés
Hirdetés |