Fórum témák
» Több friss téma |
Fórum » CCS PIC Compiler
Közben mielőtt nekiszaladnék a trimmer beállításához, felötlött valami. Biztos lehet megszakítást is alkalmazni, szóval egy pillanatra megnyomom a gombot, a led-soron 1x végig fut a program. Biztos azt is meg lehet oldani, hogy amint elengedem, azonnal leálljon az egész program. Vagy tévedek?
Jani gondolkozz ! Képzeld el a programot magadban LÉPÉSENKÉNT és döntsd el, hogy azt csinálja-e, amit kell! Ha lusta vagy végig gondolni, akkor lehet, hogy egy ilyen egyszerű programot hamar?! kijavítasz a segítséggel, de a bonyolultabba beletörik a bcskád! Hidd el, hogy mindenki nagyon sok hibakeresésen van már túl ( és előtt ), de ez az út vezet az "üdvözüléshez" ! Mégegy: korábban már sokszor javasoltuk a szimulátor használatát: hidd el nem véletlenül, a lépésenkénti végrehajtás sokat segít a hibakeresésben!
Steve
Annyival had egészítsem ki Kissi-t, hogy szokj hozzá a kommentezéshez, egy ilyen programnál nem gond ha nincs, de ha most nem szokod meg később nehezebb lesz. Valamint nem árt ha mielőtt nekikezdesz csinálsz egy folyamatábrát, vázlatot a progiról. Sokkal szemléletesebb, átláthatóbb a program szervezése. Az ilyen jellegű hibák rögtön kibuknak.
Rendben, köszi. Feliratozni fogok.
Folyamatábra hogyan készíthető?
Először is képzeld el, hogy Te, hogyan csinálnád meg azt a feladatot amit a progidnak kell, ezt kell lerajzolni, megfogalmazni, majd lefordítani a proci nyelvére. Egy kis segítség:http://wiki.prog.hu/wiki/Algoritmus
Jaj, ezeket az algo-kat már 6,7-ben rajzolgattuk, de az 4 éve volt. Nem nagyon emlékezek rájuk. Épp tegnap jutott eszembe, hogy mire is lehetett az jó.
Egy dologgal még adós maradtam.
Idézet: „if helyett a while utasítást” A while ciklussal is tudod figyelni a gomb állapotát, úgy, hogy nem csinálsz ciklusmagot. Ugye most a végtelen ciklusod magja a ledek villogtatása, vagyis az ami a kapcsos zárójelek között van. Ez azért végtelen, mert a while ciklus mindig igaz, azaz 1. Ha mindezt átépíted a gomb figyelésére, akkor eredményül azt kapod, hogy a programod addig vár, míg meg nem nyomod a gombot, ennek következtében a bement alacsony szintre megy azaz 0 lesz, így hamis lesz a while ciklus, és a program folytatódik. A gyakorlatban valahogy így néz ki:
Legalábbis remélem, hogy PIC-ül is így van. A linkelt programodban, ha az if.... helyett ezt rakod be, akkor eredményként azt kapod, hogy a program csak a gombnyomás után indul el. Remélem mindent jól és érthetően írtan, ha nem, javítsatok ki.
Köszönöm, holnap letesztelem, most már nagyon szét van az agyam csapva.
Kipróbáltam, de ez így nem működik. Elsősorban nem raktam pontosvesszőt, mert a függvénynél nem kell, másodszorra így néz ki a programom eleje:
Szia!
Ha negálod az inputot akkor ez is úgy fog működni mint az if-es változat. Ez egy elöl tesztelő ciklus, kell a végére a pontosvessző, az zárja le az egészet. A függvény után is kell. Ha itt rögtön a while után teszel pontosvesszőt akkor (negálás nélkül) saját magát fogja ismételni, vagyis addig azon a soron áll amíg meg nem nyomod a gombot, mert addig a felhúzás miatt igaz a feltétel. Egy kis irodalom, hogy tisztában legyél a ciklusokkal, elágazásokkal, függvényekkel:http://torusz.hu/prog/kr-c/index.html#Tartalom
Köszönöm, akkor utána rakom, és kipróbálom így is.
Kipróbáltam, valóban működik, de semmiben sem különbözik az IF-estől. Itt is amint elengedem a gombot, addig fut tovább a program, amig végig nem fut.
Mintha írtam volna, hogy úgy fog működni
Ha azt akarod, hogy rögtön megálljon, akkor figyelned kell a gombot, amikor változás történik megnézed ez milyen volt és aszerint vagy elindítod a ciklust, vagy azonnal megállítod. Másik lehetőség (szerintem egyszerűbb), hogy folyamatosan fut a ciklus, megszakításban figyeled a gombot, ugye amikor változik a gomb állapota akkor keletkezik egy megszakítás (persze ehhez olyan lábon kell lennie ami képes megszakítást generálni) megnézed, hogy a gomb most meg van e nyomva, vagy nincs (másik megoldás: felfutó éle történt vagy lefutóra), eszerint a led portod kimenetnek vagy bemenetnek állítod, ha kimenet villogni fog, ha bemenet akkor meg sötét marad. Ezzel egy kicsit ismerkedsz a megszakításokkal, utána rátérhetsz, hogy az időzítést is timer (nem trimmer) megszakítással csináld.
Megint csak az volt a baj, hogy nem figyeltél! Mert ha figyeltél volna, akkor úgy írod be, ahogy leírtam, és működött volna! Egyébként mindez szépen, érthetően le van írva a Kónya könyvben is.
Sziasztok!
A led-es projektet szeretném tovább fejleszteni. Valaki tudna segíteni, hogy hogyan tudom lekezelni a potmétert, hogy a sebességet állítani tudjam vele? Ez már gondolom kicsit bonyesz lesz, mert át kell alakítani is a programot, nem? Egy 10k-s poti van a fejlesztőn. Így néz ki maga a panel(12-es oldal) Bővebben: Link
Jani! Csak jót akarok, hogy először megértsd a programok működését... Szerintem kezdd inkább egy nyomógombbal. Vegyél fel egy változót és minden gombnyomásra növelje a ledek futásának sebességét. Ha elér egy végső értéket, akkor a következő gombnyomásra álljon át minimum sebességre.
Feladat: -A változó névadása, típusának választása, és kezdő értékadása -A gomb figyelése, belső ciklusban a változó növelése -A változó figyelése, hogy elérte-e a maxot, majd lekezelés -A változó beépítése a sebesség változtatásába -Ekkor már majdnem jó, de rájössz, hogy a kapcsolót prell mentesíteni kell. Ha ez megy, érdemes még bonyizni a programod 2 nyomógombra és fel/le változtatni a sebességet. Ezután már válthatsz irányt is. Ha már minden kész és jól működik, jöhet valami komolyabb, például az A/D, amit elsőnek írtál.
Köszönöm. Igazad van. Akkor megpróbálok ezek után járni, hogy hogyan, hátha találok valamit. Ha majd elakadok, írok ide a fórumra.
Rendben, írj csak! Ha kitartó vagy, 1-2 héten belül már csak ujjgyakorlat lesz ilyen feladat.
Sziasztok!
Segítséget szeretnék kérni Tőletek... A következő projektemben többek között egy 20-70 kHz között működő invertert kell építenem és persze programoznom. Ezt persze CCS C-ben akarom megcsinálni a power_pwm funkciók használatával PIC18F4431, vagy PIC18F4680-as MCU-val (a második jobb lenne, mert a CAN buszra is szükségem lesz a kommunikációhoz). Szóval szeretném alaposan megérteni a power_pwm működését, a négy pwm csatorna vezérlési trükkjeivel együtt, mert nem csak pwm, hanem PWM/PDM vezérlést kell csinálnom. Szóval már napok óta kutatok a neten olyan doksi után, amiből alaposabb ismereteket tudnék szerezni a power_pwm programozásának témájában, de eddig még csak példaprogramokat találtam eléggé kevés kommenttel a CCS fórumon. Nagyon hálás lennék, ha valaki tudna javasolni valamilyen használható doksit (az MCU adatlapján kívül, mert eddig még az volt a legjobban használható, de azért a jó megértéshez kevés)... Persze csinálok majd demó áramkört magamnak, amin kísérletezhetek, de addig is jó lenne valami alapinformáció, hogy mégis sejtsem, mit is csinálok, amikor programozok... Előre is köszönöm a segítséget. A hozzászólás módosítva: Okt 23, 2012
Van egy kis programom, amit a robogómra fejlesztek, a henger hőmérsékletet, a fordulatszámot, és a benzint jól méri, de a sebességet nem akarja.
Az IOC-al akadtam el, valaki kisegítene pár sorral, hogy az RB6-ra jövő interruptot hogy tudom kezelni? Mert a mostani programra kézzel tekerve a kereket, nem számol felfelé (és a szenzor jól adja a feszültséget). Esetleg így kellene?: #int_RB void RB_isr() { if(input(PIN_B6)){ ..... } } void main(){ enable_interrupts(GLOBAL|INT_RB); .... }
Szervusz!
Talán pl. így:
Be kell állítani, hogy le vagy felfutó élre történjen megszakítás és annak megfelelően vizsgálni a láb alacsony vagy magas állapotát. (De ha csak egy lábon jöhet megszakítás, akkor fölösleges a láb állapotát nézni ha már eljutott a megszakításba.)
Eltekintve attól az apró szépséghibától hogy az RB6 nem EXT_INT bemenet (az RA2 az, de azt másra használja), a dolog akár működhetne is.
Így marad az eredeti elképzelés az INT_RB-vel, mivel annak működnie kéne. AccessDenied: Az enable_interrupts(GLOBAL); sort tedd a végére, az összes többi enable interrupt után hátha az segít. A hozzászólás módosítva: Okt 24, 2012
Kösz, tényleg érdemes az aktuális PIC adatlapjára sűrübben ránézni...
Az INT_EXT (RA2) interruptot is használom, az működik is, de valamiért nem adja be az RB interruptot. És az a baj, hogy igazából mindegy, hogy melyik RB pinre adja, mert az egész RB soron csak 1 interruptot kellene fogadni, meg egy adc bemenetet, de úgy olvastam az adatlapon, hogy ha a portot adcre használom, akkor az nincs hatással az interrupt on changre, mert lekapcsolja a digitális meghajtó áramkört. De az előbb kipróbáltam úgy is, hogy az egész portbn csak az interrupt jel volt bekötve, és nem adja be. Az interruptok elé amúgy miért kell #int_EXT meg #int_TIMER0?
Egy portot ha analógra kapcsolsz (ANSEL = 1), akkor azon a digitális bemenet ki van kapcsolva (tehát az IOC sem fog működni). Ezzel lehet elérni, hogy az analóg funkciót ne befolyásolja hátrányosan a digitális bemenet terhelése, mert az elronthatja az A/D linearitását pl.
Ha a portot digitálisra kapcsolod (ANSEL = 0), akkor azon az analóg bemenet még működik, csak éppen terheli a digitális bemenet a vonalat.
Most próbálgattam, és ha kiveszem a programból, hogy engedélyezve legyen az INT_EXT, meg kikommentelem a #int_EXT részt, akkor olyan, mintha lefagyna a pic.
Szia!
A portbit kiválasztásához az IOCA és az IOCB regiszterben be kell állítani, mely bitek vegyenek részt a változásfigyelésben. Az INTCON regiszterben a RABIF bitet törölni kell, az RABIE bitet 1 -re kell állítani. Ahhoz, hogy a PORTB -n a változásfigyelés másodszor, sokadszor is működjön, a megszakítás beérkezése után ki kell olvasni a PORTA -t és/vagy PORTB -t (attól függően mely bitek vesznek részt a figyelésben). Ez az olvasás törli a megszakítási feltételt azzal, hogy a port aktuális értékét beírja az előző értéket tároló regiszterbe. A kizáró vagy kapcsolat tehát nem lesz aktív. Ezután törölni kell az INTCON regiszter IABF bitjét. Nem ismerem a CCS fordítót, így nem tudom megmondani, mit állít be "magától". Az assembly listában ellenőrizhető minden.
Igen, idő közbe rájöttem én is, hogy a kiolvasás maradt el, mostmár megy, csak a kettő együtt nem. Ha használom az int_EXT és int_RB interruptokat egyszerre, akkor az RB interrupt nem működik.
|
Bejelentkezés
Hirdetés |