Fórum témák

» Több friss téma
Fórum » Folyamatábrás mikrokontroller programozás Flowcode-dal
Lapozás: OK   95 / 360
(#) watt válasza pjg hozzászólására (») Nov 25, 2012 /
 
Csak a SWITCH(0) makró és az utána lévő elágazásból kell annyi lekezelés, ahány gomb van.
A gombok lekezelésében is saját kezelés kell.

Megjegyzem, hogy ez a folyamat csak menük léptetésére, értékek változtatására jók.
Ha pl. valaminek folyamatosan működnie kell addig, amíg nyomod a gombot, más eljárás kell, de az sokkal egyzserűbb.
(#) watt válasza (Felhasználó 15355) hozzászólására (») Nov 25, 2012 /
 
Nem követtem azt a topicot, de átnézek. Túl sok lesz-ez nekem. Közben írom a vezérlőm programját is...
(#) watt válasza (Felhasználó 15355) hozzászólására (») Nov 25, 2012 /
 
Nyugodtan kérdezz, ha tudok szívesen válaszolok!
(#) watt válasza (Felhasználó 15355) hozzászólására (») Nov 25, 2012 /
 
Ki lehet választani, hogy hagyományos, vagy prioritásos megszakítás szerint működjön a PIC(18F-eknél csak). A Flowcode nem tudom hogyan kezeli ezt, de van egy sejtésem, hogy csak hagyományosan.
A prioritásos megszakítás kiválasztása után be lehet állítani, hogy a periféria(Timer, CCP, stb.) alacsony, vagy magas megszakításban kezelődjön le.
Az alacsony megszakítást a magas meg tudja szakítani, így meg lehet oldani, hogy a kevésbé fontos megszakítások, mint pl. egy gombkezelés, háttérbe szoruljon és pl egy CCP meg tudja szakítani.
A prioritásos megszakítást a RCON.IPEN bittel lehet engedélyezni. A CCP1 megszakítás prioritását az IPR1.CCP1IP bittel. Az adatlapok interrupt részénél lehet ezeket megtalálni. Azt nem tudom, hogy a flowcode ezt hogyan tudja lekezelni, még C-ben sincs jelenleg ötletem, mert még nem foglalkoztam ezzel a résszel. Ha ilyen komoly programra lenne szükség, lehet, hogy nem Flowcode-ba kellene megoldani.
(#) watt válasza (Felhasználó 15355) hozzászólására (») Nov 25, 2012 /
 
Pedig tök egyszerű. A Timer1 számlál magában folyamatosan olyan frekivel, amilyet beállítottál neki. Ha a CCP1 lábra felfutó él kerül(a beállításod szerint) akkor a PIC CCP1 hardveres perifériája(milyen érdekes, hogy periféria, pedig benne van ), beleteszi a CCP1 regisztereibe a Timer1 regisztereinek megszakításkori értékét. A következő megszakításkor megint. A két érték különbsége arányos lesz a két megszakítás közötti eltel idővel.
(#) pjg válasza watt hozzászólására (») Nov 25, 2012 /
 
Tehát a SWITCH(0) makrót és az utána lévő elágazást és lekezelést másolom annyiszor ahány gomb van.
SWITCH(0)
SWITCH(1)
SWITCH(2)
SWITCH(3)

Pont menük léptetésére, értékek változtatására kell. Szobatermosztát lesz.
(#) pjg válasza mrobi hozzászólására (») Nov 25, 2012 /
 
Ennek van második része is?
(#) Hp41C válasza (Felhasználó 15355) hozzászólására (») Nov 25, 2012 /
 
Szia!
A timer1 (előosztón keresztül) a mérendő frekvenciát kapja. A kapujel felfutó élére a CCP1 tárolja a Timer1 értékét, amit mindig kiolvasunk és eltárolunk. Az újabb felfutó él (mondjuk 1 sec múlva) újra tárolja a Timer1 értékét. Ezt kiolvassuk és az előzőt kivonjuk belőle. A különbség a bemenőjelen a kapujel egy periódusa alatt befutott felfutó élek száma. Ez pedig a bemenő jel frekvenciája / átlag frekvenciája. A kapujelet a a Timer2 -vel és a másik CCP modullal (PWM) állítjuk elő. 16 bites mért értékig minden rendben van, de ez csak 4 és 3/4 digit felbontás. A felbontás növeléséhez kell egy kis ötlet...
Ha az előosztó nem 10 hatványával oszt, az sem gond, a PWM kapuidő számítás módosításával korrigálható. Ha a frekvencia túl alacsony, a pontosság növeléséhez több periódusidőnek megfelelő kapuidőt lehet felhasználni. Ha még alacsonyabb a frekvencia, a periódus idő mérése ad pontosabb eredményt...
(#) Hp41C válasza watt hozzászólására (») Nov 25, 2012 /
 
A C megoldás:

  1. //** INTERRUPT service routines ******************
  2. /***********************************************************/
  3. // High piorty vector
  4. #pragma code high_vector=0x08
  5.         void interrupt_at_high_vector(void)
  6.         {
  7.                 _asm
  8.                         GOTO    high_int
  9.                 _endasm
  10.         }
  11.  
  12. // Low piorty vector
  13. #pragma code low_vector=0x18
  14.         void interrupt_at_low_vector(void)
  15.         {
  16.                 _asm
  17.                         GOTO    low_int
  18.                 _endasm
  19.         }
  20.  
  21. #pragma interrupt high_int
  22.  
  23. void high_int (void)                    // ISR for high priority request
  24. {
  25.  ...
  26. }
  27.  
  28. #pragma interruptlow low_int
  29.  
  30. void low_int (void)                  // ISR for low priority request
  31. {
  32.  ...
  33. }
A hozzászólás módosítva: Nov 25, 2012
(#) watt válasza Hp41C hozzászólására (») Nov 25, 2012 /
 
Félreérthető voltam, a topic miatt. C-ben tudom hogyan kell lekezelni, hanem Flowcode alatt C-blokkban jelentene kicsi fejtörést.
(#) watt válasza (Felhasználó 15355) hozzászólására (») Nov 25, 2012 /
 
Eddig nem teljesen értettem mi a feladat, most már étem, hogy a mérendő menne a Timer1 bemenetére és a kalibrált mérőimpulzus szakítná meg a CCP1 bemenetét. Ez működhet. A Timer1 megszakításait még számolgatni kell, ahogy a periódusidőmérőmben is van.

Az más kérdés, hogy hogyan kell ezt megoldani, miután nincs CCP1 Capture lekezelési mód. A megodlás szinte ugyanaz, mint a priódusidő mérőben, csak a Timer1 nem belső oszciról jár, hanem a mérendő jelről, így kell beállítani.
(#) pjg válasza watt hozzászólására (») Nov 25, 2012 /
 
Ma reggel mértem. 19 fokról 21,5 fokra melegítettem a levegőt. 55 percig ment a kazán 60 fokos vízzel 1,5m3 gáz fogyott. ezt naponta egyszer eljátsza az ember az havi 45 m3. Ma éjjel nem kapcsolom vissza 19 fokra. kíváncsi vagyok mennyi gáz fogy el reggelig.
(#) pjg válasza watt hozzászólására (») Nov 25, 2012 /
 
Az a kérdésem ezt hogyan lehet összehozni a DS kiolvasó rutinnal? Bővebben: Link Ugyanis mindkettő a Timer0-át használja.
(#) watt válasza pjg hozzászólására (») Nov 25, 2012 /
 
Nálam a nap 24 órájában 23..24,5 fok van, és egy csepp gáz se fogy, de ezt ne itt beszéljük meg!
(#) watt válasza pjg hozzászólására (») Nov 25, 2012 /
 
Elférnek egymás mellett, mert ha jól emlékszem a DS rutin is 183Hz megszakítással fut. Egymás után kell tenni a két lekezelést. Ugye beállítottad a Timer0-t? Mert a jelenlegi freki csak a szimuláció miatt van ilyen magasra állítva.
(#) pjg válasza watt hozzászólására (») Nov 25, 2012 /
 
Igen! Azt láttam, hogy az előosztót 256-ra kell állítani.
Egyenlőre azt nem értem, hogyan látja a Timer0 megszakítása a portA0-n lévő nyomógombot.
(#) watt válasza pjg hozzászólására (») Nov 25, 2012 /
 
Nem is látja. A timer csak bután megszakít. A benne lévő program látja a porton lévő változást.
(#) watt válasza (Felhasználó 15355) hozzászólására (») Nov 25, 2012 /
 
Nem a ccpr1x regiszterekbe kell menteni, hanem azokat kell egy változóba menteni. A timer1x regiszterekkel semmit nem kell csinálni, azok maguktól betöltődnek a ccpr1x regekbe. Hogy miért nem történik megszakítás nem tudom megmondani, ha nem látom a programot. Szimuláció nem működik, ezt tudod.
(#) watt válasza (Felhasználó 15355) hozzászólására (») Nov 25, 2012 /
 
Ha jól van beállítva a ccp1 capture mód, akkor meg kell történjen a megszakítás, ha a lábra felfutó él kerül. Honnan származik a mérőjel, milyen periódusidővel?
(#) watt válasza (Felhasználó 15355) hozzászólására (») Nov 25, 2012 /
 
Ez rendben van. A kód engedélyezése ablakban mi van? Gondolom ott is ugyanaz, mint a kódomban? Egyéni megszakítást készítettél, amiben beállítottál egy makrót, amit meghív ugye?
640KHz megy be a CCP1 lábra? Nem sok ez kicsit? Miért kell ekkora freki?
(#) watt válasza (Felhasználó 15355) hozzászólására (») Nov 25, 2012 /
 
A timert beállítottad külső forrásra?
Nem tudom miért nem szakít meg, kézzel is meg kéne nyílván...
(#) watt válasza (Felhasználó 15355) hozzászólására (») Nov 25, 2012 /
 
Olyan nincs, hogy nem menti, ez harveres!
(#) pjg válasza watt hozzászólására (») Nov 25, 2012 /
 
Ja értem....
A timer túlcsordul és megszakít. Akkor a megszakítás rutinja megnézi, hogy van e gomb megnyomva. Ha van lekezeli és/ vagy ha nincs kilép a megszakításból.
(#) watt válasza pjg hozzászólására (») Nov 25, 2012 /
 
Pontosan. A lekezelés nagyon gyorsan megvan, a fő program észre sem veszi, hogy félbeszakították, még is mindent tudunk a gombról...
(#) watt válasza (Felhasználó 15355) hozzászólására (») Nov 25, 2012 /
 
Ez kell ott legyen. Mi az hogy nem jó? Nem lehet, hogy a timer áll és te azt hiszed, hogy nem mentődik el, pedig csak 0-kat ment? Beállítottad a Timer1-et külső forrásra? Jó lábra kötötted a mérendő jelet?
A hozzászólás módosítva: Nov 25, 2012
(#) pjg válasza watt hozzászólására (») Nov 25, 2012 /
 
Na mentem pihi, mert mindjárt reggel. Meló.
(#) watt válasza pjg hozzászólására (») Nov 25, 2012 /
 
Dettó! Jó éjt!
(#) pjg válasza watt hozzászólására (») Nov 26, 2012 /
 
Nem bírtam ki, hogy ne rágjam át magam a megszakításos DS kezelő és a nyomógomb kezelő programodon. Nagyon logikus programok. Megértettem és kissé bele is nyúltam a magam igénye szerint. Két gomb (fel és le) valamint LEDekkel kijelezve a választott hőmérséklet. Ez eltárolva az EEpromba. Közben tervezve a HW-t. Azon tűnődöm hogy a mért hőfokot is LEDdel jelzem ki. Kétszínű LED jó lesz hozzá. A beállított érték zöld, a tényleges piros, ha fedik egymást narancs. Esetleg, ha megy a kazán akkor a mért érték villog.

Közben figyelem, hogyan dolgozik a jelenlegi "kínai, programozható, digitális" termosztát. +-0,5 fok hiszterézis van beállítva. Így 3 óránként megy 20 percet.
(#) watt válasza pjg hozzászólására (») Nov 26, 2012 /
 
Az EEPROM-al vigyázz, nem lehet végtelenszer írni. Ha úgy csináltad, hogy a beállítás után egy OK gombbal eltároltad a beállított értéket, akkor jól csinálod. Ha úgy, hogy minden plusz-minusz gombnyomásra eltárolsz, akkor nem.
A LED-es megoldás megfelelő, de én akkor tenném zöldre, ha megvan a hőfok.
A hozzászólás módosítva: Nov 26, 2012
(#) watt válasza (Felhasználó 15355) hozzászólására (») Nov 26, 2012 /
 
Ma biztosan működni fog!
De nem a timer1-et kell birizgálni, az elszalad a CCP1 megszakítása után, ezért van kitalálva az egész capture hardver...
A hozzászólás módosítva: Nov 26, 2012
Következő: »»   95 / 360
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