Fórum témák

» Több friss téma
Fórum » CCS PIC Compiler
 
Témaindító: (Felhasználó 1542), idő: Ápr 3, 2006
Lapozás: OK   71 / 118
(#) vilmosd válasza messer hozzászólására (») Ápr 3, 2012 / 3
 
Tudom egy kicsit bonyolult eloszor felfogni a struct es az union tipusok mibenletet. Ebben az esetben ugy kell felgfogni, hogy a Da_cntr egy 16 bites valtozo, es ugynarra a cimre deklaraltuk a struct valtozot. Amikor a struct reszeit valtoztataod az unionban valtoztatsz tulajdonkeppen, de a struct deklaralt valtozoival. Nagyon hasznos tud lenni pl mikor sok 1-2 bites valtozot akarsz EEPROM-ba menteni es onnan kiolvasni. Csak egy 16 bites (lehet 8 is, vagy 32 es float is) valtozot kell irni olvasni az EEPROM-bol.
(#) messer válasza vilmosd hozzászólására (») Ápr 3, 2012 /
 
Igen nagyon annak tünt elsőre de segítségeddel, türelmeddel én is megértettem. Köszönöm a segítségedet. Tetszik így nagyon kis frappáns megoldás.
(#) vilmosd válasza messer hozzászólására (») Ápr 4, 2012 /
 
Na ugye itt is lehet tanulni valamit.
(#) messer válasza vilmosd hozzászólására (») Ápr 4, 2012 /
 
Van még kérdésem. ezt a sort szeretném a programomban külön elhelyezni (main--en kívül), de nem lehet mert hibát dob a da_cntrw;-re. ennek oka miben keresendő?
(#) messer hozzászólása Ápr 4, 2012 /
 
Lényeg lemaradt

  1. dataconv()
  2. {
  3. wcrmcp4802= (da_cntrw.Da_cntr)<<4; //4bit balra
  4. msb = make8(wcrmcp4802,1);//16 bit felbontása
  5. lsb=make8(wcrmcp4802,0);*///2db 8 bit-re
  6.  
  7. }
  8.  
  9.  
  10. void main()
  11.     {
  12.     setup_spi(SPI_MASTER | SPI_XMIT_L_TO_H | SPI_CLK_DIV_16);
  13.  
  14.  
  15.     union
  16.     {
  17.        int16 Da_cntr;
  18.        struct
  19.        {
  20.        intvalue:8;//DAC Input Data bits.
  21.        intshdn:1;//Output Shutdown Control bit
  22.        int ga:1;//Output Gain Selection bit
  23.        int na1:1;//bit void
  24.        int a_b :1;//DACA or DACB Selection bit
  25.        intna4:4;//4 bit void
  26.        };
  27.     }da_cntrw;
  28.      
  29.     da_cntrw.value=200;// data to DAC
  30.     da_cntrw.a_b=0;// chanel A
  31.     da_cntrw.ga=0;//gain 1x
  32.     da_cntrw.shdn=1;// chanel a active
  33.  
  34.  
  35. dataconv();




  1. Executing: "C:\Program files\Picc\CCSC.exe" +FM "learn.c" +DF +LN +T +A +M +Z +Y=9 +EA  #__12F1822=TRUE
  2. *** Error 12 "learn.c" Line 25(14,22): Undefined identifier   da_cntrw
  3. *** Error 51 "learn.c" Line 27(26,27): A numeric expression must appear here
  4.       2 Errors,  0 Warnings.
  5. Halting build on first failure as requested.
  6. BUILD FAILED: Wed Apr 04 09:54:34 2012
(#) vilmosd válasza messer hozzászólására (») Ápr 4, 2012 / 1
 
Az uniont nem latja a dataconv fveny. A main belso valtozoja. At kellene irni a dataconv() fvenyt valami ilyesmire : dataconv(int16 x) es mikor a mainbol hivod, akkor atadod neki a kivant valtozot, vagy erteket.
  1. void datavonv (int16 x)  // nincs visszateresi erteke, int16 ertekkel hivni.
  2. {
  3.     wcrmcp4802= (x)<<4;
  4.     .
  5.     .
  6. }
  7.  
  8.  
  9. void main()
  10. {
  11. .
  12. .
  13. .
  14. .
  15. dataconv(da_cntrw.Da_cntr);
  16. }

Esetleg az union deklaraciot kiteszed az elejere global valtozonak, es akkor mindenki latni fogja.
(#) vilmosd válasza messer hozzászólására (») Ápr 4, 2012 /
 
Epp most linkeltek a "PIC haladoban: C konyv Olvasgasd szorgalmasan.
(#) vicsys válasza czinka hozzászólására (») Ápr 4, 2012 /
 
Idézet:
„zip' is unavailable. This file was deleted.”
(#) messer válasza vilmosd hozzászólására (») Ápr 4, 2012 /
 
Igeeen így már jó azért tőletek sem rosszabb tanulni mint tankönyvekből. Lementettem a linket, köszönöm még egyszer a segítségedet.
(#) pontazok hozzászólása Ápr 12, 2012 /
 
Sziasztok!
Bár már egy LCD kijelzővel foglalkozó fórumba feltettem ezt a kérdést. Most felteszem ide is mert a programommal van probléma.
A lényeg hogy van egy 4x20 karakteres lcd kijelzőm.
PHICO D-0 0529 94V.
A vezérlője vagy hd44780 vagy hd 66712.
Na de ami fontosabb. Akárhogy inicializálom a kijelzőt.
A 12ik karakter utáni rész a következő sorban is megjelenik. Az adatlapban van valami leírás hogy a 13-20ik karakterig egy "EXTENSION DRIVER" vezérel, de pontosan ez nemtudom mit jelent és hogy hogy kéne ezt beleírni a driver-be. Természetesen CCS-ben írok programot.
Ha valaki tud kérem segítsen!
(#) whalaky válasza pontazok hozzászólására (») Ápr 13, 2012 /
 
Milyen programmal próbálod meghajtani?
Nálam a sorok címe (1-4) 0x80 0xc0 0x94 0xd4
(#) pontazok válasza whalaky hozzászólására (») Ápr 13, 2012 /
 
Próbáltam már a CCS beépített drivereivel, univerzális driverekkel(flex_lcd.c) átírtam sokféleképpen a címeket de nem akar jó lenni.
(#) pontazok válasza whalaky hozzászólására (») Ápr 13, 2012 /
 
Igazából kezdek kétségbe esni mert akárhogy címzem a sorokat, mintha nem is csinálnék semmit. A sorok ugyanott maradnak és a hiba sem tűnik. Egy-két oszlop beállításnál szélsőséges dolgok történnek pl: a kijelző közepére kezd kiiratni. Vagy fura kontrasztos a felső két sor.
(#) whalaky válasza pontazok hozzászólására (») Ápr 13, 2012 /
 
A kétségbeesés nem sokat lendít a helyzeteden, inkább próbáld megérteni a működését, az előrébb visz
Az include-nak add meg hogy hol keresse az lcd drivert, mert hajlamos rá hogy a sajátját használja ha nincs megadva elérési út, az pedig csak két sorost kezel (bár lehet hogy verzioó függő). Tényleg hanyas CCS?
Ha hazaérek megkeresem és feltolom ha addig nem oldódik meg.
Nem emlékszem bztosan hogy 4x16 vagy 4x20, de a címekből ítélve 4x20-as....
(#) whalaky válasza pontazok hozzászólására (») Ápr 13, 2012 /
 
Sajnos jól emlékeztem, 4x16-os

Szerintem ha a CGRAM, DDRAM ot kijavítod az adatlapnak megfelelően (lehet hogy nem is kell hozzányúlni) és az lcd_gotoxy-ban a sorok kezdőcímét szintén az adatlap szerint működnie kell. Nekem ezzel ment a 4*16-os.
Próba cseresznye....

flex_lcd416.c
    
(#) pontazok válasza whalaky hozzászólására (») Ápr 15, 2012 /
 
Köszönöm a forrást. Majd nekilátok estefelé.
(#) cmdnetwizard hozzászólása Ápr 16, 2012 /
 
Sziasztok!
Egy gyors kérdésem volna, mégpedig, hogy a PIC16F628 -on a belső osc-t hogy tudom beállítani?
Köszönöm!
(#) vilmosd válasza cmdnetwizard hozzászólására (») Ápr 16, 2012 /
 
A 16F628.h fileban talalhato kulcsszavakat kell alkalmazni.
  1. #include <16F628.h>
  2. #fuses INTRC_IO,NOWDT,NOPROTECT,NOLVP, NOMCLR
  3. #use delay(clock=4000000)
(#) cmdnetwizard válasza vilmosd hozzászólására (») Ápr 16, 2012 /
 
Ahham! Köszönöm!
De szerintem majd még lesz néhány kérdésem...
(#) szuperman hozzászólása Ápr 20, 2012 /
 
Helló mindneki!

Van egy PIC 16f628a -m és egy ledem. A led fényerejét szeretném szabályozni a PIC -el. Valahogy sehogy sem jön össze. Tudom ,hogy megfelelő időközönként kell ki-be kapcsolgatni ,de valamiért vagy nem látszik semmi változás a fényerőn vagy pedig látszik a villogás. Valaki be tudna linkelni egy működő programot?

Előre is köszi!
(#) _vl_ válasza szuperman hozzászólására (») Ápr 20, 2012 /
 
TRISB3 = 0;
PR2 = 95;
T2CON = 0;
CCPR1H = 0;
CCPR1L = 10;
TMR2ON = 1;
CCP1CON = 0x0c;

Ez 14.7456MHz-es kvarc esetén 38400Hz-cel fogja villogtatni a LED-et (az RB3/CCP1 kimenetre kell kötni, előtét ellenállással!), a fényerőt a CCPR1L-be írt számmal tudod szabályozni. A szám 0 és a PR2-be írt szám között állítható, ha 0, akkor végig 0 lesz a kimenet, ha >PR2, akkor meg végig 1, közötte meg lineárisan változik a bekapcsolt állapotban eltöltött idő.

Ha nem ennyi az órajel, akkor arányosan változni fog a frekvencia; ha audió cucc is van a környéken, akkor 25-30kHz alá nem kéne vele menni, mert hallható lehet az audiókimeneten ez a freki. A PR2 változtatásával lehet a frekvenciát állítgatni, de persze akkor változik a 100%-hoz tartozó érték a CCPR1L-nél is.

A pontos frekvencia: az órajel / 4 / (PR2+1)

(nem próbáltam ki 628-cal, de egy 16F887-esben futó tesztprogramból van a kódrészlet, és ott működött)
(#) szuperman válasza _vl_ hozzászólására (») Ápr 20, 2012 /
 
Ezt nem tudnád esetleg CCS -ben elírni, mert így nem értek belőle semmit.
(#) vilmosd válasza szuperman hozzászólására (») Ápr 20, 2012 /
 
Elvileg a Te szamitogepeden van CCS mintapelda PWM kezelesre. A neve ex_pwm.c. Ez egy AD csatornat olvas be, es ezzel valtoztatja a kitoltesi tenyezot. Persze a 16F628-ban egynel kevesebb az AD csatorna, de a mintapeldaban az AD ertek helyett fix szamot lehet beirni, es ezzel lehet valtoztatni a kitoltesi tenyezot.
(#) szuperman válasza vilmosd hozzászólására (») Ápr 20, 2012 /
 
Hát nem tudom. Átírtam kézzel az értéket, de mind1 mit írok be ugyan az az eredmény. Villog párat a led, aztán folyamatosan kezd világítani.
(#) vilmosd válasza szuperman hozzászólására (») Ápr 20, 2012 /
 
Esetleg feltenned a programot, hogy lassuk mitol nem mukodik.
(#) szuperman válasza vilmosd hozzászólására (») Ápr 20, 2012 /
 
Csak átírtam a value változót, ha jól értem ez szabályozza ,hogy mennyire világítson a ledem.
(#) vilmosd válasza szuperman hozzászólására (») Ápr 20, 2012 /
 
Probald valahogy igy:
  1. if ( interrupt_active(INT_TIMER2))
  2. {
  3.      clear_interrupt(int_timer2);
  4.      set_pwm1_duty(duty);          
  5.      duty++;
  6.      if (duty== 1023) duty=0;
  7. }
Ez a kod noveli duty-t 1023-ig, majd ujra kezdi 0-tol. Csak akkor irja ujra, amikor lejart a TMR2.
(#) sysy válasza vilmosd hozzászólására (») Ápr 20, 2012 /
 
Ez így azért nem lesz jó szupermannak, mert egy pillanat alatt (főleg, ha néhány kHz a PWM freki) teleíródik a duty változó és csak villogó LED-et fog látni.
Inkább ezt ajánlom:

  1. long  DUTY;
  2.  
  3.   while(TRUE)
  4.   {
  5.      delay_ms(10);
  6.      set_pwm1_duty(++DUTY&0x03FF);
  7.   }

a delay argumentumával be elehet állítani, hogy milyen gyorsan változzon a kitöltési tényező/fényerő.
És nem kell megszakítás sem, meg interrupt flag figyelés, meg semmi sem.

That's all folks!

off: hogyan kell ilyen szép kódokat írni, hogy tabulátorokat is lehessen bele tenni?
(#) _vl_ válasza sysy hozzászólására (») Ápr 20, 2012 /
 
Nade minek folyamatosan tekerni a duty-t? Be kell állítani a fényerőnek megfelelő értékre, aztán örülni a megfelelő fényerővel világító LED-nek...
(#) vilmosd válasza _vl_ hozzászólására (») Ápr 20, 2012 /
 
Ez demo akart lenni a mukodes kiprobalasara. Termeszetesen meg lehet cifrazni, pl 2 gombbal duty++, duty--, de azert azt inkabb a kedves kerdezo oldja mar meg.
Következő: »»   71 / 118
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