Hirdetés

Új hozzászólás Aktív témák

  • don_peter
    senior tag

    [ disclaimer: elso komoly programozasi dolgaim C64-en, assemblerben voltak, aztan utana modernebb mikrokontrollerekhez is volt szerencsem, szoval ismerem ezt a vilagot :) ]

    "#define FIRST_ROW_BIT_POSITION 4"
    Így gyakorlatilag csak egy értéket adunk FIRST_ROW_BIT_POSITION nak és nem tudjuk később léptetni a mikrocsip lábait.

    De. Azert adunk hozza i-t. Vegyuk eszre, hogy a

    SOROK = (1 >> ( FIRST_ROW_BIT_POSITION + i ) );

    ugyanaz, mint a

    SOROK = ( ( 1 >> FIRST_ROW_BIT_POSITION ) >> i ) );

    ami meg jelen esetben nem mas, mint

    SOROK = ( 0x08 >> i ) );

    (Mondjuk elrontottam, mert FIRST_ROW_BIT_POSITION helyes erteke 3, nem 4)

    "int oszlopok[] = { PORT_B4, PORT_B5, PORT_B6, PORT_B7 };"
    Ezt ugyan nem próbáltam még ilyen formában, de van egy sejtésem, hogy nem jó mivel értéknét adjuk át a az egyes portok egyes lábait.

    Nem volt teljesen egyertelmu, hogy ezek micsodak, de ha memory mapped portok, akkor annyi valtozik, hogy nem int, hanem char * lesz az oszlopok[] tipusa.

    "#define NO_KEY 0"
    Gyakorlatilag ugyan az mint az én
    "#define ALACSONY 0" definícióm.

    Legfeljebb a fordito szempontjabol, de a kodot hasznalo programozok szempontjabol egyaltalan nem.
    Ugyanis ott az ALACSONY jol lathatoan a MAGAS parja, amit arra hasznalsz, hogy megvizsgald, hogy valamelyik bit hogyan all.
    Viszont a getchar() egyaltalan nem egy bit allasat adja vissza, hanem egy karakterkodot, ami logikailag abszolut mas dolog.

    "A ciklus végtelen pergésben van"

    Nincs abban. Az eredeti kododban egyetlen ciklus van, ami pontosan negyszer fut le.
    Ha arra gondoltal, hogy a getchar()-t kivulrol vegtelen ciklusban hivod, az meg nem szamit, mert azzal kezdodik, hogy lenullazod a k-t, vagyis nem tud 16 fole noni az erteke (es teljesen feleslegesen nullazod, mert auto valtozokent a stacken van az erteke, a kovetkezo hivasig nem orzodik meg - persze csinalhatnal belole staticet, de annak meg semmi ertelme nem lenne, mert nincs ra szukseged).

    "Egyszóval, ha sima C programnak tekintjük akkor tökéletes a példád, de sajnos itt figyelembe kell venni, hogy mikrokontrollert programozunk fel illetve a lábak szintjeit ellenőriztük."

    Ilyen szempontbol ez tok sima C program, tenyleg nincs benne semmi extra. Persze, embedded cuccoknal lehetnek extra kovetelmenyek (pl. hogy ROM-ot lehessen belole forditani, vagyis pl. a konstans tomboket nem lehetne koddal inicializalni, csak statikus ertekekkel), akkor az hozhatna par dolgot, de igazabol az is sima C. A mikrokontroller-programozas tenyleg nem az a nagy varazslat :)

    Az a baj, hogy alig másfél hónapja kezdtem el a C-ét és a C18-at vagy is a PIC programozást egyszerre így sajnos nem tudok még rendesen érthetően megfogalmazni a kérdéseimet.

    "SOROK = (1 >> ( FIRST_ROW_BIT_POSITION + i ) );"
    Gyakorlatilag, ha két >> jelet teszünk az azt jelenti, hogy a 2 hatványával léptetjük a változó értékét a megadott irányban? (Ha igen akkor már is tanultam ismét valamit, vagy is tanultam már csak nem értettem meg ezek szerint)

    "int oszlopok[] = { PORT_B4, PORT_B5, PORT_B6, PORT_B7 };"
    Hogy ez is tiszta legyen:
    "PORT_B4" egyenlő a következővel : PORTBbits.RB4
    Gyakorlatilag ez egy (port) regiszter mellyel a chip egy adott porton adott láb állapotát tudjuk lekérdezni, hogy az 1 vagy 0.
    Ha 1 akkor annak állapota magas szintű, értelemszerűen a 0 = alacsony szinttel.
    A portok nekem egy header állományban külön definiálva vannak, pl. így:
    #define PORT_B4 PORTBbits.RB4

    "#define NO_KEY 0"
    Teljesen igazad van.
    Jobb rászokni az olvasható kód írásra...

    Ezt a részt nem igazán értem: "Viszont a getchar() egyaltalan nem egy bit allasat adja vissza, hanem egy karakterkodot, ami logikailag abszolút más dolog."
    Vagy itt elírás történt és valójában getchar() az get_key() akart lenni?
    Ha igen akkor ő nem a bit állással kell vissza jöjjön hanem a beolvasott karakterrel ami 1,2,3...16-ig.

    "A ciklus végtelen pergésben van"
    while(1){

    bill_ertek = get_key();

    Delay10TCYx(10);
    }//while()

    Ez egy végtelen ciklus nem?
    Ebben minden ciklusnál újratöltődik a bill_ertek változó még ha egyelőre nem is jól van megadva.

    "Ha arra gondoltál, hogy a getchar()-t kívülről végtelen ciklusban hívod, az meg nem számít, mert azzal kezdődik, hogy lenullázod a k-t"
    Feltételezem, hogy itt is get_key()-re gondolsz.
    Igen igazad van mert ha vége a ciklusnak akkor az újra meghívásnál nullázódik alapból is a k.
    Próbálkozom erősen, de kellenek a szakik tanácsai és gondos szemei ;)

Új hozzászólás Aktív témák