[elektro] C18 kérdés

hg12345 hg12345 at freemail.hu
Fri Sep 13 07:45:05 CEST 2013


Maga a C ugyan az, de ha figyelembe veszed a uC sajatosságát és eszerint írod a programot, akkor ég és a föld a különbség

pl.:
struct akarmi{
     int i1,
     uint8_t i2,
    .......
}

A program szempontjából egy tömör változó lista, regiszter fogalalás 1 azaz 1db regiszter a CORTEX-M3-ba teljesen mindegy hány elemet tartalmaz a struktura (pointer relativ cimzést használ)  ha bármi kell elegendő a pointert átadni.... teljesen mindegy global, static vagy local a structura.

Próbálj meg PI18 C-ben valami hasonlót csinálni, ha gyors és tömör kódot akarsz akkor minimum static vagy global valtozóként kell megadni, ha nincs optimalizálva a forditó akkor mindig számolja az indirekt cimzést.....
A local változokat is commom területen használja, vagy ha valodi local-ként akkor halálra indexeli magát a uC-rel.

Az, hogy C meg hogy kaompatibilis az addig érvényes amig nem kell a uC és perifériákhoz illeszteni a programot, onnan kezdve a több a #define és #ifdef feltételes fordítás mint maga a kód :-)

a CRC algoritmust próbáld ki, de itt érdemes minden változót public vagy static -ként definiálni a PIC18 miatt..., csak a CRC16 a lényeges a másik program csak egy példa program.

