Fórum témák
» Több friss téma |
Sziasztok! Egy 18F4431 PIC-kel kapcsolatban szeretnék kérdezni. C18 fordítót használok és már van egy úgymond működő programom pár hónapja csináltam tesztelt stb... szóval elvileg rendben van.
Most szerettem volna módosítani a működésén csupán a PTPER regiszternél akartam más értéket beírni. Amennyiben a PTPER értéke 128 vagy annál nagyobb (előosztás 1:1) minden működik normálisan ha 128-nál kisebb a PTPER értéke akkor problémák merülnek fel. A program beolvassa az adc-re kötött potenciométer helyzetét ami 0-255 között mozog és hozzáad 127-et (a példa kedvéért). Ekkor 127-382 között van a PTPER értéke és ennek megfelelő PWM jelet állít elő komplementer üzemmódban és count up-down beállítással. A hiba lényegében az, hogy az adc középhelyzetében 2,5V (és kis környezetében) a PWM leáll áthaladva ezen a sávon újra elindul. Nem igazán tudom a jelenség okát áradásul ha 127 a PTPER értéke attól még a poti 0 helyzeténél (PTPER=127) működik a PWM csak középállásban nem (azt nem tudtam ellenőrizni, hogy megfelelően működik a PWM a középállástól magasabb frekvencián). Ha azt írom be hogy PTPER=120+POT1; akkor is ugyan az a hiba, de ha 120 helyett legalább 128 szerepel minden ok. A hozzászólás módosítva: Júl 19, 2016
Nem értem pontosan mit szeretnél. A PTPER a frekvenciát állítja, a PDC a kitöltést. Itt nem tudjuk mennyi a PDC értéke, de hogy a PWM működjön PDC nem lehet nagyobb a PTPER-nél, tehát a PTPER értékét nem csökkentheted a PDC értéke alá.
A maximális kitöltési tényező PDC=4*PTPER.
Sajnos elég bonyolult a dolog nehéz megfogalmazni. Még csinálok pár tesztet hogy pontosabb hibaleírást tudjak adni, majd írok.
Sziasztok!
Szeretnék segítséget kérni! A kis programom azt csinálja, hogy ha megnyomok egy nyomógombot (amiből kettő van, ny1;ny2; ) az egyik kimenetem 1-be megy. Ha eltelik egy bizonyos idő (K változó eléri a 7000-et) vagy a be3-as bemenetet 3-szor megnyomom, a kimenetek 0-ba mennek. Ez így működik is, viszont ki szeretném egészíteni azzal, hogy ha bármelyik kimenetem 1-ben van és jön egy gombnyomás (ny1 vagy ny2) kapcsolja 0-ba a kimeneteket. Biztos, hogy van ötletetek ![]()
A hozzászólás módosítva: Júl 28, 2016
Időközben rájöttem a különböző változók típusaival voltak problémák.
Hello!
1. A kimenet az gondolom a jobb meg a bal. 2. Nem egészen értem a főciklusban miért kell vizsgálni a nyomógomb állapotát is meg a hozzá tartozó változókat is. 3. 2 Gombot írtál, mi a be3? Mindezeken túl mi a kérdés lényege? Nem kell vizsgálni, magas e valamelyik kimenet gombnyomáskor, egyszerűen csak nullázood mind a két kimenetet bármelyik gomb megnyomásakor, mielőtt a megfelelő kimenetet magasba állítanád.
1. Igen, a kimenet a jobb meg a bal
2. a főciklusban megy a kimenet magasba, ha elengedtem a nyomógombot és a nyomás ideje rövid volt 3. a be3 egy bemenet, ami ha 3-szor magasba került , a kimenetek 0-ba menek (próbálom érthetően... remélem sikerül) Azt szeretném, hogy ha valamelyik kimenet magas és e-közben jön bármelyik gombnyomás, akkor a kimenetek 0-ba menjenek.
Igazából még mindíg nem értem a problémád, mert ennek most is így kéne működnie, ha valamit be nem néztem.
Idézet: „if(ny1==1) {gomb1_ido++; jobb=0; bal=0; } if(ny2==1) {gomb2_ido++; jobb=0; bal=0; }” Vagy akkor mit is szeretnél elérni?
Igen. Ezeket a sorokat szépen végre is hajtja, viszont, ha a gombnyomás megfelelően rövid, felhúzza a hozzá tartozó kimenetet 1-be. Azt szeretném, hogy ha magasban van valamelyik kimenet és gombot nyomok akkor menjen minden 0-ba.
Sziasztok!
Egy 4 bites változó számjegyeit szeretném tükrözni pl. 1011 helyett 1101-et szeretnék, magyarul a 4. számjegyből legyen az 1. a 3.->2., 2.->3. ... Hogy lehet a legegyszerűbben megtenni? Idézet: „Egy 4 bites változó számjegyeit szeretném tükrözni pl.” Shift-eléssel vagy táblázattal. Ez bonyolultnak tunik, de ez osszesen hat shift-elest tartalmaz:
Ez egyszerubbnek nez ki, de ebben 8 shifteles van:
A tablazatos megoldas pedig:
Köszi.
Egyébként melyik a gyorsabb a táblázat vagy a 6 shift? A hozzászólás módosítva: Aug 3, 2016
Ebben csak 4 darab btfsc, 4 darab bsf, két movlw, két andwf és egy swapf van:
CSak 13 utasítás..
Egy kicsit pontosítok 8 bites a változóm, de csak az alsó 4 bitjét használom.
Hp41C programjának működését nem igazán értem. A hozzászólás módosítva: Aug 3, 2016
Aha kösz, végig kellett játszani papíron.
![]() Egyébként a 6 shiftes nem gyorsabb? A hozzászólás módosítva: Aug 3, 2016
Csak hogy biztoan értsük egymást: Most ha megnyomod a gomb egyet röviden akkor a jobb kimenet lesz magas, ha a gomb2-t akkor a bal. Azt akarod, hogy bármelyik gomb megnyomása törölje ezeket. Eddig rendben van, egyszerű csak ki kell venni a következő sorokból
if ((ny1==0) && (gomb1==1) && (hosszu_gomb1==0)) {jobb=1;K=0;} if ((ny2==0) && (gomb2==1) && (hosszu_gomb2==0)) {bal=1;K=0;}, amit kivastagítottam. Értelem szerűen amelyikből kiveszed az a gomb fogja mindkétkimenetet törölni, ha mindkettőt kiveszed akkor mindkettő gomb ezt csinálja, de ha a gombok törölni fognak akkor mi fogja magasba állítani a kimeneteket?
Talán nem. Miután minden léptetés után a belépő bitet törölni kell, így minden rlc, rrc utasítás után egy andlw vagy bcf utasítás is fordul.
PIC16F : Megszakítás kiszolgálóban PCLATH mentése, visszaállítása + PCLATH feltöltése, rutinhívás, PCL módosítása + 16 retlw = kb 25 utasítás, egy verem és egy változó
PIC16F1 : rutinhívás, brw + 16 retlw = kb 19 utasítás, egy verem avagy FSRxH feltöltése, FSRxL feltöltése + indirekt olvasás = kb. 6 utasítás + 16 konstans PIC18F: rutinhívás PCLATU, PCLATH feltöltése (movf PCL,w) PCL módosítása (2*x -el) + 16 retlw = kb. 20 utasítás, avagy TBLPTRU, TBLPTRH feltöltésre, PBLPTRL feltöltése, TBLRD, TABLAT kiolavasása + 16 konstans (ami csak 8 utasítás) = kb. 16 utasítás Assembly: Ha WREG címezhető:
11 utasítás
Egy 'rendes' processzoron valoszinuleg a tablazat, de 8 bites PIC-ek eseteben barmi is lehet.
Még egy kérdés. Hogyan tudom a leggyorsabban vizsgálni, hogy egy szám negatív e?
Asm-ben könnyű, mert a legmagasabb bit 1-es negatív esetén, ha if(x<0){...} ez a legmagasabb bit vizsgálatát jelenti C-ben vagy valami bonyolultabbnak fordítja? A hozzászólás módosítva: Aug 3, 2016
C18 a PIC18F2550 -re ezt fordítja:
Üdv!
Tudja valaki XC32-ben hogy lehet hozzáférni a cp0_status IE bitjéhez? Vagy hogy másképp mondjam a megszakításokat hogyan lehet tiltani és engedélyezni? De megint én vagyok a lüke, hogy XC-t használok.
Én az asm("di) és asm("ei") szoktam használni.
De ott van a__builtin_disable/enable_interrupts a disable egy integer-rel tér vissza arra már nem emlékszem mit jelöl, de a plib-es is van az INTDisableInterrupts, INTRestoreInterrupts (és lehet van, de ebbe nem vagyok biztos) INTEnableInterrupts és a plib XC32 1.40-óta (asszem) nincsen.
Legújabb XC32 van fenn, mert MM szériához kell, és valóban nincs plib, illetve valahol benne van a legacy könyvtárban, de nem ismeri fel az INTDis... és enable utasításokat, ezeket próbáltam én is.
Kipróbálom a másik kettőt, köszönöm. A hozzászólás módosítva: Aug 6, 2016
Sziasztok! Egy egyedi RC modell építéséhez szükségem van egy igencsak egyedi szabályzóra, sehol nem találtam ilyet készen, szóval marad a megépítés. A lelke elgondolásom szerint egy PIC 16F884 lenne, mivel a szabályzónak többek között 2 motort kell függetlenül vezérelnie ezért szükség van a 2db egymástól független PWM jelre, amire (ha jól fejtettem meg az adatlapot) ez a PIC képes. A kérdésem arra irányulna leginkább, hogy a vevőből érkező PWM jelekből hogyan tudok pl. 8 bites változókat kreálni, amikből utánna majd kikalkulálom, hogy melyik motornak mekkora PWM kell. CCS fordítót használok, a példák között van egy impulzusszélesség méréses példa, de nem akart működni többszöri kísérletezés után sem. A szóban forgó modell egy hernyótalpas szovjet tüzérségi vontató, a két hernyótalpat külön motor hajtja, és a menetiránynak megfelelően a különböző lámpákat is vezérelni kell, és egy szintén PIC-es dizelmotor hanggenerátort is vezérelni kell a szabályzónak. Találtam ugyan tankokba való gyári szabályzót, de pl. egyik sem olyan, hogy ún. pisztoly távirányítóval lehessen vezérelni. Nekem olyan szabályzóra van szükségem, ami 2 csatorna jeléből dönti el, hogy mi a szitu, az egyik csatorna az előre-hátramenet, a másik pedig a kormányzás. Ha a kormány középen van, akkor mindkét motort ugyanúgy kell vezérelnie a gázkar hatására, ha pedig elfordítom valamelyik irányba a kormányt, akkor az adott oldalhoz tartozó motort kell arányosan lassítania. Erre még találtam egy gyári szabályzót ebay-en "potom" 200 dollárért, de az egyik legfontosabb funkiót az sem tudja mégpedig azt, hogyha nem adok gázt, de elfordítom a kormánykereket valamelyik irányba, akkor az iránynak megfelelően az egyik motort előrefelé kell elindítania, a másikat pedig hátrafelé. Erről még éppenséggel lemondanék, de a gond ezzel a szabályzóval az, hogy eléggé kicsi méretarányú modellről van szó, és fizikailag nem fér el benne, ezért is vagyok rákényszerülve a saját szabályzó építésére.
Ismét kellene egy kis segítség.
![]() Van egy 360 elemű tömböm 16 bites számokkal (0-2048 között) szinusz értékek. Az amplitúdót szeretném változtatni egy poti segítségével mondjuk 8 biten. Szóval arra gondoltam, hogy fogom a tömböm elemeit megszorzom a poti értékével majd elosztom 255-tel. A probléma az hogy mindez megszakítás alatt történik elég sok dologgal együtt és persze rövid az idő. Hogy lehetne ezt a lehető leggyorsabban megoldni? Próbáltam olyat is, hogy a tömböm elemeit eleve 4-el osztva pakolom be és akkor már csak 6-tal kell shiftelni (256-os osztással is megelégszek). Ez is lassúnak bizonyult, mivel a PWM regiszterekbe is bele kell írni plusz külön kell választani low és high bájtra szóval körülményes. Valami ötlet, egy trükkös megoldás? A hozzászólás módosítva: Aug 7, 2016
Még gyakorlati szinten sose foglalkoztam impulzus szélesség méréssel, de hátha esetleg segít az alap elv.
Van a CCP abból a Capture mód-al szokták ezt csinálni, azt hogy pontosan, hogyan abba mást szerintem nagyobb segítséget tud nyújtani. Ezzel az előbbivel az egy probléma, hogy az adott PIC-ben csak CCP modul van és ebből neked mind a kettő kell PWM-re, egy másik működű lehetőség csinálsz megszakítást a lábra mikor a pwm jel elkezdett felfutni elindítasz egy timer-t mikor lefut megállítod és a timer értékből látod milyen hosszú a bejövő impulzus. |
Bejelentkezés
Hirdetés |