Fórum témák
» Több friss téma |
Nem mindegyik mikro C-s forditoban van a %f implementalva, hgy helyet takaritsanak meg. Ha van, akkor altalaban a float-okhoz meg kell adni, hogy egy masik printf valtozatot linkeljen be a linker, ami tartalmazza a float konverzios rutinokat. Most nem kovettem melyik forditot hasznalod, de a doksiban vagy googliban keress ra, hogy "CCS printf float" (termeszetesen csereldd le a CCS-at a forditodra)
C18-ban ha jol tudom nincs ilyen lehetoseg egyaltalan, de pl igy tudod kiiratni:
Amugy %l -nek (kis L-nek) ill %lu (kis %Lu) %ld (kis %Ld) mukodnie kellene a tmp32-del...
Én belekezdtem egy Űrsiklóvezérlésbe MPLAB+ASM+PIC12f683-al, de a visszatérési adatvezérlés már nem fért bele. Lehet ha C-be írom belefért volna?
Probald meg esetleg 12C508-asba es C++ segitsegevel.
1., 2., 3.
Vagy ezek alapján egy pic32F -fel kell kezdeni, mondjuk egy led villogtatást. Még a memória is elégnek látszik, az utasításkészlet sem korlátoz. Itt a szabadság... De ahhoz, hogy elindítsd a villogást többszáz oldalt kell elolvasni, megérteni, stb. Egy 12F508, 12F509 adatlapja 106 oldal, egy 16F628A -é 178, egy 18F2520 -é 412, egy 24FJ64GA002 -é 268, egy PIC32MX130F064B -é 320. De az utóbbi kettő sokat hivatkozik a család reference manualjára, ami megint többszáz oldal. Mindegy - ez a trendi...
Hogy ez nem jutott eszembe!
A viccet félretéve, amikor elkezdtem PIC-el foglalkozni, hallgattam az olyan emberek tanácsára, mint pl. a tiéd, hogy ASM a kezdők nyelve, e téren. Most egy másik mikrovezérlő családot is tanulgatok párhozamossan, de azt már C-ben, és így, hogy az ASM-ben megismertem a regiszterek használatát, stb... már sokkal egyszerűbb a C programozás. Azt viszont nem értem, hogy akik most kezdik a PIC programozást, miért félnek attól a kb 35 ASM utasítástól. (16f esetén) Idézet: Pont azért félnek, mert kevés az utasítás (elvégre a RISC is ezt jelenti), s abból nem könnyű kikerekíteni a kívánt algoritmust. Ha valaki netán programozott már előtte CISC eszközt, akkor még nehezebb... A PIC24 vagy az MSP430 utasításkészlete már sokkal emberszabásúbb. De ha nem muszáj, nem piszmog az ember az assembly program útvesztőjében (a program méretének növekedésével egyre nehezebb áttakinteni a programot). „miért félnek attól a kb 35 ASM utasítástól. (16f esetén)”
Szoval lehet ragni ezt a temat. Olyan ez mint a gumicsont. De sokszor latni a feltett kerdesekbol (mindegy ASM, C, Pascal) hogy a kedves kerdezonek halvany lila f.. ogalma sincs a PIC mukodeserol. Azt viszont a magas szintu nyelvek pl a PC-nel is jotekonyan eltakarjak. "Mert en mar regota programozok am C-ben" cimu kijelentesek pl azt jelentik, hogy nagyon keveset ismer az elektronikabol, es az adott uC felepitesebol. Utana jon a kerdes hogy "hova kossem a LED-et". Na ilyenkor kezdem azzal, hogy ASM. Na de mindegy mindenki ugy csinalja, ahogy jolesik. Eszt nem tudok adni legfeljebb tanacsot.
Idézet: „De ha nem muszáj, nem piszmog az ember az assembly program útvesztőjében (a program méretének növekedésével egyre nehezebb áttakinteni a programot).” En mas velemenyen vagyok ezzel kapcsolatban. Egy program attekinthetoseget nem a nyelv befolyasolja, hanem a modszer ahogy a programot felepitjuk. C-ben is lehet borzalmas, attekinthetetlen kodot irni, es asm-ben is lehet szepen strukturalt, ujrafelhasznalhato modulokkal felepitett algoritmus konyvtarakra epitkezni. Ami fokent a C mellett szol az egyreszt az absztrakcio magasabb szintje (a fejleszto az algoritmusra koncentral, nem a regiszterek, memoria es a program tar optimalis kihasznalasara), masreszt a hordozhatosag (pl irsz egy PID algoritmust amit szepen attudsz ultetni kisebb modositasokkal MSP430-ra vagy AVR-re vagy akar PC-re is).
Köszi az infót, igen hasznos volt, sokat segített. Az outdec() függvényt már nézegettem, sőt belepiszkáltam. Pozitív hőmérsékleteknél az előjel kiírást megszüntettem.
Átalakítást illetve új függvény LCD-re kiírást megcsinálom.
C18 fordítót használok, MPLAB-ban.
Miután nem volt sikerem a float típusú változók kiíratásával (ami most már világos számomra hogy nem is lehetett) hasonló megoldással próbálkoztam. Most az a gondom hogy: float szam=tmp32/10 unsigned egesz=szam unsigned tort= szam*10-egesz*10 esetében a tort értéke mindíg 0 (a tmp32 értéke pl:235) Kipróbáltam ha a szam=235, akkor működik a dolog. Szam=tmp32 esetében, a szam nem lesz egyenlő 23,5 -l Egyébként a printf utasításban az kis "L", lu és ld milyen opciók?
Szia!
A C szórakozik veled... A kifejezés kiértékelésekor számba veszi a paraméterek és az eredmény típusát. A 10 egy int érték, a tort unsigned int. Ebből kitalálja, hogy a szorzás egész szorzás, így ne csodálkozz, hogy az eredmény mindig 0.
Minek a float osztás és szorzás?
avagy
Nyilvan azert nem, mert a tmp32 valtozod (gondolom) long int vagy long unsigned tipusu, s ezert a 10-el torteno osztas is egesz tipuson hajtodik vegre -- ily modon elveszited az osztas maradekat es csak az egesz reszet fogja a float tipusu valtozodba tolteni. Ezt kikerulni ugy lehet, hogy a tmp32 szamot elobb at kell alakitani floatta az un. castingolassal:
Azonban ha mar egyszer a tmp32 egesz tipus volt, akkor nem ertem miert alakitod at float-ta egyaltalan?
Idézet: „Egyébként a printf utasításban az kis "L", lu és ld milyen opciók?” "%l" azaz "long"... Amugy itt vannak a formatum stringek, de a C18 doksijaban vannak konkretan benne, hogy a Microchip miket implementalt: Konverziós előírások (printf - formátumsztring)
Szia!
Most készültem el vele: 6 digites 7 szegmenses óra DCF77 szinkronozással PIC10F322-re sot23-6 tokban. Dátum évszázaddal és a hét napjával is kijelezhető... (424 assembly sor - ha a szimulátor kezelné a 10F322 megszakítását, akkor még kettővel kevesebb)
Hu ezt jo lenne latni! Nyilvanos a terv es a forras kod?
Nincs benne semmi különös:
6db 74HC595 már a dekódolt szegmens vezérlést lépteti ki Roman Black féle My Shift1 Protocol porotokol kicsit módosított változatával. A kijelzés egy analóg lábra adott feszültségtől függ: idő, dátum, évszázad és a hét napja vagy a mostani és az előző órában történt sikeres szinkronok száma. Kivezetések: táp, föld, DCF77 bemenet, 1 vezetékes soros kimenet, analóg kijelzés változtatás. Összesen 5 láb. Még maradt egy felhasználatlan - óránként csipoghatna is...
Pazarlás a 6db soros-párhuzamos átalakító; lehetne multiplexálni is!
Egyébként meg a 6+1db IC helyett nem lenne egyszerűbb és helytakarékosabb 1db többlábú mikrovezérlő? Multiplex vezérléshez 14 lábú jószág elég is.
(Persze tudom hogy ezt a kapcsolást a pici mikrovezérlők használhatóságának demonstrálására készítetted.)
Szia!
Helytakarékosság? Erre nem is gondoltam.... :rinya: Egy valamire való hétszegmenses kijelző sokkal nagyobb, mint a SO16 tok. Egy 74HC595 jól elfér a hozzá tartozó digit alatt. Az ICSP csatlakozó a DCF77 és a feszültség bemenet csatlakozása is. Még a tápcsatlakozás is megoldható vele. A digitek között csak találok egy sot23 -nyi helyet... A soros felület megengedi, hogy a kijelzést ki lehessen terjeszteni szinte tetszőleges számú digitre. A lényeg inkább az, hogy az összes funkció belefér a 1/2 kszóba...
Ne feledd el, hogy a közös kivezetés áramát már nem bírja el egy kontroller kimenet, ide kell valami meghajtó. A 74HC595 közvetlenül hajthatja a digitet 45 Ft/digit költséggel (a 8 db SMD ellenállást nem számítottam).
Köszönöm a segítséget a 10.0- val történő művelet eredményében már meg van a tört rész.
Ez igaz. A 6db tranzisztorról megfeledkeztem.
Köszi a castingolással:
float szam = (float)tmp32/10 hasonlóaní 10.0-val való művelettel működik a dolog. Ki lehet írni a tört részt. Pontosan ezért kell nekem az egész típust átalakítanom hogy ki tudjam íratni. A linket külön köszönöm, hiszen itt szinte minden megtalálható. Idézet: „Pontosan ezért kell nekem az egész típust átalakítanom hogy ki tudjam íratni.” Ertem, de ahogy Hp41C is leirta ill jomagam is, ehhez nem kell elobb atalakitanod float-ta, es utana vissza int tipussa -- mar csak azert sem, mert a C18 nem tudja a float-os format stringeket kezelni, ezert igy is ugy is integer lesz a vegeredmeny...
Valaki nem tudná megmondani miért nem működik nekem a WDT az Mplabban?
Mindenkinek köszönöm a segítséget, csak eddig dolgoztam, azért nem tudtam válaszolni.
Az űrsikló program lezárult, ezért maradok a földön. A programozáshoz van egy modulrendszerű demopanelem, és egy hálózati panelem. Képek mellékelve. Ezeken szeretnék tanulni. A hálózati panelt értelem szerűen hálózaton keresztüli vezérlés fejlesztésére használnám. Valamint van egy tervem, a meglévő - mellékelt képen látható kamerámat mozgásérzékelők felhasználásával vezérelném, úgy, hogy ahol mozgást érzékel a kamera, automatikusan az oda beprogramozott helyre fordul. A kamera egyébként 485-ös kábelen keresztül kapja a vezérlő jeleket.
Az elsőt ismertem, A második linket köszönöm.
Köszi amit küldtél, ezt valahogy nem találtam meg, most küzdök vele, - ha nagyon elakadok, akkor kérdezek.
A 10 egy egész konstans, a 10.0 egy float konstans a fordító szemével nézve.
Arra felhívnám a figyelmet, hogy az 1/10 egy végtelen, szakaszos kettedes tört, vele számolva előbb utóbb pontatlan lesz az eredmény a véges számábrázolás miatt. Ha sokjegyű számokkal kell műveletet végezni és fontos a pontosság, akkor célszerűbb hosszú egész számokkal számolni és külön nyilvántartani a tizedespont helyét. A tizedespontot a szöveggé alakítás és a kijelzőre való küldés között is a helyére lehet tenni.
Nekem nem tudna senki sem segíteni? Lehet primitív a kérdésem de akkor már az is jobb a törölve lesz mint, hogy levegőnek néznek. (Az előző oldalon egyszer már feltettem a kérdést beállítottam a konfigbe a wdt on-t beírom az inicializálásba a wdt beállításait de nem működik nem tettem direkt bele crlwdt-t, de nincs reset.)
|
Bejelentkezés
Hirdetés |