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   93 / 118
(#) vicsys válasza djsms hozzászólására (») Nov 18, 2013 /
 
Nincs trükk. Definiáld a kellő lábakat: Bővebben: Link
(#) djsms válasza vicsys hozzászólására (») Nov 18, 2013 /
 
Rendben, átnézem. Lesz még hozzá DS18B20 is, az meg '1 wire' kommunikációs. Meglesem Te hogy csináltad meg anno (gondolom nem ccs-ben)
(#) vicsys válasza djsms hozzászólására (») Nov 18, 2013 /
 
De biza!
(#) djsms válasza vicsys hozzászólására (») Nov 18, 2013 /
 
És elérhető a c forrás is? A cikkben csak az asm fájlt találtam, én meg még csak ccs c-ben garázdálkodom Bár mintha a hozzá tartozó topikban azt olvastam volna, hogy már nincs meg, mert más is kérte a régi DS1820 beszerezhetetlensége miatt? Hirtelen annyi az infó, hogy nem tudom mi hol volt és hova tartozik
(#) Gyimate válasza djsms hozzászólására (») Nov 18, 2013 /
 
Üdv!
A nokia 3310 kijelző nem I2C-vel működik, hanem SPI-vel, amit meg tudsz írni szoftveresen is.
A hozzászólás módosítva: Nov 18, 2013
(#) vicsys válasza djsms hozzászólására (») Nov 18, 2013 /
 
(#) djsms válasza Gyimate hozzászólására (») Nov 18, 2013 /
 
Jogos! Összekevertem az rtc modullal, az az I2C-s.
Na akkor lesz itt már 3 féle kommunikáció '1 wire', I2C és SPI is!
Plusz még rs232 is, mert egy gsm modulon is kommunikálok, ha nagyon merül vagy ha csak szimplán le akarom kérdezni az adatokat. Az sms meg 7 biten kódol, de ezt már megírtam 2003-ban a szakdolgozatomban. Csak elő kell kotorni
(#) vicsys válasza djsms hozzászólására (») Nov 18, 2013 /
 
Na, ezért érdemes tervezni, építkezés előtt. Ha nem össze-vissza válogatsz, akár 2-4 lábon keresztül is megoldhattad volna az összes kommunikációt
(#) djsms válasza vicsys hozzászólására (») Nov 18, 2013 /
 
Terveztem!
1, mit szeretnék megvalósítani
2, mi van meg hozzá (hardver)
Természetesen jobban is meg lehetne oldani, de itt egy kicsit a tanulás is cél!
Szabad láb meg van bőven szerencsére.
(#) sysy válasza djsms hozzászólására (») Nov 18, 2013 /
 
Na, lesz itt szakmai tapasztalat bőven! Majd írd meg légy oly szíves a tapasztalataidat.
Én különösen a belső refrencia (16F688) használatára lennék kíváncsi mint AD ref, mert vagy rosszul olvastam a dokumentációt, vagy félreértettem valamit.

Előre is köszönöm.
(#) djsms válasza sysy hozzászólására (») Nov 18, 2013 /
 
Rendben! De nem használom a belső referenciát, az egy mellékvágány volt csak az A/D pontosítására.
(#) vicsys válasza djsms hozzászólására (») Nov 18, 2013 /
 
Idézet:
„Terveztem!
1, mit szeretnék megvalósítani
2, mi van meg hozzá (hardver)”

Ez tetszik!
1. Szeretnék egy oda-vissza játszós atomreaktort, ami csokipudingot főz reggel és behozza a kávém.
2. Nincs hozzá semmi
3. Belevágok!
(#) _vl_ válasza vicsys hozzászólására (») Nov 18, 2013 /
 
Idézet:
„oda-vissza játszós”

Levehető előlapos is legyen, nem?
(#) vicsys válasza _vl_ hozzászólására (») Nov 18, 2013 /
 
Hopsz, az kimaradt! Köszi a kiegészítést!
(#) potyo válasza vicsys hozzászólására (») Nov 18, 2013 /
 
A második pont nem egészen igaz, neki volt hozzá ez-az
(#) Tas84 hozzászólása Nov 18, 2013 /
 
Helló,

CCS 5.015, RTOS, PIC18F87k22, FUSES NOWDT.

A probléma a következő: a PIC hébe-hóba újraindul, a restart_cause() szerint WDT_TIMEOUT van, de a saját kódunkban nem használjuk a watchdog timert.
Találkozott valaki már hasonlóval? Lehetséges az, hogy az RTOS-nak a belső működése váltja ki valami miatt?
(#) kormika hozzászólása Nov 24, 2013 /
 
Sziasztok! Akkutöltőt építek 16F819-es pic-kel, de máa a feszkijelzésnél vannak gondjaim. Az ADC által mért értéket átkonvertáltam mv-okra, osztottam ezerrel, akkor megvan az egész volt, aztán modulud osztással a maradék. Az LCD-re íráskor viszont van egy olyan problémám, hogy a tizedespont után a maradék elejéről az értékes nullák eltűnnek, ezért pl 2.015V helyett 2.15V-ot ír ki. Hol a hiba, mellékelem a forráskódot, a válaszokat előre is köszönöm.
  1. #include <16F819.h>
  2. #device ADC=10
  3. #fuses NOWDT,INTRC_IO,PUT,NOPROTECT,BROWNOUT,NOLVP,NOCPD,NOMCLR
  4. #use delay(clock=31250)
  5. #define LCD_ENABLE_PIN PIN_B0
  6. #define LCD_RS_PIN PIN_B1
  7. #define LCD_RW_PIN PIN_B2
  8. #define LCD_DATA4 PIN_B3
  9. #define LCD_DATA5 PIN_B4
  10. #define LCD_DATA6 PIN_B5
  11. #define LCD_DATA7 PIN_B6
  12.  
  13. #include <lcd.c>
  14.  
  15. void main()
  16. {
  17.      int16 volt;
  18.      int16 volte;
  19.      int16 volts;
  20.      delay_ms(500);
  21.      setup_adc(ADC_CLOCK_INTERNAL);
  22.      setup_adc_ports(AN0);
  23.      lcd_init();
  24.      delay_ms(500);
  25.  
  26.      
  27.      while(1)
  28. {
  29.      volt = 0;
  30.      set_adc_channel(0);
  31.      delay_ms(10);
  32.      volt = read_adc();
  33.      volt = volt*4.892367906066536;
  34.      volte = volt/1000;
  35.      volts = volt%1000;
  36.      lcd_gotoxy(1,1);
  37.      printf(lcd_putc,"Fesz:%ld\.\%ld\V ",volte,volts);
  38.      delay_ms(500);
  39. }
  40. }
(#) vicsys válasza kormika hozzászólására (») Nov 24, 2013 /
 
A 3db int16 helyett akár egy float-ot is használhatnál és nem kellene konvertálni/szétbontani.
(#) kormika válasza vicsys hozzászólására (») Nov 24, 2013 /
 
Float-tal még nem volt dolgom, tudnál valami linket, esetleg példaprogit mutatni, hogy azzal hogyan kell dolgozni?
(#) tneilc válasza kormika hozzászólására (») Nov 24, 2013 /
 
Elvileg a "%0d"-nek kellene a bevezető nullákat megtartani. Ez C standard, de nem próbáltam ki.

Bővebben: Link
A hozzászólás módosítva: Nov 24, 2013
(#) Tas84 válasza vicsys hozzászólására (») Nov 24, 2013 /
 
Nézd meg ezt:
  1. void main()
  2.     {
  3.          float volt;
  4.        
  5.          delay_ms(500);
  6.          setup_adc(ADC_CLOCK_INTERNAL);
  7.          setup_adc_ports(AN0);
  8.          
  9.          lcd_init();
  10.          set_adc_channel(0);
  11.          delay_ms(10);
  12.          
  13.          while(1)
  14.          {                    
  15.             volt = read_adc() /1024.0 * 4.892367906066536;
  16.             lcd_gotoxy(1,1);
  17.             printf(lcd_putc, "Fesz: %1.4fV ",volt);
  18.             delay_ms(500);
  19.          }
  20.     }
(#) nem hozzászólása Nov 28, 2013 /
 
Sziasztok!

WDT-el akadt egy kis gondom 18F4550 procin. Környezet: MPLAB 8.90 + CCS 4.016.
Annyit szeretnék, hogy legyen WachDog, de a program egy részén szeretném letiltani, majd később újra engedélyezni.

Kód elején:
  1. #fuses HS,BROWNOUT,NOPUT,NODEBUG,WDT512


Majd nem sokkal később (még mielőtt WDT lejárna):
  1. SETUP_WDT(WDT_OFF);     // WatchDog egyenlore kikapcsolva


Illetve, amikortól akarom, hogy legyen:
  1. SETUP_WDT(WDT_ON);     // WatchDog mostantol bekapcsolva


Ennek ellenére a PIC újraindul azon a szakaszon, ahol elvileg ki kellene lennie kapcsolva. Csak akkor tudom elkerülni a folyamatos újrainulást, ha eleve az elején kikapcsolom:
  1. #fuses HS,BROWNOUT,NOPUT,NODEBUG,NOWDT


..de akkor ugye nincs WDT, amit pedig szeretnék, hogy legyen.

Köszönöm az ötleteket!
Ádám
A hozzászólás módosítva: Nov 28, 2013
(#) kissi válasza nem hozzászólására (») Nov 28, 2013 / 1
 
Szia!
Hát a WatchDog már csak ilyen , nem lehet kikapcsolni, ha egyszer a tok programozásánál bekapcsoltad! Gondold át, hogy mire való: zavar esetén a program rossz helyre ugorva ( ok: a zavarjel miatt a beolvasott utasítás megváltozik! ) kiakadhatna, ilyenkor a WD resetelés újraindítja a rendszert! Ha lenne lehetőség a szoftveres tiltásra, akkor a zavarjel véletlenszerűen pont a WD-t tilthatná le --> üzembiztonság megszűnhetne --> nem megengedhető!!!
Ezért csak a tok programozásánál módosíthatod a beállítását, később már csak újbóli programozással !
A hozzászólás módosítva: Nov 28, 2013
(#) nem válasza kissi hozzászólására (») Nov 28, 2013 /
 
Jogos, logikus.
Kössz!
(#) icserny válasza nem hozzászólására (») Nov 28, 2013 / 1
 
Fordítva kell felülni a paripára! Ha a konfigurációs bittel letiltod a Watchdog timert, akkor onnantól a WDTCON regiszter SWDTEN bitjével lehet ki-be kapcsolgatni. Mint például ebben a mintaprogramban (PICCOLO projekt a honlapomon). Ha a konfigurációs biteknél engedélyezetd, akkor a szoftveres vezérlés letiltásra kerül.

Hogy mindehhez a setup_wdt() hogyan viszonyul, azt én nem tudom.

Utóirat: a PIC18F4550-nél WDTCON-nak csak a legalsó bitje van implementálva, tehát ennyi is megteszi:
  1. WDTCON = 1;   //Engedélyezés
  2. WDTCON = 0;   //Letiltás
A hozzászólás módosítva: Nov 28, 2013
(#) vicsys válasza nem hozzászólására (») Nov 28, 2013 / 1
 
Miért kell ki-be kapcsolgatni? Ha van delay-ed ami keresztbe tenne, azt ki lehet iktatni
pl.:
  1. #use delay(clock=20000000,RESTART_WDT)
(#) nem hozzászólása Nov 28, 2013 /
 
Köszönöm a válaszokat!

Akkor összefoglalom: elvileg a WDTCON bittel tudom ki-be kapcsolni a WatchDog-ot, de az az általános nézetetek, hogy ne kapcsolgassam, mert ha eltéved a program, véletlen kikapcsolja a WTD-ot (ha épp ahhoz a sorhoz ugrik) és utána fagy ki.. ez jogos.
Viszont amit nem értek, hogy mire is megoldás a:
  1. #use delay(clock=20000000,RESTART_WDT)

C-ben nem vagyok nagy pro, csak ilyen balf*sz programokat szoktam írni, és én eddig úgy tudtam, hogy a fenti kód a proci CPU-órajelét állítja be, tehát ha ide beteszem a RESTART_WDT argumentumot, az nekem mire is jó?
Vagy én nem értem a válaszokat (ez a valószínűbb), vagy Ti nem értitek még a problémámat.
A helyzet az, hogy van egy szaunavezérlő, ahol nem akarom, hogy legyen WDT az elején, amíg a felhasználó beállítja a szaunázási paramétereket, de utána, amikor elindítja a fűtést, már legyen, nehogy lefagyjon a kontroller behúzott relék mellett és 310 fokosra fűtse a szaunát, mondjuk ha ott hagyják. Amúgy azért nem akarom az elején a WTD-ot, mert azt a hő-szabályozást is megvalósító timer3 által okozott interrupt-rutinban resetálom, és a szaunázási paraméterek beállításakor ennek még nem kéne futnia (hiszen akkor elindulna a fűtés idő előtt), ennek okán letiltom az interruptokat az elején. Persze lehetne egy másik timer interrupt-rutinjában resetálgatni a WDT-t, de sajnos minden timert felhasználtam már másra hasonlóan a timer3-hoz, és azoknak sem kellene futni az elején. Vagyis van még a timer2, amik lehetne használni, de azt nem tudom felkonfigurálni, mert valamiért nem fordul le
Tulajdonképpen az is jó nekem, ha megmondjátok, hogy a timer2-t adott CCS verziószám mellett hogy kell konfigolni.

Köszönöm a segítséget!
Ádám
A hozzászólás módosítva: Nov 28, 2013
(#) nem válasza nem hozzászólására (») Nov 28, 2013 /
 
Egy olyan lehetőséget képzelek, hogy csinálok egy flag-et, ami azt jelzi, hogy már túl vagyunk-e a paraméterbeállításokon. A timer3 megszakítás-rutinjában pedig:
if(flag==0), akkor csak a WDT-t nullázza, a hő-szabályozást ne végezze el, ha pedig
if(flag==1), akkor a WDT-is resetálja meg a szabályozást is végezze el.
Kicsit favágó, de működhet. Azért szívesen veszek továbbra is minden választ/ötletet.
Kössz!
Ádám
A hozzászólás módosítva: Nov 28, 2013
(#) vicsys válasza nem hozzászólására (») Nov 28, 2013 / 1
 
Mivel a WDT működése abban rejlik, hogy avatkozzon be ha a programod (látszólag) "áll". Mivel lehet paraméterezni a WDT-t, elképzelhető, hogy a WDT értéke kisebb, mint pl. egy delay. Amit írtam, pont ennek kiváltására van. Ne adjon resetet egy hosszabb állásnál.
A programodat kell úgy írni, hogy alapesetben flag-ekkel operáljon és a pollingozásnál se legyen "leállás". A timerek használata kézenfekvő lehet, de az esetek nagyrészében elég az egy timer, amit menet közben átkonfigurálhatsz, az adott részfeladat elvégzéséhez.
(#) nem válasza vicsys hozzászólására (») Nov 28, 2013 /
 
Akkor ennek fényében nekiesek újra. Menni fog. Köszönöm!
Következő: »»   93 / 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