Fórum témák

» Több friss téma
Fórum » CCS PIC Compiler
 
Témaindító: (Felhasználó 1542), idő: Ápr 3, 2006
Lapozás: OK   81 / 118
(#) janikukac hozzászólása Szept 9, 2012 /
 
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?
(#) kissi válasza janikukac hozzászólására (») Szept 9, 2012 /
 
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
(#) janikukac válasza kissi hozzászólására (») Szept 9, 2012 /
 
Köszönöm a segítséget.
(#) mps válasza janikukac hozzászólására (») Szept 9, 2012 /
 
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.
(#) janikukac válasza mps hozzászólására (») Szept 9, 2012 /
 
Rendben, köszi. Feliratozni fogok.
Folyamatábra hogyan készíthető?
(#) szitko válasza mps hozzászólására (») Szept 9, 2012 /
 
Akkor én már nem írom le. Köszi.
(#) mps válasza janikukac hozzászólására (») Szept 9, 2012 /
 
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
(#) janikukac válasza mps hozzászólására (») Szept 9, 2012 /
 
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ó.
(#) szitko válasza janikukac hozzászólására (») Szept 9, 2012 /
 
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:
  1. while(input (PIN_B0) );

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.
(#) janikukac válasza szitko hozzászólására (») Szept 10, 2012 /
 
Köszönöm, holnap letesztelem, most már nagyon szét van az agyam csapva.
(#) janikukac válasza szitko hozzászólására (») Szept 10, 2012 /
 
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:
  1. while(1)
  2. {
  3. while(input (PIN_B0) )
  4. {
  5.  
  6.   Output_High (PIN_D0);
  7.   Delay_ms(50);
  8.   Output_Low (PIN_D0);
  9.   Output_High (PIN_D1);
és így tovább. Ez annyit csinál, ha bekapcsolom a feszültséget, akkor egyből megy a program, és ha lenyomom a gombot, akkor megáll a program, ameddig tartom. Persze előbb az adott fénycsóva lefut, és akkor áll meg. Szóval ez így nem működik.
(#) mps válasza janikukac hozzászólására (») Szept 10, 2012 /
 
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
(#) janikukac válasza mps hozzászólására (») Szept 10, 2012 /
 
Köszönöm, akkor utána rakom, és kipróbálom így is.
(#) janikukac válasza janikukac hozzászólására (») Szept 10, 2012 /
 
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.
(#) mps válasza janikukac hozzászólására (») Szept 10, 2012 /
 
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.
(#) szitko válasza janikukac hozzászólására (») Szept 10, 2012 /
 
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.
(#) janikukac hozzászólása Szept 15, 2012 /
 
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
(#) vicsys válasza janikukac hozzászólására (») Szept 15, 2012 /
 
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.
(#) janikukac válasza vicsys hozzászólására (») Szept 15, 2012 /
 
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.
(#) vicsys válasza janikukac hozzászólására (») Szept 15, 2012 /
 
Rendben, írj csak! Ha kitartó vagy, 1-2 héten belül már csak ujjgyakorlat lesz ilyen feladat.
(#) Jossz hozzászólása Okt 23, 2012 /
 
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
(#) AccessDenied hozzászólása Okt 24, 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);
....
}
(#) p_istvan válasza AccessDenied hozzászólására (») Okt 24, 2012 /
 
Szervusz!
Talán pl. így:
  1. #int_EXT
  2. void RB_isr() {
  3.  
  4.          if (input(PIN_B6)){
  5.             ...
  6.          }
  7. }
  8.  
  9. void main(void){
  10.          ...
  11.          ext_int_edge(L_TO_H);                            // felfutó él
  12.          enable_interrupts(INT_EXT);                    //
  13.          enable_interrupts(GLOBAL);  
  14.          ....
  15. }


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.)
(#) whalaky válasza p_istvan hozzászólására (») Okt 24, 2012 /
 
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
(#) p_istvan válasza whalaky hozzászólására (») Okt 24, 2012 /
 
Kösz, tényleg érdemes az aktuális PIC adatlapjára sűrübben ránézni...
(#) AccessDenied válasza whalaky hozzászólására (») Okt 24, 2012 /
 
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?
(#) _vl_ válasza AccessDenied hozzászólására (») Okt 24, 2012 /
 
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.
(#) AccessDenied válasza _vl_ hozzászólására (») Okt 24, 2012 /
 
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.
(#) Hp41C válasza AccessDenied hozzászólására (») Okt 24, 2012 /
 
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.
(#) AccessDenied válasza Hp41C hozzászólására (») Okt 24, 2012 /
 
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.
Következő: »»   81 / 118
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem