Fórum témák
» Több friss téma |
Fórum » PIC - Miértek, hogyanok haladóknak
hi egy olyan progit próbálok írni, ami egy RGB ledet vezérel, mégpedig úgy hogy 3 gombal lehet kapcsolgatni a ledet. mindegyik színhez 1 gomb tartozik azt akarom hogyha megnyomok egy gombot, akkor a hozá tartozó szín kezdjen el világítani, ha mégegyszer megnyomom a gombot akkor kikapcsol az a szín (ezzel a kikapcsolós részel még nm foglalkoztam eddig, mondjuk nem is tudom még hogy hogyan csináljam. a progit sikerült úgy megírnom, hogy egyszerre több szín is be lehessen kapcsolva, de az a gondom vele, hogy csak balról jobbra haladva lehet bekapcsolni a ledeket a gombokkal, visszafele nem. a program eleje nem lényeges, anniy az egész hogy a gombok megnyomása után 3 különböző szubrutint tud meghívni, ami a különböző ledeket kapcsolja fel a szubrutinok így néznek ki
Szóval ez a programnak a ledeket kezelő része. látszik is hogy azért csak balról jobbra lehet egymás után bekapcsolni a ledeket, mert az 1 ledről csak akkor lehet visszamenni és bekapcsolni egy másik ledet, ha a 2 ledhez tartozó gombot nyomom, és így tovább a többinél... de az nem világos, hogy hogyan lehet csinálni ÉS, VAGY, HA kapcsolatokat PICeknél. mert ha be tudnám rakni az adott lednél mind a 2 gombra a szubrutinból való visszatérést egy VAGY kapcsoltattal, akkor simán meg lehetne csinálni. szóval léteznek ezek egyáltalán a PICeknél? mert ha nem akkor tényleg elfelejthetek mindent ami a normális gépes programozásban volt ha picet akarok programozni
Igen, áramgenerátor áramát szeretném mérni vele.
A probléma az optocsatolás. Én még nem láttam olyan optocsatolót, ami:
- nem függ erősen a hőmérséklettől - együttesen megadják az átviteli karakterisztikát (tehát mindig külön a diódára és külön a tranzisztorra vannak görbék) Pl. ezt nézem: http://www.semicon.toshiba.co.jp/docs/datasheet/en/Opto/TLP281_TLP2...01.pdf Én már abban is kételkedek, hogy egy AD konvertert le lehet-e választani optikailag. (optocsatolóval). Sima ellenállás helyett több helyen is komolyabb kapcsolást láttam, de optika leválasztást sehol se. pl: http://www.edn.com/article/CA233726.html Egyébként Stahl dokumentációban láttam, hogy 93Ohmot használ (250 helyett) a neten átlagban 10Ohmot lehet olvasni. Szóval nem tudom, hogy a 500Ohm az elvi vagy pedig gyakorlati felső határ. Tehát a kérdésem leegyszerűsítve: Lehet-e A/D átalakítást optocsatolón keresztül megvalósítani. (ha lehet, akkor linket szívesen fogadok! Utána akarok olvasni). Szerintem egy optocsatoló teljesen meghamísitja a mért értéket.
Szia Neomur,
Amit most jelenleg csinalsz, hogy addig eg a LED ameddig a gomb nyomva marad, nem? Ha jol ertettem, akkor neked az kellene, hogy megnyomod es el is engeded a gombot, erre 1.led kigyullad? Erre egy olyan ciklus kellene ami folyamatosan mindharom gombot pollozza. Nagyjabol
A rutinokban pedig valami ilyesmit csinalhatsz:
Ezzel elered, hogy gomb felengedesekor a LED kigyullad / elalszik - atirhatod konnyeden, hogy mar megnyomaskor is megtegye a valtast, ezt rad bizom. Van meg egy gond ezzel: A mechanikus kapcsolok erintkezesbe lepeskor es szakadaskor is zavarokat hoznak letre amik olyanok mintha us-onkent ki-be kapcsolnad a kapcsolot. Ennek elkerulesere vagy hardveres vagy szoftveres modszert kell kidolgozni. A zavart bouncingnak hivjak (magyarul vissza pattanas, ha jol tudom pergesnek emlegetik a hazai szakszovegekben). Debouncing pedig ennek vedelme - csak azert irom le, hogy ha ra szeretnel keresni leirasokban, google-ben stb. Ujra: nincs valami elonezet, hogy lassam ha rosszul van formatalva a kod?
Ja nem jo
Ha egyszer eg mar a led akkor igy egve is marad Szoval helyesen:
nemnem
ha megnyomom a gombot akkor kigyullad a led, és ha elengedem, akkor úgy is marad. ha megnyomok mellé még1 gombot, akkor az a led is kigyullad. kikapcsolni a ledeket egyenlőre nem lehet, de ezt is meg akarom oldani valahogy. és ha jól értettem amit mondtál akkor a rutinos rész erre kb jó is lenne, de majd kipróbálom. nekem pillanatnyilag az a bajom hogy tegyük fel ég az 1 led. be akarom mellé kapcsoli a 2. ledet, és megnyomom a hozzá tartozó gombot, és ezért van az 1 led rutinjában az hogyha megnyomom a 2.led gombját akkor visszatér a rutinbón a fő programrészbe, és mivel megnyomtam a 2 led gombját, ezért azt is bekapcsolja, az 1 led mellé.ezért a BSF parancsot használom, mert akkor így nem kapcsol ki az 1. led. csak az a gond hogy ha az 1 led ég, és én mellé a 3. akarom bekapcsolni, akkor az nem lehetséges, mert az 1 led rutinjából nem lehet visszatérni a 3.led gombjával, csak a 2.ledgombal lehet, és ez így megy körbe a többi lednél. nekem valami olyasmi kéne hogy
ezt akarom most megoldani, tehát hogy mindengyik ledet lehessen kapcsolni bármilyen sorrendben. az meg egy másik kérdés hogy úgy akarom az egészet, hogy ha megnyomom a gombot egyszer akkor az adott led bekapcsol, és ha mégegyszer megnyomom az adott gombot akkor kikapcsol az adott led. de ezzel még nem foglalkoztam
Sajnos igazat kell adja, opto csatolós megoldást nem nagyon láttam. Viszont ipari körülmények között leválasztás nélkül működnek PIC-ek távadók jeleit fogadva.
Valóban 10ohm a megszokott érték, de ettől el lehet térni, de az 500ohm az valóban sok. Én olyan 20 és 50ohm között javasolnék értéket. pl. 50ohm, 1mA esetén a fesz 50mV 50ohm, 20mA -> 1V 10biten, ha 2,5V a ref fesz, a felbontás 2,5V/1024=0,002441V A 0-20mA-re eső felbontás 409, azaz 0,0489mA. Ez elég szerintem a legtöbb méréshez.
Tehát csak azt szeretnéd, hogy ha lenyomsz egy gombot, akkor a hozzá tartozó LED gyulladjon ki?
Azt is akarod, hogy miközben nyomod az egyik gombot és eközben lenyomsz egy másikat is, vagy harmadikat is, akkor annak is be kell kapcsolódnia? Vagy ez nem érdekes, egyszerre csak egy gombot nyomsz le?
Na, amit en mondtam az pont ilyen ki-be kapcsolgatos - csak abban nincs benne pergetesgatlo, aminek hianyaban olyba is tunhet mintha nem mukodne vagy bizonytalanul.
Ket gombot meg csakcsak lehet figyelni egy egymasutani BTFSC/BTFSS-el:
Ez azt csinalja, hogy PORTA,2 meg van nyomva, akkor return (atugorja a kovetkezo vizsgalatot...). Ha Nincs megnyomva, akkor nezi PORTA,1-et, ha az sincs akkor atugorja a RETURN-t es igy ugrik a LED-re vissza... NADE! Miert akarod a LED-et folyamatosan felkapcsolni ciklusban, ha az egyszer mar fel van kapcsolva? A fo ciklusban kellene a billantyuket figyelni ahogy azt korabban irtam, ott ha nyomtak akkor ugrasz megfelelo helyre. Ott elvegzel egy pergetes mentesitest, majd bekapcsolod a LED-et es varsz mig el nem engedik a gombot. Mikor innen vissza tersz mar folytathatod is a gombok vizsgalatat, azaz folyamatosan lekerdezed: Nyomtak gomb1-et? Nem->Nyomtak Gomb2-t? Igen->goto LED2... Pergetes mentesites legegyszerubben: Varsz 2-3ms-et majd megnezed, hogy a gomb meg nyomva van-e, ha igen akkor valoszinuleg tenyleg akarva nyomtak meg a gombot es mar tul vagyunk a pergesen... Altalaban ms alatt van az amig a perges tart.
Abban igazad lehet, hogy az optocsatoló mindenképp fog valamennyit torzítani.
Bár minden átalakítás visz nemlinearitást a dologba, de olyat is szoktak, hogy valamilyen vivős rendszert alakítanak ki, majd a modulált vivőt viszik át trafón vagy optocsatolón, és úgy mérik a leválasztott oldalon. Vagy meg lehet azt is csinálni, hogy kitenni az elválasztás elé egy kis kontrollert, ami mér és valamilyen digitális formában juttatja be az elválasztáson keresztül az eredményt. Az áramgenerátoros jel fogadására lehet valamilyen áramtükrös megoldást, vagy I/U átalakító kapcsolában üzemelő műveleti erősítős fogadót is építeni, ha a sima ellenállás túl snassz lenne. A műveleti erősítős megoldás gyakorlatilag 0 bemenő ellenállással fogadja az áramgenerátor jelét, így ott a feszültség mindig nulla, emiatt nincs munkapont-eltolódás az áramgenerátorban. Mindig az a kérdés, milyen precízen akarsz mérni, valószínűleg a pontossággal hatványozottan fog nőni a költség.
majdnem.
na akkor most elmondom mi is a célom összességébenvan 3 led+3 gomb. a gombok megnyomásával lehet bekapcsolni és kikapcsolni a ledeket, tehát: megnyomom, és azonnal elengedem egyik gombot = kigyulad a hozzá tartozó led. majd ezután akármikor mégegyszer megnyomom ugyanazt a gombot, és el is engedem = elalszik a gombhoz tartozó led amit az előbb ugyanígy felkapcsoltam. tehát ennek kell működnie az összes leden 1 gombnyomás= felkapcsol, még1 gombnyomás=elalszik. és emellett ha megnyomok egy másik gombot, akkor az ahhoz tartozó led is kigyullad ugyan ezzel a módszerrel, és ugyan így a harmadik is. csak most a progim arra képes hogy a következő sorrendben tudom a ledeket kapcsolni: 1->2->3 vagy 2->3->1 vagy 3->1->2. és én azt akarom elérni hogy bármilyen sorrendben tudjam őket kapcsolgatni , ne csak ebben a sorrendben! remélem már mindenki számára világos
Neomur,
Amiket irtam azok nem valtak be, vagy nem kielegito a viselkedese, vagy valami masra gondoltal?
azokat még nem próbáltam ki.
de az a te megoldásod arra, hogyha megnyomom a gombot, akkor bekapcsol a led, és bekapcsolva marad, ha felengedem a gombot? mert ez már nekem is sikerült. nekem már csak az kell hogy a gomb megynomására bekapcsoljon, majd a következő gombnyomásra kikapcsoljon az adott led. szerintem erre jó lehet a te mődszered (legalábbis én úgy gondoltam hogy azt kéne megvizsgálni a gomb lenyomásakor, hogy a ledhez tartozó kimeneti láb 0vagy1 állásban van-e, és esszerint vagy bekapcsolni, vagy kikapcsolni kéne a ledeket. én valahogy így képzeltem el az 1 gombos ki/be kapcsolást) a másik, egyenlőre fontosab dolog az hogy és ezzel azt akarom elérni, hogy az RGB ledből ki tudjam hozni az összes színt a ledek kapcsolgatásával. ezt sikerült is megoldani, de ami a mellékelt programrészletből kiderül az az, hogy ha bekapcsolom az 1. ledet, akkor utána be tudom kapcsolni mellé a 2. ledet, de a 3. nem tudom kapásból az első mellé kapcsolni. és ha bekapcsoltam a 2.at akkor amellé elősször csak a 3.at tudom, és utána az 1. gondolom még mindig nem értitek hogy mit is akarok elérni, ezért átmásolom a másik gépemről a progit, és írok hozzá magyarázatot, és majd felrakom
ja bocs, azt amit legutóbb írtál nem is láttam
Ezzel a megoldással közel se tudod az összes színt beállítani az RGB LED-en, ezt gondolom belátod!?
ezzel 7 színt lehet elvileg állítani:
-piros -zöld -kék -piros+zöld -piros+kék -zöld+kék -piroz+zöld+kék
Szerintem nem igy erti watt, hanem, hogy a led szinek akkor vagy bekacsolva vagy kikapcsolva lesznek. Van egy tpik, ami azzal foglalkozik hogy lehet az egyes szineket szabalyozni - hogy pl 50%piros, 75%kek, 25%zold... es akkor gyakorlatilag minden szint ki tudsz keverni ezekbol. De ezt meg nem javasolnam neked, ez a ki-be kapcsolgatas jo kezdetnek!
Ami a megoldasomat tekinti: Igen, megnyomod, bekapcsolva marad, megint megnyomod, kikapcsolja... kozben (elengedett allapotban) egy masik gombot is megnyomhatsz. Kovesd vegig a logikajat es meg fogod erteni miert. A ket btfss egymas utan is ebben a specialis esetben jo lehet, de altalanosan nezve nem jo modszer, hogy blokkolod a foprogramot a LED bekapcsolasaval, es allandoan 1-re billenteni a LED portlabat teljesen felesleges mivel az ugy fog maradni amig at nem billented vagy ki nem kapcsolod az aramkorod.
igen egyik osztálytársammmal épp a múltkor beszéltünk erről az RGb ledes színkeverésről, de nem is akartam még vele foglalkozni. most elősször a pic progizás alapjait akarom megtanulni.
köszönöm mindneinek a gyors válaszokat . majd holnap megpróbálom átírni a progit trudani módszerével
Bevallom nem tudtam követni a programod vázát, de a nekem legjobban tetsző megoldás az a megszakításban való gombvizsgálat, ahol Flag biteket állítasz be amikor lenyomod a gombot, valamint számlálókkal prellmenetesítést is tudsz készíteni.
Ezzel a módszerrel bármelyik gombot lenyomhatod, egyszerre, vagy külön, akár úgy is, hogy már egy másik le van nyomva, és ami még jobb, hogy nem befolyásolja főprogram futását. Ha nem vagy még otthon a megszakításban, akkor hasonló megoldást lehet készíteni ciklussal is, csak ez nem valami hatékony. Itt is érdemes jelző flag-eket használni a gomb vizsgáló résznél, és a kiértékelést külön végezni. Érdemes a gombokat úgy kezelni, hogy ne lenyomáskor, hanem felengedéskor legyenek aktívak. Ezzel elég jól lehet prellmentesíteni, némi várakozás beiktatásával is. Persze a várakozás időt vesz el, e helyett lenne hatékonyabb a megszakításos időzítés(gondolom érted, hogy a várakozás és az időzítés nem ugyanaz a folyamat). Írtam egy kis példát én is. Nincs benne prellmentesítés.
Most látom, hogy nem teljesen jó a példa.
A BTFSS GOMB1 után elvileg nem szabadna kilépni addig, amíg nem engedjük el a gombot. azaz így módosul a forrás(természetesen mindkét gomb DETECT nél:
Ennek az a hátránya, hogy amíg nem engedjük el a gombot, addig nem történhet más, csak megszakítás, azaz a fő ciklus leáll. El lehet kerülni ezt is további jelzők segítségével, amik a gombok köztes állapotát is folyamatosan figyelik, próbáld kiötleni. Ha nem megy segítek. Arra rájösz, hogy az első példa miért hibás?
Szevasztok!
Próbálkozom egy 12F629-est 20MHz-es kristállyal életrekelteni, de nem hajlandó. Az adatlap szerint 15-30pikos kondik kellenek, nekem 22 pikosom van. A jelenség, hogy a PIC (ugyan abban a nyákban) a belső 4MHz-es oszcillátorával megy, a kristállyal HX nem hajlandó elindulni. A kristály biztosan jó. Van valakinek valami ötlete????
Ha jól emléxem azzal is próbáltam, de nem esküdnék meg rá. Megpróbálom, köszi!
Felteszem itt is, mert az icd2-esre kevesebben figelnek.
PIC24FJ64GA002-est akartam feléleszteni tegnap ami ugye 3V-os. Csináltam 3V-ot, beraktam PIC24FJ64GA002-est a próbapanelbe, 8-as lába gnd, 13-as 3V (kimérve rajta van), mlrc 3V, kiérve üresben 0V, pgd 21-es, pgc 22-es lábon. 3V rávezetve az icd2 vdd-jére is. Mplabban kiválasztva, a megfelelő tipus, beállítva a külső táp adja a tápot, letölti az ic-hez szükséges dolgokot, majd nem találja. Invalid target device id üzenet. Hol lehet a bibi?
Nézd meg mit olvas.
Invalid dev. id esetén írja azt, hogy mit olvasott és mit vár... Ha a mit olvasott 0 akkor még nem jó a kommunikáció a programozó és a hardver között...
A hex fájl felépítése egy kicsit más, a mérete jóval nagyobb lehet, mint a benne leírt programkód, főleg ha a nem használt területek is benne vannak. C18-ban csináltad a bootloadert? Van ott valami olyasmi, hogy View-->Memory Usage Gauge, ott meg tudod nézni, hogy mekkora programmemóriát foglal a projekted.
Köszi, már megtaláltam az ablakot.
A bootloader Microchip féle, C18al lett lefordítva.
Szia Whalaky,
Sok nagyobb frekis kristaly egyszeruen nem megy ezekkel a 12/16 sorozatokkal, lehet meg kellene probalnod egy masik gyartotol valot, vagy aktiv oscillatort betenni helyette. Ha jol tudom az ECS-ek eleg rosszi viselkednek PIC-ekkel, mig Epson Toyocom kivalo Probald meg amugy 10-12MHz-el, hogy ugy megy-e.
ICDWarn0020: Invalid target device id (expected=0x447, read=0x0)
Ha ugyan ezt a programozót egy 16F877-re rakom akkor device kiválasztása után azt simán látja. A lábbeköteséket írtam, az jó úgy? |
Bejelentkezés
Hirdetés |