Fórum témák
» Több friss téma |
Fórum » CCS PIC Compiler
Szia!
Köszönöm szépen! Közben sikerült nekem is megfejtenem. Üdv.
Leírná valaki kicsit szájbarágósan mit is csinál a output_float (pin) függvény
Nagyjából sejtem ... de egy program kapcsán kicsit elbizonytalanodtam, hogy tényleg jól gondolom-e. Angolul nem tudni, translate google a barátom, de most ez kevés
Bemenetnek kapcsolja az adott portot.
Az input(pin) függvény is átállítja bemenetnek, akkor mi szükség van az output_float (pin) függvényre?
az input(pin) függvénynek van visszatérési értéke, míg az output_float (pin) -nek nincs. A különbség az assembly kódban nyilvánul meg. Míg az input (pin) átállítja az adott lábat bemenetnek és lekérdezi annak az állapotát is, addig az output_float csak az irányát változtatja meg.
Sziasztok!
Szeretnék egy kis segítséget kérni, 16F630-at programozok éppenséggel, 2 nyomógombot szeretnék RA0 és RA1-re, viszont nem tudom beállítani a megszakítást. Tudom egyesével engedélyezni, de az isr függvénynél már csak RA-ként tudom szerepeltetni, így nem tudom elválasztani, hogy éppen melyik gombot nyomtam le.. Ez így lenne ennél a picnél vagy csak én rontom el? Köszi! Idézet: Nemcsak ennél, hanem a többi mikrovezérlőnél sincs külön kezelve az egyes bemenetek megszakítása. Ahogy az adatlap is írja, "összeVAGY-olják" a változásjelző biteket és lesz belőle egy megszakításjelző bit.„Ez így lenne ennél a picnél vagy csak én rontom el?” A portot úgyis ki kell olvasni a megszakításjelző bit törlése előtt, annak vizsgálatából lehet eldönteni, hogy melyik lábon történt a változás.
Most, hogy mondod valóban még sosem próbáltam ugyan azon a porton több megszakítást..
Ha nem fárasztalak túl, írnál rá egy rövid példát, hogy program formájában hogy is néz ez ki? Köszi!
Én sem használtam még egyidejűleg több változásjelző megszakítást, CCS C-t meg PIC16-ot pláne nem használok...
A hozzászólás módosítva: Dec 20, 2015
Igen én úgy látom, hogy így van. Hogy pontosan melyik lábról jött neked kell eldönteni a PORTA olvasásával.
Igen értem, csak még azt nem tudom, ha beérkezik a megszakítás az ugyebár csak egy impulzus, szval nem mondhatom a programnak, h:
if(input(pin_a0)) mert mire lekérdezem, már rég visszaáll alapállapotba.. Legalábbis sztem, de mindjárt kipróbálok ezt azt
A portot csak egyszer olvasd a megszakításban, s a beolvasott értéket tárold el egy változóba. A vizsgálatokban már csak a változó bitjeit nézegesd. Egy nyomógomb állapota nem változik túl gyakran, ráadásul illik "lassítani" rajta hardveres pergésmentesítés céljából.
A hozzászólás módosítva: Dec 20, 2015
Benjami, igazad van, a leírásod valóban sokkal egyszerűbb, azt fogom használni!
Köszi Urak a segítséget!!
Ezt a sort segítene valaki lefordítani magyarra:
x a makro paramétere,
&x a paraméter címe, (int8 *)&x az paraméter címére mutató 8 bites adatot kezeló mutató, ((int8 *)&x+1) az paraméter címe utáni címre mutató 8 bites adatot kezeló mutató, (*((int8 *)&x+1)) az paraméter címe utáni címre mutató 8 bites adatot kezeló mutató által kiválasztott rekesz értéke. Milyen kódot fordít erre a kifejezésre? Feltölti az FSR -t, és inditekt elérésel olvasa ki ?? A hozzászólás módosítva: Dec 25, 2015
24C32 eepromot próbálok kezelni, és a CCS-C drivers-ben találtam rá progit, abban van ez a sor...
Akkor, ha jól értem: ha x egy 16 bites változó akkor a felső 8 bitel tér vissza? Használható helyette a >>8 vagy a make8 is? (a lefordított kódot nem nézve)
union -t mindenhová...
16 bites elérés:
byte -os elérés:
A hozzászólás módosítva: Dec 25, 2015
24C32 írtásánál tudok-e egymás után több byte-ot írni az alábbi módon?
vagy minden írásnál külön start ... cím megadás ... 1 byte írása ... stop? Kipróbáltam a fenti megoldás, de sokszor téves adat olvasható vissza. És az olvasásnál mi a helyzet? A hozzászólás módosítva: Dec 28, 2015
A memória 8 byte -os lapokra van osztva, egyszerre maximum 8 byte írható. Azonban egyszerre csak egy lap byte -jai írhatók.
Ha a kezdőcím osztható 8 -cal, akkor írható maximum 8 byte. Ha az egyszerre írandó byte -k címében a 4. bit megváltozna, akkor a lap elejére írja be azokat az értékeket, amiknál a cím már "átfordult". Pl. ha a 0x04 -től írnál be 8 byte -ot, a 0x04 .. 0x07 byte -ok a helyükre kerülnak, a további 4 byte a 0x00..0x03 címen levő adatokat írná felül. Olvasásnál tetszőlegesen lehet kezdeni és bármennyi adat kiolvasható egyszerre. A hozzászólás módosítva: Dec 28, 2015
PWM kimenet vezérlésével kapcsolatban a CCS-C varázslója ezt a sort generálja
A főprogramba elhelyeztem a következő sort: Működik is a vezérlés, de nem 50Hz-el megy a kimenet ( az MPLAB fordítója is valami olyan üzenetet ad, hogy PWM period: 2,05 ms, Frequency: 488,000 Hz, Resolution: 10,00 bits) Timer2 beállításaira vonatkozólag a programban nincsen semmi. Mit kéne még megadni hogy tényleg a beállított frekvenciával menjen a PWM?
Az oszcillátorfrekvenciát kell szerintem valahol megadni
az init részben szerepel
Nincs olyan beállítási kombináció (legalábbis az általam ismert általános típusok esetén), amivel 488Hz alá tudna menni a PWM frekvencia 8MHz oszcillátor mellett.
A hozzászólás módosítva: Dec 30, 2015
szoftveres PWM nem játszik? 8 MHz-es órajel mellet tnem nagyon van más lehetőség. Igaz, ez lefoglal egy Timer-t.
Főleg fix kitöltési tényezőre minek egyáltalán a pwm
Vagy épp miért lényeges az 50Hz? Általában az ember minél magasabb frekvenciára törekszik, hogy utána a szűrés minél jobb legyen. De majd a kérdező ha ismét erre jár, akkor talán választ kapunk. A hozzászólás módosítva: Dec 30, 2015
Alacsonyabb frekvencia általában jobb hatásfokú, egységnyi idő alatt kevesebb a ki- és bekapcsolás, ami a veszteség javát adja. DC motorokat is jobb alacsonyabb PWM-mel hajtani.
Most kezdtem még csak foglalkozni a PWM-es témával ...
Próbálgatom a lehetőségeket ... A fix kitöltési tényezőt a varázsló generálta, de a program futásakor én felülírtam. Első nekifutásra 20kHz-et állítottam be ... eredmény az lett, hogy másra már nem nagyon maradt ideje a procinak ... ezért kezdtem el csökkenteni a frekit. Mivel próbaképp egy LED fényerejét változtattam gondoltam az 50Hz is elég mert már ott sem látom a villogást. Szoftveres PWM-el kapcsolatban nem tudom más procinál mi a helyzet, de amit én használok (16F887) annál a hardveres is lefoglal egy timert.
Igen, nem voltam egyértelmű. Szoftveres PWM esetében azt a Timer-t használod, amelyiket akarod. LED világítás esetén nem baj a 488 Hz, sőt, jobb is, mint az 50 Hz. Az még láthatóan villog.
A PWM hardverből megy, mindegy mekkora a frekvenciája, nem lenne szabad foglalnia a procit. Persze ha van hozzá megszakítási rutin is, amiben valami számításigényes műveletet csinálsz, akkor az el tudja húzni a dolgokat.
50Hz azért eléggé érezhető villogást csinál, bár első körben éppenséggel megfelelt volna. A 488Hz viszont már jó lesz, bár én inkább 1kHz körül csinálnám a LED meghajtást. |
Bejelentkezés
Hirdetés |