Fórum témák

» Több friss téma
Fórum » PIC - Miértek, hogyanok haladóknak
Lapozás: OK   401 / 1319
(#) Sir-Nyeteg hozzászólása Jan 27, 2009 /
 
Üdv!
Valaki tud mondani ICD2-höz C-nyelvben való programozáshoz programot, program eggyüttest?
Köszönöm!
(#) watt válasza Sir-Nyeteg hozzászólására (») Jan 27, 2009 /
 
MPLAB
(#) potyo válasza Sir-Nyeteg hozzászólására (») Jan 27, 2009 /
 
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.
(#) Sir-Nyeteg válasza potyo hozzászólására (») Jan 27, 2009 /
 
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!
(#) icserny válasza Sir-Nyeteg hozzászólására (») Jan 27, 2009 /
 
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ó!).
(#) Sir-Nyeteg válasza icserny hozzászólására (») Jan 27, 2009 /
 
Köszönöm! Hogy nem szúrta ki a szememet
Pontosan ez kell nekem, azaz munkatársamnak!
Vendégeim vagytok egy sörre!
(#) watt válasza icserny hozzászólására (») Jan 27, 2009 /
 
Ez a topic elkerülte eddig a figyelmem! Köszi!
(#) icserny válasza watt hozzászólására (») Jan 27, 2009 /
 
Idézet:
„Ezt nem pontosan értem”
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....

Ez olyan, mint a FORTAN-ban az EQUIVALENCE.
(#) watt válasza icserny hozzászólására (») Jan 27, 2009 /
 
Ú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? )
(#) icserny válasza watt hozzászólására (») Jan 27, 2009 /
 
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.
(#) watt válasza icserny hozzászólására (») Jan 27, 2009 /
 
Köszönöm a válaszaidat, sokat segítettél! Ezt a típus tömbösítését kipróbálom.
(#) MPi-c válasza icserny hozzászólására (») Jan 27, 2009 /
 
Idézet:
„if( (PORTA && 0x2) == (PORTB && 0x80) ) {}”

Bocs! Nem sok itt a '&' jel?
Szerintem csak: if( (PORTA & 0x02) == (PORTB & 0x80) ) {}
(#) trudnai válasza watt hozzászólására (») Jan 27, 2009 /
 
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:

  1. switch (maradek) {
  2. case 0:
  3.    bit = tomb[index].bitfield0;
  4.    break;
  5. case 1:
  6.    bit = tomb[index].bitfield1;
  7.    break;
  8. case 2:
  9.    bit = tomb[index].bitfield2;
  10.    break;
  11. ...
  12. case 7:
  13.    bit = tomb[index].bitfield7;
  14.    break;
  15. }


De szerintem egyszerubb, hogy:
  1. index = bitindex / 8; // ezt majd a C kioptimalizalja neked shiftelesre
  2. maradek = bitindex % 8; // szinten forditora bizzuk hogy csinalja meg
  3. bit = tomb[index] & (1<<maradek);
(#) trudnai válasza watt hozzászólására (») Jan 27, 2009 /
 
Idézet:
„Például ha a processzor header fájljában ez van megadva:

  1. extern volatile near unsigned char       PORTA;
  2.       extern volatile near union {
  3.         struct {
  4.           unsigned RA0:1;
  5.           unsigned RA1:1;
  6.    ...


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.
(#) potyo válasza MPi-c hozzászólására (») Jan 27, 2009 /
 
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:
  1. unsigned char f=1;
  2. if (PORTA & 0x02) f^=1;
  3. if (PORTB & 0x80) f^=1;
  4. if (f) {}
(#) trudnai válasza watt hozzászólására (») Jan 27, 2009 /
 
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.
(#) MPi-c válasza potyo hozzászólására (») Jan 27, 2009 /
 
Pl. időhúzás?
(#) potyo válasza potyo hozzászólására (») Jan 27, 2009 /
 
Kár, hogy nincs logikai kizáró-vagy művelet C-ben. Ha lenne, akkor egyszerűbb lenne a helyzet, mert írhatnánk így:
  1. if (!((PORTA & 0x02) ^^ (PORTB & 0x80))) {}

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).
(#) szilva válasza MPi-c hozzászólására (») Jan 27, 2009 /
 
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
(#) szilva válasza potyo hozzászólására (») Jan 27, 2009 /
 
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.
(#) MPi-c válasza szilva hozzászólására (») Jan 27, 2009 /
 
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...
(#) icserny válasza MPi-c hozzászólására (») Jan 27, 2009 /
 
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!
(#) MPi-c válasza icserny hozzászólására (») Jan 27, 2009 /
 
A többit az előttem szólók kifejteték...
(#) watt válasza potyo hozzászólására (») Jan 27, 2009 /
 
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)

  1. mFlags.DQ5 = STATUS_C >> 5;
  2.                 mFlags.DQ7 = RS_232_Buff[c]>>5;
  3.                 if (mFlags.DQ7 == mFlags.DQ5)
  4.                 {
  5.                         ; // Ha egyforma a két bit
  6.                 }
  7.                         ; // Ha nem egyformák


Egyébként kipróbáltam és az egy &-es verzió működni látszik!
  1. if( (PORTA & 0x02) == (PORTB & 0x80) ) {}


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
(#) icserny válasza watt hozzászólására (») Jan 27, 2009 /
 

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).
(#) MPi-c válasza icserny hozzászólására (») Jan 27, 2009 /
 
Hazafelé a buszon még ez a változat jutott eszembe:
  1. if( !(PORTA & 0x02) == !(PORTB & 0x80) ) {}

Itthon aztán megnéztem, hosszabra (közel duplájára) fordul, mint potyo megoldása...
(#) potyo válasza MPi-c hozzászólására (») Jan 27, 2009 /
 
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.
(#) frecsko hozzászólása Jan 27, 2009 /
 
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.
(#) watt válasza icserny hozzászólására (») Jan 27, 2009 /
 
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.

  1. union{
  2.                 unsigned char x;       
  3.                 volatile near struct{
  4.         volatile near unsigned DQ0:1;  
  5.         volatile near unsigned DQ1:1;
  6.         volatile near unsigned DQ2:1;
  7.         volatile near unsigned DQ3:1;  
  8.         volatile near unsigned DQ4:1;  
  9.         volatile near unsigned DQ5:1;                          
  10.         volatile near unsigned DQ6:1;
  11.         volatile near unsigned DQ7:1;
  12.         };
  13.         }STATUS_Cbits;
  14.         #define STATUS_C STATUS_Cbits.x
  15.  
  16. //_______________________________________________
  17.  
  18. 164:                            STATUS_C = 0B11100000;
  19.   0038    0101     MOVLB 0x1
  20.   003A    0EE0     MOVLW 0xe0
  21.   003C    6F0D     MOVWF 0xd, BANKED
  22.  
  23. 169:                            if(STATUS_Cbits.DQ5){}
  24.   0060    AB0D     BTFSS 0xd, 0x5, BANKED
  25.   0062    D000     BRA 0x64
  26.  
  27. 168:                            STATUS_Cbits.DQ5 = 1;
  28.   0060    8B0D     BSF 0xd, 0x5, BANKED

Egész jól fordul, mintha én írnám ASM-ben...

Most a tömböt kéne megerőszakolni valahogy!
(#) trudnai válasza potyo hozzászólására (») Jan 27, 2009 /
 
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:
  1. CLRF      0x7,0x0               f = 0;
  2. BTFSS     0x80,0x1,0x0          if (PORTA & 0x02) f  = 1;
  3. BRA       0x5c
  4. MOVLW     0x1
  5. MOVWF     0x7,0x0
  6. BTFSC     0x81,0x7,0x0          if (PORTB & 0x80) f ^= 1;
  7. BTG       0x7,0x0,0x0
  8.  
  9. MOVF      0x7,0x0,0x0           if (f)
  10. BZ        0x6a
  11.                                 {
  12. MOVLW     0x2                           r = 2;
  13. MOVWF     0x8,0x0                                                                                        
  14.                                 }
  15. BRA       0x6c                  else
  16.                                 {
  17. CLRF      0x8,0x0                       r = 0;
  18.                                 }
  19.  
  20. MOVLW     0x80                  switch( (PORTA & 0x02) & (PORTB & 0x80) )
  21. ANDWF     0x81,0x0,0x0
  22. MOVWF     0xe,0x0
  23. MOVLW     0x2
  24. ANDWF     0x80,0x0,0x0
  25. ANDWF     0xe,0x0,0x0
  26. BZ        0x7e
  27. XORLW     0x82
  28. BNZ       0x84
  29.                                 {
  30.                                         case 0:
  31.                                         case 0x82:
  32. MOVLW     0x2                                   r = 2;
  33. MOVWF     0x8,0x0
  34. BRA       0x86                                  break;
  35.                                         default:
  36. CLRF      0x8,0x0                               r = 0;
  37.                                                 break;
  38.                                 }
  39.  
  40. MOVF      0x81,0x0,0x0          if( PORTBbits.RB7 == PORTAbits.RA2 )
  41. ANDLW     0x80
  42. BZ        0x8e
  43. MOVLW     0x1
  44. MOVWF     0xe,0x0
  45. MOVF      0x80,0x0,0x0
  46. ANDLW     0x4
  47. BZ        0x98
  48. MOVLW     0x1
  49. SUBWF     0xe,0x0,0x0
  50. BNZ       0xa2
  51.                                 {
  52. MOVLW     0x2                           r = 2;
  53. MOVWF     0x8,0x0                                                                                        
  54.                                 }
  55. BRA       0xa4                  else
  56.                                 {
  57. CLRF      0x8,0x0                       r = 0;
  58.                                 }

(Ez C18 student edition de optimalizalas bekapcsolva...)

Magyaran nem erdemes a bitfield-eket hasznalni?
Következő: »»   401 / 1319
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem