Fórum témák
» Több friss téma |
Fórum » CCS PIC Compiler
Értem, akkor ez a baj. Ezen a PICen az nincs. Köszönöm.
C forráskódban megadott double-t mivel kellene helyettesíteni ccs-ben?
Az attól függ, hogy milyen fordítóhoz készült forrásról van szó. Mikrovezérlőknél a double többnyire csak float-ként van kezelve. Ha 64 bites pontosság kell, akkor float64-gyel kell próbálkozni. (legalábbis Google barátod ezt súgta nekem)
A long az egész típus, a float/double meg lebegőpontos. Persze ettől még simán lehet neki jó a long is, épp valamelyik nap láttam egy figurát, hogy erővel float-ot akart használni, miközben a feladatról húsz méterről ordított, hogy csak mindent megszorzunk százzal, és sokkal jobb megoldás valamilyen egész típus használata...
Erről lenne szó: http://www.sci.fi/~benefon/rscalc.c
(Bocs, telefonról nem megy a link beszúrás ) Nekem csak a napkelte és napnyugta kiszámítása kell majd belőle. A hozzászólás módosítva: Feb 12, 2014
Ettől nem lettem okosabb. Azt kell eldöntened, hogy elég-e a 6-7 értékes jegyet tároló számábrázolás, vagy ennél több kell. Ha másképp nem megy, akkor futtasd PC-n double és float változatban is a programot, s hasonlítsd össze a végeredményeket!
Hali!
Valaki csinált már esetleg CCS és labview segítségével PIC-PC között ethernet kommunikációt?
Helló! Ti hogyan oldanátok meg ha egy 8 bites értékkel kellene vezérelni egy 10 bitest van erre valami elmés megoldás a c-ben vagy egyszerűen szorozzam fel 4-el?
Válaszotokat előre is köszönöm.
Más megoldás nincs. Esetleg ki lehet olyannal egészíteni, hogy az alsó két bitet a felső két bittel azonosra teszed, akkor ha 0 van a "bemeneten", akkor 0 lesz a kimenet is, ha 100% a bemenet, akkor 100% lesz a kimenet is. Ez pl. PWM-nél nem rossz dolog. Tehát icserny példájánál maradva:
uint16-ra castolás akkor kellhet, ha a data8bit változód csak 8 bites. Most hogy ccs-ben pontosan hogy van az uint16, azt nem tudom, ezt már neked kell kitalálnod.
Nem kell ide szorzás, 16 bites léptetés, stb:
A hozzászólás módosítva: Feb 16, 2014
No ezt jól elírtam:
data10bit.bytes.HB = (data10bit.bytes.LB = data8bit) & 0x03; helyett data10bit.bytes.LB = (data10bit.bytes.HB = data8bit) & 0x03; data10bit.bytes.LB <<=4; CCPR1L = data10bit.bytes.HB; CCP1CON ^= (data10bit.bytes.LB ^ CCP1CON) & 0x30;
Köszönöm szépen megnézem őket "megértem" és jövök, ha kérdésem van.
"Whalaky" nevű fórumtársunk csinált ilyet.
Keresd meg, szerintem fog segíteni neked.
Hp41C fórumtársunk hozzászólásait nyugodtan ignorálhatod, mert láthatóan rossz topicba van bejelentkezve.
Amit a potyó írt, hogy eltolod balra két bittel az értéket és a legfelső két bitet bemásolod a legalsó két bitbe, az tetszik.
Ugyan azt írtam, mint potyó, csak két ciklust hagytam ki belőle - lehet ebben a C -ben más a szintaxis...
Akkor lépésenként: (data10bit.bytes.HB = data8bit); felső byte-ba a 8 bites érték megy - ez kerül majd a CCPR1L -be. (bankváltásokat nem tekintve csak 2 utasítás). data10bit.bytes.LB = (data8bit) & 0x03; csak az alsó két bit marad meg - (csak 2 utasítás) data10bit.bytes.LB <<=4; (csak egy swapf cím,f lenne, de a fordító mindig letörli az eredmény alsó 4 bitjét, igy 2 utasítás) CCP1CON ^= (data10bit.bytes.LB ^ CCP1CON) & 0x30; a CCP1CON regiszter 5. és 4. bitjét a kívánt értékre állítja (bankváltásokat nem tekintve csak 4 utasítás). Ez 12 utasítás a CCPR1 resiztereibe töltéssel együtt. Az ((uint16)data8bit<<2) rész csak 6 utasítás, a (data8bit>>6) egy 6-szor lefutó ciklus, ami minimum 6 utasítás. Azaz bankváltásokat nem tekintve minimum 12 utasításba kerül, de még nincs betöltve a CCPR1 regisztereibe. Nyugodtan el lehet felejteni... Idézet: „uint16-ra castolás akkor kellhet, ha a data8bit változód csak 8 bites. Most hogy ccs-ben pontosan hogy van az uint16, azt nem tudom, ezt már neked kell kitalálnod.” Ki tudnátok nekem fejteni ezt az uint16-os dolgot, mert a ccsc helpben nem találok róla semmit sem.
Kicsit megkever a ccp1Con meg a ccpr1 hogy jönnek ezek be?
Az lenne nekem a lényeg hogy adott egy érték ami 8bite legyen a neve data8bit és ebből kellene varázsolni egy 10bites értéket aminek legyen a neve data10bit. Persze úgy szeretném hogy legyen 0 és 100% is mivel én is pwm-et szeretnék vezérelni vele.
A lényeg, hogy ha a data8bit változód csak 8 bites, akkor a data8bit<<2 művelettel elveszted a két felső bitet, mert a C alapból olyan, hogy az eredményt is ugyanakkora bítszélességen képzi, mint amilyen széles a legszélesebb operandus. Ezért kell a data8bit változót 16 bitesre castolni, akkor nem veszik el a két felső bit. A castolás történik az (uint16)data8bit kifejezéssel, a kérdés csak az, hogy CCS-ben hogy hívják a 16 bites előjel nélküli (unsigned) típust, ezt kell megnézned.
long!
long Data10Bit; Data10Bit=(long)Data8Bit<<2; A hozzászólás módosítva: Feb 17, 2014
Idézet: „Kicsit megkever a ccp1Con meg a ccpr1 hogy jönnek ezek be? .... mivel én is pwm-et szeretnék vezérelni vele.” Talán mert a CCP1CON és CCPR1 regiszterek értékeivel értékeivel lehet a PWM-et modulálni, fölösleges egy változót közbeiktatni, ha közvetlenül is lehet értéket adni nekik. Bővebben: Link Idézet: „Data10Bit=(long)Data8Bit<<2;” Ennek egy aprócska baja van: nem tudja előállítani a 100% -ot, mivel a két alsó bit mindig 00. Úgy küszöbölhető ki, hogy a 8 bites értékből "pótoljuk" a hiányzó két bitet. Potyo a legfelső két bittel pótolta, én a két legalsóval, de bármelyik kettővel lehet... Az a lényeg, ha a 8 bites érték 0x00, akkor a 10 bites két legaló bitje is legyen 00, ha a 8 bites érték 0xFF, akkor a 10 bites két legaló bitje legyen 11.
Sziasztok!
Összeraktam próbapanelen Topi leírása és programja alapján a 433MHz-es analóg adó-vevő párost. Valamennyire működik is, de nem jól. Adó oldalon sorban küldök négy karaktert (a, b, c majd d) A vevőn viszont a következő számok jelennek meg: 105 106 105 102 Minden ciklusban ez van, szóval nem egyszerű zavarról van szó. Mi lehet a hiba? A Topi féle m_manchester.c-t változatlanul hagytam, az adó és vevő programot írtam át minimálisan, illetve Nokia 5110 lcd-t használok, de gondolom ez nem lehet baj Baudot is próbáltam már más értékeken, de mindenhol ez az eredmény.
Köszönöm szépen mindenkinek a segítséget, és visszafelé hogyan működik a dolog, ha pl 12bites adatot szeretnék 8 bitesre?
Hello, Pic-el 4 dali eszközt akarok vezérelni ehhez írom a kommunikációt 4 I/O lábon szeretném küldeni ki az adatokat. Kérdésem az volna hogy szeretnék egy uiverzális függvényt írni aminek a bemenő paramétere lenne meghívásnál egy I/O láb. tehát mikor küldöm az adatokat elég legyen csak a port-ot és azt hogy magas vagy alacsony legyen. Ezt CCSC-ben hogyan lehet megvalósítani?
Ezt sikerült alkotni, de nem vagyok biztos benne, hogy ez a szép okos elmés megoldás. |
Bejelentkezés
Hirdetés |