Fórum témák
» Több friss téma |
Fórum » PIC - Miértek, hogyanok haladóknak
É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..
100nF -et vagy akar 1µF keramia kondit tegyel a Vdd-Vss labakra olyan kozel a PIC labaihoz amennyire csak lehet.
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.
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.
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!
É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.
Jobb lenne, ha letiltanád az LVP bitet a konfigban.
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?
Probaldd meg igy:
(humidity = 41L*para; humidity=(unsigned long)(humidity)>>8L; humidity-=31L
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.
Csatoltam.
Trudnai javaslatával sem jó:S
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
Ezeknek mi az értelme?
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!
Ennek mi értelme? Nem a te dolgod, hogy írjál bele.
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.
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;
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' ?
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.
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%.
Kicsit félreérthető: A megszakításon belül kezelje le a program az adatot.
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...
Ennek a typecasting-nak mi értelme van, ha a humidity változó már eleve "unsigned long" típusú?
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
Igazad van, ennek sem sok értelme van így..
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?
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?
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ó.
Na szóval az említett sor nem fordul le, rosszul írtam
Így nem fordul le:
para =((unsigned long)ADRESH<<8) + ADRESL; Így lefordul: para = (ADRESH<<8)+ADRESL; Remélem most érthetőbb voltam>>>>
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.
Idézet: „Így nem fordul le: para =((unsigned long)ADRESH<<8) + ADRESL;” 1. Akkor próbáld így:
2. Vagy így:
X. Vagy hajítsd ki a fordítót! |
Bejelentkezés
Hirdetés |