- A Panasonic is nyit a TiVo okostévé rendszer irányába?
- Rengeteg csatlakozó van a HP legfrissebb, irodai célú monitorgóliátján
- Computex 2024: teljesen integrált hibrid hűtéssel közeleg az MSI új csúcs-VGA-ja
- Támogatja a legújabb Windows frissítést az új AIDA64
- Fürge M.2 2230-as SSD-vel jelentkezett az IRDM
Hirdetés
-
Megjelent a RIPOUT című kooperatív horror FPS teljes változata
gp Az early access időszaknak vége, elérhető lett a végső verzió.
-
A Z Flip6 jókora, a Galaxy Ring parányi akkumulátort kap
ma A telepadatok az FCC listázásában jelentek meg.
-
A választási tévinformációk ellen küzd a Meta
it Az EU monitorozza azokat az intézkedéseket, amelyeket a választási tévinformációk ellen alkalmaz a Meta.
Új hozzászólás Aktív témák
-
zka67
őstag
Sziasztok, egy kis segítségre lenne szükségem:
C-ben hogyan tudom azt megoldani, hogy egy 8 bites tömb elemeit tudjam írni és olvasni 16 bitesként is?
Valami ilyesmire gondoltam, csak ez nem működik, bár a fordító nem jelez hibát:
uint8_t zreg[8];
#define C zreg[0]
#define B zreg[1]
#define BC (uint16_t)zreg[0]
...
BC += 1;A segítségeteket előre is köszönöm!
-
zka67
őstag
Sziasztok, ismét elakadtam, így megint a segítségeteket kérem:
Nem tudom megoldani azt, hogy csak akkor olvasson be egy karaktert az stdin-ről, ha van karakter, magyarul ne várjon a karakterre, ha nincs.
while (1) {
if (checkInput()) doInput();
if (checkTimer()) doTimer();
}Itt a checkInput() a kérdéses, fogalmam sincs, hogy oldjam meg, hogy jelezze, ha van karakter az stdin-ben.
A segítségeteket előre is köszönöm.
-
zka67
őstag
Sziasztok,
Nem tudom megoldani azt, hogy csak akkor olvasson be egy karaktert az stdin-ről, ha van karakter, magyarul ne várjon a karakterre, ha nincs.
while (1) {
if (checkInput()) doInput();
if (checkTimer()) doTimer();
}nos azt hiszem, sikerült megoldanom a problémát:
void ???func(void *parm) {
pthread_mutex_lock(&mutex);
...
pthread_mutex_unlock(&mutex);
sched_yield();
return NULL;
}
int main(int argc, char **argv) {
pthread_t threadid, inputid;
char f;
f = 1;
while (1) {
pthread_mutex_lock(&mutex);
pthread_create(&threadid, NULL, threadfunc, NULL);
if (f) {
f = 0;
pthread_create(&inputid, NULL, inputfunc, NULL);
}
usleep(10);
pthread_mutex_unlock(&mutex);
pthread_join(threadid, NULL);
pthread_mutex_destroy(&mutex);
}
}ahol az inputfunc a doInput() és a threadfunc a doTimer()
Magyarul, két külön szálon fut a két funkció.
A program alapját a neten találtam, és egyenlőre fogalmam sincs, hogy a pthread_xxx-ek mit is csinálnak pontosan, de a program az elvárásoknak megfelelően működik.
[ Szerkesztve ]
-
zka67
őstag
válasz don_peter #5187 üzenetére
Szia, én innen szoktam venni a szenzorokat:
IC DS18B20 TO-92 DALLAS Thermometer Temperature Sensor NEW GOOD QUALITY
-
zka67
őstag
Szia, itt az általam használt modul. A gpio.h-t cseréld le a PIC io moduljára, és a gpio funkciókat is írd át a megfelelőkre, értelemszerűen (Ez a program a 2.5-ös portot használja, természetesen ez szabadon választható). A temp_delay értékeket át kell számolnod, hogy a megfelelő időzítéseket megkapd.
Először olvasd ki az értket a chip-ből a temp_get()-tel, utána indítsd el a következő konverziót a temp_start_conv()-val, és a következő kiolvasásig várj 1mp-et. A program az alapértelmezett felbontást használja (12 bit), a konverzió ideje 750ms. Ezalatt csinálhatsz mást, sűrűbben kiolvasni nincs értelme és egyébként is hibás adatot kapnál.
Remélem így már boldogulni fogsz
#include "core/gpio/gpio.h"
void temp_delay(int delay) {
do { ; } while(--delay);
}
void DQ_LOW(void) {
gpioSetDir(2, 5, gpioDirection_Output);
gpioSetValue(2, 5, 0);
}
void DQ_HIGH(void) {
gpioSetValue(2, 5, 1);
gpioSetDir(2, 5, gpioDirection_Input);
}
uint32_t DQ(void) {
return gpioGetValue(2, 5);
}
void temp_reset(void) {
char presence = 1;
while (presence) {
DQ_LOW() ;
temp_delay(9055); // 503us
DQ_HIGH();
temp_delay(1260); // 70us
presence = DQ();
temp_delay(7740); // 430us
}
}
void temp_write_byte(uint8_t val) {
uint32_t i;
uint8_t temp;
for (i=8; i>0; i--) {
temp = val & 0x01;
DQ_LOW();
temp_delay(90); // 5us
if (temp) DQ_HIGH();
temp_delay(1134); // 63us
DQ_HIGH();
temp_delay(36); // 2us
val = val >> 1;
}
}
uint8_t temp_read_byte(void) {
uint32_t i;
uint8_t value = 0;
for (i=8; i>0; i--) {
value >>= 1;
DQ_LOW();
temp_delay(108); // 6us
DQ_HIGH();
temp_delay(72); // 4us
if (DQ()) value |= 0x80;
temp_delay(1134); // 63us
}
return(value);
}
void temp_start_conv(void) {
DQ_HIGH();
temp_reset();
temp_write_byte(0XCC); // skip rom
temp_write_byte(0X44); // start conversion
}
uint32_t temp_get(void) {
uint32_t tlv, thv;
temp_reset();
temp_write_byte(0XCC); // skip rom
temp_write_byte(0XBE); // read scratchpad
tlv = temp_read_byte();
thv = temp_read_byte();
DQ_HIGH();
return tlv | (thv << 8);
} -
zka67
őstag
Szia, jobban megnézve a kódodat, én úgy látom, hogy csak 8 bitet olvasol ki a 12-ből.
[ Szerkesztve ]
-
-
zka67
őstag
válasz maestro87 #5471 üzenetére
Szia, a fordítód alapértelmezett beállítása 24 bites lebegőpontos számok. Így ne csodálkozz, ha csak az első néhány számjegye pontos. A --FLOAT=32 opcióval állítsd át 32 bitesre a lebegőpontos számok formátumát, és így már 6 tizedesig pontos lesz. Továbbá a doksid 143. oldalán megtalálod a különböző változó típusok pontosságát, így nem igaz, hogy csak 16 bites számokat tud kezelni a fordítód. Van pl. signed és unsigned short long, és signed és unsigned long, 24 és 32 bites méretben.
A lebegőpontos számoknál pontosabb eredményt kapsz, ha tudod hogy hány tizedesjegy pontosságra van szükséged, és egész számokat használsz. Ha pl. 3 tizedes elég, akkor megszorzod pl. at 123.456-ot 1000-el és 123456-al dolgozol, amikor pedig az eredményre van szükséged akkor osztod 1000-el és meg is van a számod egész része. És gyorsabb is.
-
zka67
őstag
válasz ToMmY_hun #5547 üzenetére
Szia, de igen, a pointerek csak és kizárólag egy darab memóriacímet tárolnak, ami egy darab szám. Az összes többit a fordító végzi el. Ha te pl. egy int típusú tömb címét adod át paraméterként egy függvénynek, az átadott paraméter csak a tömb címét tartalmazza. Amikor a függvényben a tömb következő elemére lépsz, a fordító által generált kód szerint lesz 4-el nagyobb a címed. Ha karakter tömb címét adod át, a fordító csak 1-el fogja növelni a címet. Ennél egyszerűbben nem tudom megfogalmazni.
-
zka67
őstag
válasz Jester01 #5552 üzenetére
Szia,
Ezzel együtt az eredeti kiindulás az volt, hogy az & operátor nem egy számot ad vissza, hanem egy megfelelő típusú pointert. Emiatt aztán (int)&x + 1 és (int)(&x + 1) az nem ugyanaz (kivéve ha véletlenül x mérete 1 byte)
Mint említettem, fizikailag a pointer egy (memória)címet tartalmaz, ami egy egyszerű szám (ez lehet 16, 32 vagy akár 64 bites érték is, rendszertől függően, de ebbe most ne menjünk bele). A pointer típusát a fordító kezeli, magából a pointer értékéből ez nem derül ki, mivel nem tárolja azt.
Az eredeti kérdés az az volt, hogy a pointer elé miért nem kell a & jel, ezt próbáltam meg konyhanyelven elmagyarázni a kérdezőnek, hogy megértse.
int main(int argc, char* argv[])
{
char c;
char *p;
p = &c;
printf("sizeof(c)=%d, sizeof(p)=%d, p=%08X\r\n", sizeof(c), sizeof(p), p);
return 0;
}Ennek az eredménye az alábbi:
sizeof(c)=1, sizeof(p)=4, p=0018FF53azaz a c változó a 0x0018FF53-as memóriacímen található. Nincs a p változóban semmilyen típus, csak a változó címe.
-
zka67
őstag
válasz llaszlo #5711 üzenetére
Szia, van egy kis ellentmondás a feladatodban:
Ebben csakis betűk szerepelhetnek. Ha más karakter is van, akkor hibaüzenet.
A space-t ne vegye figyelembe.Ha feltételezzük, hogy betűk és szóközök lehetnem az inputban, akkor az isalpha és az isspace lesznek a barátaid.
Utána már csak egy táblázatra lesz szükséged, amit csinálhatsz akár úgy is, hogy 256 elemű, vagy úgy is, hogy 64 elemű. Az első változat előnye, hogy ott meg tudod adni a space karakternek a 0 értéket, nem kell kétszer vizsgálnod a karaktert. A második változatnál pedig kivonsz 0x40-et a karakter kódjából és azt használod a tömb indexekét, ekkor az 'A'-1 karakter értéke lesz a tömb első eleme.
Ha a kisbetű és a nagybetű nincs megkülönböztetve, akkor elég egy 26 elemű tömb is a betűk értékeinek, ebben az esetben még a toupper-re is szükséged lesz, és 'A'-t vonsz ki a karaktered értékéből az indexhez.
Ha nem 256 elemű a tömböd, akkor kétszer is meg kell vizsgálnod a karaktert, hogy valóban betű-e.
[ Szerkesztve ]
-
zka67
őstag
válasz llaszlo #5715 üzenetére
Szia, hát igen, az ékezetes karaktereket nem nagyon támogatják a fordítók. Tudod, van több száz kódlap, és egy toupper-hez nem biztos hogy megérné mindegyiket beletenni, mert nem csak magyarok használják a fordítóprogramokat. Csak megjegyzem, hogy magyar kódlapból is van több tucat... melyiket szeretnéd használni? Az UTF-8 pl két vagy több karakteren ábrázolja az ékezetes betűket...
Ha neked megfelel pl. a Windows 1250-es vagy az ISO-8859, akkor egyszerű lesz a dolgod:
Nem kell külön vizsgálnod semmi, csinálsz egy 256 elemű tömböt, amiben 0 értéke van az egyéb karaktereknek, és a kis és nagybetűkhöz (amennyiben nem különbözteted meg őket) ugyan azokat az értékeket írod be. Ha szükséges a hiba kiírása ha egyéb karaktert kapsz, akkor az egyéb karaktereknek adsz pl. -1 értéket, és mielőtt hozzáadod az eredményhez, ezt figyeled.
Új hozzászólás Aktív témák
● olvasd el a téma összefoglalót!
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
Állásajánlatok
Cég: Ozeki Kft.
Város: Debrecen
Cég: Promenade Publishing House Kft.
Város: Budapest