Fórum témák

» Több friss téma
Fórum » Folyamatábrás mikrokontroller programozás Flowcode-dal
Lapozás: OK   96 / 360
(#) pjg válasza watt hozzászólására (») Nov 26, 2012 /
 
Kezdőként a könnyebbik utat választottam. A rosszabbikat. Gondolván, hogy az az egymillió beírási lehetőség az milyen sokáig elegendő. Persze, hogy minden gombnyomást tárol. De már átlátom a program működését és pikk-pakk meglesz a "tárol" gomb is.
Az, hogy milyen színű a LED az részletkérdés, de köszi az észrevételt. Megfogadom.
(#) Hp41C válasza (Felhasználó 15355) hozzászólására (») Nov 26, 2012 /
 
Szia!
Nem értek flowcode -ul, de még azt is be kell állítani, hogy a CCP láb bemenet legyen, a CCP modul a timer1 -et (és nem a Timer3) mentse a CCPR regiszterekbe.
(#) watt válasza (Felhasználó 15355) hozzászólására (») Nov 26, 2012 /
 
Én még mindig nem értem mit csinálsz a Timer1h-val, vagy az egy saját változó, amit feltöltöttél előtte a ccpr1h-ból? Nem túl szerencsés elnevezés, megtévesztő. Ha viszont a valós timer1h, vagy abból lett feltöltve, akkor abszolút nem ezt kéne csinálni! Fene ezt a Flowcode megoldást, hogy a regiszerek nevét kicsivel írják! Teljesen összezavar mindent!
A programot csak délután tudom megnézni...

Megszakítást csak akkor kell letiltani, ha két megszakítás között nem tudod lekezelni a folyamatot. Egyébként a CCP1 megszakítását a PIE1.CCP1IE bittel lehet engedélyezni, tiltani.
A Timer1-et nem kell megállítani, vagy megszakítását tiltani, csak a mérés kezdetekor esetleg nullázni és törölni a megszakításokat számláló számlálót, hogy legyen idő a mérést megkezdeni, ne fusson be egy Timer1 megszakítás, mondjuk két órajel múlva. A többi megy magától.
A PWM is futhat folyamatosan, mivel a Timer2 van hozzárendelve. A második mérőjel után mindenképpen van idő a számításokra és a következő mérésre felkészülni.
(#) Hp41C válasza watt hozzászólására (») Nov 26, 2012 /
 
A Timer1 -et jobb nem piszkálni. ld.: Timer1 errata.
(#) watt válasza Hp41C hozzászólására (») Nov 26, 2012 /
 
Én is amellett vagyok.
Viszont te hogyan kerülnéd el azt a helyzetet, hogy bejön a CCP1 megszakítás, ekkor törölni kéne a megszakításokat számláló számlálót. De mi van, ha a CCP1 megszakítása lekezelése közben csordul túl a Timer1 is? Bár ha a Timert a CCP után kezelem le a megszakításban, akkor ez meg is oldott, talán... ??

Másik kérdésem, a Timer3-al is ilyen gondok vannak?
A hozzászólás módosítva: Nov 26, 2012
(#) Hp41C válasza watt hozzászólására (») Nov 26, 2012 /
 
Ez a kulcs kérdése a felbontás növelésének. Egy megszakítási szintre kell tenni őket, ekkor ha egyik kér, a másik már nem tudja félbeszakítani. Ha a CCP megszakítás érkezik előbb, akkor a CCP már tárolt, a timer1 (timer3) pedig lép tovább. Ha a timer fordul át hamarabb, akkor 0 -ról indul újra a számítás és később tárol a CCP. A probléma csak akkor jelentkezik, ha a megszakítás kiszolgálása alatt, vagy addig, amíg a kiszolgálás eljut az ok kiderítéséig a későbbi kérés is befut.

Timer3 ugyan olyan egység, mint a Timer1. Külön erratát nem találtam, de nagyon sok típus errata -ban együtt szerepel a Timer1 / Timer3.
(#) watt válasza Hp41C hozzászólására (») Nov 26, 2012 /
 
Ha a CCP1 kiszolgálása közben csordul túl a Timer1 és töröljük a Timer1 túlcsordulás számlálót az nem okoz bajt, mert a kiszolgálás után rögtön ráfutunk a Timer1 kiszolgálására is, azaz a következő méréshez meg lesz a túlcsordulás pontos száma. Ha a Timer1 megszakítás kezelése közben fut be a CCP1, akkor pedig szintén ott lesz a megszakítás száma, amikor a Timer1-el végezve szinte azonnal a CCP1 megszakítására lépünk. Szerintem ezt az egészet folyamatos Timer1-el ki lehet szolgálni, főleg, ha a mérő freki 1Hz! Ha olyan magas frekit mérünk, amivel a Timer1 hamarabb túlcsordul, mint amennyi idő kellene a megszakításba való visszalépéshez, akkor le kell mondanunk erről a frekiről! Nem számolgattam, de szerintem ez a freki fizikailag sem fér be a Timer1 portján, úgyhogy nem lesz gond.
(#) pjg válasza (Felhasználó 15355) hozzászólására (») Nov 26, 2012 /
 
Még egy kicsit simogatom.
(#) pjg válasza (Felhasználó 15355) hozzászólására (») Nov 26, 2012 /
 
Még nincsen készen, de már látni valamit.

(#) watt válasza (Felhasználó 15355) hozzászólására (») Nov 26, 2012 /
 
Most néztem bele a programba. Nagyon fontos, hogy a Megszakítás blokk egy csomó regisztert beállít, ha valamit máshogyan akarnál beállítani, akkor azt utána kell kiadnod a C kódban, vagy módosítani kell a blokkon belül egyedi kóddal.
A ccpr1x regisztereket nem szabad írni, semmi értelme. A timer1x regeket szintén ne piszkáld.
A timer2 megszakításban nem tudom mit szerettél volna, de ha nem tévedek ütközik a CCP1 megszakításban történtekkel.
(#) watt válasza pjg hozzászólására (») Nov 26, 2012 /
 
Néhány építő észrevétel. Egy Feltételes elágazásnál ha két hőfokot összehasonlítasz és az egyik ágba teszed, hogy a Relé bekapcs, akkor a másik ágba teheted, hogy a relé kikapcs, nem kell neki még egy Feltételes elágazást csinálni, mert ez felesleges programmemóriát pazarol és amúgy sincs logikai értelme.
Az Ok a Gomb nevében nálam az Oké gombot jelölte, van még Menu, meg Plusz, Minusz stb. Adj beszédes neveket a változóknak, meghálálják!
Néztem a gombok detektálását a Timer0-ban, nem biztos, hogy megértetttem mit szeretnél...
(#) pjg válasza watt hozzászólására (») Nov 26, 2012 /
 
Azért tettem külön mert így más más hiszterézist tudok beállítani melegedéshez, lehűléshez.

Memória az van még csak 7%-ot foglal a program.

gombnevekkel nem foglalkoztam igazán. Csak összelapátoltam, hogy lássam merre mennyi?

A fel gombbal növelem a hőmérsékletet, a le gombbal csökkentem. Az OK tárolja a beállítást
(#) watt válasza pjg hozzászólására (») Nov 26, 2012 /
 
Már látom hogyan oldottad meg, nem rossz! Egy hátránya van, hogy egyszerre csak egy gomb lehet lenyomva, de ez a legtöbb esetben nem gond.
(#) kaqkk válasza watt hozzászólására (») Nov 26, 2012 /
 
Csináltam egy újabb verziót

fellegomb.fcf
    
(#) watt válasza kaqkk hozzászólására (») Nov 26, 2012 /
 
Korábban már jeleztem, hogy nem szabad meghívni egy olyan rutint, amit a megszakítás is meghív, mert akkor a megszakításnak nem sok értelme lesz és az adatok is össze vissza keveredhetnek! Az is kifogásolható, hogy rengeteg blokkot használsz fel és tele van ugrásokkal.
Az is problémás, hogy végül is nem a Timer megszakításban döntődik el, hogy a gomb meg van-e nyomva. Emellett, ha valahol leragad a program, pl. a hőn szeretett Delay blokkok használatakor, akkor az int értéke külön életre kel.
Az is gond, hogy a 15Hz-es Timer0-al is nagyon gyors a szimuláció a valóságban ez nem működik szerintem.

Ha a kiírt feladat szerint nézzük, akkor nem teljesül a fő programszáltól való gomb detektálási függetlenség és a kevés blokk felhasználás. A többi említésre kerülő kifogás, csak hab a tortán. De ne add fel!
(#) Kovabe hozzászólása Nov 26, 2012 /
 
Sziasztok.
Szeretnék több DS18B20-as szenzort bekötni egy picre. Hogy tudom beazonositani illetve hogy lehet beállitani hogy minden eggyes szenzorhoz más változó legyen rendelve?
(#) vilmosd hozzászólása Nov 26, 2012 /
 
Szoval gombok kezelesere mutatok egy egyszeru, es rugalmas megoldast (hatha nem leszek ledorongolva mert megint C)
Van nekem egy bott.h allomanyom, ami lekezeli a gombok allapotat, es visszaad egy erteket a gombok allapotatol fuggoen:
  1. #define butt_c1 1      
  2. #define butt_c2 2
  3. #define butt_c3 3
  4. #define butt_c4 4
  5. #define butt_c5 5
  6.  
  7. #define Butt1 0b00100000
  8. #define Butt2 0b00001000
  9. #define Butt3 0b00000010
  10. #define Butt4 0b00000000
  11. #define Butt5 0b00001010
  12.  
  13. #define Butt_MASK ((Butt1) | (Butt2) | (Butt3) | (Butt4) | (Butt5))
  14.  
  15.  
  16.  
  17. int botton( int in_butt)
  18. {
  19.  
  20.         switch ( in_butt & Butt_MASK )
  21.         {
  22.  
  23.     case Butt1:
  24.         return (butt_c3);
  25.         break;
  26.  
  27.     case Butt2:
  28.         return (butt_c2);
  29.         break;
  30.  
  31.     case Butt3:
  32.         return (butt_c1);
  33.         break;
  34.    
  35.    
  36.     case Butt5:
  37.         return (butt_c4);
  38.         break;
  39.  
  40.     default:return (0);
  41.  
  42.        // no Botton or more Bottons
  43.  
  44.         }
  45. }
A lenyege, hogy a Butt_MASK tartalmazza a figyelt biteket, es ezt at lehet irni a kivanalmaknak megfeleloen. A jelen peldanal figyeljuk a bit1, a bit3, a bit5 allapotait, valamint a bit1&bit3 allapotot (itt ket gomb van egyszerre lenyomva). A botton() fvenyt periodikusan meghivjuk a bemenetek allaallapotaval, es a visszateresi ertek a felso definiciok valamelyike,a gombok allapotatol fuggoen. Amennyiben nem egyezik a bemenet egyik maszkkal sem, akkor 0 a visszateresi ertek. A fuggveny feldolgozasat a TMR0 IT alatt csinalom. A TMR0 IT mondjuk 10 mS gyakorisaggal tortenik. Minden IT alatt beolvasom a gombokhoz tartozo portot, es meghivom a botton() fvenyt, ami visszaad egy erteket. Amennyiben ket beolvasas egyezik, akkor a gombnyomas stabil, es rogton eldontom, hogy mi az amit csinalnom kell a kesobbiekben. De lassuk a kezelesre a peldat:
  1. int_rtcc                          // This function is called every time
  2. void clock_isr()
  3. {                                                       // the RTCC (timer0) overflows (255->0).
  4.     set_timer0(100);                // TMR0 reload
  5.        
  6.        
  7.       if (sampleb)
  8.           {
  9.                 sampleb--;
  10.           }
  11.  
  12.      }
  13.      
  14.         butt_in=~port_a;      //read bottons
  15.         n_butt=botton(butt_in);
  16.         if((o_butt==n_butt)&&n_butt&&!sampleb)
  17.         {
  18.                 switch (n_butt)
  19.                 {
  20.                         case 1: ......
  21.                                         break;
  22.                        
  23.                         case 2: ......
  24.                                         break;
  25.                        
  26.                         case 3: .......
  27.                                         break;
  28.                                         default:
  29.                 }
  30.                 sampleb=SAMPLEM;
  31.         }
  32.         if (o_butt!=n_butt) sampleb=SAMPLEM;
  33.         o_butt=n_butt; 
  34. }
A SAMPLEM egy allando, amivel a gombnyomas idejet lehet beallitani. A n_butt es a o_butt valtozokban taroljuk a gomb uj es a regi allapotat. Amikor a ket allapot megegyezik, es az ido letelt, akkor dontjuk el mit fogunk csinalni. Jellemzoen a Case: sorokban egy-egy bit beallitasa tortenik, es utana a foprogramban dontjuk el mit csinalunk a bitek allapotatol fuggoen. Termeszetesen ennel is lehetseges a gombismetles sebesseget allitani a sampleb valtozo nagysagatol fuggoen. Azt hogy ezt a modszert hogyan lehet rafaragni a FC programra azt talan probaljatok meg Ti. En ezt a modszert alkalmazom sok projectben, es korrekt eredmenyt ad.
(#) watt válasza (Felhasználó 15355) hozzászólására (») Nov 26, 2012 /
 
Hibás a Timer1, erről esett szó, ezért nem érdemes birizgálni, csak fejtörés lesz belőle. Had menjen, úgy is működnie kell a folyamatnak.
Felesleges erőfeszítésnek látom, hogy pontos 1Hz-et akarsz készíteni. Mindegy mennyi, csak tudd, hogy mennyi(esetleg egy hiteles periódusidőmérő?)! A többi számítás kérdése.
A jelenlegi programban már jó sorrendben állítod be a Timer1-et?
Tedd fel, hogyan akarod a PWM-et beállítani, mert így nem tudom mitől mehet gyorsabban.
(#) watt válasza Kovabe hozzászólására (») Nov 26, 2012 /
 
Az one wire blokkban be lehet állítani, hogy hány db eszközt keressen a vonalon. A makróhívásokban indexelve kellene megjelenjenek. Minden mást a blokk makrója megold, elvileg. Nekem is csak egy darab van, már bánom, hogy csak egyet rendeltem, nem túl olcsó...
(#) pjg válasza watt hozzászólására (») Nov 26, 2012 /
 
Nálunk itt a végeken 980.- egy DS.
(#) watt válasza vilmosd hozzászólására (») Nov 26, 2012 /
 
Szia! Sajnos ezért nem tudok tudáspontot adni, de ha átfaragod a topic témájának megfelelően Flowcode-ra, akkor dupla tudáspont jár!
(#) kaqkk válasza pjg hozzászólására (») Nov 26, 2012 /
 
Viszont itt az apróban valaki hirdeti 400ft/db áron
(#) pjg válasza kaqkk hozzászólására (») Nov 26, 2012 /
 
+ posta, mindjárt ugyanannyi.
(#) kaqkk válasza pjg hozzászólására (») Nov 26, 2012 /
 
levélben 200ft ért elmegy bárhová az országban
(#) watt válasza (Felhasználó 15355) hozzászólására (») Nov 26, 2012 /
 
Nekem is így működik, neked miért nem? Timer1-et nem állítom le, csak minden második CCP1 megszakítást figyelek. Ezt neked nem kell, mert nálad a mérőjel megy a CCP1-re. A Timer1 csak had számláljon, neked csak az első mérőjelnél el kell menteni, nullázni a Timer1 megszakításait számláló számlálót, majd várni a második mérőjelet, ekkor ugyanezt megcsinálod, kiszámolod, amit ki kell és innen folyamatosan forog az egész magától. Ha nem csinálod meg, majd én megcsinálom, csak most sok más dolgom van párhuzamosan...
(#) watt válasza (Felhasználó 15355) hozzászólására (») Nov 26, 2012 /
 
Ez egy +-2C pontos analog szutyok. Azért a DS-el nem lehet egy lapon említeni, az árán is látszik!
(#) watt válasza (Felhasználó 15355) hozzászólására (») Nov 26, 2012 /
 
De! Akkor inkább az SPI-s változatok(TC77), azok csak 1fokot tévednek, nem 4-et, mint a 9700-as sorozat.
A hozzászólás módosítva: Nov 26, 2012
(#) kaqkk válasza watt hozzászólására (») Nov 26, 2012 /
 
Nem -De denem dede
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 /
 
Szerintem hagyjuk... Egyébként 25C-on 1fokot lóg, de 0..70 között 4-et, ami elfogadhatatlan...
Adatlap 9700
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 /
 
Végig kell kapibrálni, mert nem tudod hol mennyit merre csal. Inkább kiadok érte 700Ft-ot(ennyi a HQ-ban) és kapok 0,5C lógást! Egyébként meg a TC77-et használom, mert olcsó és jó 1méteren belülre. A DS-t nagyon messzire is el lehet vinni!
Nem tudom neked miért jött be hiba, én nem várakoztam utána semmit, és jó lett.
A hozzászólás módosítva: Nov 26, 2012
Következő: »»   96 / 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