"Tibor Kovács" <kovacs.tibor7909 at gmail.com> írta:
>A C18-at azért erőltetem, mert jópár kész kártyánk van amiben 18as>
sorozatból használunk uC-t, vagyis ez van ezt kell tanulni... Idővel>
valószínű lesznek váltások, de ha már ezzel tudok némi C-s gyakorlatot,>
rutint szerezni, akkor valószínű a váltás is könnyebb lesz. Csak nincs>
olyan óriási különbség...>
>
>
2013. szeptember 12. 19:45 hg12345 írta, <hg12345 at freemail.hu>:>
>
> Hi,>
> Ez a CRC16 (8bites) számítás gyors és legtömörebb kivitele. (Tisztán C-ben)>
>>
> static void Calc_CRC( uint16_t* CRC,uint8_t C)>
>  //folyamatos ellenörzö összeg számító program>
> {       register uint16_t i,x;>
>>
> /*----- RTU : CRC ---*///>
> http://www.dattalo.com/technical/software/pic/crc16.asm>
>         {       i= (C ^ *CRC) & 0x00FF;>
>                 x=  i ^ (i>>4);>
>       //atmeneti byte paritás számítása>
>                 x=  x ^ (x>>2);>
>                 x= (x ^ (x>>1)) & 0x0001 ;>
>                 x= x ? 0xC001 : 0x0000;>
>                 *CRC = ((*CRC)>>8) ^ x ^ (i<<6) ^ (i<<7);>
>         }>
> }>
>>
> static int GenIdenCRC(uint8_t* Array, int Lenght)>
> { int i;>
>   uint16_t  CRC=0xFFFF;>
>   *(uint32_t*)Array= FixIdenArray[(IdenArray[6]>>2)&0x0F];  //adathalmaz>
> kiegészítése>
>   for(i=0;i<Lenght;i++)>
>   { Calc_CRC((uint16_t*)&CRC,*Array++);                     //következö>
> elem értékének generálása>
>   }>
>   *Array++=CRC&0xFF;>
>   *Array  =CRC>>8;>
>   return CRC;>
> }>
>>
> generáláshoz ellenörzéshez jó, csak a buffer-ben mindig legyen 2byte>
> tartalék>
>>
> Amúgy kár erőltetni a 8 és 16 bites uC, árban tudásban könnyen lehet>
> kényelmesebb eszközt találni a 32 bitesek között... Dolgozni meg zongorázni>
> lehet a különbséget>
>>
> "Tibor Kovács" <kovacs.tibor7909 at gmail.com> írta:>
> >a hibaüzenet - Error: syntax error>>
> >>
> hogy tudom akkor ezt a dolgot megoldani? ha nem tudom pontosan melyik>>
> bankba teszi a változót akkor hogy állítsam? vagy a c-ben meg lehet azt>>
> mondani neki hogy hova tegye a változót deklaráláskor?>>
> >>
> egyébként azért van asm-ben ez a rész mert a kommunikációs csatorna>>
> tulvégén egy pici proc van amibe sehogy sem férnék bele ha C-ben írnám a>>
> programját... itt pedig nem akartam bajlódni ennek az átírásával.>>
> >>
> >>
> 2013. szeptember 12. 14:33 hg12345 írta, <hg12345 at freemail.hu>:>>
> >>
> > Mert azt a linker kezeli.>>
> >>>
> >>>
> > "Tibor Kovács" <kovacs.tibor7909 at gmail.com> írta:>>
> > >Így már majdnem lefordul, csak a BANKSEL-t nem tudom vele megetetni...>>>
> > >>>
> > void Crc8bit(void)>>>
> > {>>>
> > _asm>>>
> > BANKSEL iobyte>>>
> > MOVF iobyte, 0, 0>>>
> > MOVWF b_crcv4, 0>>>
> > CLRF b_crcv2, 0>>>
> > BSF b_crcv2, 3, 0>>>
> > crc8c:>>>
> > MOVF b_crcv4, 0, 0>>>
> > XORWF b_crc8, 0, 0>>>
> > MOVWF b_crcv3, 0>>>
> > RRCF b_crcv3, 1, 0>>>
> > MOVF b_crc8, 0, 0>>>
> > BTFSC STATUS, 0, 0>>>
> > XORLW c_crc8c>>>
> > MOVWF b_crcv3, 0>>>
> > RRCF b_crcv3, 1, 0>>>
> > MOVWF b_crc8, 0>>>
> > RRCF b_crcv4, 1, 0>>>
> > DECFSZ b_crcv2, 1, 0>>>
> > GOTO crc8c>>>
> > BANKSEL PORTA>>>
> > RETURN 0>>>
> > _endasm>>>
> > }>>>
> > >>>
> > >>>
> > 2013. szeptember 12. 13:04 Tibor Kovács írta, <>
> kovacs.tibor7909 at gmail.com>>
> > >:>>>
> > >>>
> > >>>>
> > > Egy ujabb buktató.>>>
> > > Van neküknk régebbről, még asm-es korból egy jól bevált crc-r rutin,>>
> > amit>>>
> > > eddig basicbe be tudtam szúrni, de itt C-ben az istennek sem fogadja>
> el.>>>
> > > Syntax error-t dob vissza... esetleg nem jól használom az asm>
> beszúrást?>>>
> > >>>>
> > > void Crc8bit(void)>>>
> > > {>>>
> > > _asm>>>
> > > BANKSEL iobyte>>>
> > > MOVF iobyte,W>>>
> > > MOVWF b_crcv4>>>
> > > CLRF b_crcv2>>>
> > > BSF b_crcv2,3>>>
> > > crc8c:>>>
> > > MOVF b_crcv4,W>>>
> > > XORWF b_crc8,W>>>
> > > MOVWF b_crcv3>>>
> > > RRCF b_crcv3,1>>>
> > > MOVF b_crc8,W>>>
> > > BTFSC STATUS,0>>>
> > > XORLW c_crc8c>>>
> > > MOVWF b_crcv3>>>
> > > RRCF b_crcv3,W>>>
> > > MOVWF b_crc8>>>
> > > RRCF b_crcv4,1>>>
> > > DECFSZ b_crcv2,1>>>
> > > GOTO crc8c>>>
> > > BANKSEL porta>>>
> > > RETURN>>>
> > > _endasm>>>
> > > }>>>
> > >>>>
> > >>>>
> > > 2013. szeptember 11. 15:37 Tibor Kovács írta, <>>
> > kovacs.tibor7909 at gmail.com>>>>
> > > :>>>
> > >>>>
> > >> köszi!>>>
> > >>>>>
> > >> így már ugy működik ahogy szerettem volna. kezdem kapizsgálni... a>>
> > minap>>>
> > >> kezdtem el a C-ben létezni, és vannak még dolgok bőven amik meg>
> tudnak>>>
> > >> kavarni.>>>
> > >>>>>
> > >>>>>
> > >> 2013. szeptember 11. 15:27 Lajos Rancz írta, <lajos.rancz at gmail.com>
> >:>>>
> > >>>>>
> > >> igen mert a pData_2 elé nem kell a csillag ha az nem lokális hanem>>
> > vmilyen>>>
> > >>> globális. Mivel ez itt értékadás nem pedig deklaráció. Tehát>>>
> > >>>>>>
> > >>> *Eset 1, globális:*>>>
> > >>>>>>
> > >>> char *pData_2 = NULL;>>>
> > >>> ....>>>
> > >>> void MyPrint(...)>>>
> > >>> {>>>
> > >>> pData_2 = data_2; // Globalis ertekadas>>>
> > >>> for (...) ....>>>
> > >>> }>>>
> > >>>>>>
> > >>> *Eset 2, lokális:*>>>
> > >>>>>>
> > >>> ...>>>
> > >>> void MyPrint(....)>>>
> > >>> {>>>
> > >>> char *pData_2 = data_2; // Lokalis deklaracio + ertekadas>>>
> > >>> for (...) ..>>>
> > >>> }>>>
> > >>>>>>
> > >>> Üdv>>>
> > >>>>>>
> > >>>>>>
> > >>> 2013. szeptember 11. 15:22 Tibor Kovács írta, <>>>
> > >>> kovacs.tibor7909 at gmail.com>:>>>
> > >>>>>>
> > >>> > próbáltam így: *pData_2 = data_2;>>>
> > >>> > de hibával fordul...>>>
> > >>> >>>>
> > >>> >>>>
> > >>> > 2013. szeptember 11. 15:21 Lajos Rancz írta, <>
> lajos.rancz at gmail.com>>
> > >:>>>
> > >>> >>>>
> > >>> > > Hi!>>>
> > >>> > >>>>
> > >>> > > Úgy, hogy a ptr változót mindig az elejére állítod a for ciklus>>>
> > >>> előtt.>>>
> > >>> > >>>>
> > >>> > > Üdv>>>
> > >>> > >>>>
> > >>> > >>>>
> > >>> > > 2013. szeptember 11. 14:56 Tibor Kovács írta, <>>>
> > >>> > kovacs.tibor7909 at gmail.com>>>
> > >>> > > >:>>>
> > >>> > >>>>
> > >>> > > > szuper!>>>
> > >>> > > >>>>
> > >>> > > > Ez működik, viszont azt hogy csináljam hogy ha ezt:>>>
> > >>> > > >>>>
> > >>> > > > for (i = 0; i < 18; ++i)>>>
> > >>> > > > {>>>
> > >>> > > > ptr += sprintf(ptr, "%02x ", S2buffer[i]);>>>
> > >>> > > > }>>>
> > >>> > > >>>>
> > >>> > > > többször is meg akarom hívni akkor ne fűzze mindíg az előző>>
> > állapot>>>
> > >>> > > > végéhez. Mert jelenleg ez van...>>>
> > >>> > > >>>>
> > >>> > > >>>>
> > >>> > > > 2013. szeptember 11. 14:37 Lajos Rancz írta, <>>>
> > >>> lajos.rancz at gmail.com>:>>>
> > >>> > > >>>>
> > >>> > > > > Helló!>>>
> > >>> > > > >>>>
> > >>> > > > > Hogy akarod kiírni mint hexa számok mint decimális számok>
> vagy>>>
> > >>> mint>>>
> > >>> > > > > karakterek?>>>
> > >>> > > > >>>>
> > >>> > > > > hexában és decimálisan:>>>
> > >>> > > > > int i;>>>
> > >>> > > > > char *ptr = data_2;>>>
> > >>> > > > > for (i = 0; i < 18; ++i)>>>
> > >>> > > > > {>>>
> > >>> > > > > ptr += sprintf(ptr, "%02x ", pS2buffer[i]); // Decimalisan>
> a>>>
> > >>> format>>>
> > >>> > > > string:>>>
> > >>> > > > > "%d ">>>
> > >>> > > > > }>>>
> > >>> > > > >>>>
> > >>> > > > > Üdv>>>
> > >>> > > > >>>>
> > >>> > > > >>>>
> > >>> > > > > 2013. szeptember 11. 13:58 Tibor Kovács írta, <>>>
> > >>> > > > kovacs.tibor7909 at gmail.com>>>
> > >>> > > > > >:>>>
> > >>> > > > >>>>
> > >>> > > > > > Sziasztok!>>>
> > >>> > > > > >>>>
> > >>> > > > > > Egy ujabb C-s kérdés merült fel bennem..>>>
> > >>> > > > > > Mégpedig van egy bejövő soros adatom amit egy tömb-be>>>
> > >>> letárolok (18>>>
> > >>> > > > > byte),>>>
> > >>> > > > > > ezzel eddig nincs is gondom, viszont ahoz hogy ezt ki>
> tudjam>>>
> > >>> írni>>>
> > >>> > > > LCD-re>>>
> > >>> > > > > át>>>
> > >>> > > > > > kell tennem egy string-be formázottan. Van egy módszer>>
> > amivel>>>
> > >>> > > sikerűlt>>>
> > >>> > > > de>>>
> > >>> > > > > > túl hosszúnak találom, és az lenne a kérdésem hogy lehet>
> ezt>>>
> > >>> > > > > > leegyszerűsíteni.>>>
> > >>> > > > > >>>>
> > >>> > > > > > pl.: (ez csak 6 byte-ra vonatkozik, nekem ugye 18>
> kellene)>>>
> > >>> > > > > > sprintf(data_2, "%c%c%c%c%c%c",>>>
> > >>> > > > > >>>>
> > >>> > > >>>>
> > >>> >>>>
> > >>>>>
> >>
> s2buffer[0],s2buffer[1],s2buffer[2],s2buffer[3],s2buffer[4],s2buffer[5]);>>>
> > >>> > > > > >>>>
> > >>> > > > > > gondoltam egy ilyenre, de ez nem működik...>>>
> > >>> > > > > >>>>
> > >>> > > > > > pData_2 = &data_2[0];>>>
> > >>> > > > > > pS2buffer = &s2buffer[0];>>>
> > >>> > > > > > for (i=0; i < 18; i++)>>>
> > >>> > > > > > {>>>
> > >>> > > > > > sprintf(*pData_2, "%2x", *pS2buffer);>>>
> > >>> > > > > > pData_2++;>>>
> > >>> > > > > > pS2buffer++;>>>
> > >>> > > > > > }>>>
> > >>> > > > > >>>>
> > >>> > > > > > előre is köszi!>>>
> > >>> > > > > > ----------------------------------------->>>
> > >>> > > > > >           elektro[-flame|-etc]>>>
> > >>> > > > > >>>>
> > >>> > > > > ----------------------------------------->>>
> > >>> > > > >           elektro[-flame|-etc]>>>
> > >>> > > > >>>>
> > >>> > > > ----------------------------------------->>>
> > >>> > > >           elektro[-flame|-etc]>>>
> > >>> > > >>>>
> > >>> > > ----------------------------------------->>>
> > >>> > >           elektro[-flame|-etc]>>>
> > >>> > >>>>
> > >>> > ----------------------------------------->>>
> > >>> >           elektro[-flame|-etc]>>>
> > >>> >>>>
> > >>> ----------------------------------------->>>
> > >>>           elektro[-flame|-etc]>>>
> > >>>>>>
> > >>>>>
> > >>>>>
> > >>>>
> > ----------------------------------------->>>
> >           elektro[-flame|-etc]>>>
> >>>
> >>>
> > ----------------------------------------->>
> >           elektro[-flame|-etc]>>
> >>>
> ----------------------------------------->>
>           elektro[-flame|-etc]>>
>>
>>
> ----------------------------------------->
>           elektro[-flame|-etc]>
>>
----------------------------------------->
          elektro[-flame|-etc]>




More information about the Elektro mailing list