Fórum témák

» Több friss téma
Fórum » PIC programozása C nyelven, C-Compiler
Lapozás: OK   114 / 153
(#) Wezuv válasza ativagyok hozzászólására (») Szept 29, 2015 / 1
 
Ha nem azt írod, hogy hőmérséklet szabályzást akarsz (még akkor is, ha a hűtés is az), akkor nem írom azt amit. Nekem a hőmérséklet szabályzás fűtést jelent, de ez munkahelyi ártalom...
Szóval egy egyszerű ventilátoros hűtésnek talán elég egy arányos szabályzás is(P). Ez meg nem más, mint egy lineáris függvény (y=P*hiba+korrekció), aminek a bemenő tagja a hiba, amit az SP(beállított hőfok) és a PV(mért hőfok) különbsége ad (előjelet helyesen kezelve). Az erősítéssel (P) be tudod állítani, hogy mekkora hibára adjon 100%-ot. Ami alatta van az arányosan kisebb. És valóban lehet egy alsó határt szabni, ami alatt leállítja a ventit és a hiszterézis is hasznos, hogy ne kapkodjon összevissza a venti motorja a határon billegve.

A programod, talán pont ezt csinálja, ha minden igaz...
(#) ktamas66 válasza ativagyok hozzászólására (») Szept 29, 2015 /
 
Lehet én kavarodtam bele a sok feltételbe, de szerintem helyettesíts de néhány értéket és úgy ellenőrizd végig (pl. diff=25 vagy 250). Nem tudom a Pwm2_Set.....-ben van-e maximum vizsgálat diff*SLOPE-ra, bár nem tudjuk a SLOPE milyen érték lehet. Alapból pl. az látszik. hogy -20-nál nagyobb különbségnél lekapcsolod a ventit (ami nem tudom ildomos-e mondjuk 80 fokos cél és 60 fokos borda hőmérsékletnél). A különbséggel inkább a változtatás mértékét kellene szabályozni, tehát az eddigi pwm állást is figyelembe kell venni (ha magasabb az elvártnál növelem a kitöltést, ha alacsonyabb csökkentem).
(#) ativagyok válasza ktamas66 hozzászólására (») Szept 29, 2015 /
 
Szia!

Ez a sor lenne a maximum vizsgálat:

  1. else if(diff >= 255) {fan_duty = 255;}


A SLOPE értéke jelenleg 1.
A -20-nál nagyobb különbség nem fokot jelent, hanem az ADC 12bites értéke. Esetemben ez a 20 megközelítőleg 0.5°C. Ez lenne a hiszterézis.
(#) killbill válasza ativagyok hozzászólására (») Szept 29, 2015 /
 
Hiszterezis nincs folyamatos szabalyzasnal. Hiszterezis akkor van, ha ki-/bekapcsolgat valami, pl. egy mechanikus szobatermosztat. 20 fokon bekapcsol, 21-en ki. 1 fok a hiszterezis. Inkabb szabalyzasi tartomanynak neveznem a 20 LSB-t.
(#) ativagyok válasza killbill hozzászólására (») Szept 29, 2015 /
 
Egy adott hőmérséklet alatt esetemben is kikapcsol a venti. Ha jól gondolom, ide kellene hiszterézis, mivel ha pont határon van, akkor ki-be kapcsolgat a venti. A bekapcsolási határérték fölött viszont már arányosan szabályoz, ez a rész rendben van, szimulációban működik is.
(Lehetséges, hogy kicsit érthetetlenül írom le, amit szeretnék)
(#) killbill válasza ativagyok hozzászólására (») Szept 29, 2015 / 2
 
A hiszterezis lenyege, hogy a billenesi kuszob valtozik a komparator kimenetetol fuggoen. Ez igazabol egy pozitiv visszacsatolas az analog technikaban. Sw-bol egy allapotvaltozoval tudod megcsinalni. Ez a kod eloszor elengedi temp-et 200-ig, ott kapcsol at "hutes"-be. 190 alatt lekapcsolja a hutest. Ha hutes=0, akkor nem megy a venti. Ha hutes=1, akkor 190-hez 0 pwm ertek tartozk, es linearisan no egeszen 255-ig. A STEP adja meg, hogy mekkora a teljes szabalyzasi tartomany. Ha STEP 10, akkor 216-nal megy a venti 100%-on.

  1. int calpwm(int temp)
  2. {
  3. static int hutes;
  4. int pwm;
  5.  
  6.  if(hutes == 0 && temp >= 200){
  7.     hutes = 1;
  8.  }
  9.  else if(hutes == 1 && temp < 190){
  10.    hutes = 0;
  11.    pwm = 0; // leall aventi
  12.  }
  13.  
  14.  if(hutes){
  15.     pwm = (temp - 190) * STEP;
  16.     if(pwm > 255)
  17.        pwm = 255;
  18.   }
  19.   return pwm;
  20. }
(#) ativagyok válasza killbill hozzászólására (») Szept 29, 2015 /
 
Köszönöm, pontosan erre van szükségem. Ez nagy segítség most.
Közben már nagyon közel jártam a megoldáshoz, viszont az én kódom kb. kétszer ilyen hosszú.
Üdv,
Ati
(#) killbill válasza ativagyok hozzászólására (») Szept 29, 2015 / 1
 
Nincs mit. De van benne egy hiba. A 11. sorbol a pwm = 0; sort tedd at az elso if ele.
vagy inkabb igy:
  1. int calpwm(int temp)
  2. {
  3. static int hutes;
  4. int pwm;
  5.  
  6.  if(!hutes && temp >= 200)
  7.     hutes = 1;
  8.  else if(hutes && temp < 190)
  9.    hutes = 0;
  10.  
  11.  if(hutes){
  12.     pwm = (temp - 190) * STEP;
  13.     if(pwm > 255)
  14.        pwm = 255;
  15.   }
  16.   else
  17.     pwm = 0;
  18.  
  19.   return pwm;
  20. }
A hozzászólás módosítva: Szept 29, 2015
(#) don_peter hozzászólása Okt 6, 2015 /
 
Uraim, van egy ilyen bit léptetésem:
  1. (0x80>>x)

Azt szeretném, hogy a léptetést követően balról ne nullák lépjenek be hanem 1-esek.
Tehát 10000000 ha léptetem jobbra akkor nem így 01000000 hanem így töltődjön fel: 11000000, 111000000, 11110000...stb
Előre is köszi.
A hozzászólás módosítva: Okt 6, 2015
(#) don_peter válasza (Felhasználó 15355) hozzászólására (») Okt 6, 2015 /
 
Igen, sajnos fontos, ezért vagyok bajba.
Ha nem lehet egyszerűen akkor nyilván fel kell vennem külön egy táblába az eseteket és hozzáadni, de jobb lenne egy igen egyszerű megoldás.
  1. unsigned char bitek[8]={0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff};
  2. bitek[x];

Ennél kellene egyszerűbb, ha van.
A hozzászólás módosítva: Okt 6, 2015
(#) Hp41C válasza don_peter hozzászólására (») Okt 6, 2015 /
 
  1. k = (0x80 >> x);

helyett:
  1. k=0x80;
  2. for (i = 0; i < x; i++)
  3. {
  4.   k >>=1;
  5.   k|=0x80;
  6. }

Avag C18 -ban van Rlcf(var, dest, access) makro.
  1. for (i = 0; i < x; i++)
  2. {
  3.   STATUSbits.C = 1;
  4.   Rlcf(k,1,0); // azaz rlncf k,f, access
  5. }
A hozzászólás módosítva: Okt 6, 2015
(#) Hp41C válasza cross51 hozzászólására (») Okt 6, 2015 /
 
Idézet:
„0x80 >> x”

Változó számú bittel való léptetést sugall..
(#) don_peter válasza Hp41C hozzászólására (») Okt 6, 2015 /
 
Köszi, de ez bonyolultabb mint amit megírtam. Nem akarom még egy ciklust így is van bőven..
  1. void Line(void){
  2.         unsigned char x,y,z,v;
  3.         unsigned char bitek[8]={0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff};
  4.         unsigned char sor, h=1, paratlan, elso=0;
  5.         if(h==1){
  6.                 sor = 0;
  7.                 elso = 1;
  8.         }else if(h%2==0){
  9.                 sor = h/2;
  10.         }else if(h%2==1){
  11.                 sor = h/2-1;
  12.                 paratlan = 1;
  13.         }else{
  14.                 sor = 0;
  15.         }
  16.  
  17.         for(z = 10; z < 11; z++){
  18.                 for(y = sor; y < 8; y++){
  19.                         for(v = 0; v < 2; v++){
  20.                                 for(x = 0; x < 8; x++){
  21.                                                 if(y < 32){
  22.                                                         LCD_WriteCommand(0x80 | z);
  23.                                                 LCD_WriteCommand(0x80 | y);
  24.                                                 }else{
  25.                                                         LCD_WriteCommand(0x80 | (z-32));
  26.                                                 LCD_WriteCommand(0x88 | y);
  27.                                                 }
  28.                                         if(v){
  29.                                                 if(paratlan){
  30.                                                         paratlan=0;
  31.                                                         LCD_WriteData(0x00);
  32.                                                         LCD_WriteData(bitek[x]);
  33.                                                 }else{
  34.                                                         LCD_WriteData(0xff);
  35.                                                         LCD_WriteData(bitek[x]);
  36.                                                 }
  37.                                         }else{
  38.                                                 if(elso){
  39.                                                         elso=0;
  40.                                                         LCD_WriteData(0x00);
  41.                                                 }else{
  42.                                                         LCD_WriteData(bitek[x]);
  43.                                                 }
  44.                                         }
  45.                                         Delay10KTCYx(10);
  46.                                 }
  47.                         }
  48.                 }
  49.         }
  50. }

Ez egy ST7920-as GLCD pixelenkénti vonalhúzása lesz majd egyszer, ha végre ki tudom kényszeríteni belőle amit akarok.
Az a sok feltétel az elején és a sok változó, majd a pozicionálás miatt kell, egyelőre még nem működik, csak mutatom mibe kellett a léptetés.
Elég ocsmány egy kijelző..
A hozzászólás módosítva: Okt 6, 2015
(#) Hp41C válasza don_peter hozzászólására (») Okt 6, 2015 / 1
 
Esetleg:
k = 0xFF << (7 - x);
(#) don_peter válasza Hp41C hozzászólására (») Okt 6, 2015 /
 
No ez akár lehet jó is.. Köszi, kipróbálom..
(#) killbill válasza don_peter hozzászólására (») Okt 7, 2015 /
 
  1. (signed char)0x80 >> x

Ennek az eredmenye int lesz, es az osszes felso bit is 1-ben lesz. Ha char-kent vagy unsigned char-kent hasznalod fel az eredmenyt, akkor mindegy, de ha zavar, akkor le tudod vagni a tetejerol a felesleges egyeseket:
  1. ((signed char)0x80 >> x) & 0xff

A dolog lenyege, hogy a signed tipusoknal a jobbra shifteles az elojel bitet masolja. A signed char tipusnal a 7-es bit (0x80) az elojel bit.
A hozzászólás módosítva: Okt 7, 2015
(#) don_peter hozzászólása Okt 17, 2015 /
 
Köszönöm a fentebbi segítséget.
Most egy elvileg egyszerű esetben kérném a segítségeteket.
Nem jövök rá, hogy egy több dimenziós tömböt, hogy hozhatok létre a következő esetre:

  1. unsigned char fonts[1][5]= { {'A', {0x8,0x14,0x22,0x3e,0x22} } };

A lényege az lenne, hogy "A" tömb tartama alá tartozna a mögötte lévő 5 byte-nyi adat.

Vagy ezt így nem lehet?
ui: plusz sorokkal meg tudom oldani, de én erre az egyszerű megoldásra gondolnék.
A hozzászólás módosítva: Okt 17, 2015
(#) foxi63 válasza don_peter hozzászólására (») Okt 17, 2015 /
 
Így kellene:
  1. unsigned char xx [2][5]={{1,2,3,4,5},{4,5,6,7,8}};

ekkor xx[0][3]=4; és xx[1][4]=8;
A tömbök 0. elemmel kezdődnek.
üdv.:Foxi
A hozzászólás módosítva: Okt 17, 2015
(#) don_peter válasza foxi63 hozzászólására (») Okt 17, 2015 /
 
Köszi, ezt tudom, de ez még nem egyértelmű azzal amit keresek.
A lényege az lenne, hogy "A" tömb tartama alá tartozna a mögötte lévő 5 byte-nyi adat.
Ez önmagában így nekem nem jó.

Valójában amit keresek az azt hiszem az Asszociatív tömb lesz.
Nem tudom hogy C18-ban lehet e ezt alkalmazni.
A hozzászólás módosítva: Okt 17, 2015
(#) Kovidivi válasza don_peter hozzászólására (») Okt 17, 2015 /
 
Amit ki tudsz használni: a betűknek van egy ASCII értéke. Tehát ha azt írod, 15+'A', akkor a 15-höz hozzáadja az A betű ASCII értékét, ami egy decimális szám. Függvényhíváskor ezt tudod használni.
Pl. write_char('D'); a függvényben pedig kivonod mindig az 'A' ASCII értékét, így mindig 0-tól fog sorszámozódni minden betű. A tömbödben tárolhatod egymás után a betűk képeit, ami ha 5byte, akkor amennyi betű, annyiszor 5byte-ot használsz fel.
(#) foxi63 válasza don_peter hozzászólására (») Okt 17, 2015 /
 
Szia!
Esetleg készítesz egy felsorolt típust enum a,b,c,e,f,g,h,j,i,k,
ezekután használhatod a hozzátartozó tömb elemeit. pl.: fonts [a][0]
(#) cross51 válasza don_peter hozzászólására (») Okt 17, 2015 /
 
Gondolom karakter készletet akarsz csinálni GLCD-hez, szerintem ez a feladat nagyon hasonló a 8x8 led matrix karakter készletéhet. Ne úgy képzeld el, hogy minden tömb elé be írod, hogy melyik karakterről van szó, hanem a tömböt ascii karakter sorban kéne elkészíteni, és így mikor a tömböt olvasod a karakter értéke - 0x30 az adott karakter tömbjének kezdőcíme és ezt egy for ciklusba rakva olvasod végig, ha gondold nekem erre szövegmozgatással van programom, de az MAX7219-hez készült.
(#) pipi válasza don_peter hozzászólására (») Okt 17, 2015 /
 
Hali!
miért nem jó a 6 elemű tömb?
(#) don_peter hozzászólása Okt 18, 2015 /
 
Végül úgy oldottam meg, hogy létrehoztam az azonosítás miatt egy másik tömböt:
  1. unsigned char fontnum[41] = {' ', '0','1','2','3','4','5','6','7','8','9',
  2.                                                         'A','B','C','D','E','F','G','H','I','J',
  3.                                                         'K','L','M','N','O','P','Q','R','S','T',
  4.                                                         'U','V','W','X','Y','Z',':','!','/','-'};

És kikeresem melyik betű melyik tömbhöz tartozik és elmentem a számát.
  1. // Keresett 1. betű száma
  2.                 kbetu1=0xFF;
  3.                 for(x=0; x<41 && kbetu1==0xFF; x++){
  4.                         if(fontnum[x] == tomb[i*4]) kbetu1 = x;
  5.                 }

Majd ezzel a számmal már is megvan a karakter.
  1. if(kbetu1!=0xFF){
  2.                                 bit32 = (bit32 | (temp | font5x5[kbetu1][y])<<2)<<6;
  3.                         }

A balra 2bit eltolassál ne foglalkozzatok, az szükséges a mostani karakterkódom miatt. (00111111)

Jelen pillanatban a karakter kiírás működik szépen de nagyon béna az elosztása.
Itt van egy 128x64-es GLCD kijelző és normál alakban 4x16 karakter kiírására alkalmas.
Vicces.
Vannak olyan programok amivel képes a 8x16 karakter kiírására.
Én most egy olyant írtam amivel képes a 10x16 karakter kiírására is.
Ezek már majdnem jók lennének, ha nem lenne óriási űr két karakter közt.
Ezt akarom csökkenteni 1pixel-re.
Amin most dolgozom az a számításaim szerint 10x21 karaktert lesz képes kiírni egy sorba.
Ehhez viszont kellene egy 128bit-es változóra amit valszeg struktúrába fogok létrehozni és a teljes szélességben fogom elhelyezni a karakterek egymásutáni pixeleit.
24bit-el már megoldottam, hogy az első 4karakter szépen rendezetten 1pixel kihagyással egymás után kezdődjön, de a nagyobb része még hátra van...
ST7920 kijelzőről van szó.. Baromi ratyi..
(#) don_peter hozzászólása Okt 18, 2015 /
 
Uraim, van valakinek DS1820-hoz való C18-as kódja megírva?
Nem találnám fel még egyszer a spanyol viaszt.
Köszi előre is.
(#) Hp41C válasza don_peter hozzászólására (») Okt 18, 2015 /
 
Kéerdezd meg Gooooogle -t.
A hozzászólás módosítva: Okt 18, 2015
(#) Wezuv válasza don_peter hozzászólására (») Okt 18, 2015 / 1
 
Minden karakternek van saját kódja, miért kell külön keresgélni, mikor csak ki kell vonni a kódból egy egész számot és megvan a tömb címe...
Kivétel lehet ez alól az ékezetes karakterek, de azokat is könnyű konvertálni a tömb végére...

A változó szélességű karakterekhez pedig le lehet tárolni a karakter szélességét a karakter bitkép bájtjai elé plusz két bájtra, hogy a kiíró rutin tudja, mennyi oszlopot kell kirakni, hányadiktól.
(#) don_peter válasza Wezuv hozzászólására (») Okt 18, 2015 /
 
Minden karaktert én írok meg külön és teszek be egy tömbbe.
Nem minden karakter oda esik a tömbbe ahol az alapértelmezett karakterek lennének.
De nyilván ha az angol ABC-t követve kerül be a tömbbe az elkészített karakter bitképe, akkor egy kivonásos, vagy hozzáadásos módszerrel meg lehet határozni a keresett karaktert.
Ez még rugalmas szóval köszönöm a tanácsot, átgondolom és módosítani fogom, úgy, hogy minél rugalmasabb és gyorsabb legyen a kód.

Hp41C: köszi, gondoltam ez emberibb, ha itt kérdezem meg, hisz szeretünk segíteni egymásnak..
Ettől független a goggle-t is kérdezgetem, hátha nem kell újra feltalálnom valamit
(#) cross51 válasza don_peter hozzászólására (») Okt 18, 2015 /
 
Az ascii kódrendszerben való elhelyezéshez egy kis segítség ez MAX7219-re van de szerintem nagyon jó alapot nyújthat mint írtam, Bővebben: Link itt a harmadik nagyobb programban látsz egy karakterkészletet ez sor multiplexeléses megoldás, Bővebben: Link ez oszlop multiplexes, mindkettő arduino-ra készült de révén, hogy C-ről van szó könnyen átvehető/átdolgozható.
(#) cross51 hozzászólása Okt 18, 2015 /
 
Sziasztok!

Nem tudom, hogy van-e sok értelem amit csinálok, de azért gondoltam megkérdezem hátha sikerül megcsinálni.
Szóval arról lenne szó, hogy a printf függvény szeretném elkészíteni kicsit másképp ezt a függvény sikerült helyette csinálni:
  1. void lcdprint(const char *format, ...)
  2. {
  3.     va_list args;
  4.     va_start (args, format);
  5.     vprintf (format, args);
  6.     va_end (args);
  7. }


a C++ refernce oldalról származik valamit sok microchipes és egyéb fórum bújása után jutottam ide, de ezzel az a baj, hogy a fordító ezt dobja a vprintf-re warning: (1404) unsupported: vprintf() is not supported by this compiler, de szimulációba mégis megnyit egy vprintf.c fájlt így nem értem, hogy mért mondja, hogy nem támogatott. A string kiírás még működik de ha a pirntf-hez hasonlóan egy formázott adatot szeretnék kiírni először a %-jel el tér vissza aztán a formázást jelölő karakterrel.

Ezt meglehet valahogyan oldani?
Következő: »»   114 / 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