Fórum témák

» Több friss téma
Fórum » PIC programozása C nyelven, C-Compiler
Lapozás: OK   71 / 153
(#) potyo válasza miklosch hozzászólására (») Márc 6, 2013 /
 
A linker scriptet kell szerkesztened, hogy egybefüggő területként kezeljen több memóriabankot. Az alap script 256 bájttól nagyobb egybefüggő struktúrát nem enged. Fejlből nem tudom, hogyan kell, de keresgess a pices témákban a linker scriptre, volt már többször róla szó.
(#) Hp41C válasza potyo hozzászólására (») Márc 6, 2013 /
 
Szia!
Az MpLab -ban van lehetőség a project állományban definiálni szimbólumot is. Hozz létre annyi project állományt, ahány verziód van, mindben definiálj azonos névvel, de eltérő értékkel egy szimbólumot. Ezt a szimbólumot vizsgáld feltételes fordítási direktívákkal.
A hozzászólás módosítva: Márc 6, 2013
(#) potyo válasza Hp41C hozzászólására (») Márc 6, 2013 /
 
Igen, pontosan ezt csináltam
(#) AZoli hozzászólása Márc 12, 2013 /
 
Sziasztok!

LCD-t szeretnék vezérelni PIC-el, a busy-t felhasználva, de ez nem megy.
LCD: Link

Busy nélkül így tökéletes:
  1. void LCD_SEND (void)  
  2.         {      
  3.                 LATB = (LATB & 0xFF00) | (LCD_Send_data & 0x00FF); //LATB felső 8 bitja érintetlen marad..
  4.                 _E = 1;
  5.  
  6.                 unsigned int wait;  //lokális változó       
  7.                 for (wait=0 ; wait < LCD_Send_wait; wait++)
  8.                 {
  9.                         Nop (); //várakozás  
  10.                 }
  11.                 _E = 0;
  12.         }


Így viszont valamint rosszul csinálok: össze-visszaságok jelennek csak meg..
  1. void LCD_SEND (void)  
  2.         {      
  3.                 unsigned int wait = 0;  
  4.                 unsigned int _RSSave = 0;      
  5.                 _E = 1;
  6.                 LATB = (LATB & 0xFF00) | (LCD_Send_data & 0x00FF); //LATB felső 8 bitje érintetlen marad..
  7.                 Nop ();
  8.                 Nop ();
  9.                 _E = 0;
  10.                
  11.                 Nop (); //várakozás  
  12.                 //*** Busy teszt:
  13.                 TRISB = TRISB | 0x00FF ; //TRISB felső 8 bitja érintetlen marad.. alsók bemenet..
  14.                 if (_RS == 0) _RSSave = 0;
  15.                 else _RSSave = 1;
  16.                 _RS = 0;
  17.                 _RW = 1; //Olvasás
  18.                 _E = 1;
  19. LCD_Send_wait = 1000;
  20.                 for (wait=0 ; ((PORTBbits.RB7 == 1) && (wait < LCD_Send_wait)); wait++) // //Amíg foglalt, addig keringünk, de max LCD_Send_wait
  21.                 {
  22.                         _E = 0;
  23.                         Nop ();
  24.                         Nop ();
  25.                         Nop ();
  26.                         _E = 1;                
  27.                 }
  28.                 _E = 0;
  29.                 _RW = 0; //Írás
  30.                 TRISB = TRISB & 0xFF00; //TRISB felső 8 bitje érintetlen marad.. alsók kimenet
  31.                 if (_RSSave == 0) _RS = 0;
  32.                 else _RS = 1;
  33.         }
(#) _vl_ válasza AZoli hozzászólására (») Márc 12, 2013 /
 
Idézet:
„//LATB felső 8 bitja érintetlen marad..”

Nem írtad, de akkor ezek szerint nem 8-bites a PIC-ed...
(#) AZoli válasza _vl_ hozzászólására (») Márc 12, 2013 /
 
Így van, 16 bites. 30F6012A és a "bitja" az bitje akart lenni..
A hozzászólás módosítva: Márc 12, 2013
(#) icserny válasza AZoli hozzászólására (») Márc 12, 2013 / 1
 
  1. if (_RS == 0) _RSSave = 0;
  2.                 else _RSSave = 1;
helyett így írnám:
  1. _RSSave = _RS


A BUSY flag ellenőrzését meg valahogy így:
  1. _RS = 0;
  2.   _RW = 1;
  3. TRISB = TRISB | 0x00FF;
  4. wait = 1000;
  5. do {
  6.       _E = 1;
  7.       flag = _RB7;
  8.       _E = 0;
  9.  
  10.      } while(flag && wait--)


4-bites vezérlésre ezen az oldalamon találsz példát foglatság figyelésre.
(#) AZoli válasza icserny hozzászólására (») Márc 12, 2013 /
 
Igen, valóban sokkal szebb így. Köszi!

És így végre működik is:
  1. void LCD_SEND (void)  
  2.         {      
  3.                 unsigned int _RSSave = 0;      
  4.                 unsigned int flag = 0;
  5.                 //*** Busy teszt:
  6.                 _E = 0;
  7.                 _RSSave = _RS;
  8.                 _RS = 0;
  9.                 TRISB = TRISB | 0x00FF ; //TRISB felső 8 bitje érintetlen marad.. alsók bemenet..
  10.                 _RW = 1; //Olvasás
  11.                 LCD_Send_wait = 200;
  12.             do
  13.                 {
  14.                 _E = 1;
  15.                         Nop ();
  16.                 flag = _RB7;
  17.                 _E = 0;
  18.             } while(flag && LCD_Send_wait--);
  19.                 //*** Send:
  20.                 _RS = _RSSave;
  21.                 _RW = 0; //Írás
  22.                 TRISB = TRISB & 0xFF00; //TRISB felső 8 bitje érintetlen marad.. alsók kiment
  23.                 LATB = (LATB & 0xFF00) | (LCD_Send_data & 0x00FF); //LATB felső 8 bitje érintetlen marad..
  24.                 _E = 1;
  25.                 Nop (); //várakozás  
  26.                 Nop (); //várakozás  
  27.                 _E = 0;
  28.         }
(#) mps hozzászólása Márc 12, 2013 /
 
Sziasztok! Az lenne az én kérdésem, hogy miként tudom össze hozni a C-t és az ASM-et. A konkrét problémám (Lehet, hogy nem is igazán ebbe a topicba illik.):
  1. #asm
  2.         MOVLW 0x07 ;
  3.         MOVWF 0x1F      ;CMCON
  4.        
  5. #endasm

Ez így lefordul, ám ha a CMCON-t írom a címe helyére már azt írja, hogy nincs is ilyen. Hitec fordítórol van szó.
Miéelőtt felvetődig a jogos kérdés, hogy mi értelme van, tudom, hogy alapból semmi, csak most van időm és próbálom a két nyelvet kombinálni, ha egyszer szükségem lesz rá ne akkor keljen kapkodni
Előre is köszi a segítséget!
A hozzászólás módosítva: Márc 12, 2013
(#) mps válasza mps hozzászólására (») Márc 12, 2013 /
 
Megoldódott egy #include <caspic.h> sorral.
(#) AZoli hozzászólása Márc 17, 2013 /
 
Sziasztok!

MPLAB C30 PIC30F6012A
Miért nem tetszik a felső sor a fordítónak, és ha már nem jó, akkor miért eszi meg az alsót?
(mintha 0xE -re végződő számokkal szivatna csak.. végigpróbáltam elég sokat)
  1. LCD_Update = __builtin_tblrdl(0xF05E+((Active_MAP - 1) * 32));
  2. LCD_Update = __builtin_tblrdl(0xF05C+((Active_MAP - 1) * 32));


Idézet:
„2809:34: error: invalid suffix "+" on integer constant”
(#) _vl_ válasza AZoli hozzászólására (») Márc 17, 2013 / 1
 
Tegyél szóközt a + elé és mögé (ez amúgy is javítja az olvashatóságot).
(#) AZoli válasza _vl_ hozzászólására (») Márc 17, 2013 /
 
Köszi, működik.
De miért csak "E" -nél problémázik?
(#) _vl_ válasza AZoli hozzászólására (») Márc 17, 2013 /
 
E+, E-, ha ezek szerepelnek benne, akkor probléma van.
Bővebben: Link
Idézet:
„Strange as it may seem, the behavior is correct, and mandated by the C Standard. 0x00E-0x00A is a single preprocessor token, of type pp-number, and it must become a single compiler token, but it can't. The gotcha is the `E-' sequence, that makes it seem like the exponent notation of floating-point constants.”
(#) watt hozzászólása Márc 30, 2013 /
 
Sziasztok! Elakadtam egy struktúrán. Szükségem lenne egy "128 bites" változóra, amin belül különböző számú bit csoportok hordoznak információt. Hogyan lehetne ezt struktúrálni? Gondoltam bájtokból felépíteni egy olyan struktúrát, amire együtt lehetne hivatkozni egy másik struktúrában, hogy bitcsoportokat lehessen deklarálni, illetve programból kezelni. A bitcsoportokat alkotó bitek átcsúszhatnak egyik bájtból a másikba, még is összetartozó információt hordoznak. Az adatokat bájtonként tölteném fel, de bitcsoportonként értelmezném.
Köszi!
(#) _vl_ válasza watt hozzászólására (») Márc 30, 2013 /
 
Erre nincs a C-ben egyszerű megoldás, ha a bitcsoportok a C-ben definiált legnagyobb integer méretének határain átnyúlnak. Továbbá sok értelme sincs, ha a CPU által egységként kezelt legnagyobb integer határokon átnyúlnak, azaz ha 8-bites a PIC-ed, akkor már a short meg a sima unsigned használata is csak a kód átláthatóságát növeli, hiszen a CPU nem tudja egyben betölteni a byte-nál nagyobb részt, hogy kiszedje a kívánt bit-mezőt.
Lehet írni makrókat, amik a bittologatásokat és AND/OR műveleteket elvégzik, és akkor nem lesz ronda a kód. Gyors mondjuk sehogyse lesz...
(#) watt válasza _vl_ hozzászólására (») Márc 30, 2013 /
 
Szia! Ez nem hangzik valami bíztatóan! A sebesség nem gond, csak egy regisztertömeget kell értelmezni ritkán. Kényelmes lett volna, de közben látom, hogy még az is gondot okoz egy long változó esetében, hogy ha átnyúlik két bájton a struktúra bitegysége, vagy hosszabb, mint 8 bit.
A bittologatás lehet, hogy jó megoldás lesz, elég gáz, de egyszerűbb, mint bájtonként kisilabizáltatni az átnyúlókat. Köszi!
(#) anemo hozzászólása Ápr 1, 2013 /
 
Sziasztok!

Segítséget szeretnék kérni: PIC18F4550-et a CCS-sel programozom, egyelőre virtuálisan. USB bootloader-t szeretnék beleégetni, gondolom az ex_usb_bootloader.c hex fájlját kell egy az egyben használni. Használta ezt már valaki? Nem találtam róla minimális hardver rajzot, hogy a boot gombnak hol kell lennie (MicroChipnél ugye B4).

Ha sikerült a bootloadert beleégetni, akkor a PIC-et USB HID kapcsolathoz használnám (Visual C#). Ha új szoftververziót szeretnék felrakni a PIC-re, akkor a SIOW.EXE-vel tehetem ezt meg?

Köszönöm előre is!

(szerk: ha ez a topic a MCIP C-compilerével foglalkozik, akkor elnézését kérek, és szóljatok )
A hozzászólás módosítva: Ápr 1, 2013
(#) kissi válasza anemo hozzászólására (») Ápr 1, 2013 /
 
Szia!
Miért nem keresel rá : Bővebben: Link ?!
(#) anemo válasza kissi hozzászólására (») Ápr 1, 2013 /
 
Hello!
Köszi, a keresőt én is ismerem. Tavalyig visszanéztem már a linkelt topicot, nem volt szó a bootloader konkrét megoldásáról. Ennek a topiknak az elején pedig olvastam CCS-t, ezért bátorkodtam itt megkérdezni.
A hozzászólás módosítva: Ápr 1, 2013
(#) watt válasza anemo hozzászólására (») Ápr 1, 2013 /
 
Tehát ismerted a topicot még is itt kérdezel. Nem értem a logikádat!
(#) anemo válasza watt hozzászólására (») Ápr 1, 2013 /
 
Igen, de úgy gondoltam ez redundáns topic. De akkor elnézést.
(#) cassis hozzászólása Ápr 3, 2013 /
 
  1. const unsigned char hello[]={"kiskutya \r\n"};
  2. unsigned char   *TXPtr;
  3. int a;
  4.  
  5. int main (void)                        
  6. {
  7. U1MODE=0x8000;
  8. U1STA=0x0000;
  9. U1BRG=25000;                            // ((Fcy/16)/BAUD-1) : érték találomra
  10. TXPtr=&hello [0];
  11. U1STAbits.UTXEN=1;
  12. a=0;
  13.  
  14. while (1)
  15. {
  16.   while (a<2)
  17.   {
  18.  U1TXREG= *TXPtr++;
  19.  a++;
  20.   }
  21.  
  22. a=0;
  23. TXPtr=&hello[0];
  24. }


A fenti kódnak alapvetően nincs értelme, csupán a regiszterek és a pointer viselkedését vizsgáltam vele. Ez utóbbival viszont gondom akadt.
Debuggert használva látom, hogy először a TXPtr felveszi a 0x8294 címet, majd mikor a while (a<2) sorhoz ér a TXPtr értéke 0xFFFF re változik.
Mikor kikerül a belső While ből, a TXPtr=hello val ismét helyreáll a TXPtr és 0x8294 lesz.
Mi történik a while sorban? Miért van hatása a pointermutatóra?
Processzortípus: p24FJ256GA106. És még annyi, hogy a hello tömb elemeit meg szerettem volna nézni, de nem találom. A program memóriában kerestem a megadott címnél, de ott semmi nem volt. Akkor hol van?
A hozzászólás módosítva: Ápr 3, 2013
(#) zoox hozzászólása Ápr 6, 2013 /
 
Sziasztok.
CCSC . PIC16f886 Interrupt-al van némi gondom.RB7(vagy bármelyik RBxx lábon nem akar jól müködni az interrupt , azaz nem akar kilépni az az IT-ből.
Kod:
  1. #include <16f886.h>
  2.  
  3. #include <stdlib.h>
  4. #include <math.h>
  5. #include <stdio.h>
  6. #include <string.h>
  7.  
  8. #FUSES NOWDT,INTRC_IO, NOPROTECT, NOBROWNOUT
  9.  
  10. int x=0;
  11. #use delay(clock=8000000)
  12. #int_rb
  13. void RBinterrupt()
  14.         {
  15.  
  16.         output_high(PIN_C0);           
  17.         }
  18. void main(viod)
  19. {
  20.                 setup_oscillator(OSC_8MHZ | OSC_INTRC);
  21.                 port_b_pullups(0xff);
  22.                 setup_adc_ports (no_analogs);          
  23.                  
  24.                 enable_interrupts(INT_RB7);    
  25.                 enable_interrupts(GLOBAL);
  26. //              SET_TRIS_B(0b11111111);
  27.  
  28.        
  29. while(1)
  30.                 {
  31.        
  32.         output_low(PIN_C0);    
  33.        
  34.                 }                      
  35. }

szoval szimuláltam MPLAB-ban több verben is (belső sim, PROTEUS) de mindig ugyan az történik.RB7 portot lehuzom L re akkor IT generálódik de ettöl kezdve nem lép ki az IT-ből és nem értem miért.Megnéztem az ASM kodját is és az INTCOM regoszter RBIF bit törlésre kerül (de a szimulációban nem törlödik BCF INTCOM,RBIF) ,szóval nem tudom hogy mit nem veszek észre,adatlapon sem találok semmit légyszi segítsetek.
(#) _vl_ válasza zoox hozzászólására (») Ápr 6, 2013 / 1
 
Az RB interruptnál az interrupt "kezelése" abból áll, hogy kiolvasod az RB értékét. Amíg nem olvasod ki, addig nem szűnik az interrupt...
(#) zoox válasza _vl_ hozzászólására (») Ápr 6, 2013 /
 
Hu tényleg müködik ,erre nem gondoltam (ASM-ben azt nem teljesen igy kellett csinálni.:bonk
Nagyon köszi magamtól nemtudom mikor jöttem volna rá.
(#) kissi válasza zoox hozzászólására (») Ápr 7, 2013 /
 
Idézet:
„(ASM-ben azt nem teljesen igy kellett csinálni”
De, ott is úgy kell csinálni, a PIC nem látja, hogy Te milyen nyelven próbálod programozni, "neki" ugyanaz a bitminta jelenti ugyanazt ( vagyis minden nyelven az ugyanazt eredményező parancsot kell kiadni ! )!
A hozzászólás módosítva: Ápr 7, 2013
(#) zoox válasza kissi hozzászólására (») Ápr 7, 2013 /
 
ASM-be én ezt mindig ugy csináltam,hogy IT vektor ORG 4 -en ,RBIF bit törése......és a végén RETFIE utasitás és már vissza is tér a főprogira.Nem kell kiolvasnom kötelezően a PORTB-t hogy visszatérjen a főprogira.A C-ben irt proginál már tudom hogy ezt muszály ,mert csak akkor tér vissza a főprogira(köszi _vl_)A CCSC fejlesztői nagyon sokat akarnak segíteni hogy könnyebb legyen a programozást de ASM után inkább nehezebb(nekem),de majd csak megtanulom ezeket is.(az sem lenne rossza ha a mintaprogijaik jól müködnének amit a HELP-ben találtam.)
(#) watt válasza zoox hozzászólására (») Ápr 7, 2013 /
 
Eleinte én is így voltam, aztán elmúlt!
(#) zoox válasza watt hozzászólására (») Ápr 7, 2013 /
 
Jó lenne ha lenne olyan leírás valahol amiben a sok-sok hasonló függvény részletesen le lenne írva ASM harmin valahány utasítását könnyü megtanulni de a C-nek nagyon-nagyon sok függvénye van ......hm... na mind1 ,igyekszem okosodni.Köszi Watt.
(ezért is szeretem a HE-t mert mindig kapok utmutatást ) Köszi ALL user!
Következő: »»   71 / 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