Fórum témák

» Több friss téma
Fórum » PIC - Miértek, hogyanok haladóknak
Lapozás: OK   461 / 1320
(#) menyus válasza whisky hozzászólására (») Ápr 17, 2009 /
 
Én nem vagyok profi, de amit leírsz az szerintem tipikusan valami tápszűréssel kapcsolatos gerjedési probléma. Pár hozzászólással lejjebb találod "potyo" megoldását az ilyen jellegű problémára (hsz (#419718) )
A nem használt I/O lábakat pedig konfigold kimenetté, persze csak ha nincs rájuk kötve egyébként semmi..
(#) trudnai válasza whisky hozzászólására (») Ápr 17, 2009 /
 
100nF -et vagy akar 1µF keramia kondit tegyel a Vdd-Vss labakra olyan kozel a PIC labaihoz amennyire csak lehet.
(#) menyus válasza whisky hozzászólására (») Ápr 17, 2009 /
 
a gomb úgy van bekötve, hogy +5 voltot ad az egyik megszakítási lábra, és van egy 10KOhm-os ellenállás, ami ezt a lábat köti össze 0-volttal,

szerintem ezt pont fordítva kéne csinálni, bemenetet felhúzni tápra 10K val és a nyomógomb húzza testre a bemenetet.
(#) watt válasza whisky hozzászólására (») Ápr 17, 2009 /
 
Ha az LVP bit nincs letiltva, és a PGM láb lebeg, vagy egyéb dolog vezérli, akkor is ilyen dolgok szoktak történni.
(#) whisky válasza watt hozzászólására (») Ápr 17, 2009 /
 
A PGM lekötése megoldotta szinte minden problémámat! Köszi mindenkinek a gyors válaszokért A megszakításos problémát meg épp most próbálom javítani!
(#) szilva válasza whisky hozzászólására (») Ápr 17, 2009 /
 
Épp azt akartam írni, amit előttem watt is említett, hogy nagyon valószínű, hogy vagy a PGM lábat kellene GND-re húzni egy ellenállással, vagy a config-ban ki kellene kapcsolni az LVP módot. Egyébként mintha nem írtad volna, hogy milyen PIC, így edig az, hogy a 10-11. láb környékét tapogatva bolondul meg, nem túl sok információt hordoz.
(#) watt válasza whisky hozzászólására (») Ápr 17, 2009 /
 
Jobb lenne, ha letiltanád az LVP bitet a konfigban.
(#) szigetivan válasza icserny hozzászólására (») Ápr 17, 2009 /
 
Sziasztok!

Kipróbáltam minden lehetőséget, amiket írtatok, így a para-ba jó adat kerül (humidity = para - 400), ami a mostani páratartalom mellett és figyelemben véve a szenzor grafikonját és a rajta mért feszültséget (táplábán 5 V) megfelelő szám. A gond a számokkal a képletnél van (humidity = 0.1590492671*para - 31.20521173, amit kicsit átalakítottam 256-al szoroztam, mivel ha nagyobbal tenném, para maximális értékénél túlcsordulna
(humidity = 41*para;
humidity=(unsigned long)(humidity)>>8;
humidity-=31
és arra jutottam, hogy a műveleteket csak 8 biten végezheti, vagy nemtudom hogy, bárhogy is próbáltam, azokkal a módszerekkel amiket említettetek és ami csak eszembe jutott. Szóval se átalakítva, sehogy máshogy nem ad vissza jó értéket..
Hogy a temperature-be jó érték kerül az csak amiatt van, hogy kis számokkal dolgozik..
Miért nem tud normálisan számolni?
(#) trudnai válasza szigetivan hozzászólására (») Ápr 17, 2009 /
 
Probaldd meg igy:

(humidity = 41L*para;
humidity=(unsigned long)(humidity)>>8L;
humidity-=31L
(#) icserny válasza szigetivan hozzászólására (») Ápr 17, 2009 /
 
Azért a programot becsatolhattad volna! Jó lenne látni a változódeklarációkat, a math16.h becsatolását és a képletek konkrét alakját.
(#) szigetivan válasza icserny hozzászólására (») Ápr 17, 2009 /
 
Csatoltam.

Trudnai javaslatával sem jó:S

szenzor.c
    
(#) szigetivan válasza szigetivan hozzászólására (») Ápr 17, 2009 /
 
Korrigáltam a main-t, mert még a másik NYÁK-omon levő szenzorokra volt a progi megírva..

TRISA = 0b.0000.0010;
TRISB = 0b.0011.0000; // RB7>TX, RB5>RX=1
TRISC = 0b.0011.0111; // RC0 AN4 input of temperatute, RC1 AN15 input of humidity
ANSEL = 0b.0011.0000; //; Dig, Dig, Ana input Ana input, Dig, Dig, Dig, Dig
(#) icserny válasza szigetivan hozzászólására (») Ápr 17, 2009 /
 
Ezeknek mi az értelme?
  1. #include "int16CXX.H"  
  2. #include <math24f.h>


Idézet:
„int msb, lsb;”

Ezeket is unsigned long-nak, vagy uns16-nak kellett volna deklarálni! Így nincs értelme a használatuknak. Pont arra lettek volna jók, hogy a 8 - > 16 bit konverziót megoldjuk velük.

Az alábbi sornak működni kellene. Ezt milyen assembly utasításokra fordítja a compiler? Mutasd!
  1. para = ((unsigned long)ADRESH<<8) + ADRESL;



Ennek mi értelme? Nem a te dolgod, hogy írjál bele.
  1. ADRESH = 0;
  2. ADRESL = 0;
(#) szigetivan válasza icserny hozzászólására (») Ápr 17, 2009 /
 
Csatoltam a compiler fordítását!
A két include-ot kivettem, az msb, lsb unsigned long-nak átírtam és az ADRESH és ADRESL=0 sort kivettem.

szenzor.asm
    
(#) szigetivan válasza icserny hozzászólására (») Ápr 17, 2009 /
 
Sztem ez a sor működik:
Idézet:

1. para = ((unsigned long)ADRESH<<8) + ADRESL;”


Ami nem jól számol sztem ez:

humidity = 41L*para;
humidity=(unsigned long)(humidity)>>8L;
humidity-=31L;
(#) trudnai válasza szigetivan hozzászólására (») Ápr 17, 2009 /
 
Idézet:
„Ami nem jól számol sztem ez:

humidity = 41L*para;
humidity=(unsigned long)(humidity)>>8L;
humidity-=31L;”


Rendben, de melyik nem jo a 3 sor kozul, es milyen teszt adatokkal probalkozol? Mit jelent a 'nem jo' ?
(#) Mate12345 hozzászólása Ápr 17, 2009 /
 
Sziasztok! Nekem a következő PIC-programra lenne szükségem.

Fogad egy bájtot 9600 baud-dal és azt belerakja egy regiszterbe.
(Amint megkapja az adatot, generálódjon egy megszakítás.)

Tudom, hogy ott az adatlap, de egyszerűen nem tudok rajta kiigazodni.

Légyszi írjatok nekem egy ilyen programot! (A konfigokat is írjátok meg, amit a megszakítás érdekében létre kell hozni.)

Tudom, hogy elég pofátlan a kérés, de nekem tényleg csak egy egyszerű és összeszedett kis példa kell. (Asm-ben) Abból már meg tudnám csinálni, amit akarok, de egyszerűen nem találok normális leírást. (Az adatlap rendes, hogy közli, melyik biteket módosítsam, de hogy azok hol vannak, azt néhány oldallal előbb írta valahol. Ezen nem tudok kiigazodni.)

A válaszokat előre is köszönöm.

Szerk.: Asszinkron kapcsolat kell.
(#) szigetivan válasza trudnai hozzászólására (») Ápr 17, 2009 /
 
Ami nem jó az az eltolás, mivel én úgy vettem észre, hogy csak 8 biten akarja elvégezni a számolást és olyan eredményt ad hogy az alsó 8 bit mintha eltűnne és a felső 8 bit értékét adja vissza 8 bites számként...
Teszt adat para=450-500 közti szám, mivel kb. ennyinek kellene most lennie mivel Vout = para* Vref / 1023, Vout=2,23 V, Vref=5V. Legalábbis én ezeket a számokat kaptam és számoltam.

Idézet:
„Mit jelent a 'nem jo' ?”

Ezt úgy értem, hogy Vout alapján kiszámolom kézzel para értékét és beírom a képletbe (humidity = (0.1590492671*(unsigned long)(para)) - 31.20521173) kézzel 50% körüli érték, majd elvégzem mindezt a fordítóval és megnézem, hogy mit ad a humidity-re, ami ott 2%.
(#) Mate12345 válasza Mate12345 hozzászólására (») Ápr 17, 2009 /
 
Kicsit félreérthető: A megszakításon belül kezelje le a program az adatot.
(#) icserny válasza szigetivan hozzászólására (») Ápr 17, 2009 /
 
Idézet:
„Csatoltam a compiler fordítását!”

Szép hosszú lista. Csak pont azt az egy sort hagytad ki a c programból, amit kértem...
(#) icserny válasza szigetivan hozzászólására (») Ápr 17, 2009 /
 
  1. humidity=(unsigned long)(humidity)>>8L;


Ennek a typecasting-nak mi értelme van, ha a humidity változó már eleve "unsigned long" típusú?
(#) szigetivan válasza icserny hozzászólására (») Ápr 17, 2009 /
 
Uhh bocsesz, amúgy ezt a sort nem fordítja le nálam, és ezzel a hibaüzenettel jön vissza:
Unable to generate code
(#) szigetivan válasza icserny hozzászólására (») Ápr 17, 2009 /
 
Igazad van, ennek sem sok értelme van így..
(#) icserny válasza szigetivan hozzászólására (») Ápr 17, 2009 /
 
Idézet:
„Ami nem jó az az eltolás, mivel én úgy vettem észre, hogy csak 8 biten akarja elvégezni a számolást és olyan eredményt ad hogy az alsó 8 bit mintha eltűnne és a felső 8 bit értékét adja vissza 8 bites számként...”

Tévedésben vagy, mert te pont ezt kérted tőle! Ha a 16 bites változót nyolc helyiértékkel jobbra lépteted (osztás 256-tal), akkor csak az a 8 bit marad, ami eredetileg a magasabb helyiértékű bájtban volt.

A fordító tehát korrekt kódot generált, mostmár csak az a kérdés, hogy akkor mit is akarsz csináltatni?
(#) icserny válasza szigetivan hozzászólására (») Ápr 17, 2009 /
 
Idézet:
„Uhh bocsesz, amúgy ezt a sort nem fordítja le nálam”

Ehhez képest meglepő, hogy néhány sorrallentebb ezt írtad:
Idézet:
„Sztem ez a sor működik:
para = ((unsigned long)ADRESH<<8) + ADRESL;”


Szóval nem fordul le, de működik? Akkor minek kínlódsz a fordítóval?
(#) szigetivan válasza icserny hozzászólására (») Ápr 17, 2009 /
 
Idézet:
„Tévedésben vagy, mert te pont ezt kérted tőle! Ha a 16 bites változót nyolc helyiértékkel jobbra lépteted (osztás 256-tal), akkor csak az a 8 bit marad, ami eredetileg a magasabb helyiértékű bájtban volt.”


Rendben, akkor miért lesz ez az érték a humidity-ben 36?
para értéke konvertálás után 485 (ADRESH=1, ADRESL=229).
humidity = 41L*para; (ami 19885)
humidity=humidity>>8L; (ezután 77-nek kéne lenni humidity-ben)

és mivel ebből kéne még 31-et kivonna az csak 5% lenne és nem a kézzel kiszámolt 46%, és ez a szám nem jó.
(#) szigetivan válasza icserny hozzászólására (») Ápr 17, 2009 /
 
Na szóval az említett sor nem fordul le, rosszul írtam
(#) szigetivan válasza szigetivan hozzászólására (») Ápr 17, 2009 /
 
Így nem fordul le:
para =((unsigned long)ADRESH<<8) + ADRESL;

Így lefordul:

para = (ADRESH<<8)+ADRESL;

Remélem most érthetőbb voltam>>>>
(#) drywater válasza menyus hozzászólására (») Ápr 17, 2009 /
 
Valóban lehagytam, hogy a zöld a top oldal, a poros a bottom.

Minden alkatrész a top oldalon van, hátul csak forrasztás történt.

Az egész kapcsolásban két tápszűrő kondi van. Egy 100nF-os és egy 10µF-os. A PCB-n ezek C3- és C4-ként szerepelnek. A PIC közelében csak két 33pF-os kondi van, a kristály miatt.
(#) icserny válasza szigetivan hozzászólására (») Ápr 17, 2009 /
 
Idézet:
„Így nem fordul le: para =((unsigned long)ADRESH<<8) + ADRESL;”


1. Akkor próbáld így:
  1. para =(unsigned long)ADRESH<<8;
  2. para += ADRESL;


2. Vagy így:
  1. msb=ADRESH;
  2. lsb=ADRESL;
  3. para = msb*256 + lsb;



X. Vagy hajítsd ki a fordítót!

Következő: »»   461 / 1320
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