Fórum témák

» Több friss téma
Fórum » PIC programozása C nyelven, C-Compiler
Lapozás: OK   81 / 153
(#) Attila86 hozzászólása Szept 18, 2013 /
 
Van megint pár kérdésem:
1.- Ennek mi a C-nyelvű megfelelője?
  1. bsf             ANCON0, ANSEL0  ;RA0 analóg láb lesz

2.- Hogyan tudok bájtnál kisebb dolgot definiálni? Mondjuk egyetlen bitet! Ezt olvastam valahol a Kónya-könyvben de már tíz perce lapozgatom és egyszerűen nem találom hol volt, pedig írta...
(#) _vl_ válasza Attila86 hozzászólására (») Szept 18, 2013 /
 
Több opció van.
  1. ANSEL0 = 1;
  2. ANCON0bits.ANSEL0 = 1;
  3. ANCON0 |= 0x01;
  4. ANCON0 |= _ANCON0_ANSEL0_MASK;

Ezek mind azért működnek csak, mert a megfelelő (processzoronként külön-külön) include fájlban definiálva vannak a megfelelő memóriaváltozók ill. makrók:
  1. extern volatile unsigned char ANCON0 @ 0xF5D;
  2.  
  3. typedef union {
  4.     struct {
  5.         unsigned ANSEL0                 :1;
  6.         unsigned ANSEL1                 :1;
  7.         unsigned ANSEL2                 :1;
  8.         unsigned ANSEL3                 :1;
  9.         unsigned ANSEL4                 :1;
  10.     };
  11.     struct {
  12.         unsigned PCFG0                  :1;
  13.     };
  14.     struct {
  15.         unsigned                        :1;
  16.         unsigned PCFG1                  :1;
  17.     };
  18.     struct {
  19.         unsigned                        :2;
  20.         unsigned PCFG2                  :1;
  21.     };
  22.     struct {
  23.         unsigned                        :3;
  24.         unsigned PCFG3                  :1;
  25.     };
  26.     struct {
  27.         unsigned                        :4;
  28.         unsigned PCFG4                  :1;
  29.     };
  30. } ANCON0bits_t;
  31. extern volatile ANCON0bits_t ANCON0bits @ 0xF5D;
  32.  
  33. #define _ANCON0_ANSEL0_POSN          0x0
  34. #define _ANCON0_ANSEL0_POSITION      0x0
  35. #define _ANCON0_ANSEL0_SIZE          0x1
  36. #define _ANCON0_ANSEL0_LENGTH        0x1
  37. #define _ANCON0_ANSEL0_MASK          0x1
  38.  
  39. extern volatile __bit ANSEL0 @ (((unsigned) &ANCON0)*8) + 0;
  40. #define ANSEL0_bit BANKMASK(ANCON0), 0

Hogy éppen hogy nevezik az adott regiszter/bitet, van-e bitenkénti definíció, vagy csak a regisztert definiálták, azt innen érdemes kinézni mindig.

Byte-nál kisebb dolgot nem akarsz definiálni! Azért nem, mert azt valahová raknia kell a fordítónak, és ahova rakni tudja, azok mind byte méretű memóriaterületek. Jobban jársz, ha magad pakolod össze byte-okba a bit méretű változóidat. Pl.:
  1. struct {
  2.   unsigned nibble: 4;
  3.   unsigned bit4: 1;
  4.   unsigned bit5: 1;
  5.   unsigned bit6: 1;
  6.   unsigned bit7: 1;
  7. } var;

Ezután a var.bit7 a legfelső bitet jelenti, a var.nibble pedig a legalsó 4-bites területet. Ha így csinálod:
  1. union {
  2.   struct {
  3.     unsigned nibble: 4;
  4.     unsigned bit4: 1;
  5.     unsigned bit5: 1;
  6.     unsigned bit6: 1;
  7.     unsigned bit7: 1;
  8.   };
  9.   unsigned char byte;
  10. } var;

Ez annyiból jobb, hogy lehet hivatkozni a var egyes bitjeire: var.bit7, vagy var.nibble, de egyben is el tudod érni: var.byte.
A hozzászólás módosítva: Szept 18, 2013
(#) Attila86 hozzászólása Szept 18, 2013 /
 
Köszönöm a válaszokat, emésztem őket. Közben egy dolog; bepötyögtem szó szerint ugyan azt ami a könyvben van:
  1. void    varakozas (unsigned int uiMaxIdo)
  2. {
  3.         unsigned int uiIdo      //A késleltetéshez használt változó.
  4.         for(uiIdo=0; uiIdo<uiMaxIdo; uiIdo++)
  5.         {
  6.         Nop();          //uiMaxIdo-ször fut le a nop utasítás
  7.         }
  8. }

De a fordító sytax error-t ír a "for"-al kezdődő sorra. Miért?
(#) icserny válasza Attila86 hozzászólására (») Szept 18, 2013 /
 
Az előtte levő sor végéről lemaradt a pontosvessző.
(#) Attila86 válasza icserny hozzászólására (») Szept 18, 2013 /
 
Ja igen. Hozzá kell szoknom hogy a pontosvesszőt itt nem akkor kell írni amikor kommentelni akarok...
Viszont most meg az utolsó kapcsos zárójel zavarja. Így néz ki eddig amit kalimpáltam:
  1. #include        <p18f25k80.h>
  2. #include        "PIC-es panelmero III - C szubrutinok.h"
  3.  
  4. //konfigurációs beállítások:
  5. #pragma config  FOSC    =       HS1     //külső oszcillátor
  6. #pragma config  PLLCFG  =       ON      //pll bekapcsolva
  7. #pragma config  MCLRE   =       OFF     //mclr funkció kikapcsolva
  8. #pragma config  SOSCSEL =       DIG     //
  9. #pragma config  RETEN   =       OFF     //stabkocka kikapcsolva
  10. #pragma config  STVREN  =       ON      //veremtár-túlcsordulás esetén reset!
  11. #pragma config  XINST   =       OFF     //kiterjesztett instrukciók tiltva
  12. #pragma config  WDTEN   =       OFF     //watchdog kikapcsolva
  13. #pragma config  FCMEN   =       OFF     //
  14. #pragma config  IESO    =       OFF     //
  15. #pragma config  BOREN   =       OFF     //
  16. #pragma config  CP0             =       OFF     //kódvédelem
  17. #pragma config  CP1             =       OFF     //kódvédelem
  18. #pragma config  CPB             =       OFF     //kódvédelem
  19. #pragma config  WRT0    =       OFF     //
  20. #pragma config  WRT1    =       OFF     //
  21. #pragma config  WRTB    =       OFF     //
  22. #pragma config  WRTC    =       OFF     //
  23. #pragma config  EBTR0   =       OFF     //
  24. #pragma config  EBTR1   =       OFF     //
  25. #pragma config  EBTRB   =       OFF     //
  26.  
  27. #define regiszter1      1
  28.  
  29.  
  30. main ()         //főprogram kezdete
  31. {
  32.  
  33.  
  34.  
  35.         TRISB = 0b11000101;
  36.         TRISC = 0b00000000;             //PORTC mint lába kimenet
  37.         TRISA = 0b11011111;             //PORTA minden lába bemenet, kivéve az RB5
  38.         ANCON0bits.ANSEL0 = 1//RA0 analóg láb lesz
  39.         ANCON0bits.ANSEL1 = 1//RA1 analóg láb lesz
  40.         ANCON0bits.ANSEL2 = 1//RA2 analóg láb lesz
  41.         ANCON0bits.ANSEL3 = 1//RA3 analóg láb lesz
  42.         ANCON0bits.ANSEL4 = 0//RA5 digitális láb lesz
  43.         ANCON1bits.ANSEL8 = 0//RB1 digitális láb lesz
  44.         ANCON1bits.ANSEL9 = 0//RB4 digitális láb lesz
  45.         ANCON1bits.ANSEL10 = 0; //RB0 digitális láb lesz
  46.  
  47.         LATB = 0x00;
  48.         LATC = 0x00;
  49.  
  50.         WPUB = 0b11000111;              //felhúzóellenállás bekapcsolása RB0, RB1, RB2, RB6 és RB7 lábakra!
  51.  
  52.  
  53.  
  54.         LATC = 0x00;
  55.         varakozas (30000);
  56.         LATC = 0xFF;
  57.         varakozas (30000);
  58.  
  59. }

És az include-olt:
  1. #include        <p18f25k80.h>
  2.  
  3.  
  4. void    varakozas (unsigned int uiMaxIdo)
  5. {
  6.         unsigned int uiIdo;     //A késleltetéshez használt változó.
  7.         for(uiIdo=0; uiIdo<uiMaxIdo; uiIdo++)
  8.         {
  9.         Nop();          //uiMaxIdo-ször fut le a nop utasítás
  10.         }
  11. }

Mit rontottam el ebben? Szeretném majd a függvényeket a második fájlban gyűjtögetni de gondolom valamit elrontottam.
(#) _vl_ válasza Attila86 hozzászólására (») Szept 18, 2013 /
 
A main függvénynél meg kéne adni a visszatérési értéket (void, ha nincs visszatérési érték):
  1. void main() {
  2. }

Persze a PIC esetén nem kéne visszatérni a main()-ből, egy végtelen ciklust kéne oda beírni.
  1. #include "PIC-es panelmero III - C szubrutinok.h"

Nagyon-nagyon-nagyon nem javaslom, hogy a fájlnevekben
- space-t,
- ékezetes betűt,
- random nem alfanumerikus karaktereket (kapcsos/szögletes zárójelek, csillag, kérdőjel, idézőjel, aposztróf, /) akarjál használni.
Betű, szám, pont, kötőjel, ha nagyon muszáj, akkor aláhúzás. A könyvtárnevekben (pl. projektkönyvtár neve) is kerülném a space-t és az ékezetes betűket, az IDE által a háttérben indított programoknak lehet velük gondja.
Mivel minden projektnek illik saját könyvtárának lennie, azon belül a fájlok neveibe értelmetlen dolog a projekt nevét még egyszer belekódolni.
A hozzászólás módosítva: Szept 18, 2013
(#) _vl_ válasza Attila86 hozzászólására (») Szept 18, 2013 / 1
 
Include fájlok működése:
A C nyelvben a .h fájlok arra vannak kitalálva, hogy az adott .c fájlokon kívül létező, máshol definiált változókat, függvények létezését a fordító tudomására hozzuk. Nem csak erre használhatók, de erre szokás használni.
Ez a .c fájl fordításakor lényegében egy külső hivatkozást fog eredményezni a lefordított kódban. Ahhoz, hogy ebből a lefordított kódból egy futtatható kód keletkezzen, egy linkelés nevű fázisban ezeket a külső hivatkozásokat fel kell oldani.
Mondjuk ha van két .c fájl, amiket külön-külön fordítunk le (a fordító egyszerre mindig egy .c fájllal foglalkozik), és az egyik fájlból szeretnénk a másikban levő függvényt meghívni, akkor a hívó .c fájl fordításakor meg kell mondani a fordítónak, hogy hogy néz ki az a függvény (mik a paraméterei, visszatérési értéke), amit meg akarunk hívni. A hivatkozás a függvény neve alapján történik (ebből következik, hogy ugyanazzal a névvel nem lehet két függvénypéldány). Ez a "megmondás" pont úgy néz ki, mint a függvény, de csak a függvény fejlécét kell megadni, a "testét" nem. Változóknál az extern kulcsóval lehet ugyanezt megtenni. Azaz:
a.c:
  1. unsigned valtozo = 42;
  2.  
  3. int fuggveny(int param1, char param2) {
  4.    return param1 + param2 * 2;
  5. }

b.c:
  1. extern unsigned valtozo;
  2. int fuggveny(int param1, char param2);
  3.  
  4. void main() {
  5.   fuggveny(2, valtozo);
  6. }

Az "int fuggveny(int param1, char param2);" sor mondja meg a b.c fordításakor, hogy valahol van egy fuggveny nevű függvény, ezekkel a paraméterekkel. A fordítás során a fordító nem tudja, hogy valójában hol van ez a függvény (vagy a valtozo nevű változó), csak a típusokat tudja. A lefordított kód is csak egy külső hivatkozást tartalmaz.
A fordítás végén, amikor az a.c is meg a b.c is le van fordítva, a linker a két lefordított kódot összelinkeli, és ekkor mindegyik külső hivatkozást fel kell oldania. Ha ugyanaz a függvény/változó több forrásfájlban is megtalálható, akkor abból hiba lesz. Ha sehol nincs meg a hivatkozott név, akkor megintcsak sikertelen lesz a linkelés. Ha a típusokat elrontottuk, azt nem biztos, hogy kiszúrja a linker, viszont futás közben gondok lesznek.
Azért, hogy ne tévesszük el a történetet, szokás ezeket a külső hivatkozásokat külön .h fájlba rakni:
a.h:
  1. extern unsigned valtozo;
  2. int fuggveny(int param1, char param2);

a.c:
  1. #include "a.h"
  2.  
  3. unsigned valtozo = 42;
  4.  
  5. int fuggveny(int param1, char param2) {
  6.    return param1 + param2 * 2;
  7. }

b.c:
  1. #include "a.h"
  2.  
  3. void main() {
  4.   fuggveny(2, valtozo);
  5. }

Ez azért jó, mert így ugyanazt a fájlt be tudjuk include-olni abba a .c fájlba is, amiben ott van a függvény implementációja. Ekkor ha nem stimmelnek mondjuk a paramétertípusok, arra már ordítani fog a fordító, így könnyebben észrevesszük.

A .h fájlba nem szokás implementációt rakni (azaz a függvénynek csak a fejléce kerül bele szokásos módon, a konkrét függvénykódot egy .c fájlba rakjuk). Ha ugyanis implementáció is belekerül, akkor azt a .h fájlt nem tudjuk egynél több .c fájlba include-olni (hiszen akkor a több .c fájlban az adott függvényből külön-külön példányok keletkeznének, amik a linkelésnél összeütköznének). Ha valaki a függvény implementációját akarja valamilyen okból include-olni, akkor azt az include fájlt .c kiterjesztéssel szokás ellátni (ez utal rá, hogy azt csak egyszer, egy fájlba szabad include-olni).
(#) Attila86 válasza _vl_ hozzászólására (») Szept 18, 2013 /
 
Na most már kezdenek összekuszálódni a dolgok. az a.c-nél és az a.h-nál miért írtál a fuggveny elé int-et? Illetve az a.h-nál mi az az extern?
(#) potyo válasza Attila86 hozzászólására (») Szept 18, 2013 /
 
Azt int a függvény neve előtt azt mutatja meg, hogy milyen típusú a függvény visszatérési értéke. asm-ben ilyen nincs, C-ben van, tehát ez újdonság számodra. Vagyis végülis van, kb. olyan, mint amikor a W-ben adták vissza értéket a hívott szubrutinból, csak itt több bájtos is lehet a visszatérési érték, float is lehet, stb. Ez azért jó, mert pl. van valami függvényed, ami csinál valamit, pl. beolvas egy hőmérsékletet, akkor nem kell azt a beolvasó függvénynek egy globális változóba raknia, majd a hívó függvénynek onnan kiszednie, hanem egyszerűen a visszatérési értékben azt visszaadja, és azt közvetlenül fel tudod használni a kódban máshol.

Pl.
  1. lcd_iras(ho_olvasas(1));

Itt a ho_olvasas() függvény vár egy bemenő paramétert, mondjuk azt, hogy melyik szenzor hőmérsékletét akarjuk lemérni, ez lesz az egyes. És a függvény visszaad egy - például unsigned char- értéket, amit közvetlenül bemenő paraméterként használunk az lcd_kiir() függvény hívásánál, ami tiszta véletlenül épp unsigned char típust vár. Persze belül ebből lesz valamilyen változó használat, vagy legalábbis W regiszter, de C szinten nem kell plusz változót beállítani. Sőt, a fordító akár azt is megoldja, ha nem azonosak a típusok, pl. a ho_olvasas unsigned char értéket ad vissza, viszont az lcd_kiir meg unsigned int típust vár, akkor feltölti a felső bájtot nullákkal. Ugyanez fordítva is megy, akkor viszont levágja a felső bájtot, tehát lehet vele szívni ugyanúgy, mint az 1byte*1byte szorzásnál, amikor az eredményt is 1byte-ra rakja. float-int típusok esetén pedig konvertál, ott mondjuk kisebb pontatlanság lép fel.

Függvény lehet olyan is, hogy nincs visszatérési értéke, ekkor írjuk azt a neve elég, hogy void. Meg ha bemenő paramétere sincs, akkor ott is némelyik fordító kéri, hogy szerepeljen a void kulcsszó a zárójelben, de ezt sok fordító elnézi, és elég a ()

Az extern pedig azt jelenti, hogy azt a változót nem ott hozzuk létre, hanem tudatjuk a fordítóval, hogy az a változó majd létezni fog valahol, és majd a linker össze tudja rakni, hogy hol. Nagyjából ugyanarra való, mint az, hogy tudatjuk fele, hogy az a függvény létezik valahol, és majd szintén a linker összerakja, hogy hol. A fordítás folyamán amikor az szerepel, hogy "include a.h", akkor azt úgy képzeld el, hogy ahol ez a sor szerepel, oda bemásolod az a.h fájl tartalmát, és amit úgy kapsz, azt fordítja a fordító.

És lassan majd elérkezünk a pointerekhez, az még egy szép dolog a C nyelvben

-----------------------

Egyébként ha valami nem megy, akkor javaslom idemásolni a fordító hibaüzenetét is, nem csak annyit, hogy nem tetszik neki valami.
A hozzászólás módosítva: Szept 18, 2013
(#) Attila86 válasza _vl_ hozzászólására (») Szept 19, 2013 /
 
Megpróbáltam átírni ezek alapján átírni de így sem jó. A fő program:
  1. #include        <p18f25k80.h>
  2. #include        "fejlecek.h"
  3.  
  4. //konfigurációs beállítások:
  5. #pragma config  FOSC    =       HS1     //külső oszcillátor
  6. #pragma config  PLLCFG  =       ON      //pll bekapcsolva
  7. #pragma config  MCLRE   =       OFF     //mclr funkció kikapcsolva
  8. #pragma config  SOSCSEL =       DIG     //
  9. #pragma config  RETEN   =       OFF     //stabkocka kikapcsolva
  10. #pragma config  STVREN  =       ON      //veremtár-túlcsordulás esetén reset!
  11. #pragma config  XINST   =       OFF     //kiterjesztett instrukciók tiltva
  12. #pragma config  WDTEN   =       OFF     //watchdog kikapcsolva
  13. #pragma config  FCMEN   =       OFF     //
  14. #pragma config  IESO    =       OFF     //
  15. #pragma config  BOREN   =       OFF     //
  16. #pragma config  CP0             =       OFF     //kódvédelem
  17. #pragma config  CP1             =       OFF     //kódvédelem
  18. #pragma config  CPB             =       OFF     //kódvédelem
  19. #pragma config  WRT0    =       OFF     //
  20. #pragma config  WRT1    =       OFF     //
  21. #pragma config  WRTB    =       OFF     //
  22. #pragma config  WRTC    =       OFF     //
  23. #pragma config  EBTR0   =       OFF     //
  24. #pragma config  EBTR1   =       OFF     //
  25. #pragma config  EBTRB   =       OFF     //
  26.  
  27.  
  28. #define regiszter1      1
  29.  
  30.  
  31. void main ()            //főprogram kezdete
  32. {
  33.  
  34.  
  35.         TRISB = 0b11000101;
  36.         TRISC = 0b00000000;             //PORTC mint lába kimenet
  37.         TRISA = 0b11011111;             //PORTA minden lába bemenet, kivéve az RB5
  38.         ANCON0bits.ANSEL0 = 1//RA0 analóg láb lesz
  39.         ANCON0bits.ANSEL1 = 1//RA1 analóg láb lesz
  40.         ANCON0bits.ANSEL2 = 1//RA2 analóg láb lesz
  41.         ANCON0bits.ANSEL3 = 1//RA3 analóg láb lesz
  42.         ANCON0bits.ANSEL4 = 0//RA5 digitális láb lesz
  43.         ANCON1bits.ANSEL8 = 0//RB1 digitális láb lesz
  44.         ANCON1bits.ANSEL9 = 0//RB4 digitális láb lesz
  45.         ANCON1bits.ANSEL10 = 0; //RB0 digitális láb lesz
  46.  
  47.         LATB = 0x00;
  48.         LATC = 0x00;
  49.  
  50.         WPUB = 0b11000111;              //felhúzóellenállás bekapcsolása RB0, RB1, RB2, RB6 és RB7 lábakra!
  51.  
  52.         LATC = 0x00;
  53.         varakozas (30000);
  54.         LATC = 0xFF;
  55.         varakozas (30000);
  56.  
  57. }

A másik c fájl, amiben a függvényeket gyűjtögetném majd:
  1. #include        <p18f25k80.h>
  2. #include        "fejlecek.h"
  3.  
  4.  
  5. void    varakozas (unsigned int uiMaxIdo)
  6. {
  7.         unsigned int uiIdo;     //A késleltetéshez használt változó.
  8.         for(uiIdo=0; uiIdo<uiMaxIdo; uiIdo++)
  9.         {
  10.         Nop();          //uiMaxIdo-ször fut le a nop utasítás
  11.         }
  12. }

És a fejléc fájl:
  1. extern unsigned uiIdo;
  2. void    varakozas (unsigned int uiMaxIdo);

A fejléc fájl void-dal kezdődő sorát jelöli hogy syntax error.
A hozzászólás módosítva: Szept 19, 2013
(#) _vl_ válasza Attila86 hozzászólására (») Szept 19, 2013 /
 
Másold már be a pontos hibaüzeneteket, mert ezen én nem látom, hogy mit kifogásolhat.
(#) potyo válasza Attila86 hozzászólására (») Szept 19, 2013 /
 
syntax error-on kívül semmi mást nem ír? Szoktak a fordítók ott még mást is írni
(#) Attila86 válasza _vl_ hozzászólására (») Szept 19, 2013 /
 
Idézet:
„----------------------------------------------------------------------
Debug build of project `D:\Elektronika\Projektek\Projektek-2013\PIC-es panelmero III - C\PIC-es panelmero III - C.mcp' started.
Language tool versions: mpasmwin.exe v5.44, mplink.exe v4.42, mcc18.exe v3.41, mplib.exe v4.42
Preprocessor symbol `__DEBUG' is defined.
Thu Sep 19 17:57:07 2013
----------------------------------------------------------------------
Clean: Deleting intermediary and output files.
Clean: Done.
Executing: "C:\Program Files (x86)\Microchip\mplabc18\v3.41\bin\mcc18.exe" -p=18F25K80 "PIC-es panelmero III - C.c" -fo="PIC-es panelmero III - C.o" -D__DEBUG -Ou- -Ot- -Ob- -Op- -Or- -Od- -Opa-
D:\Elektronika\Projektek\Projektek-2013\PIC-es panelmero III - C\fejlecek.h:4:Error: syntax error
Halting build on first failure as requested.
----------------------------------------------------------------------
Debug build of project `D:\Elektronika\Projektek\Projektek-2013\PIC-es panelmero III - C\PIC-es panelmero III - C.mcp' failed.
Language tool versions: mpasmwin.exe v5.44, mplink.exe v4.42, mcc18.exe v3.41, mplib.exe v4.42
Preprocessor symbol `__DEBUG' is defined.
Thu Sep 19 17:57:07 2013
----------------------------------------------------------------------
BUILD FAILED”
A hozzászólás módosítva: Szept 19, 2013
(#) potyo válasza Attila86 hozzászólására (») Szept 19, 2013 /
 
Namost ez azt mondja, hogy nem találja a szubrutinok.c nevű fájlt, nem pedig syntax errort ír...

Mellesleg ha lokális (függvényen belüli) változó az uIdo, akkor a header fájlban semmi keresnivalója az extern unsigned uIdo sornak, mert nincs mire hivatkoznia. Nem kell a header fájlban az összes változót felsorolni extern-ként, hanem csak azokat kell, amiket el kell, hogy lehessen érni máshonnan is.
A hozzászólás módosítva: Szept 19, 2013
(#) Attila86 válasza potyo hozzászólására (») Szept 19, 2013 /
 
Rosszat másoltam, bocsi! Javítottam.
(#) potyo válasza (Felhasználó 15355) hozzászólására (») Szept 19, 2013 /
 
Úgytűnik van, én is úgy emlékeztem, hogy bőbeszédűbb szokott lenni a fordító...
(#) _vl_ válasza Attila86 hozzászólására (») Szept 19, 2013 /
 
De a 4. sorra panaszkodik, miközben csak 2 sort másoltál be lent... Nem lehet, hogy valami "szemét" karakter maradt a fájl végén? Valami normális editorból meg kéne nézni a fájlt (pl. Far manager-ben van hexa nézegető: F3 view file -> F4 hex mode, abban látszódni fog, ha valami nem kóser).
(#) potyo válasza Attila86 hozzászólására (») Szept 19, 2013 /
 
Van egy új sor a void-os sor után? Azt mintha kiírnák nomálisan, hogy hiányzik az újsor, de hátha. Ha nem megy, akkor töröld ki az extern-es sort, hagyd csak ott a void-osat, meg próbáld ki, hogy átnevezed ezt a fájlt valami másra, csinálsz a helyére egy újat, és oda újra beleírod. Lehet, hogy valami nem látható karakter van ott még. Esetleg hexben megnézheted, pl. Total commander, F3, majd ott valamelyik menűpont alatt van olyan, hogy hex nézet.
A hozzászólás módosítva: Szept 19, 2013
(#) _vl_ válasza (Felhasználó 15355) hozzászólására (») Szept 19, 2013 /
 
Jó, hogy eszembe juttattad, megyek is gyorsan egyet impossibile missionözni...
(#) pepe1125 hozzászólása Szept 19, 2013 /
 
Sziasztok!

A körünkben van a PIC-es panelmérő program írója is?! Vagy valahonnan letölthető a forrás? (Egy hasonló kis buta egyszerű műszerrel próbálkozom én is).

Megmondom őszintén, kedvet kaptam egy teljesítmény mérő elkészítésére. Hobbi szinten foglalkoztat a téma, nem tanultam C nyelvben programozni. Beszereztem az MPLAB C18 fordítót, van már HI-Tech fordítóm is, és immáron a mikroC is. Próbálgattam mindegyiket, de a legkönnyebben átlátható számomra a mikroC. Ezért elkészítettem életem első végre valamit csináló programját...
A miértek, hogyanok topicba is írtam, potyo erre a fórumra terelt át, és olvasgattam már sok mindent is, de nem áll össze a kép. Hogy kell az időzítőket használni, megszakításokat konkrétan kezelni az én problémámra...

Azt már tudom, hogy a delay függvényt kerülni kell, időzítőt kell indítani. De hogy tudom megvillogtatni a LED-et, ha a feltétel teljesül úgy, hogy ne kelljen kivárni azt az időt amíg a LED ki/be kapcsolgat?!

  1. // Lcd beállítása
  2.  
  3. sbit LCD_RS at LATC7_bit;
  4. sbit LCD_RW at LATC6_bit;
  5. sbit LCD_EN at LATC5_bit;
  6. sbit LCD_D4 at LATB4_bit;
  7. sbit LCD_D5 at LATB5_bit;
  8. sbit LCD_D6 at LATB6_bit;
  9. sbit LCD_D7 at LATB7_bit;
  10.  
  11. sbit LCD_RS_Direction at TRISC7_bit;
  12. sbit LCD_EN_Direction at TRISC5_bit;
  13. sbit LCD_RW_Direction at TRISC6_bit;
  14. sbit LCD_D4_Direction at TRISB4_bit;
  15. sbit LCD_D5_Direction at TRISB5_bit;
  16. sbit LCD_D6_Direction at TRISB6_bit;
  17. sbit LCD_D7_Direction at TRISB7_bit;
  18.  
  19. sbit LCD_BCK at LATB3_bit;
  20. sbit LCD_BCK_Direction at TRISB3_bit;
  21.  
  22. // Lcd beéllítás vége
  23.  
  24.  
  25. unsigned long int ADC_Value1, ADC_Value2, Voltage, Ampere, POWER;
  26.  
  27. char *display_v1 = "U=00.0V";
  28. char *display_v2 = "I=00.0A";
  29. char *display_v3 = "POWER  =>   000W";
  30.                
  31. char txt2[] = " SP LCD POWER ";
  32. char txt3[] = "ver 1.1";
  33.  
  34. void main() {
  35.  
  36.      ADC_init();
  37.  
  38.      TRISA = 0b00001011;
  39.      TRISB = 0b00000000;
  40.      TRISC = 0b00000000;
  41.  
  42.     // ADCON1=0x05;   //Külső referencia (Vref+) ha szükséges
  43.  
  44.      LCD_RW_Direction = 0;
  45.      LCD_RW = 0;
  46.  
  47.      delay_ms(500);
  48.        
  49.      Lcd_Init();        
  50.      Lcd_Cmd(_LCD_CLEAR);            
  51.      Lcd_Cmd(_LCD_CURSOR_OFF);      
  52.  
  53.      LCD_BCK_Direction = 0;
  54.      LCD_BCK = 1; //LCD háttérvilágítás bekapcsolása...
  55.  
  56.   Lcd_Out(1,2,txt2);             //DEMO szöveg kiiratása    
  57.   Lcd_Out(2,5,txt3);             //DEMO szöveg kiiratása
  58.              
  59.   Delay_ms(3000);
  60.  
  61.   Lcd_Cmd(_LCD_CLEAR);          
  62.  
  63.  
  64. do {
  65.  
  66.  
  67.    ADC_Value1 = ADC_Read(0);        
  68.    Voltage = (5000 * ADC_Value1 / 1023) * 10;    //AD értékének Feszültséggé alakítása
  69.    
  70.    ADC_Value2 = ADC_Read(1);        
  71.    Ampere = (5000 * ADC_Value2 / 1023) * 4;    //AD értékének Árammá alakítása
  72.    
  73.    POWER = (Voltage * Ampere) / 1000000;      //Teljesítmény számítás
  74.  
  75.  
  76.    display_v1[2] = Voltage /10000 +48 ;
  77.    display_v1[3] = (Voltage /1000)%10 +48;
  78.    display_v1[5] = (Voltage /100)%10 +48;
  79.  
  80.    Lcd_Out(1,1,display_v1);
  81.    
  82.    display_v2[2] = Ampere /10000 +48 ;
  83.    display_v2[3] = (Ampere /1000)%10 +48;
  84.    display_v2[5] = (Ampere /100)%10 +48;
  85.  
  86.    Lcd_Out(1,10,display_v2);
  87.  
  88.    //display_v3[11] = POWER /1000 +48 ; //Ha szükséges 4 számjegyű kijelzés 1000W felett...
  89.    display_v3[12] = (POWER /100)%10 +48;
  90.    display_v3[13] = (POWER /10)%10 +48;
  91.    display_v3[14] = (POWER /1)%10 +48;
  92.    Lcd_Out(2,1,display_v3);
  93.  
  94.    delay_ms(50);
  95.  
  96.    
  97.    if (POWER >= 800){    //LCD megvillogtatása 800W felett
  98.    LCD_BCK = 0;
  99.    delay_ms(500);
  100.    LCD_BCK = 1;
  101.    delay_ms(500);
  102.    }
  103.    else{}
  104.  
  105.   } while(1);
  106.  
  107. }
(#) Attila86 válasza _vl_ hozzászólására (») Szept 19, 2013 /
 
Az első két sor üres, ott csak nyomtam két entert. Ide meg nem másoltam be mert gondoltam minek.
(#) Attila86 válasza pepe1125 hozzászólására (») Szept 19, 2013 /
 
Szia!

Én készítettem a PIC-es panelmérőket és én írtam a szoftverüket is. De nem C-ban hanem assembly-ben. Amiket most másolgatok be ide kódrészletek, abban csak azért van benne a "PIC-es panelmero III" név mert ennek az áramkörnek az egyik prototípus-paneljére írom (írnám) ezt a C programot és majd ha mindent tudok C-ül akkor végül ténylegesen a panelmérő III lesz majd. Bár megjegyzem a panelmérő III szoftvere kb 95%-ban készen van assembly-ben, ezt csak azért csinálom hogy megtanuljam a C nyelvet.
(#) Attila86 válasza potyo hozzászólására (») Szept 19, 2013 /
 
A void-os sor után nincs semmi. Az extern sor kitörlésével nem változott semmi a hibaüzenet tekintetében.
(#) pepe1125 hozzászólása Szept 19, 2013 /
 
Gratulálok hozzá! Szép munka!

Én is csak a C nyelv tanulása miatt gyúrom a dolgot. De már itt az elején ilyen problémákba ütközök... Kicsit magas nekem ez a nyelv.
(#) kissi válasza Attila86 hozzászólására (») Szept 19, 2013 /
 
Idézet:
„Van egy új sor a void-os sor után?”
Azért írta potyo, mert kell egy üres sor ( az első próbálkozásaimnál én is így jártam !)!
(#) Attila86 válasza pepe1125 hozzászólására (») Szept 19, 2013 /
 
Köszi. Ahogy látom egyenáramú teljesítménymérő lesz. Az nem lesz annyira nehéz, csak szorozni kell hozzá!
Én AC teljesítmény-mérőn dolgozom most, na az már nem piskóta! Figyelni kell a nullátmeneteket, teljes periódusokat mintavételezni, aztán pillanatértékek szorzatát és valódi effektív-értéket számolni, ezekből hatásos és látszólagos teljesítményt kiszámítani, pitagorasz tétellel meddő teljesítményt számolni, kis trigonometriával cosFI-t... Ráadásul mindezt assembly-ben. Nem véletlen próbálkozom a C-vel.
(#) Attila86 válasza kissi hozzászólására (») Szept 19, 2013 /
 
Ohh, köszönöm! Érteni nem értem de nem is érdekel, a lényeg hogy most jó.
A hozzászólás módosítva: Szept 19, 2013
(#) kissi válasza Attila86 hozzászólására (») Szept 19, 2013 /
 
Én sem tudom, hogy miért kell, de így megy ! Annak idején én is néztem egy darabig, hogy mi maradt bent !
(#) pepe1125 válasza Attila86 hozzászólására (») Szept 19, 2013 /
 
Váltakozóáramú meg sem fordult a fejemben Ez jó lesz a kis kapcsiüzemű tápomhoz a végfokba... Már így is jó, csak tovább akarok fejlődni, hogy működik az interrupt...

Amúgy assembly-ben le a kalappal ha a 95%-át megcsináltad. Az nagyon nagy meló!
Ezzel is amit én csinálok már egy jó ideje szívatom magam.
A hozzászólás módosítva: Szept 19, 2013
(#) Hp41C válasza pepe1125 hozzászólására (») Szept 19, 2013 / 1
 
Idézet:
„Ampere = (5000 * ADC_Value2 / 1023) * 4; //AD értékének Árammá alakítása”

Idézet:
„Voltage = (5000 * ADC_Value1 / 1023) * 10; //AD értékének Feszültséggé alakítása”

Az átalakított mennyiségel alsó bitjei mindig 0 -k lesznek...
  1. Ampere = (5000 *  4 * ADC_Value2 / 1023;    //AD értékének Árammá alakítása
  2. Voltage = (5000 * 10 * ADC_Value1) / 1023;    //AD értékének Feszültséggé alakítása

Így azokban a bitekben is értékes információ lesz.

Azt a rengeteg osztást, ami a decimálisre való alakításban van, lehetne csökkenteni.
A hozzászólás módosítva: Szept 19, 2013
Következő: »»   81 / 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