Fórum témák
» Több friss téma |
Köszi a gyors választ. Valóban, nem gondoltam rá, hogy nem fér bele 255-nél több. Igazából egy egyszerű progiról van szó, egy uh érzékelő jelét kellene figyelni (SFR04) és csak egy adott távolságnál kellene (ahol az uh-ból kimenő jel H szintje 450uS) átbillenteni a kimenetet. Sajnos még nem tartok olyan szinten, hogy amit leírtál mind megtudjam valósítani.
Szerintem nem érdemes mondogatnod, hogy egyszerű program, mert attól még nem lesz az. Majd egy hét múlva meglátom mit mondasz mennyire egyszerű. Egyébként ahogy leírtam úgy tényleg egyszerű lenne, csak meg kell érteni az adatlapból, és egyéb helyekről a CCP modul és a timerek működését és felépíteni a folyamatábrát, utána pedig lekódolni.
Tudom,hogy nem egyszerű (pláne nekem,). Már kb másfél éve próbálkozom a PIC-kel kisebb nagyobb sikerrel. A gondom az a timer és CCP modullal, hogy azok kellenek másra és még azt is meg kell tanuljam kezelni. Ha nem engedem, hogy tulcsorduljon az echo konstans akkor elméletileg jó?
Sziasztok!
Nekiláttam, hogy csináljak egy Simon mondja játékot (aki nem ismerné, annak itt egy Link), de elég csúnyán elakadtam. A pic, amire a programot írom egy 628a-s. A legújabb, 9.81-es Hi-Tech C a fordítóm és még egyelőre pro verziójú. Gondoltam, hogy ne terheljem a fórumot túl hosszú szöveggel, így a rar-ba beletettem egy leírást a programról. A kapcsolásom úgy néz ki, hogy az RA-1-2-3-on vannak a gombok. Alapból egy 10k-s ellenállással földre vannak húzva és amikor megnyomom a gombot vált át VDD-re a láb. A négy LED a PORTB0-1-2-5-ön van. Az MCLR nincs letiltva, szóval az RA5 10k-val VDD-re van húzva. Érdekes, hogy a szimulátorban jól fut, de a valóságban nagyon nem azt csinálja, amit kéne neki. A Gombvizsgalat_FGV()-ben nem várakozik egy gombnyomásra, hanem túllépi azt és emiatt a switch-case részben nem talál egyezést és mivel hibás gombot "nyomtunk" meg újraindul a program. Próbáltam az assembly kódból kiokoskodni valamit:
Eleve nem értem, hogy mért nem a Z bitet figyeli, mert ha az alsó bitek bebillennek, attól még a ciklusban maradunk, de a PORTA már közel sem 0 lesz. Remélem jól okoskodom ezzel a DC bittel, mert még sosem használtam...De ez a szimulátorban hibátlanul fut, szépen várakozik egy gombnyomásra...Másik furcsaság számomra, hogy nem a programmemória elejére kerül a program, hanem van egy goto a legelején és az egész kód a memória végén van. Ez normális szerintetek? A programból kikommenteztem az időzítéseket, így rögtön lehet használni hozzá a szimulátort. Remélem ti rájöttök, hogy mi a hibám. Megeshet, hogy nem a fenti résszel van a gond, de nekem ez a rész a gyanús. Előre is köszi a segítségeteket! Idézet: A CPU idő meg nem kell? Arra ráér a program, hogy a várakozó ciklusokban kóvályogjon?„A gondom az a timer és CCP modullal, hogy azok kellenek másra” Nem tudom, hogy milyen mikrovezérlőt használsz, de ha a bemenő jel polaritása megfordítható, akkor az esetleg nem használt UART modul is bekonfigurálható, hogy a min. 450 us jelet BREAK karakternek érezze. Vagy egy RC taggal megintegrálva a jelet az analóg komparátorra viszed, ami csak akkor billen be, amikor az impulzus elég hosszú (ehhez esetleg kell egy kimenet is, amivel az impulzusra várás előtt a kondenzátor kisüthető).
Ez nem a gombnyomásra, hanem a felengedésre vár! (Felteszem, hogy a gomb földre zár lenyomáskor)
Az elképzelésem a következő (csak tőmondatokban).Egy 16f882-vel próbálkozom. Az ultrahang modult kell figyelni, de ennek kell egy 10uS-os vezérlőjel. Ez megvan és megy is. Az uh modul kimenetén a magas jel szélessége a távolságtól függ. Én csak egy bizonyos távolságot szeretnék figyelni (ami 450uS szélességet jelent). Mikor az uh modul lemérte a távot a kimenet L lesz és ilyenkor 10mS mulva meg kell ismételni a bemenetén a 10uS-os vezérlőjelet(legalábbis azthiszem). Közben kellene vezérelni egy szervót (1ms-20ms-2ms-20ms...) plusz kettő db DC motort két külön PWM-el. Az uh modul vezérlése, ha kiveszem a 450uS-os figyelést, megy rendesen.
Nem. A gombok 5V-ra zárnak, ha lenyomom őket és így addig várunk, amíg valamelyik gombot meg nem nyomtuk.
Pedig ha ilyen régen foglalkozol ezzel, akkor ideje lenne megismerkedni a PIC-el is!
A timer nem más, mint egy számláló. Van 8 és 16bites. Számlálnak monoton az órajeltől, az előosztótól, az utóosztótól, már ha vannak, és természeteses saján bithosszúságuktól függően felfelé, majd túlcsordulnak és kezdik előről. Amikor túlcsordulnak beállítanak egy jelzőbitet, ami, ha meg van neki engedve, megszakítást is okoz(jelzést nekünk kell törölni). A megszakítás kiszolgálása(ugye ez is csak egy szubrutin, csak fix a kezdőcíme) lezajlik, (pl. számolod a túlcsordulásokat), és visszatér a fő programszálba. A CCP capture módban annyit tud, hogy a beállított élre(amit menet közben is lehet módosítani) a hozzá rendelt timer értékét betárolja egy regiszterbe. Ekkor beállít egy jelzőbitet, ami ha engedélyezve van neki, megszakítást is okoz. Itt van idő kiolvasni az eltárolt regiszterek értékét, és egy korábbi eltároltat kivonni belőle, valamint ha volt timer túlcsordulás, akkor annyiszor 65536-ot még hozzáadni, ahányszor volt. Ez arányos lesz a jeled fel ill. lefutó élének időtartamával. Ennyi tőmondatokban. Az adatlapokban részletesen le van írva minden, és a neten is sok anyag van, még magyarul is. Az oldalamon találsz linkeket ilyen oldalakra. Itt az idő...
Elég életveszélyes, ha csak szigorú egyezést vizsgálsz a 450 us kapcsán.
Idézet: Nem "kell", hanem lehet. Az adatlap szerint 10ms-ot kell várni, mielőtt újabb triggerjelet adhatsz ki. Ismételni ezentúl bármikor lehet, akár két nap múlva is. „Mikor az uh modul lemérte a távot a kimenet L lesz és ilyenkor 10mS mulva meg kell ismételni a bemenetén a 10uS-os vezérlőjelet(legalábbis azt hiszem).” A várakozásnál pedig azt is vedd figyelembe, hogy az impulzusszélesség akár 36 ms is lehet, ha nincs echo jel. Ezért volna jó valami hardveres megoldás a figyelésre.
Idézet: Elég szokatlan megoldás, de attólmég működhetne. Lefelé mi húzza a bemenetet, amikor a gomb el van engedve?„A gombok 5V-ra zárnak, ha lenyomom őket” Szerintem a btfsc STATUS,2 a Z bitet figyeli, tehát a fordító jól fordította a kódot.
Igen igaz "nem kell hanem lehet", rosszul fordítottam.Azt tudom ,hogy 36ms is lehet ezért nem jó amit írtam progit, mint utólag rájöttem, találtam egy példaprogramot 16f84-re, de az sem megy rendesen.A hardveres megoldát már elvetettem, mert így legalább tanulom a programozást. Tehát a beérkező jel feldolgozásán tovább kell dolgoznom. Köszi a válaszokat.
10k-s ellenállással van a földre kötve.
A Z bittel kapcsolatban pedig igazad van. El sem merem mondani, hogy én hogyan értettem, pedig írtam egy pár asm kódot... Az az érdekes, ha kikommentezem a Gombvizsgalat_FGV()-t, akkor jól fut le a program, tehát szépen random számokkal feltölti a tömböt és utána ki is rakosgatja a PORTB-re (mármint élesben tesztelve). Szóval Gombvizsgalat_FGV-ben van a hiba valahol,de nem tudom, hogy hol, mert szimulátorban hiba nélkül lefut... Még valami. Akkor indul a program, ha megnyomom az RA0-ra rakott gombot és ez jól is működik, tehát nem elkötéssel van a gond. Azt nem tudod esetleg megmagyarázni, hogy miért a programmemória végére rakja a kódot a fordító?
Idézet: Elsősorban ott lehet a hiba, hogy az egész A portot beolvasod, pedig csak négy bemenetén van nyomógomb. Én így írnám:„Szóval Gombvizsgalat_FGV-ben van a hiba valahol,de nem tudom, hogy hol, mert szimulátorban hiba nélkül lefut...”
A switch utasítással meg az a baj, hogy nincs "default" ága, ahová az összes "szabálytalan" eset besorolható (pl. két gomb egyidejű lenyomása, vagy az a ritka eset, amikor pont a feltételvizsgálat és a chPort_allapota változóba történő eltárolás között engeded el a gombot). Mellesleg az utóbbi eset elkerülése érdekében célszerű volna módosítani a kódot valahogy így:
Tehát előbb rögzítem a bemenet állapotát, utána vizsgálom. Megjegyzés: lehet, hogy a C fordító megengedi így is:
de ilyesmibe most nem mennék bele...
A PORTA állapotának bitenkénti és-elése 0x0F-el megoldotta a problémámat. Volt még ezen kívül egy kis bakim, de azt javítva működik a program.
Persze, hogy nem működött úgy, hogy az egész PORT-ot olvastam, mert az MCLR VDD-re volt húzva, amikor meg nem volt bekapcsolva az MCLR funkció, akkor meg mindenféle zajt szedett össze az RA5-ön, mivel az csak bemenet...Így, hogy segítettél, már könnyen vagyok okos A default ágat meg azért nem raktam bele, mert a Kónya-Kopják könyv szerint, ha nincs egyezőség semelyik case ágban, akkor a programfutás a switch utáni utasítással folytatódik és a soron következő if-ben kiderül mindenféle turpisság. Köszönöm szépen a segítségedet! Legközelebb figyelek ezekre.
Örülök, hogy megoldódott a probléma. A default ágat én sem mindig használom, erőltetni végképp nem akarom, csak itt kézenfekvőnek látszott a hibalehetőségek kiszűrésére. (Te sem szenvedtél volna ennyit a fölösleges bitek beolvasása miatt, ha a rossz érték fennakadt volna a szűrőn...)
Hali
En egy ilyen megoldast csinaltam gombok kezelesere:
Egyszeru, bovitheto, es tudja kezelni a tobb gombos hibakat is. A fveny hivasa a port ertekevel tortenik, es visszaadja a lenyomott gomb erteket, vagy nullat.
Hi Mesterek!
Kellene egy kis segítség. Nem boldogulok a 18f2550 pic-el A gondom vele hogy hiába használom a RLNCF parancsot s látom(WATCH) hogy a deklarált változóba forgatja a bitet is, de nem rakja be/ki a PORTB-re, pedig bemozgatom a PORTB-re. Vagy megtudná nekem magyarázni mit jelent ez: RLNCF f,d,a (18f2550 adatlapjában így van a parancs) Én amit kihámoztam belőle hogy cerry nélkül forgatja az f regisztert de mi az a ",d,a"? ezt nem értem. Segítséget magyaráztatott előre is köszönöm.
Hello!
Nézd meg az utasítások összesítésénél az adatlapban ( figyelj az ACCESSED és DESTINATION kifejezésekre! )! A 'C' a carry bit rövidítése! Steve
Hi
Ott ez a parancs van RLNCF f,d,a Tehát akkor ha: RLNCF TEMP ;így a temp-ben lévő biteket forgatja RLNCF TEMP,d ;így pedig a temp-ben forgatott biteket átrakja a "d"be Vagyis Én ezt így gondolom. de nem megy: RLNCF TEMP,W MOVWF PORTB Én így csináltam de nem megy a prg , nem rakja ki portb -re.
Kérdés még az 'a' szerepe ( bár úgy emlékszem, hogy elhagyása esetén azzal alapból nincs gond, de nézd meg! ).
18-as sorozatnál egyébként ne a PORT-ot írd, hanem a LAT-ot ! A PORTB biztos, hogy megfelelően van konfigurálva ( kimenet, tuti, hogy látszik rajta a kirakott adat? ), mert szerintem ennek egyébként működnie kellene ?! Steve
Letiltottad az analóg bemeneteket a PORTB-n?
Hi, öö nem, hol kell letiltani? Config biteknél vagy program sorból?
Program --> PORTB konfigurálása PDF !!
Steve
Aranyszabály, ha portra írunk LATB, ha olvasunk PORTB!
Ennek így működnie kell:
Két forgatás van. Az első eredménye 8 lesz, ez a TEMP-be is beíródik. Amásodik forgatás eredménye 0x10, ez csak a WREG munkaregiszterbe íródik be, majd onnan a PORTB regiszterbe. RLNCF f,d,a f - a regiszter (memória-rekesz) címe d - destination (cél) 0: WREG, 1: file register (ez az alapértelmezett) a - ACCESS (elérés) 0: Access blokk (BSR nincs figyelembevéve), 1: Banked (BSR mondja meg, melyik lapot kell címezni) Mindez persze benne van az adatlapban! Szerk: beiktattam az ADC bemenetek letiltását is.
18F2550-nél a PORTB-n konkrétan mindkét helyről lehet, de a legtöbbször program sorból, úgyhogy inkább azt válaszd, az máshol is jól jön.
Sziasztok! Új vagyok még itt és új vagyok a PIC-ek világában is. Az utóbbi egy két hétben próbáltam belerázódni az elméletbe, de úgy látszik nem nagyon sikerült.
Tegnapelőtt kezdtem el MPLAB szimulátorban kísérletezgetni, de mára már el is akadtam. Próbáltam keresgélni a könyvekben, a PIC adatlapján és itt a fórumokon is. De nem lettem okosabb. Pedig biztos nem "nagy ügy", de rajtam mégis kifogott. Így hát megkérdezném tőletek. A P12F629-est válaszottam kezdetnek (tudom, sokan írták, hogy nem ez a legjobb kezdéshez, de most már ez van) Szóval a problémám. Megpróbáltam lapozni a file register memóriát, a STATUS 5. bitjével, ahogyan azt a PIC adatlapja is írta. Utána próbáltam beleírni az aktuális lap egy általános célú regiszterébe. Ez sikerült is, de nem úgy, ahogyan én szerettem volna. Ugyanis megjelent a másik bankban is az az érték amit az eredetileg kiválasztott bankba szántam.(mintha tükrözték volna oda) Csatoltam képet is a MPLAB-ról... A File Registers ablakban a 30h és a B0h bájtokkal van a problémám. Mit rontottam el? Vagy esetleg ezt csak így lehet? |
Bejelentkezés
Hirdetés |