Fórum témák

» Több friss téma
Fórum » PIC programozása C nyelven, C-Compiler
Lapozás: OK   133 / 153
(#) szilva válasza otvenkilenc hozzászólására (») Aug 25, 2016 /
 
Pl. a dupla egyenlőnek az az értelme, hogy megkülönböztethető a szimpla egyenlőtől. A matematikában feltételben és "értékadásban" (hozzárendelésben) is általában az egyenlőségjelet használják (persze, van olyan is, ahol a hozzárendeléshez inkább a := formát szeretik). A C-ben mindkettő egy-egy operátor, valahogy meg kellett különböztetni, mert minden kifejezésben felhasználható mindkettő, nyilván más-más jelentéssel.

De ha már itt tartunk, az "EQ" mivel lenne jobb, "matematikaibb" az "=="-nél, ha ilyet és olyat sem használunk a kézzel írott matematikában?

Az pedig miért furcsa, hogy egy számítógépes programozási nyelvben olyan operátorok is megjelennek, amik az algebrában nem szokásosak? Pl. hogy értelmeznél a hagyományos algebrában egy olyan kifejezést, amiben logikai (boole) operátorok is vannak, vagy hogy jelölsz az algebrában egy bitenkénti logikai műveletet?

Azon is kár szerintem rugózni, hogy a különböző számrendszerekben leírt konstansokat hogyan kell a fordítónak megfogalmazni. Ezt is egyszer kell megtanulni, mint ahogy annak idején megtanultuk pl. a tizedes törteket vagy normálalakot elolvasni és értelmezni.
(#) Kovidivi válasza otvenkilenc hozzászólására (») Aug 25, 2016 / 4
 
Szerintem ne csak mára. Ha nem érted a C-t, akkor olvasd el a netről ingyenesen letölthető Programozzunk C nyelven című könyvet az elejétől fogva. Legközelebb megkérdőjelezed, hogy a német nyelvben miért a második helyen áll az ige, mekkora hülyeség? Ha nem tetszik a C nyelv, ne foglalkozz vele, de én úgy érzem, mintha irigység fogna el, hogy nem érted, nem tudsz benne programozni, és inkább le akarod húzni a sárba, ezzel elrejtve/kisebbítve a saját hibádat. De ezzel csak magadat nyugtatod meg, aki elolvassa a hozzászólásod, látja miről szól az egész.
(#) Elektro.on válasza otvenkilenc hozzászólására (») Aug 25, 2016 /
 
Ez a párbeszéd így értelmetlen. Programoztam már delphiben, php ben keveset C ben, java scriptben, De kis eltérésekkel, kevés szintaktiai különbségekkel mind így épít fel gy kódot.

A javaslatom azt, hogy maradj az assembly nél. Háta az neked jobban tetszik, és ez a topik tisztán megmarad annak amire szánták. C nyelvben segítség kérésére illetve segítség nyújtásra a tanulni vágyóknak.
(#) kissi válasza otvenkilenc hozzászólására (») Aug 25, 2016 / 2
 
Idézet:
„Miért nem lehet ezt így írni? Z=Z+1”
Ki mondta, hogy nem lehet ?!
Az előnye az, hogy rövidebb. SMS-nél és chat-elésnél használják a fiatalabbak az általad leírt rövidítéseket, pl. a "vok"-ot, sokan értik, de nem tilos az eredeti "vagyok"-at sem leírni, de hosszabb ( én sem használom a rövidebb alakot!)! Egy nyelvet ( programozási nyelv, jel nyelv, beszélt nyelv vagy egyéb ), ha megalkotnak, akkor az alkotók döntik el a szabályokat a tapasztalataik és a céljaik függvényében, ha más is szeretné használni, akkor eldönti, hogy veszi-e a fáradtságot a megismeréséhez...!
Szerintem kiveséztük a témát, gondold át és dönts, de ne fikázz egy milliók által jól használható nyelvet csak azért, mert nem vagy hajlandó megtanulni!
(#) Hp41C válasza Hp41C hozzászólására (») Aug 26, 2016 /
 
Csak magamnak írom, mert az érdekelt nem is reagál arra, amit írok.....

++ / -- művelet értelme:
Tegyük fel, hogy egy nagy programban egy függvénynek átadnak néhány jókora tömböt és még felhasznál egy rakás lokális változót is. (Aki már elakadt itt, olvassa el a már belinkelt BRIAN W. KERNIGHAN – DENNIS M. RITCHIE A C programozási nyelv könyvet - ingyenes és nem túl hosszú.) A függvény a feldolgozás során egy tömb elemeit a felhasználás után megnöveli.
Réges régen, amikor a C -t definiálták nem volt minden fordítóban optimalizálás...
  1. b[b] = a[index]
  2. a[index] = a[index] + 1;

A fordító kiszámolta az a[index] címét, kiolvasta az étéket és áttette a rendeltetési helyére. Aztán megint kiszámolta az a[index] címét, kiolvasta az étékét, hozzáadott 1 -et, aztán megint kiszámolta az a[index] címét és visszaírta...
  1. b[b] = a[index]++

A fordító kiszámolta az a[index] címét, kiolvasta az étéket és rögtön alkalmazhatta a növelést...
Összevetve nem kellett kiszámolnia többször a keresett objektum címét.
A hozzászólás módosítva: Aug 26, 2016
(#) cua válasza Hp41C hozzászólására (») Aug 26, 2016 /
 
Szamomra egyertelmu hogy csak trollkodik, teljesen felesleges torni magad.
(#) Wezuv válasza Hp41C hozzászólására (») Aug 26, 2016 / 1
 
Kettő lehetőség van.
1. Trollkodik
2. Nem ért semmit abból, amit írsz, pedig abban van a lényeg, ezért minden másra reagál, ami lényegtelen és nem arra vezet, hogy megértse a nyelvet.

Véleményem szerint az egészet majdnem offnak lehet tekinteni és törölni kellene, de lexa...
Üdv!
(#) cross51 válasza otvenkilenc hozzászólására (») Aug 27, 2016 / 2
 
Mi kérünk elnézést, hogy megsértettünk..
(#) Lamprologus válasza cross51 hozzászólására (») Aug 27, 2016 /
 
Attól tartok lemaradtam valami jó kis buliról!
Pedig már bíztam benn, hogy végre elkezdődik valami aminek a végeredménye, hogy létrejön egy programozóbarát nyelv.
(#) Kovidivi válasza Lamprologus hozzászólására (») Aug 27, 2016 /
 
Ott van a Comenius Logo, magyar nyelvű, magyar nyelvű parancsokkal. Csak hát szinte semmit nem tudsz benne megírni. A komplikáltabb programok pedig ott is ugyanolyan nehezek, elég, ha csak megnézed a néhány beépített "játékot". Bővebben: Link Ezért kell használni azt, ami jól van dokumentálva, hozzáférhető, és elterjedt, legyen az bármelyik programozási nyelv.
(#) Lamprologus válasza Kovidivi hozzászólására (») Aug 27, 2016 /
 
Na, jó ... asszem a második mondatom végére is kellett volna tennem valami szmájlit!

Alapjában véve azért én örülök a C-nek! Szoktam szidni ... de a végén mindig rájövök, hogy én voltam a hülye! Vannak szabályai, és ha nem tartom be őket, akkor nem azt csinálja amit én szeretnék ... ez van!
Vannak feladatok amiket simán megoldok vele, miközben asm-ben fogalmam sem lenne, hogy álljak neki...
(#) ativagyok hozzászólása Szept 19, 2016 /
 
Sziasztok!

Két PIC között SPI-vel szeretnék kommunikálni, de sajnos nem jön össze, pedig látszólag nagyon egyszerű.
Egyelőre a Master által küldött tetszőleges üzenetre válaszként küldené el a slave az "50"-et, de valamiért debug üzemmódban azt látom, hogy a visszakapott üzenet: "31"
Mi lehet a gond?

Master:
  1. unsigned short send, receive;
  2. void main(){
  3.      SSPSTAT.SMP=0;
  4.      SSPSTAT.CKE=0;
  5.      SSPCON.SSPEN=1;
  6.      SSPCON.CKP = 0;
  7.      SSPCON.SSPM3=0;
  8.      SSPCON.SSPM2=0;
  9.      SSPCON.SSPM1=0;
  10.      SSPCON.SSPM0=1;
  11.  
  12. do{
  13. send= 20;
  14. SSPBUF = send;
  15. receive = SSPBUF;
  16. }while(1);
  17. }

Slave:
  1. short send, receive;
  2.  
  3. void interrupt(){
  4.   if(SSP1IF_bit == 1){
  5.     receive = SSPBUF;
  6.     send = 50;
  7.     SSPBUF = send;
  8.     SSP1IF_bit = 0;  //reset interrupt
  9.   }
  10. }
  11.      SSPSTAT.SMP=0;
  12.      SSPSTAT.CKE=0;
  13.      SSPCON.SSPEN=1;
  14.      SSPCON.CKP = 0;
  15.      SSPCON.SSPM3=0;
  16.      SSPCON.SSPM2=1;
  17.      SSPCON.SSPM1=0;
  18.      SSPCON.SSPM0=1;
  19.      SSPBUF = 0;
  20.  
  21. do{
  22.  
  23. }while(1);
(#) ha1drp válasza ativagyok hozzászólására (») Szept 19, 2016 / 1
 
Azt mindenképp meg kellene várni míg megérkezik az adat kiolvasásánál.
(#) cross51 válasza ativagyok hozzászólására (») Szept 19, 2016 / 1
 
Esetleg próbáld meg ezzel a függvénnyel kezelni az spi-t:
  1. uint8 spi_io( uint8 data) {
  2. uint8 tmp;  
  3.   PIR1bits.SSPIF = 0;              // törli az interrupt jelzőbitet
  4.   SSPCON1bits.WCOL = 0;            // törli az esetleges írás ütközés hibajelzőt
  5.   tmp = SSPBUF;                    // törli a BF jelzőbitet
  6.   SSPBUF = data;                   // kirakja a kimenő adatot az SSPBUF regiszterbe
  7.   while( !PIR1bits.SSPIF );        // megvárjuk a busz ciklus végét
  8.   return (SSPBUF);                 // a vett bájttal térünk vissza
  9. }

Az uint8_t típus az unsigned char-al egyenlő.
(#) Attila86 hozzászólása Szept 19, 2016 /
 
Van a programmemóriában egy struktúratömböm, így néz ki:
  1. const MenuPont_type Menu1[] = {
  2. ...
  3. }

Ez a projekt egyik c fájljában van. Egy másik c fájlban pedig hivatkozom rá:
  1. extern const MenuPont_type Menu1[];

Ugyan ebben a c fájlban szeretnék számolgatni a struktúratömb méretével (szeretném megtudni hogy hány eleme van):
  1. b=sizeof(Menu1)/sizeof(Menu1[0]);

Viszont erre a sorra a fordító hibaüzenetet ad:
Idézet:
„error: invalid application of 'sizeof' to incomplete type 'const struct MenuPont_type[]'”

Miért? Rémlik hogy van valami korlátozás a sizeof operátor használatára de nem emlékszem...
(#) killbill válasza Attila86 hozzászólására (») Szept 20, 2016 / 1
 
Csak abban a file-ban fog ez mukodni, ahol a tombot inicializalod, hiszen csak abban a file-ban tudja a C fordito, hogy hany elemu a tombod. Az extern hivatkozas mar csak egy memoria cim, semmi tobb.
(#) ativagyok válasza cross51 hozzászólására (») Szept 20, 2016 /
 
ha1drp & cross51: Köszönöm a válaszokat.
Valamit nagyon elrontok, nem akar működni...
Ha jól gondolom, ezzel a sorral valósul meg az, hogy megvárom az adat megérkezését:
while( !PIR1bits.SSPIF );
Sajnos így sem jó, és a fenti függvénnyel sem.
Vagy a küldött adatot olvassa vissza, vagy mást...vagy volt már olyan is, hogy helyesen működött, de ugyanazt a hex-et mégegyszer felprogramozva már megint nem volt jó.
Lemaradtak a PIC típusai:
Master: PIC16F1938
Slave: PIC16F1824
(#) Attila86 válasza killbill hozzászólására (») Szept 20, 2016 /
 
Köszi! Közben megoldottam hogy működjön: A struktúratömbböt egy h fájlba tettem amit beinklúdoltam a c tetejébe.
(#) Wezuv válasza ativagyok hozzászólására (») Szept 20, 2016 / 1
 
SPI vezetékelése max 10cm és akkor már nem lehet túl gyors(10-20kHz).
(#) ativagyok válasza Wezuv hozzászólására (») Szept 20, 2016 /
 
Bőven 10cm-en belül van a vezetékelés. A sebességet lentebb vettem egy kicsit (Fosc = 4MHz, SPI clock: Fosc/64), de továbbra sem működik.
(#) cross51 válasza ativagyok hozzászólására (») Szept 20, 2016 / 1
 
Most nézem:
  1. //.....
  2. SSPSTAT.CKE=0;
  3. //..
  4. SSPCON.CKP = 0;
  5. /.....


erre írd át:
  1. //.....
  2. SSPSTAT.CKE=1;
  3. //..
  4. SSPCON.CKP = 0;
  5. /.....


Nálam ez okozta a problémát 32 biten az SD kártyánál, hátha nálad is.
A hozzászólás módosítva: Szept 20, 2016

timing.png
    
(#) ativagyok válasza cross51 hozzászólására (») Szept 21, 2016 /
 
Köszi, közben az errata-ban megtaláltam, hogy miért kell így használni és át is írtam. Viszont így sem akar működni. Több napos próbálkozás után még mindig nem tudok átvinni egy számot SPI-n...
(#) cross51 válasza ativagyok hozzászólására (») Szept 21, 2016 / 1
 
Próbáld meg master SDO-t master SDI-re, küldünk egy bájtot és megnézzük mi van az SSPBUF-ban, ha az amit küldtél akkor vagy akkor jó eséllyel a kapcsolásban van, hiba. De még mindig meg lehet, hogy sw hiba.
(#) Wezuv válasza ativagyok hozzászólására (») Szept 21, 2016 / 1
 
Nem tudom, de esetleg nézd meg, hogy mindkét PIC-ben ugyanolyan SPI modul van-e, ugyanúgy kell-e beállítani. Az biztos, hogy az SPI pofon egyszerű, ennek helyes beállítás mellett működnie kell. Csak beállítási hibát lehet sejteni (kivéve, valami bagatel hibát, amit nem tudunk úgy se kideríteni)...
(#) ativagyok hozzászólása Szept 22, 2016 /
 
cross51:
Kipróbáltam, ebben az esetben az van az SSPBUF-ban, amit küldtem. Én valami sw hibára gyanakszom, a hw-ben nem nagyon lehet elrontani semmit.

Wezuv: Az adatlap alapján nem látok különbséget a két SPI modul között. Beállítási hiba is előfordulhat.

Most az történik, hogy ha elindítom az áramkört, elkezdenek kommunikálni és azt olvassa ki a master az SSPBUF-ból, amit küldött. Viszont ha a Slave-ről leveszem a tápot, majd vissza adom, akkor átjön a kívánt adat. Első induláskor viszont sosem. Ez már biztató.
(#) ativagyok hozzászólása Szept 22, 2016 /
 
...azt tapasztaltam, hogy ha a slave pic már fut amikor a master elindul, akkor a master SDO lábán invertálva jelenik meg a jel(mintha a magas szint lenne az idle állapot). A slave újraindítása után rendbe jön a jel, és működik a kommunikáció.
(#) c27 hozzászólása Szept 22, 2016 /
 
Sziasztok!

Olyan problémám lenne hogy kb 100usec-ként fut egy megszakítás és a megszakításon kívül a main függvényben írogatni kellene egy LCD kijelzőt. A kijelzőt fix késleltetéssel használnám, de problémák vannak amikor megy a megszakítás.
C18 fordítót használok és a Delay1KTCYx függvényt. A leírásban az szerepel, hogy ez a függvény DelayCounter1 és DelayCounter2 nevű változókat használ amiket menteni kellene a megszakításkor.
#pragma interrupt Timer_ISR save=DelayCounter1, DelayCounter2 viszont ennél sornál hibát ír ki az mplab szerint nincsenek ilyen változók, akkor hogy lehetne ezeket menteni és visszaállítani? Nem találtam erről leírást.
(#) Wezuv válasza c27 hozzászólására (») Szept 22, 2016 /
 
  1. #pragma udata access ACCESS_section
  2. volatile near unsigned char DelayCounter1


Ha egy fájlon belül van a megszakítás, akkor mást nem kell tenni, ha nem, akkor globálissá kell tenni.
(#) c27 válasza Wezuv hozzászólására (») Szept 22, 2016 /
 
Ez egy kicsit tudnád részletezni?
"fájlon belül van" Ezt hogy kell érteni?
(#) pipi válasza c27 hozzászólására (») Szept 22, 2016 /
 
Hali!
Nem világos a delay függvényt hol használod?
Ha az interruptban nem használod, csak a main-ben akkor miért kellene menteni?
Ha mindkettőben használnád akkor írd meg mégegyszer új néven, új változóhasználattal a késleltetést, és nincs összeakadás.
Következő: »»   133 / 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