Fórum témák

» Több friss téma
Fórum » PIC programozása C nyelven, C-Compiler
Lapozás: OK   78 / 153
(#) watt válasza Wudoou hozzászólására (») Aug 22, 2013 /
 
Most csak struktúrálisan futottam át, de igen, erről van szó.
Az a 750ms várakozás eléggé csúnya, inkább egy timer megszakításban időzíts, és ha lejár egy jelzőt beállítva a fő ciklusban folytatódhat a kiolvasás.
Van parancs, ami ellenőrzi a konverzió elkészültét, ezt időzítés helyett lehet használni, szintén timer megszakításban rápillantva egy kiválasztott ds-re.
Így lesz időd kijelezni, gombot vizsgálni stb.
A hozzászólás módosítva: Aug 22, 2013
(#) Wudoou válasza watt hozzászólására (») Aug 22, 2013 /
 
Értem, megpróbálom. Azt hiszem ami ellenőrzi a konverzió elkészültét, az az, hogy amíg a ds dolgozik, addíg 0-t kell visszaolvasni.
Ha végzett, akkor 1-et.
Szóval:
  1. while(busy == 0){                               //Ha a busz nem 0, akkor az adott érzékelő nincs a buszon
  2.         busy = OW_read_byte();                         
  3.         }

Ezt kellene belehelyezni a megszakítás rutinba.
(#) watt válasza Wudoou hozzászólására (») Aug 22, 2013 /
 
Az utasítás stimmel, az eljárás nem. Nem szabad megszakításban várakozni. if-et kell tenni és jelzőt beállítani egy timer megszakításába. A jelzőt pedig a fő programciklusban vizsgálni és lekezelni.
(#) Wudoou válasza watt hozzászólására (») Aug 22, 2013 /
 
Igen, teljesen igazad van. Meggondolatlanul kivágtam a régi ds függvényből és beillesztettem.
Húúú, azért lefárasztó tud ám lenni a programozás...
(#) potyo válasza Wudoou hozzászólására (») Aug 22, 2013 /
 
Idézet:
„Húúú, azért lefárasztó tud ám lenni a programozás...”
Az nemis annyira. Előtte végigondolni és eltervezni az egészet apró részletekig, na az, ami fárasztó inkább

Na meg amikor két napja nem megy valami, aztán rájössz, hogy hibás a panel, amit küldtek, és persze, hogy azért nem működik, mert rossz lábakra fut be az adat és az órajel. De persze ez előtt még rájössz, hogy az oszcilloszkóp kábele is törött, azért nem kapsz jelet még egy villogó led lábáról sem, nemhogy az órajellábról Ez történt kb. két hete...
A hozzászólás módosítva: Aug 22, 2013
(#) potyo válasza watt hozzászólására (») Aug 22, 2013 / 1
 
Alapvetően az a gond, hogy késleltetést használsz, ha jól értem (delayxxx?). A késleltetést próbáld elfelejteni.

Én pl. általában úgy csinálom az ilyesmit, hogy a timer 1ms időalappal fut, és ott növelgetek különféle változókat, amik ha elérnek adott értéket, akkor bebillentem a hozzájuk tartozó flaget, és nullázom a változókat. A főprogramban pedig minden programrész figyeli a saját flagjét, ha az egyesbe váltott, akkor lefut a hozzá tartozó kód, visszabillenti nullába a flagjét, és várja, amíg ismét egyes nem lesz. Pl. esetedben csinálhatod azt, hogy az 1ms timer megszakításban növeled egy belső, static kétbájtos változó értékét, amikor elért 50000-re, akkor nullázod, és beállítod a kijelző flagjét. Ha a főprogram látja a kijelző flagjét bebillentve, akkor bemegy a saját rutinjába, ott egy belső számlálón billent egyet (ez a számláló jelzi majd, hogy melyik csoportot kell a kijelzőre kiírni), a számláló értékétől függően kiírja a kijelzőre a megfelelő hőmérsékleteket, nullázza a flaget, és kész is a saját dolgával. Csatoltam, úgy jobban olvasható.
A hozzászólás módosítva: Aug 22, 2013

meres.c
    
(#) Wudoou válasza potyo hozzászólására (») Aug 22, 2013 /
 
Fúú írtam egy olyan f...a programot, hogy elszállt az egész eepromom.
Nem tudom mit csinált, de kitörölte az egészet, plusz az lcd-re is tiszta baromságokat írt ki.
Ajaj. Na jó, megfogadom potyo a tanácsodat és átszervezem az egészet.
(#) Wudoou válasza Wudoou hozzászólására (») Aug 22, 2013 /
 
Még annyit szeretnék kérdezni, hogy szerintetek érdemes az átlagolással foglalkozni?
Csak azért, mert néha észreveszem, hogy 2-3 naponta 1-2x valamelyik ds nem jól mér, és ha van kb 27 fok, akkor az egyik mérése 60-80 fok lesz, de utána egyből megjavul.
És crc hibát nem hoz.
Vagy a rutinban lehet a hiba?
(#) watt válasza Wudoou hozzászólására (») Aug 22, 2013 / 1
 
Ha nem kell gyorsan mérni, akkor mérsz hatot, a legkisebbet és a legnagyobbat kidobod és a maradék négyet átlagolod. kb. 5sec lesz a mérési idő így. De nagyon fura, hogy crc hiba nélkül többet mér, mint amennyi van.
(#) Wudoou válasza Wudoou hozzászólására (») Aug 22, 2013 /
 
Na mostmár nagyon szép kis program lett, csak a soros port nem akar válaszolni.
Átnézné valaki, hogy mit rontok el?
A hozzászólás módosítva: Aug 22, 2013

main_potyo.c
    
(#) Wudoou válasza Wudoou hozzászólására (») Aug 24, 2013 /
 
Közben sikerült kijavítanom a hibákat, mostmár szépen küldi is az adatokat, csak annyi problémám maradt, hogyha nem jó parancsot kap a PIC akkor onnantól kezdve nem szakad meg a program soros adat fogadás esetén, pedig nem is tiltom le.
Kipróbáltam Pickit2-vel debugolás közben és ha pl. jn egy *73 akkor onnantól kezdve nem ugrik az isr függvény soros részére.
Van valakinek ötlete?

main_potyo.c
    
(#) Hp41C válasza Wudoou hozzászólására (») Aug 24, 2013 / 1
 
Szia!
Hibánál nem elég letiltani és újraengedélyezni a USART -ot, a hibás karaktert ki is kell olvasni. Különben a megszakításkérése nem törődik.
(#) Wudoou válasza Hp41C hozzászólására (») Aug 24, 2013 /
 
Szia!
  1. if (RCIF)       // soros port dolgai
  2.         {
  3.                 cgetchar=RCREG;
  4.                 if( OERR )
  5.                 {
  6.                         OERR=0;
  7.                         CREN = 0;
  8.                         CREN = 1;
  9.         //      return;
  10.                 }
  11.                 if (cgetchar=='*')
  12.                 {
  13.                         bejovo_puffer.hossz=0;
  14.                         // ürítjük a fogadó puffert
  15.                 }

Itt a cgetchar-ban kiolvasom.
(#) Hp41C válasza Wudoou hozzászólására (») Aug 24, 2013 /
 
De a putch -ban nem.
(#) Wudoou válasza Wudoou hozzászólására (») Aug 24, 2013 /
 
Az a baj, hogy nem akar megszakadni, miután nem a *71 vagy a *72 jött, hanem *7 és valami más. Ez után semmi.
(#) Hp41C válasza Wudoou hozzászólására (») Aug 24, 2013 /
 
(#) _vl_ válasza Wudoou hozzászólására (») Aug 24, 2013 / 1
 
Egy tömör mintakód az interrupt kezelő algoritmusára:
  1. while (RCIF) {
  2.   if (OERR) {
  3.     // overrun - eldobáljuk a puffer tartalmát, majd reset
  4.     while (RCIF) (void)RCREG;
  5.     CREN = 0;
  6.     CREN = 1;
  7.     continue;
  8.   }
  9.   frameerr = FERR != 0;
  10.   cgetchar = RCREG;
  11.   if (frameerr) {
  12.     ... // frame error - karakter eldobása
  13.   }
  14.   else {
  15.     ... // jó karakter, eltároljuk valahová
  16.   }
  17. }
(#) Wudoou válasza Hp41C hozzászólására (») Aug 24, 2013 /
 
Köszönöm a segítséget. Innen menni fog.
(#) Wudoou válasza _vl_ hozzászólására (») Aug 24, 2013 /
 
Ejha, ebben aztán minden benne van. Köszönöm szépen. Ám lenne vele egy kis gondom.
Az hogy eldobáljuk a puffer tartalmát, az mit jelent?
A másik, hogy
  1. while (RCIF) (void)RCREG;
  2.     CREN = 0;
  3.     CREN = 1;
  4.     continue;

Nekem erre hibát hoz a fordító. Azt írja, hogy nem megfelelő eljárás.
A frameerr az egy változó?
(#) Wudoou válasza Wudoou hozzászólására (») Aug 24, 2013 /
 
Error [243] D:\Munka\Cseko\cseko_hom_logger_pic_130814\main_potyo.c; 81.1 inappropriate break/continue
Ezt kapom a fordítótól. Ha kiveszem a continue-t, akkor jó, csak az már ugye nem azt jelenti.
(#) _vl_ válasza Wudoou hozzászólására (») Aug 24, 2013 /
 
Idézet:
„Az hogy eldobáljuk a puffer tartalmát, az mit jelent?”

Az, hogy ami a pufferben van, azt ki kell olvasni, majd nem használni semmire. Ezt csinálja a belső while ciklus.
A frameerr egy változó, amibe el kell menteni az FERR bit értékét, mivel az a várakozó byte kiolvasása előtt valid, utána már a következő byte-ra vonatkozik. Ha az FERR igaz volt, akkor az adott byte valószínűleg hibás, ezért szintén el kell dobni (nem használni semmire).
A hozzászólás módosítva: Aug 24, 2013
(#) _vl_ válasza Wudoou hozzászólására (») Aug 24, 2013 /
 
Talán a külső while ciklust kihagytad, azért.
(#) Wudoou válasza _vl_ hozzászólására (») Aug 25, 2013 /
 
Igen, de az nem gond, hogy megszakításban van?
A hozzászólás módosítva: Aug 25, 2013
(#) Wudoou válasza _vl_ hozzászólására (») Aug 25, 2013 /
 
  1. while (RCIF)    // soros port dolgai
  2.         {
  3.                
  4.                 if (OERR)
  5.                 {
  6.         // overrun - eldobáljuk a puffer tartalmát, majd reset
  7.                  while (RCIF) (void)RCREG;
  8.              CREN = 0;
  9.              CREN = 1;
  10.              continue;
  11.             }
  12.                 frameerr = FERR != 0;
  13.                 cgetchar = RCREG;
  14.             if (frameerr)
  15.                 {
  16.         // frame error - karakter eldobása    
  17.                 cgetchar=0;
  18.                 }
  19.                 else
  20.                 {
  21.                
  22.                         if (cgetchar=='*')
  23.                         {
  24.                                 bejovo_puffer.hossz=0;
  25.                                 // ürítjük a fogadó puffert
  26.                         }
  27.                         else
  28.                         {
  29.                                 bejovo_puffer.adat[bejovo_puffer.hossz++]=cgetchar;     // letaroljuk a pufferbe a bejovo adatokat (eloszor csak cimet, majd utana parancsot), így lesz két bájt a pufferben
  30.                                 if (bejovo_puffer.hossz==2)
  31.                                 {
  32.                                         if (bejovo_puffer.adat[0]==pic_cim)
  33.                                         {
  34.                                                 soros_flag=1;
  35.                                         //      RTS=1;  //írás előkészítés
  36.                                         }
  37.                                         else
  38.                                         bejovo_puffer.hossz=1;
  39.                                 }       //end if
  40.                         }               //end else
  41.                 }                       //end else
  42.         }                               //end RCIF

Szóval így?
(#) _vl_ válasza Wudoou hozzászólására (») Aug 25, 2013 /
 
Akár. De szerintem ha több byte-os üzeneteket akarsz küldözgetni, akkor
- valamivel jelezni kéne, hogy melyik az első byte (mondjuk pl. legfelső bit = 1 az első byte-ban, és = 0 a többiben),
- ha bármilyen hiba van (akár frame akár overrun), akkor a komplett aktuális több byte-os üzenet megy a levesbe, és várjuk a következő első byte-ot,
- a több byte-os üzenet végére kéne valami checksum-szerűség, ha az nem stimmel, akkor megintcsak megy a levesbe az egész üzenet.
(#) Wudoou válasza _vl_ hozzászólására (») Aug 25, 2013 /
 
Igen, valószínüleg LRC lesz benne. Csak itt megálltam, mert nem akart működni ez a dolog, de most már simán megy.
Elvileg a bejovo_puffer.hossz akkor van nullázva, ha jön egy *. Ez jelzi, hogy lekérdezés lesz.
Utána vár 2 karaktert és ha az első megegyezik a PIC címével, akkor a főprogramban kiértékeli, hogy mi a második karakter (ez mondja meg, mit kell csinálnia).
Ha a PIC cím nem egyezik meg, akkor a bejovo_puffer.hossz-t 1 be írom, vagyis addíg, míg újra nem nullázzuk a *-gal, addíg nem fog kiértékelni.
(#) _vl_ válasza Wudoou hozzászólására (») Aug 25, 2013 /
 
Okés, csak arra akartam utalni, hogy ha bármilyen hiba lép fel, akkor tudni lehet, hogy minimum egy byte nem érkezett meg jól, tehát az egész üzenet komplett használhatatlan.
(#) Wudoou válasza _vl_ hozzászólására (») Aug 25, 2013 /
 
Nagyon köszönöm a segítségedet. Rengeteget tanultam belőle!
(#) killbill válasza _vl_ hozzászólására (») Aug 25, 2013 /
 
(#) watt válasza _vl_ hozzászólására (») Aug 26, 2013 /
 
Szia! A frameerr segédváltozóra miért van szükség?
Következő: »»   78 / 153
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