Fórum témák
» Több friss téma |
Fórum » PIC - Miértek, hogyanok haladóknak
Üdv!
Valaki tud mondani ICD2-höz C-nyelvben való programozáshoz programot, program eggyüttest? Köszönöm!
MPLAB
Az a baj, hogy már a kérdés sántít...
ICD2-höz MPLAB kell, ez fix. A legtöbb C fordító pedig beépül az MPLAB alá. De hadd ne soroljam már fel, hogy milyen fordítók léteznek, inkább keresgess itt a fórumon egy kicsit, mert már néhányszor volt szó róla.
Munkatársamat értettem félre...
1000 bocsi, épp a te általad tervezett ICD2-höz kerestem vmi C fordítót, de nem saját részre, hanem lusta munkatársamnak, emiatt akartam inkább kérdezni, mint végigolvasni 802 oldalt Mint kiderült ASM-ben tud az illető programozni, de C-ben szeretne. Viszont C-ben még én sem találtam mintaprogramot itt a HE-n sem. Arról szeretnék infót, hogy hogyan is kell kezdeni egy C-programot, avagy miben tér el az ASM-től. Hol található C-s példaprogram, amiből rájön az ember, hogy hogyan címez, milyen parancsok vannak. Bocsi a gabalyos kérdésekért!
Ebben a topikban a legfrissebb hozzászólások között találsz nagyon hasznos linkeket.
a www.pdfchm.com vagy a http://www.mikroe.com/en/books/ címen találsz kitűnő könyveket is (némelyik online olvasható!).
Köszönöm! Hogy nem szúrta ki a szememet
Pontosan ez kell nekem, azaz munkatársamnak! Vendégeim vagytok egy sörre!
Ez a topic elkerülte eddig a figyelmem! Köszi!
Idézet: Arra utaltam, hogy az előző példában valójában nem a PORTA változóhoz férsz hozzá bitenként, hanem a PORTAbits struktúrához. Az más kérdés, hogy történetesen fizikailag ugyanoda vannak leképezve....„Ezt nem pontosan értem” Ez olyan, mint a FORTAN-ban az EQUIVALENCE.
Úgy érted először az előfordítóhoz szólok, utána lesz lefordítva a gépi kóddá? Azt hiszem sejtem mire gondolsz, de nem látom igazán a jelentőségét. Hol van itt a buktató, ha van?
A végeredmény az, hogy egy gépi kód keletkezik, aminek a kódja a BSF, BCF ASM kóddnak felel meg. Vagy tévedek, van valami amire oda kell figyelni ennek kapcsán? A másik kérdésem, hogy egy tömböt hogy lehetne bitekre tipizálni? (lehet, hogy át kéne ugranunk a C-s topicba? ) Idézet: „Hol van itt a buktató, ha van?” Nincs buktató, csak a szóhasználat pontosítása miatt tartottam szükségesnek a tisztázást. Kényelmetlenség meg csak annyi van benne, hogy két nevet kell használni (PORTA és PORTAbits). Idézet: „A másik kérdésem, hogy egy tömböt hogy lehetne bitekre tipizálni?” Nem tudom, hogy lehet-e (most nem is tudom kipróbálni), mindenestre típusdefinícióval kezdeném, benne a korábbihoz hasonló, "bitre bontott" struktúrával. Ezután ilyen struktúrákból próbálnék meg egy tömböt létrehozni.
Köszönöm a válaszaidat, sokat segítettél! Ezt a típus tömbösítését kipróbálom.
Idézet: „if( (PORTA && 0x2) == (PORTB && 0x80) ) {}” Bocs! Nem sok itt a '&' jel? Szerintem csak: if( (PORTA & 0x02) == (PORTB & 0x80) ) {} Idézet: „Csak típuseklaráció után lehet közvetlenül hozzáférni egy char változó egy bitjéhez a kódban?” Nem kell tipus deklaracio, elegendo ha bitfield-kent letrehozod a valtozot - azaz struktura, ahol a kettosponttal megmondod hany bites a struktura elem... Idézet: „És egy tömb elemeit hogyan lehetne bitenkénti hozzáférésre tipizálni?” Irj egy fuggvenyt vagy makrot ra. Ha pl van egy 256 bites bit-sorozatod es bitenkent akarsz hozzaferni, hogy mondjuk az 56. bit kellene, akkor pl van egy 256/8 elemu unsigned char tipusu tombod, jobban mondva egy bitlield-ekbol allo tombod, es akkor 8-cal elosztod a cimzest, megkapod a tomb elemenek indexet, es a maradek (azaz a bitindex%8) meg megadja a bit indexet amit mar magadnak kell megoldanod hogy veszed ki ( & muvelettel vagy switch case-zel ami a bitfield cimzeseket megoldja neked:
De szerintem egyszerubb, hogy:
Idézet: „Például ha a processzor header fájljában ez van megadva:
Csak azt ne felejtsd majd el, hogy itt a headerekben nem szamit mekkora helyet foglalnak ezek, mert ugyis csak a bitfield-hez fersz hozza es a teruletet nem kell a C-nek kulon lefoglalnia (az a LIB-ben mar le van foglalva neki tortenetesen a PORTA helyere deklaralva). De ha ezt beteszed egy sajat tombbe, akkor ez igy neked 'int' -nyi meretet foglal le tomb elemenkent hiaba akarsz csak 8 bitet kihasznalni. Ezert inkabb 'unsigned char' -t hasznalj.
Az attól függ, mi a feladat De a jelenlegire szerintem egyik verzió sem jó. icserny verziója igaz értéket ad vissza, ha legalább egy-egy bit a PORTA és PORTB-ben is egyes. A tiéd pedig csak akkor ad vissza igaz értéket, ha a PORTA,2 és a PORTB,8 is nulla. Minden más esetben a visszaadott érték nulla.
Ez volt az eredeti kérdés: Idézet: „Két char változó, amiből az egyik egy tömb kiválasztott eleme, egy-egy bitjét kéne összehasonlítanom és most túl kacifántosra sikeredett a kód szerintem. Ti hogy közelítenétek ehhez?” Nem teljesen világos, de ha az lenne a feladat, hogy bemenjen az if-be, ha a két bit azonos, akkor talán szét kellene szedni több összehasonlításra, mielőtt rettenetesen elbonyolítjuk:
Idézet: „Igen, erre gondoltam én is, de ezt tömbbel is meg lehet csinálni? pl. TOMBbits(20).b1 ...” Nem, ugyanugy, ahogy ASM-ben sem tudod valtozokent (ertsd file register vagy WREG-kent) megadni a bit indexet... Tehat ez: BCF PORTA,WREG nem mukodik... De amugy sem a C nyelv resze ez ill nincs bit tipus - bar ha jol emlekszem van olyan mikros C implementacio amiben letezik bit tipus es azzal talan meg lehet ezt csinalni, de az nem szabvanyos ha az szamit egyaltalan valamit is.
Kár, hogy nincs logikai kizáró-vagy művelet C-ben. Ha lenne, akkor egyszerűbb lenne a helyzet, mert írhatnánk így:
De szerintem ezt sem fordítaná jobb kódra, mint amit az előbb betettem (mondjuk azt sem néztem meg, de eddigi tapasztalataim alapján úgy érzem, hogy elég jó kódot csinál belőle).
Ez egy elég trükkös feltétel. A (PORTA & 0x02) 0 vagy 0x02 értéket vehet fel, a (PORTB & 0x80) pedig 0 vagy 0x80 értéket. A kettő akkor és csak akkor lesz egyenlő, ha mindkét kifejezés értéke nulla, azaz mindkét vizsgált portbit értéke nulla. Ha a portbitek 1 értékét tekintjük logikai igaznak, akkor ez az egész kifejezés a két portbit NOR kapcsolatát adja. Szerintem watt nem ezt akarta elérni az egyenlőséggel
Szerintem ez egy kifejezetten frappáns megoldás, egy jó fordító ebből nagyjából egy molvw-t, két btfsc-t és két xorlw-t fordít.
Hej! Ez valóban így igaz, én viszont csak a '&&' és az utánnuk írt 0x2 és 0x80 értékeken akadtam meg, amik így mindig igaz értéket jelentenek...
Idézet: „Nem sok itt a '&' jel?” De igen, pont a duplája a szükségesnek, hiszen "bitwise AND" akart lenni! Köszönöm az észrevételt!
A többit az előttem szólók kifejteték...
Mindenkinek köszönöm a törődést!
Én így oldottam meg, de még este ha hazaérek kipróbálom a tipizálást amit icserny ajánlott, és akkor az elágazást megelőző két műveletet ki lehet hagyni. (jó lenne ha gyors lenne a kód)
Egyébként kipróbáltam és az egy &-es verzió működni látszik!
Amit Te ajánlottál, azt meg még nem értem! Majd este, ha lesz időm megemésztem! Mégegyszer köszönöm mindenkinek! Üdv! watt Ahogy korábban írták már, az == csak akkor működik, ha azonos helyiértékű biteket hasonlítasz össze. Erre vigyázz majd! Potyo javaslata logikai műveletet (XOR) használ, ezért ott a helyiérték nem számít (csak azt nézi, hogy a mennyiségek értéke nulla-e vagy sem). Miver az XOR művelet akkor ad logikai igaz értéket, ha a két operandusa különbözik, ezért ha az egyezés az érdekes, akkormég kell egy negálás is. Ezért rakta be a felkiáltójelet a logikai kifejezés negálására).
Hazafelé a buszon még ez a változat jutott eszembe:
Itthon aztán megnéztem, hosszabra (közel duplájára) fordul, mint potyo megoldása... Idézet: „Itthon aztán megnéztem, hosszabra (közel duplájára) fordul, mint potyo megoldása...” Ez a baj az ilyenekkel, hogy egy jó kis tömör C kifejezést gyakran hosszabbra fordít a fordító, mintha a kifejezést több részre bontottuk volna.
Sziasztok.
Egy kis segítséget szeretnék kérni. Egy 3 szinű rgb ledet szeretnék meghajtani: r , r+g , g , g+b , b , b+r . Ezt a picet választottam, nem tudom hogy megfelel e a feladatnak. Hogy kezdjek a programhoz? Segítsetek kérlek.
Na ideértem. Haladgatok, eddig ez egész jónak tűnik!
Egyelőre csak egy változót oldottam meg unionnal, hogy bitenként és egyben is lehessen kezelni.
Egész jól fordul, mintha én írnám ASM-ben... Most a tömböt kéne megerőszakolni valahogy! Idézet: „Ez a baj az ilyenekkel, hogy egy jó kis tömör C kifejezést gyakran hosszabbra fordít a fordító, mintha a kifejezést több részre bontottuk volna.” Dobbenet:
(Ez C18 student edition de optimalizalas bekapcsolva...) Magyaran nem erdemes a bitfield-eket hasznalni? |
Bejelentkezés
Hirdetés |