Fórum témák

» Több friss téma
Fórum » PIC programozása C nyelven, C-Compiler
Lapozás: OK   79 / 153
(#) _vl_ válasza watt hozzászólására (») Aug 26, 2013 /
 
Lehet segédváltozó nélkül is, csak akkor két helyen lesz RCREG olvasás:
  1. if (FERR) {
  2.   cgetchar = RCREG;  avagy (void)RCREG;
  3.   ... // frame error - karakter eldobása
  4. }
  5. else {
  6.   cgetchar = RCREG;
  7.   ... // jó karakter, eltároljuk valahová
  8. }

A frame error esetén az érkezett karakter azért lehet fontos, mert pl. ha frame error van, és az RCREG == 0, akkor egy BREAK jelet érzékeltünk, és azt is lehet mondjuk szinkronizálásra használni. Az azért lehet jó, mert nagyon nem zavarérzékeny (tehát én a '*' karakter helyett inkább a BREAK-et használnám erre).
A hozzászólás módosítva: Aug 26, 2013
(#) watt válasza _vl_ hozzászólására (») Aug 26, 2013 /
 
Így nem jó?
  1. cgetchar = RCREG;
  2. if (FERR) {
  3. FrameError_Flag=Be;
  4.  //Jelző beállítása, hogy a csomag sérült, mert kerethiba volt. De a továbbiakban fogadjuk a csomagot végig, majd kidobjuk az egészet és töröljük a jelzőt. Ha CRC is van, az is rossz lesz elvileg, egy feltételben lehet vizsgálni akár.
  5. }else{
  6.   ... // jó karakter, eltároljuk valahová
(#) _vl_ válasza watt hozzászólására (») Aug 26, 2013 /
 
Így nem jó. Az FERR addig valid, amíg ki nem olvastad az RCREG-et. Utána már a következő karakterre vonatkozik.
(#) watt válasza _vl_ hozzászólására (») Aug 26, 2013 /
 
Aha! Erre nem gondoltam, köszi!
(#) watt válasza _vl_ hozzászólására (») Aug 26, 2013 /
 
Azt értem, hogy a tömörség a szépsége a példakódodnak, de igazából ha OERR, vagy FERR hibánk van, akkor a csomagnak annyi. Van mikor nem elég a CREN törlése, mert nem kerül szinkronba a vétel. Ha ezt is le akarjuk kezelni, akkor eléggé bel kell rondítani a letisztult képbe.
(#) _vl_ válasza watt hozzászólására (») Aug 26, 2013 /
 
Igen, ezt írtam lentebb is, hogy hiba esetén a legközelebbi szinkronig mindent el kell dobni. Az végülis egy extra bit/flag, plusz egy if a jó byte-ok feldolgozása elé.
Egyébként a lenti kód inkább pszeudo-kód (azaz algoritmus, kódban megfogalmazva), mint közvetlenül felhasználható kód akart leni.
(#) watt válasza _vl_ hozzászólására (») Aug 26, 2013 /
 
Nekem a (void)RCREG; volt új, még nem láttam így használni. Ilyenkor hová kerül a tartalom? (meg kéne néznem, mire fordul, de most lusta vagyok... )
Azért megnéztem, fura, a C18 nem fordít semmit oda! ?
A hozzászólás módosítva: Aug 26, 2013
(#) _vl_ válasza watt hozzászólására (») Aug 26, 2013 /
 
Idézet:
„Ilyenkor hová kerül a tartalom?”

A levesbe. Mondjuk az XC8 simán ugyanezt teszi az "RCREG;" utasítás hatására is. A (void) arra szolgál, hogy ne pampogjon a fordító, hogy az utasítás nem csinál semmit. Ha pl. egy értékadást elgépelsz, és az x = 0; helyett x == 0; lesz a kódban, arra illik panaszkodnia, hiszen annak semmi értelme nincsen.
Idézet:
„Azért megnéztem, fura, a C18 nem fordít semmit oda! ?”

Kéne neki, bár őt sose használtam.
(#) Hp41C válasza watt hozzászólására (») Aug 26, 2013 /
 
C18:

WREG = RCREG;

  1. 91:                                                     RCSTAbits.CREN = 0;
  2.   739E    98AB     BCF 0xfab, 0x4, ACCESS
  3. 92:                                                     WREG = RCREG;                           // Clear error by reenabling receiver
  4.   73A0    50AE     MOVF 0xfae, W, ACCESS
  5.   73A2    6EE8     MOVWF 0xfe8, ACCESS
  6. 93:                                                     RCSTAbits.CREN = 1;
  7.   73A4    88AB     BSF 0xfab, 0x4, ACCESS

(void)RCEG;
  1. 91:                                                     RCSTAbits.CREN = 0;
  2.   739E    98AB     BCF 0xfab, 0x4, ACCESS
  3. 92:                                                     (void)RCREG;                            // Clear error by reenabling receiver
  4. 93:                                                     RCSTAbits.CREN = 1;
  5.   73A0    88AB     BSF 0xfab, 0x4, ACCESS
A hozzászólás módosítva: Aug 26, 2013
(#) watt válasza Hp41C hozzászólására (») Aug 26, 2013 /
 
Szia! Akkor jól láttam, hogy nem fordít oda semmit? Vagy nem veszek észre valamit?

Az nem furcsa, hogy két sort fordít a WREG = RCREG-re? Nem lenne elég a MOVF RCREG,W?
A hozzászólás módosítva: Aug 26, 2013
(#) watt válasza _vl_ hozzászólására (») Aug 26, 2013 /
 
Értem, de melyik assembly utasítás a leves?
Biztosan a WREG-be kéne nyomnia, ha nyomja, de nem látok ilyen kódrészletet a listában. Hp41C által felrakott lista második részében sem. És hibát sem ad a fordító...
(#) _vl_ válasza watt hozzászólására (») Aug 26, 2013 /
 
"megy a levesbe" = "megy a kukába", esetünkben a kiolvasott byte-ot el kéne dobnia a kódnak.
Az XC8 ezt csinálja belőle (valami 16F18xx-re fordított kód volt, épp ezt találtam egy gyors grep-pel):
  1. 4479  007A                     i1l3562:      
  2.   4480                           ;main.c: 637: while (PIR1bits.RCIF) {
  3.   4481            
  4.   4482  007A  0020                      movlb   0       ; select bank0
  5.   4483  007B  1E91                      btfss   17,5    ;volatile
  6.   4484  007C  288C                      goto    i1l405
  7.   4485      
  8.   4486                           ;main.c: 638: (void)RCREG;
  9.   4487  007D  0023                      movlb   3       ; select bank3
  10.   4488  007E  0819                      movf    25,w    ;volatile
  11.   4489  007F  287A                      goto    i1l3562

A C18 - ahogy lentebb szerepelt - teljesen kioptimalizálja a kódot. Remélem, legalább warningot ad mellé...
A hozzászólás módosítva: Aug 26, 2013
(#) Hp41C válasza watt hozzászólására (») Aug 26, 2013 /
 
Jól látod, a C18 a (void)RCREG -re nem jelez hibát, nem ad figyelmeztetést, de legalább nem fordít semmit sem. Vagyis kioptimalizálja.
A WREG kezelése ugyanúgy megy, minha egy változó lenne. A return (WREG) biztos, ami biztos befordít egy movf WREG,w, ACCESS -t.
A hozzászólás módosítva: Aug 26, 2013
(#) Hp41C válasza _vl_ hozzászólására (») Aug 26, 2013 /
 
Optimalizál ax XC8? A Hi-Tech benne hagyja...
A hozzászólás módosítva: Aug 26, 2013
(#) watt válasza _vl_ hozzászólására (») Aug 26, 2013 /
 
Úgy tűnik ezt nem szabad használni a C18-ban.
A teszt=RCREG sornál nem értem minek fordít be egy NOP-ot...
A hozzászólás módosítva: Aug 26, 2013

voidRCREG.png
    
(#) Hp41C válasza watt hozzászólására (») Aug 26, 2013 /
 
A movff 4 byte -os, a második szó, a paraméter, aminek a felső 4 bitje 1. Visszafordításkor az is nop.
A hozzászólás módosítva: Aug 26, 2013
(#) watt válasza _vl_ hozzászólására (») Aug 26, 2013 /
 
Értem én, hogy kidobja, de binárisan ezt nem lehet ilyen egyszerűen elintézni. Esetünkben ha W-be olvassa, majd utána nem csinálna vele semmit, az megfelelne a kidobásnak. A baj az, hogy csak hasonlót látok a kódokban. Ezt egy sorral el lehetne intézni, de a fordító mindig két sorral terheli meg a szűk memóriánkat.
(#) watt válasza Hp41C hozzászólására (») Aug 26, 2013 /
 
Most, hogy mondod, már nekem is leesett. Elfelejtettem, hogy vannak kétszavasak... Köszi!
De a MOVF x,W egyszavas és pont azt csinálná, amit a WREG=RCREG-el akarnánk.
A hozzászólás módosítva: Aug 26, 2013
(#) Hp41C válasza watt hozzászólására (») Aug 26, 2013 /
 
Hát ilyen a C és a többi... Akkor is eltesz az értéket, ha el kellene dobni. Lehet másként is csinálni (char dummy; dummy = WREG; ), de az még hosszabb.
A hozzászólás módosítva: Aug 26, 2013
(#) _vl_ válasza Hp41C hozzászólására (») Aug 26, 2013 /
 
Ez valamennyire biztosan, mert nulla optimalizációval teljes mértékben használhatatlan. Na, megnéztem, "--opt=all,+asm,-asmfile,+speed,-space,-debug,9" van a Makefile-ban, gondolom ezzel fordított utoljára.
(#) watt válasza Hp41C hozzászólására (») Aug 26, 2013 /
 
Azért ez erős lenne a C-ben sűrűn használni, csak azért, hogy tömör, gyors programunk fordítódjon.
  1. 84:                     _asm
  2. 85:                     MOVF 0xfae, 0xfe8 ,0
  3.  00EE4    50AE     MOVF 0xfae, W, ACCESS
  4. 86:                     _endasm
(#) usane hozzászólása Aug 27, 2013 /
 
Üdv!

Tudja valaki, hogy xc8 fordítóval az mplab X miért nem fogadja el a __delay_ms() utasítást, ha egyszer benn van a header fileok között a pic.h?
(#) usane válasza usane hozzászólására (») Aug 27, 2013 /
 
Másik kérdés.
Meg tudom oldani valahogy, hogy a portok bitjeit tömbbe rakjam?
Az a baj, hogy konstanst vár a tömbelemeknél. Próbáltam #define-al is úgysem sikerült.
A hozzászólás módosítva: Aug 27, 2013
(#) potyo válasza usane hozzászólására (») Aug 27, 2013 /
 
Keresd meg a delay.h vagy hasonló nevű headert, és nézd meg abban, hogy vannak a delay függvények.
(#) usane válasza potyo hozzászólására (») Aug 27, 2013 /
 
Azt tudom fejből is, hogy abban ciklusokkal számol, delayktcy meg hasonlók, de a ms-os meg benne van a pic.h-ban. Végül is mindegy, jó a ciklusos is. A portbitek tömbökbe rendezésére nem tudsz valamit?
(#) _vl_ válasza usane hozzászólására (») Aug 27, 2013 /
 
Esetleg ha megfogalmaznád pontosan, hogy mit szeretnél, mert annak, amit leírtál, nincs túl sok értelme.
(#) usane válasza _vl_ hozzászólására (») Aug 27, 2013 /
 
Ok. Elnézést, ha nem voltam egyértelmű.
Van 8 darab bemeneti pin, több porton. És van 8 darab kimeneti pinem szintén összevissza több porton.
pl valami ilyet szerettem volna:
unsigned char input[8]={PORTAbits.RA3,PORTCbits.RC1.......}
unsigned char output[8]={PORTAbits.RA2,PORTCbits.RC4.......}

Azért, hogy utána ciklusban könyebb egyen kezelni ne kelljen ezer IF-et irni.

Közben megtaláltam a választ, hogy ez így nem működik. lásd:pinarray

Az 5-ös pont leírja mit tehetek.
Esetleg egyéb ötlet?
A hozzászólás módosítva: Aug 27, 2013
(#) _vl_ válasza usane hozzászólására (») Aug 27, 2013 /
 
A C nyelv nem a kényelemről szól. Továbbá mikrokontrolleres környezetben (ez itt súlyosbító tényező) a C nyelvben nem mindegy, hogy mit írsz le - mivel a fordító a leírt kód alapján készíti el az assembly kódot. A mikrokontroller teljesítménye erősen korlátozott, ha ugyanazt a feladatot 10 utasítás helyett 200 utasítással csinálod meg, akkor simán lehet, hogy már nem lesz elég gyors a kívánt feladatra. Ez az, ami miatt nem mindegy, hogy mit írsz le. Sajnos a mikrokontrollerre C-ben fejlesztésnél az a legfőbb meló, hogy rávedd a C fordítót, hogy minél jobb assembly kódot generáljon az adott feladathoz. Persze ehhez tisztában kell lenni azzal, hogy kb. mi a jó assembly kód - és úgy szerkeszteni a C kódot, hogy az legyen belőle, amit szeretnénk.
Az adott feladatra: ha engem kérdezel, alapból úgy kell bekötni a biteket, hogy minél egyszerűbben lehessen őket összerakni (azaz NEM össze-vissza hozzárendelni a lábakhoz). Másrészt inkább egy marék if, minthogy 10x lassabban fusson a kód.
(#) usane válasza _vl_ hozzászólására (») Aug 28, 2013 /
 
Igen, sajnos tudom, hogy a uC korlátozza a lehetőségeket, de úgy gondoltam, hogy az adott feladatra elég lesz. Nem kell egyebet csinálnia, mint 8 bemeneten figyelni a gombokat és ki-be kapcsonli a hozzájuk rendelt kimenetet. Szerencsétlenségemre elég macerás 1 portra gyüjteni a biteket a nyák miatt. Így is elég kacifántos lett a körülötte levő cuccoktól. Na mind1, akkor megírom a marék if-et, esetleg egy részét switch-case szerkezettel, vagy ha időm engedi nekiesek assemblyben kigyötröm magamból a kódot, csak ugyebár a lusta állatfaj, ezért keresi az egyszerűséget. (igaz, villanyosmérnök lennék vagy mifene) Esetleg a uC-t is lecserélhetném, hogy át tudjam variálni a nyákot, de nem vagyok benne biztos, el akarok még szórakozni vele 3-4 napot.
Mindenesetre köszönöm a véleményed.
A hozzászólás módosítva: Aug 28, 2013
(#) watt válasza usane hozzászólására (») Aug 28, 2013 /
 
If (vagy más feltételes elágazás) nélkül elég nehéz lenne gombot kezelni, bármilyen struktúrát hozol létre! A port bitjére pedig közvetlenül lehet hivatkozni, amit BCF, BSF, illetve BTFSS, BTFSC-re fordít a fordító, jó esetben! Esetleg maszkolni lehet a portot, ha több bitet egyidőben kell váltani, igaz ez is csak egy porthoz tartozó bitekkel lehet megcsinálni, mert ez fizikai kapcsolat, nem csak logikai.
De ez semmiképpen nem az a feladat, amit egyszerűbbé lehetne tenni azzal, ha a port bitjeire egy tömb elemeként tudnál hivatkozni, még ha lehetne akkor sem.
A hozzászólás módosítva: Aug 28, 2013
Következő: »»   79 / 153
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