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   99 / 118
(#) Hp41C válasza subi hozzászólására (») Márc 31, 2014 /
 
Szia!
Jobban megnézve az adatlapot a PIR1 RCIF és TXIF bitjei fölé az "R-0" van írva. Ezek a bitek csak olvashatók. Az PIR1.RCIF -et az RCREG olvasása vagy a PIE1.RCIE törlése, a PIR1.TXIF -et a TXREG írása vagy a PIE1.TXIE törlése állítja 0 -ra. Ezt a kontroller áramköre csinálja (néhány órajel idő alatt) nem a fordító. A bitek programból való írása fölösleges. A soros vevő kettős bufferelésű, így előfordulhat, hogy az RCREG egyszeri kiolvasása nem törli az RCIF -et, ekkor egy második karakter is kész van, azt is ki kell olvasni. Ugyanígy, ha az adó már régen elkészült az adással és beírunk egy karaktert, az átkerül az adó léptető regiszterébe és a TXREG már üres is lesz, a TXIF megint 1 lesz, beírhatunk még egy karaktert.
Nagyon forntos (főleg 9 bites átvitelnél):
Az RCSTA regisztert az RCREG olvasása előtt kell kiolvasni és karakterenként csak egyszer szabad kiolvasni. Ha a feldolgozáshoz többször is kellene az érték, akkor menteni kell egy változóba.
(#) Buddha hozzászólása Márc 31, 2014 /
 
Sziasztok!
Köszönöm szépen a hozzászólásokat, a kettős pufferelés zavart meg.
Másodszor is kiolvasom a vételi regisztert és utána automatikusan törlődik.
Üdv: B.
(#) subi válasza Hp41C hozzászólására (») Márc 31, 2014 /
 
Köszönöm a kiigazítást.
Subi
A hozzászólás módosítva: Márc 31, 2014
(#) Buddha válasza Hp41C hozzászólására (») Ápr 1, 2014 /
 
Hogyan kell letiltani és újra engedélyezni a vevőt?
(#) Hp41C válasza Buddha hozzászólására (») Ápr 1, 2014 /
 
Az alábbi módszer törli a RCSTA.FERR és a RCSTA.OERR biteket is:
RCSTA.SPEN = 0; RCREG kiolvasása; RCSTA.SPEN = 1;
(#) Buddha válasza Hp41C hozzászólására (») Ápr 1, 2014 /
 
Ezt értem, de hogyan kell kivitelezni CCS C-ben?
(#) Buddha válasza Buddha hozzászólására (») Ápr 1, 2014 /
 
Asszem rájöttem:

#BIT SPEN= 0xFAB.7
...
SPEN=0;
(#) danydosster hozzászólása Ápr 13, 2014 /
 
Egy 12f629 es pic hez írtam ezt a programot mircoc pro ban, de nem csinál semmit.
Nem tudjátok mi lehet vele a gond?

  1. void main()
  2. {
  3. TRISIO = 0;
  4. do{
  5. GPIO.GP1=1;
  6. Delay_ms(1000);
  7.  
  8. GPIO.GP1=0;
  9. Delay_ms(1000);
  10. }while(1);
  11.  
  12. }
(#) potyo válasza danydosster hozzászólására (») Ápr 13, 2014 /
 
Konfigurációs bitek hiányoznak a kódból, de akár az áramkörből is hiányozhat valami.
(#) danydosster válasza potyo hozzászólására (») Ápr 13, 2014 /
 
igen, meglett, a konfigurációk hiányoztak!
Abban tud valaki segíteni, hogyan tudnám megcsinálni azt, hogy egy kapcsoló segítségével változtatni tudjam hogy melyik led villogjon!

eddig a kód így néz ki, de nagyon megy, villog az egyik de ha átkapcsolom csak megáll és nem vált át a másikra.

  1. #ifdef _PIC12F675
  2. #pragma DATA_CONFIG, _CPD_OFF & _CP_OFF  & _WDT_OFF & _BODEN_OFF & _PWRTE_OFF  & _MCLRE_OFF & _INTRC_OSC_NOCLKOUT
  3. #endif
  4.  
  5. #define v 700
  6. #define f 900
  7.  
  8. void init_ports(void) {
  9.    TRISIO = (1<<5);
  10. }
  11.  
  12. int get_key() {
  13.     if (GPIO.GP5 = 1) return 1;
  14.     return 0;
  15. }
  16.  
  17. void feher() {
  18.      GPIO = 1;
  19.      delay_ms(f);
  20.      GPIO = 0;
  21. }
  22. void voros() {
  23.      GPIO = 2;
  24.      delay_ms(v);
  25.      GPIO = 4;
  26.      delay_ms(v);
  27. }
  28.  
  29. void main() {
  30.  
  31.   init_ports();
  32.  
  33.   while(1) {
  34.            if (get_key() == 1) voros();
  35.            if (get_key() == 0) feher();
  36.   }
  37.  
  38. }
(#) potyo válasza danydosster hozzászólására (») Ápr 13, 2014 /
 
13. sorban az = helyett == kell.

És hiányzik egy delay_ms(f) a 20. sor után.
(#) danydosster válasza potyo hozzászólására (») Ápr 13, 2014 /
 
semmi változás, ugyan az maradt. villog szépen a vörös, de ha átkapcsolom akkor csak olyan mintha megállna a pic ( világít az a led amelyik utoljára) ha lekapcsolom akkor megint villog a vörös szépen tovább. Valamiért nem áll át a fehérre
(#) kurucz_peter hozzászólása Ápr 17, 2014 /
 
Hi!

PIC18F2455 ill PIC18F25K20 sleep mode-dal kapcsolatban lenne kérdésem.
Sikerült mindkét PIC-et sleep-be küldeni de nem esett jelentősen az áramfelvétel.
2455 run mode 4,5 mA sleep mode 700 uA
25K20 run mode 2,5 mA sleep mode 1,4 mA
ennél sokkal nagyobb esést vártam volna ill. azt is hogy a 25K20 XLP kivitel miatt run mode-ban is kevesebbet fogyaszt.
Esetleg van valami ötletetek, hogy mi lehet rossz? Feltételezem az igaz, hogy ezek az áramértékek nagyon nem stimmelnek.

Köszi!
A hozzászólás módosítva: Máj 29, 2014
(#) kissi válasza kurucz_peter hozzászólására (») Ápr 17, 2014 /
 
A lábakra figyelj ( a kimenetek úgy legyenek, hogy ne fogyasszanak /pl. LED bekapcsolva!/, a bemenetek ne legyenek üresen/lebegve!), ill. a szükségtelen dolgokat kapcsold ki a konfigurációs biteknél ( pl. BOR )! Így lemegy ~ 10uA környékére !
(#) pepe33 hozzászólása Máj 10, 2014 /
 
Sziasztok!

Beleütköztem egy problémába amit már pár napja nem tudok megfejteni.
Van egy 16F628A amiben komparátort szeretnék használni.
Ezzel nincs is gond, működik is de nem értem a PORT B3 mért van kimenetként magas szinten ?
És nem tudom lekapcsolni sem és nem tudok rájönni mi van vele.
Megköszönném ha valaki segítene megfejteni ezt a rejtélyt.
  1. #include <16F628A.h>
  2.  
  3. #FUSES NOWDT                    //No Watch Dog Timer
  4. #FUSES XT                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
  5. #FUSES NOBROWNOUT               //No brownout reset
  6. #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
  7. #fuses nomclr
  8. #use delay(clock=4000000)
  9.  
  10. #define DELAY 1000
  11.  
  12. #byte CMCON=0x1F
  13. #bit C2OUT=0x1F.7
  14. #bit C1OUT=0x1F.6
  15. //============================================
  16. #int_TIMER2
  17. void  TIMER2_isr(void)
  18. {
  19. // 10ms timer  
  20. T1--;
  21. }
  22. void main()
  23. {
  24. setup_timer_2(T2_DIV_BY_16,41,15);      //672 us overflow, 10.0 ms interrupt
  25.    setup_ccp1(CCP_COMPARE_CLR_ON_MATCH);
  26.      setup_comparator(A0_A2_A1_A2); //011
  27.     enable_interrupts(INT_TIMER2);
  28.    enable_interrupts(GLOBAL);
  29.    while(1)
  30.    {
  31. output_low(PIN_B3);
  32.       if (C2OUT) output_high(PIN_A3);
  33.       else  output_low(PIN_A3);
  34.    }
  35. }
(#) Hp41C válasza pepe33 hozzászólására (») Máj 10, 2014 /
 
A 16F628(A) -n az RB3 pont a CCP1 modul kimenete.
A hozzászólás módosítva: Máj 10, 2014
(#) pepe33 válasza Hp41C hozzászólására (») Máj 10, 2014 /
 
PWM modul kimenet, de ha nem használom a CCP1-et akkor is folyamatosan 1 ben van kimenetként.
Tehát ha ezt írom:
setup_comparator(NC_NC_A1_A2);
Akkor is 1 és nem tudom 0-ra kapcsolni.
(#) pepe33 hozzászólása Máj 10, 2014 /
 
Köszönöm a segítséget.
Rávilágítottál a lényegre.
setup_ccp1(CCP_COMPARE_INT);
Ezzel a konfigurációval már nincs probléma. Így már szabadon használható a kimenet.
(#) kurucz_peter válasza kissi hozzászólására (») Máj 29, 2014 /
 
Helló kissi!

Köszi a segítséget!
3,3 V-os tápnál és 4MHz-es belső oszcillátor esetén 35uA-re sikerült levinni az áramfelvételt sleep modban. Ez már elfogadható Üdv
A hozzászólás módosítva: Máj 29, 2014
(#) Brienter hozzászólása Júl 13, 2014 /
 
Üdv!
Most próbálkozok a megszakításokkal CCS-C-ben de nem boldogulok a külsőkkel(RB0/INT).
Ami adott CCS-C+MPLABX 16F887.
Ami a probléma: Nagyon szépen működik a megszakítás külső szintváltozásra amíg az lcd.c header segítségével nem írok valamit a kijelzőre, onnantól mintha kikapcsolna.
Van valami ötlet, esetleg találkozott valaki ilyennel már?
  1. #include <16f887.h>
  2. #zero_ram
  3. #use delay (clock=4000000)
  4. #fuses XT,NOWDT,NOPROTECT,NOLVP,NOPUT,BROWNOUT
  5. #use i2c(master, sda=PIN_C1, scl=PIN_C0)
  6. //LCD PIN table
  7. #define LCD_ENABLE_PIN  PIN_B3
  8. #define LCD_RS_PIN      PIN_B1
  9. #define LCD_RW_PIN      PIN_B2
  10. #define LCD_DATA4       PIN_B4
  11. #define LCD_DATA5       PIN_B5
  12. #define LCD_DATA6       PIN_B6
  13. #define LCD_DATA7       PIN_B7
  14.  
  15. #include <lcd.c>
  16.  
  17. #int_EXT
  18. void EXT_isr()
  19. {
  20.     output_high(PIN_E0);
  21.     delay_ms(10);
  22.     output_low(PIN_E0);
  23. }
  24.  
  25. #int_TIMER0
  26. void TIMER0_isr()
  27. {
  28.     output_high(PIN_E0);
  29.     delay_ms(5);
  30.     output_low(PIN_E0);
  31. }
  32.  
  33. void main()
  34. {
  35.     set_tris_b(0b00000001);
  36.     lcd_init();
  37.     delay_ms(100);
  38.     ext_int_edge(H_TO_L);
  39.     enable_interrupts(INT_EXT);
  40.     setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
  41.     disable_interrupts(INT_TIMER0);
  42.     enable_interrupts(GLOBAL);
  43.     printf(lcd_putc"Test");
  44.     while(1)
  45.     {
  46.        
  47.     }
  48.  
  49. }
(#) Tas84 válasza Brienter hozzászólására (») Júl 14, 2014 /
 
43. sorban kellene egy vessző az lcd_putc után. Melyik ccs verziód van, mert az 5.011 vagy talán még az előtte lévők is csináltak olyat, hogy a printf "letiltotta" a megszakításokat!
(#) Brienter válasza Tas84 hozzászólására (») Júl 17, 2014 /
 
Eddigi programjaimban nem volt vessző, úgy is működött, de most hogy beszúrtam nincs gond a fordításban ugyan úgy, de sajnos az interrupt még mindig nem megy. És sajnos pont a 5.011-es verzióm van nekem.
(#) Buvarruha válasza Brienter hozzászólására (») Júl 18, 2014 /
 
Lehet, hogy hasonló hibám volt, akkor a megoldás az interruptok külön engedélyezése jelentette.

  1. enable_interrupts(int_rb);
  2. enable_interrupts( INT_RB4 );
  3. enable_interrupts( INT_RB5 );
  4. enable_interrupts(global);
(#) Tas84 válasza Brienter hozzászólására (») Júl 18, 2014 /
 
Nézd meg, hogy az lcd írás után be van-e állítva a megfelelő interrupt, ha nincs akkor állítsd be.

Úgy emlékszem, hogy az 5.015-től már nem volt ez a probléma, ha tudod frissítsd a ccs-t (ha csak nem Torrente nyomozó hozta ).
(#) retek2345 hozzászólása Júl 19, 2014 /
 
Sziasztok!
Egy olyan kérdésem lenne, van valakinek tapasztalata dspic33ep512mu810 vagy valamelyik hasonló dspic USB használatára ccs alatt?
(#) djsms hozzászólása Júl 22, 2014 /
 
Sziasztok!

Szeretnék építeni egy egyszerű fogyasztásmérőt az autómba. A következőképp gondoltam megvalósítani:
1, megmérem az egyik injektor nyitva tartási idejét. Ebből ki tudom számolni, hogy mennyi üzemanyagot nyomott a hengerbe. (gyártó adatlapjáról meg tudom nézni az injektor áteresztési mennyiséget)
(Amikor megkapja a tápot az injektor akkor indulna a mérés, amikor megszűnik a táp akkor ér véget)
2, megmérem a sebességmérő jeladója által adott periódusidőt, amiből ki tudom számolni a sebességet.
3, a két adatból megvan a pillanatnyi fogyasztás.
Ez eddig szép és jó, de még sosem dolgoztam igazából a timerekkel. Ha valaki írna egy pár soros példát azt megköszönném.
Ez csak egy hobbi projekt, tudom hogy nem lesz pontos a mérés stb.
Az autó nem obd-s, onnan nem lehet levenni a jelet.

Max fordulatszám 7500 1/min -> 125 1/s -> legkisebb periódusidő 8ms
Min fordulatszám 600 1/min -> 10 1/s -> legnagyobb periódusidő 100ms

Mivel elég nagy a két érték közötti differencia úgy gondolnám, hogy a pontosabb mérés érdekében a timer0-át 8ms-re állítanám, túlfutás esetén pedig egy változó értékét növelném, majd újra indulna a timer0. Ez így jó elképzelés?
A hozzászólás módosítva: Júl 22, 2014
(#) kissi válasza djsms hozzászólására (») Júl 22, 2014 /
 
Idézet:
„Ez csak egy hobbi projekt, tudom hogy nem lesz pontos a mérés stb.”

Ez biztos, csak néhány adalék hozzá:
- az injektor nyitása és zárása nem a ráadott feszültség "kezdetével és végével" egyezik meg,
- az áteresztés mértéke "nem tuti",
- a mennyiség függ a rendszer nyomásától is, nem csak az időtől...

Tapasztalatszerzésnek persze nem lesz rossz, ha úgy döntesz , akkor sok sikert !
(#) djsms válasza kissi hozzászólására (») Júl 22, 2014 /
 
Tudom, ezekkel azért tisztában vagyok. De úgy gondolom az eltérés +- 1-2dl/100km lehet emiatt. Ez meg bőven belefér! (Ennyit a megane-om is téved, sokszor 1 literrel többet tudok beletankolni, mint amit szerinte elfogyasztott az autó)
A mérendő autóban amúgy is már 400e km van, szóval tényleg csak játék és tapasztalat szerzés az egész. Hőmérséklet és fesz mérést már tud, de ezek nagyon egyszerű dolgok voltak (DS18B20)
(#) potyo válasza djsms hozzászólására (») Júl 22, 2014 /
 
Én másképp közelíteném meg a dolgot. Van a CCP modul a picekben, annak a capture módja arra való, hogy amikor jelszintváltozás van a lábon, akkor elmentse a hozzárendelt timer pillanatnyi értékét a CCPR1x regiszterpárba. Mivel úgy írod, hogy egyik injektort megcsapolod, ebből úgy sejtem, hogy hengerenkénti injektoros a verda, ekkor egy injektor maximum 16ms (azért 16ms, mert egy injektor nem csak egy fordulat, hanem két fordulat ideje alatt folyamatosan fecskendezhet be egy hengerhez) ideig lehet nyitva, neked tehát úgy kell egy timert beállítani, hogy az épp ne csorduljon túl ennyi idő alatt. Ha mondjuk 32MHz-ről futtatod a kontrollert és 18F-ről van szó, akkor 4MHz-el hajtva a timert, az épp 16,4ms alatt csordulna túl, ami tekintve, hogy az injektorokat egyébként sem illik 80% fölé vinni, bőven jó lesz. Amikor felfutó él van (kezdődik az injektor nyitása), a kontroller elmenti a timer értékét a CCPR1x regiszterpárba, megszakítást is okoz, te ezt akkor eltárolod egy másik változóban, majd amikor lefutó él van (lezár az injektor), akkor meg kivonod a CCPR1x aktuális tartalmából a változód tartalmát, ekkor megkapod, hogy mennyi ideig volt az injektor kivezérelve. Lényegtelen, hogy közben esetleg túlcsordult a timer, a kivonás eredménye stimmelni fog. Az injektor zárt állapotában eltelő idő esetedben lényegtelen, hogy mennyi, akár többször is túlcsordulhat közben a timer - bár persze fel lehet használni fordulatszámmérésre két felfutó él között eltelő időt. Az injektorok nyitási idejének minimuma 2-3ms között szokott lenni, tehát még mindig elég nagy felbontással tudsz mérni terhelés nélküli időszakban is - nyilván itt már többet számít a lineáristől eltérő viselkedésük, erről viszont jó lenne találni valami doksit, hogy mégis hogyan alakul egy injektor szállított mennyisége a nyitási időtől függően.


Nézz utána, hogy a benzinhíd nyomása függ-e a szívócsőnyomástól. Mert ha nem függ, akkor az injektorok szállított mennyisége eltér a különféle üzemállapotokban, hiszen nem mindegy, hogy 3bar vagy 3,8bar a nyomás a két oldaluk között. Ha nem függ a benzinnyomás a szívócsőnyomástól, akkor ismerni kell a szívócsőnyomást is, hogy kompenzálni tudj valamilyen mértékben, ebben az esetben sokat segít, ha MAP szenzoros a levegőmérés, mert akkor annak a jele direktben felhasználható kompenzációra. Ha MAF szenzoros, nos az szívás De nyílván megoldható akkor is, csak nem olyan egyszerű. Ha függ a benzinnyomás a szívócsőnyomástól, az az egyszerűbb eset, akkor csak az injektor nyitási idejétől függ a befecskendezett mennyiség - első körben vehető lineárisnak az összefüggés.
(#) djsms válasza potyo hozzászólására (») Júl 22, 2014 /
 
Huha ez elég kimerítő részletességű ötlet
Egyelőre maradok a "kis" pic-ek mellett (12, 16 széria) mert ezekhez vagyok hozzászokva...
Van 12f683-am, abban van CCP modul. Gondolom ez is megteszi. Egyelőre csak ezt a részfeladatot oldanám meg, nem egy teljes autó vezérlést
Ezt 16MHz-en kergetve a timer1-et 16,3ms-re tudnám beállítani. Ez az érték majdnem az, mint amit te is írtál. A timer1 16 bites, vagyis 65535 részre bontom ezt az időintervallumot. Vagyis a kivonás eredménye * 16,3/65535 ideig volt nyitva az injektor. Ebből pedig ugye már számítható a liter/óra (álló autó)
Ez így jó logikailag?
A verda hengerenkénti injektoros valóban (Daihatsu Charade 1.3i)
A 16ms maximumot honnan számoltad?
Idézet:
„azért 16ms, mert egy injektor nem csak egy fordulat, hanem két fordulat ideje alatt folyamatosan fecskendezhet be egy hengerhez)”

Na ezt viszont tényleg nem értem, miért is?

Kompenzációval egyelőre nem foglalkoznék, majd ha már működik valamennyire a "műszer" majd pontosítom. Egyelőre vegyük lineárisnak a rendszert.
A hozzászólás módosítva: Júl 22, 2014
Következő: »»   99 / 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