|
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
arksi Član
Pridružen-a: Sre 03 Sep 2008 10:19 Prispevkov: 741 Aktiv.: 3.89 Kraj: Dolenjska
|
Objavljeno: Tor Dec 23, 2014 8:07 am Naslov sporočila: |
|
|
>>nekaj mesecev kasneje<<
Zanima me, ali ostaja v jeziku C kakšna funkcija, ki bi decimalni rezultat zaokrožila na določeno število decimalk. Programiram atmega328P.
Npr.: vrednost 2.12345 bi rad zaokrožil na eno decimalno mesto 2.1.
LP
|
|
Nazaj na vrh |
|
|
MitjaN Član
Pridružen-a: Sre 17 Avg 2011 15:40 Prispevkov: 91 Aktiv.: 0.59 Kraj: Ljubljana
|
Objavljeno: Tor Dec 23, 2014 8:44 am Naslov sporočila: |
|
|
ans = ((float)((long)(2.12345 * 10 + 0.5)))/10;
|
|
Nazaj na vrh |
|
|
arksi Član
Pridružen-a: Sre 03 Sep 2008 10:19 Prispevkov: 741 Aktiv.: 3.89 Kraj: Dolenjska
|
Objavljeno: Pet Feb 13, 2015 10:43 pm Naslov sporočila: |
|
|
Opis: |
|
Velikost datoteke: |
26.12 KB |
Pogledana: |
4 krat |
|
Opis: |
|
Velikost datoteke: |
85.4 KB |
Pogledana: |
23 krat |
|
|
|
Nazaj na vrh |
|
|
lojzek Član
Pridružen-a: Pet 25 Jan 2008 8:00 Prispevkov: 3356 Aktiv.: 16.97
|
Objavljeno: Pon Mar 07, 2016 9:28 am Naslov sporočila: |
|
|
Mene pa zanima, če je že kdo zasledil enostavnejšo softversko rešitev, ki bi bila podobna hardverski "pin change interrupt" oz. hardverski prekinitvi na rising / falling edge?
Sedaj to softversko delam z if stavki in postavljanjem / brisanjem vsaj dveh zastavic / spremenljivk, ki jih potem zopet preverjam. Skratka kar nekaj IF-ov in vsaj ena spremenljivka.
|
|
Nazaj na vrh |
|
|
tilz0R Član
Pridružen-a: Čet 31 Maj 2012 15:39 Prispevkov: 898 Aktiv.: 6.20 Kraj: Črnomelj
|
Objavljeno: Pon Mar 07, 2016 9:33 am Naslov sporočila: |
|
|
lojzek je napisal/a: |
Mene pa zanima, če je že kdo zasledil enostavnejšo softversko rešitev, ki bi bila podobna hardverski "pin change interrupt" oz. hardverski prekinitvi na rising / falling edge?
Sedaj to softversko delam z if stavki in postavljanjem / brisanjem vsaj dveh zastavic / spremenljivk, ki jih potem zopet preverjam. Skratka kar nekaj IF-ov in vsaj ena spremenljivka. |
Če si shraniš trenutno stanje PIN registra v eno spremenljivko, lahko preveriš v while zanki, ali se je vrednost spremenila glede na shranjeno.
Če se je, narediš XOR z staro vrednostjo in dobiš rezultat, ki ima bite na 1 tam, kjer se je stanje zamenjalo.
Potem pa pač preveriš stanje PIN registra glede na to, kateri bit imaš postavljen na 1 v rezultatu XOR operacije.
Tukaj, poglej "Primeri" pri vaji za tipke (vaja 4)
_________________ Knowledge sharing is caring.
majerle.eu | stm32f4-discovery.net |
|
Nazaj na vrh |
|
|
lojzek Član
Pridružen-a: Pet 25 Jan 2008 8:00 Prispevkov: 3356 Aktiv.: 16.97
|
Objavljeno: Pon Mar 07, 2016 12:17 pm Naslov sporočila: |
|
|
THX, to je malce lažje in bolj razumljivo od tistega, kar sem do sedaj počel. Bom pa še malce preštudiral.
|
|
Nazaj na vrh |
|
|
lojzek Član
Pridružen-a: Pet 25 Jan 2008 8:00 Prispevkov: 3356 Aktiv.: 16.97
|
Objavljeno: Pet Maj 06, 2016 11:21 am Naslov sporočila: |
|
|
Ponovno imam eno vprašanje:
Programiram mego8 in imam recimo 4 spremenljivke tipa uint8_t, se pravi unsigned char. Ta normalno sprejme vrednost 0-255. Ker gre v mojem primeru za časovne spremenljivke, se njihova vrednost giblje 0-23 za ure in 0-59 za minute.
Potem pa v if stavku, kot je prikazano v primeru:
Koda: |
if (((hour*100+min) < (ALhourOFF2*100 + ALminOFF2)) |
vrednost ur pomnožim s 100 in prištejem minute. Npr ura 10:00 bi tako postala vrednost 1000.
Ali pa je to resnično, ali pa primerjalna vrednost (ZANIMA ME SAMO V IF STAVKU) zaradi uporabe Uchar-a naredi večkratni rollover in tako v danem primeru dobi stanje 232:
Koda: |
1000 = 0b11111101000
232 = 0b 11101000
|
S sprintf sem sicer vrednost prikazal na LCD in dobim lepo 1000, ampak sprintf mogoče naredi kaj "po svoje" in nisem nikakor 100%, kateri rezultat je za mego tisti pravi... 1000 ali 232
|
|
Nazaj na vrh |
|
|
dgrude Član
Pridružen-a: Sob 15 Nov 2008 13:44 Prispevkov: 193 Aktiv.: 1.03 Kraj: Velike Lašče
|
Objavljeno: Pet Maj 06, 2016 11:53 am Naslov sporočila: |
|
|
Vrednost 232 dobiš zato, ker mega računa z 8 bitno spremenljivko(kot vidiš je spodnjih 8 bitov pravilnih). V if stavku spremenljivko castaj v 16 bit-no pa bo zadeva delovala po pričakovanjih.
Takole bi moralo delovati:
if ((((uint16_t)hour*100+min) < (ALhourOFF2*100 + ALminOFF2))
|
|
Nazaj na vrh |
|
|
lojzek Član
Pridružen-a: Pet 25 Jan 2008 8:00 Prispevkov: 3356 Aktiv.: 16.97
|
Objavljeno: Pet Maj 06, 2016 12:43 pm Naslov sporočila: |
|
|
Aha hvala. Bom poskusil po predlogu. Sicer mi že brez tega preverjanje časovnikov deluje (tako preko palca) ampak dejansko pa ne vem, kaj pravzaprav v resnici primerja. sedaj vem, da napačne vrednosti, ki so pravzaprav po naključju vse enako napačne in zato ustrezne
Sem še malo potestiral. V primeru rolloverja bi potem morala biti ura 2:57 (željena vrednost 257) popolnoma enaka kot rollover na čas 00:02 (vrednost 257-255 = 2). Ampak vseeno zgleda da se rollover ne zgodi
Skratka, program se obmaša kar enako če castam z uint16_t ali pa ne... Mogoče pa že kompiler naredi tisto, kar bi moral jaz "na roke"
|
|
Nazaj na vrh |
|
|
lojzek Član
Pridružen-a: Pet 25 Jan 2008 8:00 Prispevkov: 3356 Aktiv.: 16.97
|
Objavljeno: Sre Avg 10, 2016 1:38 pm Naslov sporočila: |
|
|
Ponovno imam eno vprašanjce....
Želim narediti menu, ki ima recimo 6 elementov, izbor vsakega nekaj naredi. To deluje.
Rad pa bi naredil neke vrste menijski prikaz, kjer menije izbiraš z enkoderjem.
Torej, podmenijev je recimo 6, na LCD imam 4 vrstice za prikaz. Ali obstaja nek način, da besedila (naslove) menijev spravim v spomin, potem pa glede na vrtenje enkoderja (od 1-6) prikažem na LCD ekranu tisti naslov menija z določeno številko?
Nekaj podobnega kot na risbi v prilogi
Malce sem gledal po netu, pa mi stvari niso jasne:
- Zasledil pa sem nekaj s "struct" ukazom.
- ali se da kaj narediti s kazalci (do sedaj jih še nisem uporabljal )
Če mi kdo lahko nakaže smer rešitve bi bil hvaležen.
Opis: |
|
Velikost datoteke: |
5.01 KB |
Pogledana: |
6495 krat |
|
Nazadnje urejal/a lojzek Sre Avg 10, 2016 1:41 pm; skupaj popravljeno 1 krat |
|
Nazaj na vrh |
|
|
tilz0R Član
Pridružen-a: Čet 31 Maj 2012 15:39 Prispevkov: 898 Aktiv.: 6.20 Kraj: Črnomelj
|
Objavljeno: Sre Avg 10, 2016 1:40 pm Naslov sporočila: |
|
|
Imaš array pointerjev na stringe, ki jih prikažeš.
Imaš potem enkoder, ki z njim kontroliraš spremenljivko.
Ta spremenljivka gre v tvojem primeru od 0 do 2 in predstavlja, kater string se začne na vrhu LCD-ja.
Če je x = 0, potem prikažeš prve 4,
če je x = 1, potem prikažeš drugo, tretjo, četrto, peto
če je x = 2, potem prikažeš zadnje 4.
Je jasno?
_________________ Knowledge sharing is caring.
majerle.eu | stm32f4-discovery.net |
|
Nazaj na vrh |
|
|
lojzek Član
Pridružen-a: Pet 25 Jan 2008 8:00 Prispevkov: 3356 Aktiv.: 16.97
|
Objavljeno: Sre Avg 10, 2016 1:47 pm Naslov sporočila: |
|
|
To je bilo pa neverjetno hitro
tilz0R je napisal/a: |
Imaš array pointerjev na stringe, ki jih prikažeš.
|
Kako pa te stringe spravim v spomin (da vem kateri je 1., ... in kateri zadnji)?
Kako ustvarim array pointerjev?
Kako potem pokličem pravi pointer?
|
|
Nazaj na vrh |
|
|
tilz0R Član
Pridružen-a: Čet 31 Maj 2012 15:39 Prispevkov: 898 Aktiv.: 6.20 Kraj: Črnomelj
|
Objavljeno: Sre Avg 10, 2016 1:51 pm Naslov sporočila: |
|
|
Tako nekako.
Koda: |
//Seznam stringov
char * stringi[] = {
"string1",
"string2",
"string3",
"string4",
"string5",
"string6",
};
//Print vrstic, pac neka funkcija, prvi parameter je vrstica na LCD, drugi kaj naj sprinta
int i = 0;
print_vrstica(1, stringi[i]);
print_vrstica(2, stringi[i + 1]);
print_vrstica(3, stringi[i + 2]);
print_vrstica(4, stringi[i + 3]);
|
Poskrberi moraš, da je i med 0 in 2, manj ne, več pa tudi ne.
lpTM
_________________ Knowledge sharing is caring.
majerle.eu | stm32f4-discovery.net |
|
Nazaj na vrh |
|
|
lojzek Član
Pridružen-a: Pet 25 Jan 2008 8:00 Prispevkov: 3356 Aktiv.: 16.97
|
Objavljeno: Čet Avg 11, 2016 10:56 am Naslov sporočila: |
|
|
Princip deluje! Prvič sem uporabil arraye in pointerje in vse kaže, da jih bom počasi zastopil.
Tilzor, thx
|
|
Nazaj na vrh |
|
|
lojzek Član
Pridružen-a: Pet 25 Jan 2008 8:00 Prispevkov: 3356 Aktiv.: 16.97
|
Objavljeno: Pet Avg 26, 2016 1:02 pm Naslov sporočila: |
|
|
Hja.... še vedno problemi z menujem. Po nebroj poizkusih sem najverjetneje ugotovil težavo, ne pa rešitve...
V eni funkciji: void (Menu) imam deklaracijo spremenljivk za meni (gornji posti) definirano takole:
Koda: |
char *Naslov[] =
{
//01234567890123456789
" ",
"1-Izhod ",
"2-Obrat. ure",
"3-Temperat. ",
"4-Ura ",
"5-Casovniki ",
"6-Kalibrac. ",
"7-Auto Send ",
};
|
Delovanje programa menija sicer v nadaljevanju funkcije deluje.
Sedaj pa problem:
V naslednji funkciji: void (obratovanje) pa imam zopet definirano spremenljivko za drugačen meni na popolnoma enak način.
Koda: |
char *Naslov[] =
{
//01234567890123456789
" ",
"1-Izhod ",
"2-Izklop ",
"3-Rocno ",
"4-Tedensko",
"5-Datum ",
}; |
in tudi program funkcije funkcionira tako, kot je treba.
Ampak.... če v celotnem programu prevedem obe funkciji, mi to zmeša vrednosti vseh ostalih spremenljivk v vseh delih programa in program kot celota napačno deluje. Ne glede na to, da ne pokličem v izvajanje nobene od teh dveh menijskih funkcij.
Če prevedem samo eno (katerokoli) od teh menijskih funkcij, program kot celota deluje v redu.
Zato po mukotrpnem preizkušanju in poizkušanju slklepam, da "besedilnih" spremenljivk ne definiram prav...
Torej, kako je prav? Sem že poizkusil z različnimi imeni (Naslov1 in Naslov2), pa ni haska..
|
|
Nazaj na vrh |
|
|
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 73 dni
Powered by phpBB © 2001, 2005 phpBB Group
|