Fórum témák
» Több friss téma |
Fórum » PIC - Miértek, hogyanok haladóknak
Tessék itt a forrás : Bővebben: Link
Mintha ebben a rev-be nem akkora számot töltenének, mint ami nem fér bele, ugye?
![]()
Ezen gondolkodtam én is próbálgattam más típusú változókkal is de nem nagyon akart összejönni. változók értéke Igazából nincs tippem már mit próbáljak ki
![]()
Ezen nem "gondolkodni és próbálkozni" kell, hanem pár alapvető dolgot megtanulni. Kezd mindjárt a változók típusával. Aztán mielőtt változtatsz egy kódon, meg kellene érteni a működését. Azután ott a szimulátor, azonnal kiderül, ha hibás típust használsz és le lehet mérni a kód futási idejét is, hogy két megszakítás között le tud-e futni.
Nem világos, hogy mi "csordul túl" nálad. Elfogy a RAM, kevés lesz a programmemória, vagy a fordításnál közli a Mikroc, hogy overflow van?
Bár igazából mindegy. A Mikroc fordítójának jellegzetes logikája van. Ha kicsi a program, akkor akár egy bájtba is betöltheted két float hányadosát, mert fel tudja használni azt a 20 segédregiszterét, amikben dolgozgat. Ez kicsit megtévesztő, de rendes dolog tőlük, hogy beleírták. Az eredeti, pár soros programban nincs is baj. Ha nő a program, akkor ezeket inkább stack és egyéb gondok tárolására használják, úgyhogy azt a változót kell rendesen deklarálni, amibe az eredmény megy, mert azt fogja használni a fordító a résszámításokhoz is. (Egy 4 bájtos osztáshoz jó sok számolgatás kell assembly-ben.) Tehát a "rev" legyen long, de inkább float, az a biztos. Persze csak akkor, ha van elég RAM. Ha nincs, akkor kénytelen leszel szétbontani a számítást olyan részösszegekre, amik beférnek 2-4 bájtba. Az is gond, hogy minél nagyobb számjegyekkel végzel aritmetikai műveleteket, úgy pakolja be a kódba a különböző, egyre nagyobb terjedelmű, számító rutinokat. Azok szintén használnak segédregisztereket, így gyorsabban fogy a RAM, mint a fagyi a gyerekzsúron. Úgy kell felépíteni a programot, hogy optimális legyen a RAM allokáció. (Ezért is jobb assmebly-ben is venni pár leckét.) A PIC nem számítógép, be lehet ugyan írni, hogy anégyzetszerbénégyzetpergyökkettő, a fordító meg is kísérli a feldolgozását, de elfoglalja az összes helyet. Ha meg már egyszerűen nincs hova bepréselnie 4 egymást követő bájtot, jön a hibaüzenet.
Másolom a hibaüzenetet a szimulátorból : PC=0B0BA4 Stack owerflow is device forcing reset.
Szabad ramom 90% szabad rom 85% fordítás után ennek csak elégnek kell lennie.. de akkor megpróbálom azokkal a változókkal amiket említettél.
Na, akkor már tudjuk mi a hiba. A Stack overflow azt jelenti, hogy túl sok egymásba ágyazott programhívás van a kódban. Valószínűleg a nagy osztást számoló rutin belépése tette be a kaput.
Át kell dolgozni a programot. Sok az elágazás. Utána talán menni a fog a számítás az eredeti módon, de azért a rev legyen legalább u long.
Értem, igen tuti hogy ez a nagy számítás okozza a hibát mert amint csökkentem az értékét akkor működik. Rendben megpróbálom úgy.
Megoldottam, fogtam addig módosítgattam a kódot amíg a frekvenciát pontosan meg nem kaptam, egy plusz függvénnyel pedig felszoroztam a pillanatnyi frekvenciát 60-al így megkaptam a percenkénti fordulatszám eredményét így már jó.
Sziasztok!
Táblázatkezelési problémám van. A klasszikus call... addwf PCL,f RETLW.. -vel kb 200 bájtot sikerült kiolvasnom, majd a program elejére ugrott. Lapváltás még nem volt, de a PCL már FF-re váltott. Ezt még valahogy értem. Aztán megpróbáltam a következőt: sin: movlw d'0' movwf index movlw HIGH (TABLE_START) movwf PCLATH movf index,w addlw TABLE_START skpnc incf PCLATH,f movwf PCL nop TABLE_START retlw ... Ez viszont az első retlw után a program elejére ugrik, W-be még betölti az adott értéket. (ezt az internetről bányásztam)
Régebben olvastam és most átfutottam, de nem látom a hibát. Segítenél kinyitni a szemem?
Megpróbáltam a "GetTabData" szerint még egyszer, de ugyanaz az eredmény.
Köszönöm... újra végig mentem rajta most már jó. (Remélem nem felejtem el megint.) Az a CALL... nagyon kellett bele.
Idáig még nem használtam semmilyen kommunikációs portot (nem is értem hogy úszhattam meg eddig), de most mindenképp SPI-n kellene vezérelnem egy A/D-t és egy D/A-t. Épp a nyákot tervezem az áramkörhöz és kérdezném hogy ugye jól kötöttem össze őket a PIC-kel?
(A kapcsolási rajz még nincs kész, ezért a többi részt ne tessék nézni.)
Az MCP4922 adatlapja azt írja, hogy az adatbeírás a #CS bemenet lehúzásával kezdődik. Utána 16 bitet kell beléptetni (bitek sorrende és szerepe az 5-1. ábrán) és, amiből az első 4 bit konfigurációs bit, a további 12 pedig adatbit. Ezt követően a #CS jel magasba húzásakor íródik be a megfeleő regiszterbe az adat. A kettős bufferelés miatt azonban az adatregiszterbe írt számmal arányos jel nem kerül ki közvetlenül a kimenetre, ebbe még az #LDAC és az #SHDN bemenetek állapota is beleszól.
A hardveres Shutdown mellőzhető, az #SHDN lábat magas szintre kell húzni. Az #LDAC bemenet arra való, hogy az A és a B DAC kimenetét szinkronizáltan lehessen frissíteni (az #LDAC bemenet lehúzásakor íródnak be az előzetesen beállított adatregiszterek a két DAC-ba). Ha erre nincs szükség, akkor #LDAC egyszerűen földre köthető (alacsony szint kell neki), s ekkor megszűnik a kettős bufferelés. A #CS bekötése nyilván nem mellőzhető. Több eszköz is ráköthető az SPI buszra, s az egyedi #CS vezetékek választják ki, hogy melyik reagáljon éppen (lásd: 6-1. ábra). Megjegyzés: a fentiekben a # jel a felülhúzást jelöli (alacsony szintnél aktív jel).
Mi anno a negált jelszinteket "/" karakterrel jelöltük, mert az még az írógépen is megvolt...
Köszönöm a válaszokat, akkor így jó lesz?
Nyilván látnak mert az előző rajz is ekkora volt. Nyisd meg új lapon és akkor valamivel nagyobb lesz!
Valahol meg '!' jelet használnak erre.
![]()
Valamivel jobb, de én így se látom a feliratokat, csak a vezetékek számát tudom megszámolni és szerintem a legutóbbi válasz is így született, nem azért mert a rajz olvasható. Ilyen nagy probléma feltenni egy normális képet, vagy pdf-et?
A hozzászólás módosítva: Jan 22, 2014
Dehogy probléma. A rajzom nagyobb felbontású, csak a HE lekicsinyíti sajnos. Viszont a pdf jó ötlet, íme:
A hozzászólás módosítva: Jan 22, 2014
A fájl nevére kattintva, nagyobb lesz, tádá...!
![]()
Így már tökéletes! A bekötés szerintem is jó.
Micsoda műhelytitkok!
![]() A hozzászólás módosítva: Jan 22, 2014
Szia! Mire gondolsz? A 'CS' vonalakra? Mert az SPI-re nem kellenek. A 'CS'-kre lehetne, de oda sem mindig indokolt, attól függ milyen problémát okoz a bekapcsolás időtartama a perifária és a PIC között. Általában nincs gond, de van mikor jó, ha a lebegő engedélyező láb fel van húzva, annak ellenére, hogy a lebegés általában H szint.
A hozzászólás módosítva: Jan 23, 2014
Nem kevered az I2C-vel? Az SPI meghajtott kimenettel rendelkezik, ezért lehet csak egy eszköz engedélyezve a vonalon.
Az összes ki-bemenetre szerintem is felesleges, de ha több eszköz van az SPI buszon, akkor a CS lábakra én mindenképpen tennék olyan irányú húzást, amivel az inaktív állapotba húzódik. Azért, hogy ne történhessen meg a kontroller indulása alatt, hogy két eszköz is aktív CS szintet érzékel, és a kimeneteik szembekapcsolódnak.
Egyetértek, hasonlót próbáltam javasolni én is.
Sziasztok! Olyan, lehetőleg 2 irányú kommunikációs kapcsolatra lenne szükségem PIC-ek közé (2-nél több mcu) ahol a tápfeszültség 2 vezetékére van rámodulálva az Rx és Tx. Tudnátok valamit javasolni? RS485-tel valahogy megoldható lenne?
|
Bejelentkezés
Hirdetés |