Fórum témák

» Több friss téma
Fórum » CCS PIC Compiler
 
Témaindító: (Felhasználó 1542), idő: Ápr 3, 2006
Lapozás: OK   111 / 118
(#) madazg77 válasza foxi63 hozzászólására (») Szept 20, 2015 /
 
Szia!

Köszönöm szépen! Közben sikerült nekem is megfejtenem.

Üdv.
(#) Lamprologus hozzászólása Dec 9, 2015 /
 
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
(#) sysy válasza Lamprologus hozzászólására (») Dec 9, 2015 / 1
 
Bemenetnek kapcsolja az adott portot.
(#) Lamprologus válasza sysy hozzászólására (») Dec 9, 2015 /
 
Az input(pin) függvény is átállítja bemenetnek, akkor mi szükség van az output_float (pin) függvényre?
(#) Gyimate válasza Lamprologus hozzászólására (») Dec 9, 2015 / 1
 
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.
(#) Istibácsi hozzászólása Dec 19, 2015 /
 
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!
(#) icserny válasza Istibácsi hozzászólására (») Dec 20, 2015 / 1
 
Idézet:
„Ez így lenne ennél a picnél vagy csak én rontom el?”
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.

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.
(#) Istibácsi válasza icserny hozzászólására (») Dec 20, 2015 /
 
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!
(#) icserny válasza Istibácsi hozzászólására (») Dec 20, 2015 / 1
 
É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
(#) ktamas66 válasza Istibácsi hozzászólására (») Dec 20, 2015 / 1
 
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.
(#) Istibácsi válasza ktamas66 hozzászólására (») Dec 20, 2015 /
 
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
(#) icserny válasza Istibácsi hozzászólására (») Dec 20, 2015 / 1
 
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
(#) Istibácsi válasza benjami hozzászólására (») 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!!
(#) Lamprologus hozzászólása Dec 25, 2015 /
 
Ezt a sort segítene valaki lefordítani magyarra:
  1. #define hi(x)  (*((int8 *)&x+1))
(#) Hp41C válasza Lamprologus hozzászólására (») Dec 25, 2015 / 1
 
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
(#) Lamprologus válasza Hp41C hozzászólására (») 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)
(#) Hp41C válasza Lamprologus hozzászólására (») Dec 25, 2015 /
 
union -t mindenhová...
  1. typedef union _word
  2. {
  3.     unsigned int Val;
  4.     struct
  5.     {
  6.         unsigned char LB;
  7.         unsigned char HB;
  8.     } bytes;
  9. } word;


  1. word w;

16 bites elérés:
  1. w.Val = 0x55AA;

byte -os elérés:
  1. w.bytes.HB = w.bytes.LB;
A hozzászólás módosítva: Dec 25, 2015
(#) Lamprologus hozzászólása Dec 28, 2015 /
 
24C32 írtásánál tudok-e egymás után több byte-ot írni az alábbi módon?
  1. void write_ext_eeprom(long int address, BYTE data1, BYTE data2, BYTE data3, BYTE data4) {
  2.    while(!ext_eeprom_ready());
  3.    i2c_start();
  4.    i2c_write(0xa0);
  5.    i2c_write(hi(address));
  6.    i2c_write(address);
  7.    i2c_write(data1);
  8.    i2c_write(data2);
  9.    i2c_write(data3);
  10.    i2c_write(data4);
  11.    i2c_stop();


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
(#) Hp41C válasza Lamprologus hozzászólására (») Dec 28, 2015 / 1
 
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
(#) Lamprologus hozzászólása Dec 30, 2015 /
 
PWM kimenet vezérlésével kapcsolatban a CCS-C varázslója ezt a sort generálja
  1. #use pwm(CCP2,TIMER=2,FREQUENCY=50,DUTY=25)

A főprogramba elhelyeztem a következő sort:
  1. set_pwm2_duty(PWM_value);

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?
(#) potyo válasza Lamprologus hozzászólására (») Dec 30, 2015 /
 
Az oszcillátorfrekvenciát kell szerintem valahol megadni
(#) Lamprologus válasza potyo hozzászólására (») Dec 30, 2015 /
 
az init részben szerepel
  1. setup_oscillator(OSC_8MHZ);
(#) potyo válasza Lamprologus hozzászólására (») Dec 30, 2015 /
 
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
(#) Bakman válasza potyo hozzászólására (») 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.
(#) potyo válasza Bakman hozzászólására (») Dec 30, 2015 /
 
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
(#) Bakman válasza potyo hozzászólására (») 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.
(#) Lamprologus válasza potyo hozzászólására (») Dec 30, 2015 /
 
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.
(#) Bakman válasza Lamprologus hozzászólására (») Dec 30, 2015 /
 
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.
(#) potyo válasza Lamprologus hozzászólására (») Dec 30, 2015 /
 
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.
Következő: »»   111 / 118
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem