Fórum témák
» Több friss téma |
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.
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?
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.
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. 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?
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ó?
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 ![]()
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:
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.
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.
Az Encoder 3 kivezetéses. A,B,C... Ezen felül nyomógombot is tartalmaz másik 2 kivezetésen.
É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
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.
É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.
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.
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ő.
Nos ez is egy példaprogramban volt
![]()
Tedd csak az RB6-RB7-re.
![]()
Halle. Áttettem de csodát azt nem látok
![]() ![]()
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.
![]() ![]()
De megcsinálhatod a prellmentesítést szoftveresen is. Nem bonyolult. Ha minden igaz olyan 150-250ms-ot kell várni.
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.
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ó.
Kössek be hozzá egy 4k7-es ellenállást 5Vra?
Hát persze, hogy igen!
![]() Csatolok egy mintát...
Heló !
Ezt a rajzot mivel készítetted? Szép.
Viszont, ha külső felhúzást használ az encoder kimeneteihez, akkor a belső felhúzást ki kell kapcsolni!
SPlan 6.0
Bővebben: Link
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?
|
Bejelentkezés
Hirdetés |