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   4 / 118
(#) sysy hozzászólása Máj 26, 2007 /
 
Ha ilyen ~10MHz tartományban akarsz mérni, akkor valszeg a kritikus (interrupt) részeket ASM-ben kellene megírni és kapuzni kellene a bemenetet, hogy feldolgozás és kijelzés alatt ne pörögjön a számlálód.

A Timer0-nak használod az előosztóját?

sysypet
(#) hummer válasza sysy hozzászólására (») Máj 27, 2007 /
 
A TMR0-nak nem használom az előosztóját. Direktben számol (számolna, ha működne). Az interrupt kezelőt meg azért nem asm-ben véstem, mert nem ismerem az assembly-t. Ezért használok C-t. De ha tud valaki segíteni a kezelőrutin megvésésében vagy van valami kód csak erre a problémára, akkor azt szeretettel fogadom. Tudom, hogy az igazi geekek lenéznek, mert nem asm-ben nyomom a kódot, de szinte mindent meg tudok valósítani C-vel. Ritkán van szükségem asm kódrészletre, hát ez a mostani ilyen alkalom. Biztos nem lehet ezt C-ben megjavítani ?
(#) sysy hozzászólása Máj 27, 2007 /
 
Nem hiszem, hogy az egészséges lelkületű geekek lenéznek téged ezért. Amíg asm geek voltam (és nagyon büszke) ámulattal néztem a C-ben nyomulókat és irigyeltem őket, hogy egy C utasítással megcsinálják azt, amit én egy fél képernyőnyi kóddal. (ami nem biztos, hogy működött azonnal) Mindíg nagyra tartottam azokat, akik C ben tudnak programozni. Az sem egyszerű, bár a kívülállóknak annak látszik. Visszatérve a problémádra...

Valószinűleg abban rejlik a baj, hogy nem lehet olyan gyorsan végrehajtani a C utasításokat, mint ahogyan kellene. Ilyen nagy freki mérésekor célszerű lenne a Timer0 előosztóját is használni, hogy legyen időd lekezelni az eseményeket. A Timer1 megszakításába bele kellene tenni 2-3 ASM utasítást, ami gyorsan "lekapcsolja" a Timer0-ra bejövő frekit. Utána kijelzés, kinullázni a mérő regisztereket és új mérést indítani.

Megjegyzés: A Timer1 ben nem kell letiltani a megszakítást, mert a megszakítás kiszolgálása alatt ez automatikusan tiltva van a függvényből való visszatérésig.
(#) hummer válasza sysy hozzászólására (») Máj 27, 2007 /
 
Köszi a magasztaló szavakat, remélem, hogy majd egyszer méltó leszek rájuk.
Ami az ötleted illeti, sejtettem, hogy a C<->asm ideoda tilitolizás közben időt vesztek, csak nem gondoltam, hogy ennyit. A TMR0 előosztót majd kipróbálom, de az a baj, hogy gőzöm sincs, hogy hogyan kapcsoljam le a TMR0-ra bejövő frekit. PDF közli a rajzát a TMR0 résznek, de az a szívás, hogy csak a T0SE (fel/lefutó élre számol) és a T0CS (órajel kiválasztó) vezérelte multiplexer van a TMR0 bemenetén. Semmi olyasmi, mint pl. a TMR1-nél belül a TMR1ON vezérelte AND kapu. Tehát csak a GLOBAL interrupttal tudom leállítani. A mérésem azért pontatlan, mert a TMR0 túlcsordulásokat számolom. A referencia oszcillátornál 1280 VAGY 1536 (1280+256 impulzus) ! Nem mindegy, mert ez már mérési eltérés. Amúgy kalibrált frekimérővel kimértem a TTL oszcillátor+74hc14 kombót és tökéletesen nyomják az ipart. Tehát a PIC-ben tolom el a dolgot. Milyen asm utasításokkal bővítsem a TMR1 interruptot ?
(#) sysy hozzászólása Máj 27, 2007 /
 
A Global Int letiltásával nem állítod le a Timer0 számlálását! Ez úgy lehetne megcsinálni, ha egy soros ellenálláson keresztül vezetnéd be a jelet a RA4 be. Az ellenállás és az RA4 csatlakozásába még egy portot is bekötsz. (párhuzamosan a két port) Ezzel a kisegító porttal le lehetne kapcsolni a bejövő jelet. (kimenetnek programozva és mondjuk "0" kiküldve rajta) Ha mérsz, akkor bementenk állítva nem zavarja a mérést.

Most utána számoltam és 20MHz mérendő freki esetén 12 asm utasítás végrehajtása alatt fordul át a Timer0. Ez meglehetősen durva dolog. Egy C sor simán lehet ennyi. Ha a PA3 lenne a kapuzó port párhuzamosan a jelbemenettel, akkor mindössze ennyit kell a Timer1 megszakításának elejére berakni:

#asm
BANKSEL TRISA
bcf TRISA,3
BANKSEL PORTA
#endasm

Ez elég hamar lefut. Természetesen valahol a program elején az RA3-at kimenetnek kell beállítani és kiküldeni egy 0-át.
(#) hummer válasza sysy hozzászólására (») Máj 27, 2007 /
 
Kipróbálom, de a banksel-t nem ismeri a PICC és asszem a PIC utasításkészletében sincs. Mi van helyette ?
(#) potyo válasza hummer hozzászólására (») Máj 27, 2007 /
 
Idézet:
„Mi van helyette ?”

Kézzel beállítod a bankválasztó biteket.
(#) dpeti válasza Gory hozzászólására (») Jún 20, 2007 /
 
tudom, hogy régen kérdezted, de hátha nézed:

"Én is CCS Compilerhez keresek egy fájlt, de nem akarok új témát nyitni neki. A neve EX_USB_SCOPE.c
A gyári mintaprogramok közül való, de a demo-ban szintén nincs benne."

a legujabb forditonak benne van a mintaprogramjai között, csak az a baj vele, hogy kellene hozzá CCS USB demoboard, az meg gondolom senkinek sincs
a program alapján ki lehet sakkozni, hogy mit hová kell kötni, csak ott a gubanc, hogy nincsen meg sem az usb driver, sem a kliensprogam hozzá...

valakinek ötlet?
(#) Prinner hozzászólása Jún 22, 2007 /
 
Sziasztok!
Szükségem lenne egy kis segítségre ccs-ben, írtam egy egyszerűt, de nem tudja lefordítani

#include <16F84A.h>
#zero_ram
#fuses XT,NOWDT,NOPROTECT,NOPUT
#use delay(clock=4000000)


main(){
while(true){
if(input(PIN_A2));
output_high(PIN_B0);
else
output_low(PIN_B0);
}
}

Ezt kapom hibaüzenetnek: Executing: "D:\Program Files\PICC\Ccsc.exe" +FM "F84C.c" +DF +LN +T +A +M +Z +Y=9 +EA
*** Error 51 "D:\Mplab projektek\16F84CCS\F84C.c" Line 11(1,5): A numeric expression must appear here
1 Errors, 0 Warnings.
Halting build on first failure as requested.
BUILD FAILED: Fri Jun 22 19:40:58 2007

Előre is köszönöm a segítséget
(#) dpeti válasza Prinner hozzászólására (») Jún 22, 2007 /
 
if(input(PIN_A2)); <<<--- Itt az if után ne tegyél ;-t
output_high(PIN_B0);
else
output_low(PIN_B0);

meg szebb lenne, ha
void main(void) { -al kezdődene
meg while(true) helyett inkább írj while(1)-et az a biztos>>>
(#) potyo válasza Prinner hozzászólására (») Jún 22, 2007 /
 
Mondjuk én nem ismerem ezt a CCS-t, de C kódban az if utáni kifejezést nem ;-vel zárjuk le.

Amúgy, ahogy elnézem elég messze van ez a fordító a rendes C nyelvtől, az a true valahogy nagyon szúrja a szemem.
(#) dpeti válasza potyo hozzászólására (») Jún 22, 2007 /
 
na, akkor nem csak az enyémet szúrta...
próbáld ki Prinner ezeket átjavítani és nézd meg mi történik (ha van időd próbáld ki mindegyiket, hogy mi változik)

(#) Prinner válasza potyo hozzászólására (») Jún 22, 2007 /
 
Köszi a gyors válaszokat, sikerült fordítani, és működik, ez volt az első c nyelvű próbálkozásom (egy nyomógombbal felvillantok egy LED-et )

A true-val is megy, egyébként a ccs book-ban olvastam, azt írta, hogy a végtelen ciklusokhoz ezt kell beírni (de fogalmam sincs, hogy mit jelent )

Még van egy hülye kérdésem: milyen cimkével kell "szubrutin" szerűséget írni c-ben. (úgy tudom hogy a for {}-al lehet, de nem vagyok benne biztos)
(#) dpeti válasza Prinner hozzászólására (») Jún 22, 2007 /
 
"Még van egy hülye kérdésem: milyen cimkével kell "szubrutin" szerűséget írni c-ben. (úgy tudom hogy a for {}-al lehet, de nem vagyok benne biztos)"

Huh, ettől majdnem elgurult a gyógyszerem

Ajánlom, hogy először tanuld meg a C programnyelvet
pl innen :
http://www.iit.bme.hu/~szebi/proga_1_bsc.html
http://www.le.ac.uk/cc/tutorials/c/
(#) potyo válasza Prinner hozzászólására (») Jún 22, 2007 /
 
Idézet:
„A true-val is megy, egyébként a ccs book-ban olvastam, azt írta, hogy a végtelen ciklusokhoz ezt kell beírni”

Akkor a C nyelvet ne onnan tanuld meg használni! Az a true azért szúrja egy C nyelvhez valamilyen szinten értő szemét, mert a C nyelvben nincs logikai tipus, és a true és false az a pascalból van átvéve. Helyette az egész tipust használjuk (int, char, stb). Annyiból áll a dolog, hogy ha a változó értéke nem nulla, akkor az megfelel a true-nak, ha nulla az értéke, az megfelel a false-nak, csak a C-ben ravaszabb dolgokat is lehet csinálni "logikai" tipussal.

Amúgy végtelen ciklust lehet többféleképpen csinálni. Legtöbbször a
while (1)
{


}
formát használjuk, de pl. a
for(;
{

}
is végtelen ciklust ad.
(#) sysy válasza Prinner hozzászólására (») Jún 22, 2007 / 1
 
Hmmm...

Mindenki azt írja, hogy nem ismerem a CCS C-t, de azért osztják az észt. Meghogy true helyett írjál 1-et, mert az biztosabb.
Miért is?
Ilyenkor a standard válasz az az, hogy nem tudom, de már láttam egy ebert aki ezt hallotta valakitől. Az igazi kérdésre meg nem adnak választ. Hmmm... ezek szerint így is lehet segíteni.

Tehát:

A
while( true)
{

}
fuggvény ugyanaz mint a
while(1)
vagy a
while(12345)

Amíg a while argumentuma nem nulla (true) vagy (1), addig a fuggvény törzse {a bajszos zárojelek közötti kód} mindíg lefut.
Magyarul: végtelen ciklus.... mint ahogyan potyo is el akarta magyarázni a hozzá nem értőknek.


A szubrutint a C nyelvben fuggvénynek hívják és általában valahogy így néz ki:


void
valamit_csinálunk_itt (void)
{
kód;
kód;
....
kód;
}

és így illik meghívni pl. a main fuggvényből:

void
main (void)
{
kód;
kód;
....
valamit_csinálunk_itt(); //itt van a függvényhívás helye
kód;
kód;
}

A "szubrutint" (függvényeket) illik a main előtt megírni, hogy fordítási időben már tudjon mindent a függvényekről a fordító, mikor odaér, hogy a hívás helyét is lefordítsa.

hirtelen ennyit a függvényekről.

sysypet
(#) potyo válasza sysy hozzászólására (») Jún 22, 2007 /
 
Idézet:
„Hmmm... Mindenki azt írja, hogy nem ismerem a CCS C-t, de azért osztják az észt. Meghogy true helyett írjál 1-et, mert az biztosabb. Miért is? Ilyenkor a standard válasz az az, hogy nem tudom, de már láttam egy ebert aki ezt hallotta valakitől.”

Nem írta senki, hogy biztosabb, hanem azt, hogy ez nem C nyelv. CCS-ben működik, mert a CCS szarik az ANSI szabványra, de egy szabványos fordítóban a true és a false nincs benne. Hamár tanulja a C nyelvet, akkor ne a CCS saját találmányait használja, hanem tanulja meg úgy a C-t, hogy azt másik fordítóban is tudja használni.
(#) dpeti válasza sysy hozzászólására (») Jún 22, 2007 /
 
"A "szubrutint" (függvényeket) illik a main előtt megírni, hogy fordítási időben már tudjon mindent a függvényekről a fordító, mikor odaér, hogy a hívás helyét is lefordítsa."

vagy pedig header fileban, vagy a file elején definiálod, hogy mi a függvény neve, paramétereinek típusa, és a visszatérési értéke...

int valami(int,int);

void main(void) {
int a,b,c;
a = valami(b,c);
}

int valami(int a, int b)
{
return (a+b);
}

(#) sysy válasza dpeti hozzászólására (») Jún 22, 2007 /
 
Okay, ezt én mind tudom, de aki még azt sem tudja, hogy a szubrutint hogyan is csinálják a C-ben, annak nem kéne egyetemi szinten lenyomni a torkán. Majd később, ha már kezdi élvezni

sysypet
(#) dpeti válasza sysy hozzászólására (») Jún 22, 2007 /
 
már bocs, de szerintem Szebi elég érthetően elmagyarázza a honlapján...
kezdőknek ideálisak a diái...
C-t hogyan lehet még máshogy tanulni, ha nem egyetemi szinten?

alapok mindenhol ugyanazok, legfeljebb nem olvassa el a bináris fákat, fésűs rendezést, rekurziót, qsortot meg társait...
(#) sysy válasza potyo hozzászólására (») Jún 22, 2007 /
 
nem biztos, hogy ANSI C-t akar használni. Ezt nem közölte velünk. Azt viszont igen, hogy CCS-t használ. Ígyhát...

sysypet
(#) dpeti válasza sysy hozzászólására (») Jún 22, 2007 /
 
ja, utánna meg majd elkezd más C fordítókkal is foglalkozni, és itt fog oldalakon keresztül fakkolni a fórumokon, hogy miért nem így van benne "pedig a CCS-ben így volt, az is C fordító, há' nem?"


hülyeség úgy hozzáállni, hogy nem a szabványos dolgokat tanuljuk meg először...
rengeteg alattomos, és idegesítő hiba forrása lehet...
(#) Moderátor hozzászólása Jún 22, 2007
 
Én személy szerint úgy látom a szemeimmel, ez MÉG MINDIG a CCS PIC Compiler topik, nem a Hogyan tanuljunk rendes ANSI C-t? topik

Előbbi ide a fórumra való, utóbbi pedig a www.prog.hu-ra...

Különben is...az okos, intelligens emberek tanulnak más hibáiból, rengeteget olvasnak, és így nagy valószínúséggel nem csinálnak túl durva hibákat...

Aki meg nem rendelkezik ezen képességekkel (még), azok meg saját bőrükön fogják majd tapasztalni (ahogy az életben szokás), hogy nem minden úgy van, ahogy azt elsőre gondoltuk...
(#) dpeti válasza (») Jún 22, 2007 1 /
 
jó, akkor én innentől kezdve teszek magasról arra, hogy segítsek a kezdőknek... mi a sz.rnak erőlködjek, ha már a moderátorok is tesznek arra, hogy a használható tudást erőltessék az embereknek
(#) Moderátor hozzászólása dpeti hozzászólására (») Jún 23, 2007
 
Te tudod...én nem ezt próbáltam meg sugallni...

De nem baj...majd egyszercsak jön vki, aki úgy egészen egyszerűen...csak szimplán segít egy szimpla elakadáskor, segítségkéréskor...

Erre én nem tudok és nem is akarok többet mondani...
(#) dpeti válasza (») Jún 23, 2007 /
 
"Te tudod...én nem ezt próbáltam meg sugallni..."

márpedig nagyon úgy tűnt...
itt most kivételesen bele sem kellett volna szólnod, mert mindenki a jó útra akarta terelni a kezdőket, függetlenül attól, hogy a CCS C-ről van szó.

(#) gtk hozzászólása Jún 23, 2007 /
 
Sziasztok !

Szerintem CCS C -vel kezdeni C-t tanulni nem jobb mint ha Visual C alatt MFC -vel kezdene el tanulni.
(#) dpeti válasza gtk hozzászólására (») Jún 23, 2007 /
 
senki nem mondta neki hogy azzal kezdje el...
(sőt azt nem is ajánlom )
azt tanácsoltuk, hogy először pusztán elméleti szinten nézze át az ansi c-t
(#) gtk válasza dpeti hozzászólására (») Jún 23, 2007 /
 
Potosan ezert irtam
(#) dpeti válasza gtk hozzászólására (») Jún 23, 2007 /
 
ja ok, nem éreztem az iróniát
Következő: »»   4 / 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