Fórum témák

» Több friss téma
Fórum » PIC programozása C nyelven, C-Compiler
Lapozás: OK   21 / 153
(#) atideath válasza icserny hozzászólására (») Jún 29, 2010 /
 
Ezzel tisztában vagyok hogy így a legkönnyebb hogy csak átírom de pont ez a bajom hogy úgy kellene átírni a dolgot hogy PIN-enként meg lehessen adni hogy az Encoder hova van kötve. Ezt a féle megadást nem értem :S.

enc_position |= ( input_b() & 0x03 );

Konkrétan nem bírom értelmezni ezt a sort. A többivel boldogulok.
(#) atideath válasza atideath hozzászólására (») Jún 29, 2010 /
 
Nos. Saját magamnak válaszolva. Attól még lehet hogy nem jó

0x03 --- 0b00000011 -el egyezik meg ugye?

input_b() & 0x03 ---- Átállítja bemenetre a RB0,RB1-et

De akkor mi lesz az értéke a enc_position-nak?
(#) El_Pinyo válasza atideath hozzászólására (») Jún 29, 2010 /
 
A bitenkénti & művelettel maszkolod a B port felső bitjeit. Tehát csak az alsó két biten (RB0, RB1) levő értékek lehetnek logikai 1- ben, a többi mind logikai nulla. A |= művelet az enc_position változónak ad értéket úgy, hogy önmagát bitenkénti vagy kapcsolatba állítja a jobb oldali kifejezéssel. A sort így is lehetne írni:
enc_position = (enc_position) | (input_b() & 0x03). A bitenkénti logikai műveleteknek pedig tessék utánanézni neten vagy szakkönyvben, valamint digitális technika ismereteket sem árt feleleveníteni, megtanulni.
(#) edison14 hozzászólása Jún 29, 2010 /
 
Helló!

Azt szeretném megkérdezni, hogy CCS C-ben PIC16F877A-ra hogyan kell beállítani a belső oszcillátort? Mert átböngésztem az adatlapot de nem volt említés róla, hogy van belső oszcillátora.
(#) potyo válasza edison14 hozzászólására (») Jún 29, 2010 /
 
Idézet:
„Mert átböngésztem az adatlapot de nem volt említés róla, hogy van belső oszcillátora.”


Ha nincs belső oszcillátora, akkor mégis hogyan állítanád be?
(#) edison14 válasza potyo hozzászólására (») Jún 29, 2010 /
 
Csak azért kérdeztem mert a PIC-eket nem ismerem nagyon és ha netán tévedtem volna akkor kijavítotok.
De most van még egy kérdésem. A portok állapotát hogyan tudom beállítani? Valamilyen TRISX parancs rémlik és hogy az X helyére a port betűjelét kell írni. A programban hogyan tudok egy portra hivatkozni?
PORTB = 0x00. Ez így jó?
(#) atideath válasza El_Pinyo hozzászólására (») Jún 29, 2010 /
 
Utánakerestem a bitműveleteknek de nagyon nehezen találtam rá példát. Nos akkor nézzük hogy jól értettem-e meg..

A fenti példát ha át szeretném tenni RC2 és RC3-mas lábra akkor a következőképpen nézne ki:

enc_position|=(input_c() & 0x0C);

Mert ha jól oldottam meg a feladatot akkor már értem .
(#) El_Pinyo válasza atideath hozzászólására (») Jún 29, 2010 /
 
Így van!
(#) icserny válasza atideath hozzászólására (») Jún 29, 2010 /
 
Nem lesz jó, mert az eredeti program szerint enc_position legalsó két bitjébe kell berakni a beolvasott értéket! Én jobbraléptetéssel próbálkoznék:
  1. enc_position |= (input_c() & 0x0C) >> 2;
(#) El_Pinyo válasza icserny hozzászólására (») Jún 29, 2010 /
 
Ebben az esetben igazad van, valóban kell a jobbra shift is. Én azt gondoltam, hogy nem kell a legalsó helyértékre helyezni a maszkolt biteket. Visszaolvasva a hozzászólásokat már világos a dolog, valóban kell.
(#) Bell válasza atideath hozzászólására (») Jún 29, 2010 /
 
Magas frekvencián célszerű ellenőrizni, hogy az eszköz igényei rendben vanak-e. Az adott kód részt futasd le szimulátorral.
Nemrég vettem egy pofás encodert 150.Ft-ért, abban 3 kapcsoló van. Kettő az irányt adja és van rajta egy nyomógomb is.
Egy kapcsolóval az hogyan encoder?
Kódom nincs hozzá, de a google szállít ehhez ötleteket.
(#) atideath hozzászólása Jún 30, 2010 /
 
Az Encoder 3 kivezetéses. A,B,C... Ezen felül nyomógombot is tartalmaz másik 2 kivezetésen.
(#) atideath válasza icserny hozzászólására (») Jún 30, 2010 /
 
Én már ezt nem vágom miért kell jobbra léptetés.. Ha nem csal az emlékem akkor a jobbraléptetés pl így néz ki:
00001100 >> 00000011
(#) El_Pinyo válasza atideath hozzászólására (») Jún 30, 2010 /
 
Jól emlékszel! Azért kell jobbra léptetni, mert ha a port magasabb helyértékű bitjeiről olvasol, akkor az enc_position változó megfelelő magasabb bitjeit manipulálod. Gondolom valami "API" függvényt használsz a kiértékelésre és ha ez a függvény csak az átadott paraméter alsó két bitjének kiértékelésével dönti el a forgás irányát és mértékét, akkor muszáj megfelelő alakra hozni az átadott paramétert.
(#) atideath válasza El_Pinyo hozzászólására (») Júl 1, 2010 /
 
Értem.

Most próbáltam bekötni RB lábakra úgy hogy megszakítást kezeljek de valamiért mindig csak csökkenti a változó értékét. Másolom a kódot.

  1. void rb_isr() {
  2. A1_last_state = A1_current_state;
  3. B1_last_state = B1_current_state;
  4. A1_current_state = input(ROT_A);
  5. B1_current_state = input(ROT_B);
  6. if (A1_current_state ^ B1_last_state)
  7.    current_position = --current_position;
  8. else current_position = ++current_position;
  9. }


Az encoder középső lába testre van kötve, PORT_B fel van húzva. A és B kivezetés pedig B4,B5-ön csücsül.
(#) El_Pinyo válasza atideath hozzászólására (») Júl 1, 2010 /
 
Bármely irányba elforgatva folyamatosan csökkenő eredményt kapsz a current_positionre? Ez érdekes. Mondjuk érdekesen van megoldva a last_state változók értékadása is. Ezeket általában nem a függvény elején, hanem a végén követik el. Egyébként prell mentesítve van már az encoder? Könnyen előfordulhat, hogy annak hiánya okozza a problémát. Másik kérdés: az RBIF flaget nem kell törölni, megteszi helyetted a fordító?
Esetleg hasznos lenne, ha feltennéd a forráskódodat a mellékletbe, mert így kódmorzsánként nézve nehezen elemezhető.
(#) atideath válasza El_Pinyo hozzászólására (») Júl 1, 2010 /
 
Nos ez is egy példaprogramban volt . De felteszem az egész kódot hátha többet látsz belőle.
(#) vicsys válasza atideath hozzászólására (») Júl 1, 2010 /
 
Tedd csak az RB6-RB7-re. (és láss csodát...!)
(#) atideath válasza vicsys hozzászólására (») Júl 1, 2010 /
 
Halle. Áttettem de csodát azt nem látok . Az Encoder középső lába le van kötve testre. Az A,B pedig az RB6,RB7-re. De reagállni nem reagáll
(#) atideath válasza El_Pinyo hozzászólására (») Júl 1, 2010 /
 
Még prellmentesítve nincs az encoder. Hardweresen szeretném de még nem árulta el senki hogy mekkora kondit kellene bekötni és hova. Úgyhogy ez még egyenlőre kimaradt
(#) edison14 válasza atideath hozzászólására (») Júl 1, 2010 /
 
De megcsinálhatod a prellmentesítést szoftveresen is. Nem bonyolult. Ha minden igaz olyan 150-250ms-ot kell várni.
(#) vicsys válasza atideath hozzászólására (») Júl 1, 2010 /
 
Fel van húzva az A és B vonala?
(#) potyo válasza edison14 hozzászólására (») Júl 1, 2010 /
 
Aztán azzal már le is maradtál egy csomó bejövő jelről. Inkább nézd meg egymás után 4-8 alkalommal 1ms időnként, hogy változott-e az 1ms-al ezelőtti állapothoz képest, és ha nem, akkor ki lehet értékelni.
(#) Bell válasza atideath hozzászólására (») Júl 1, 2010 /
 
A kondenzátorokkal sok baj lehet. 20 ms-os megszakításnál pl. úgy pergésmentesítettem, hogy 5 darab egymást követő eltérő állapot jelenti az állapotváltást. Kapcsolónként ez különbözhet, de csak egyszer kell beállítani. Nincs adatvesztés, lustulás, stabilan kézbentartható.
(#) atideath válasza vicsys hozzászólására (») Júl 1, 2010 /
 
Kössek be hozzá egy 4k7-es ellenállást 5Vra?
(#) vicsys válasza atideath hozzászólására (») Júl 1, 2010 /
 
Hát persze, hogy igen!
Csatolok egy mintát...
(#) Bell válasza vicsys hozzászólására (») Júl 1, 2010 /
 
Heló !
Ezt a rajzot mivel készítetted?
Szép.
(#) El_Pinyo válasza vicsys hozzászólására (») Júl 1, 2010 /
 
Viszont, ha külső felhúzást használ az encoder kimeneteihez, akkor a belső felhúzást ki kell kapcsolni!
(#) vicsys válasza Bell hozzászólására (») Júl 1, 2010 /
 
SPlan 6.0
Bővebben: Link
(#) atideath válasza El_Pinyo hozzászólására (») Júl 2, 2010 /
 
Hát igen. Ezért nem is értettem miért kell hardveresen felhúzni mikor a B portot felhúztam. Egyébként melyiket érdemesebb használni? Belső felhúzást vagy a hardverest?
Következő: »»   21 / 153
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