www.elektronik.si
Začetniški problem v C-ju pri AVR-ju
Pojdi na stran Prejšnja  1, 2, 3 ... 23, 24, 25 ... 27, 28, 29  Naslednja  :||:
www.elektronik.si -> Osnove programiranja AVR-jev

Avtor: arksiKraj: Dolenjska PrispevekObjavljeno: 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

Avtor: MitjaNKraj: Ljubljana PrispevekObjavljeno: Tor Dec 23, 2014 8:44 am    Naslov sporočila:  
----------------------------------------------------------------------------
ans = ((float)((long)(2.12345 * 10 + 0.5)))/10;

Avtor: arksiKraj: Dolenjska PrispevekObjavljeno: Pet Feb 13, 2015 10:43 pm    Naslov sporočila:  
----------------------------------------------------------------------------

Avtor: lojzek PrispevekObjavljeno: 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.

Avtor: tilz0RKraj: Črnomelj PrispevekObjavljeno: 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)

Avtor: lojzek PrispevekObjavljeno: 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.

Avtor: lojzek PrispevekObjavljeno: 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... Think 1000 ali 232 Think

Avtor: dgrudeKraj: Velike Lašče PrispevekObjavljeno: 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))

Avtor: lojzek PrispevekObjavljeno: 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 Smile

Think

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 Think
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" Think

Avtor: lojzek PrispevekObjavljeno: 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 Whistle Angel )

Če mi kdo lahko nakaže smer rešitve bi bil hvaležen.


Nazadnje urejal/a lojzek Sre Avg 10, 2016 1:41 pm; skupaj popravljeno 1 krat

Avtor: tilz0RKraj: Črnomelj PrispevekObjavljeno: 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?

Avtor: lojzek PrispevekObjavljeno: Sre Avg 10, 2016 1:47 pm    Naslov sporočila:  
----------------------------------------------------------------------------
To je bilo pa neverjetno hitro Very Happy

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?

Avtor: tilz0RKraj: Črnomelj PrispevekObjavljeno: 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

Avtor: lojzek PrispevekObjavljeno: Čet Avg 11, 2016 10:56 am    Naslov sporočila:  
----------------------------------------------------------------------------
Very Happy Princip deluje! Prvič sem uporabil arraye in pointerje in vse kaže, da jih bom počasi zastopil.

Tilzor, thx Smile

Avtor: lojzek PrispevekObjavljeno: 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..

Stran 24 od 29

Powered by phpBB © 2001,2002 phpBB Group