www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 
Sponsored by SiOL

Začetniški problem v C-ju pri AVR-ju
Pojdi na stran Prejšnja  1, 2, 3 ... 23, 24, 25, 26  Naslednja
 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Osnove programiranja AVR-jev
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
arksi
Član
Član



Pridružen-a: Sre 03 Sep 2008 10:19
Prispevkov: 583
Aktiv.: 4.33
Kraj: Dolenjska

PrispevekObjavljeno: Tor Dec 23, 2014 8:07 am    Naslov sporočila:   Odgovori s citatom

>>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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
MitjaN
Član
Član



Pridružen-a: Sre 17 Avg 2011 15:40
Prispevkov: 90
Aktiv.: 0.91
Kraj: Ljubljana

PrispevekObjavljeno: Tor Dec 23, 2014 8:44 am    Naslov sporočila:   Odgovori s citatom

ans = ((float)((long)(2.12345 * 10 + 0.5)))/10;
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
arksi
Član
Član



Pridružen-a: Sre 03 Sep 2008 10:19
Prispevkov: 583
Aktiv.: 4.33
Kraj: Dolenjska

PrispevekObjavljeno: Pet Feb 13, 2015 10:43 pm    Naslov sporočila:   Odgovori s citatom




Vrednost_bayt_ov.jpg
 Opis:
 Velikost datoteke:  26.12 KB
 Pogledana:  3 krat

Vrednost_bayt_ov.jpg



Računanje_posameznih_bayt_ov.jpg
 Opis:
 Velikost datoteke:  85.4 KB
 Pogledana:  20 krat

Računanje_posameznih_bayt_ov.jpg


Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
lojzek
Član
Član



Pridružen-a: Pet 25 Jan 2008 8:00
Prispevkov: 3000
Aktiv.: 21.14
Kraj: Koroška Bela

PrispevekObjavljeno: Pon Mar 07, 2016 9:28 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
tilz0R
Član
Član



Pridružen-a: Čet 31 Maj 2012 15:39
Prispevkov: 854
Aktiv.: 9.60
Kraj: Črnomelj

PrispevekObjavljeno: Pon Mar 07, 2016 9:33 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
lojzek
Član
Član



Pridružen-a: Pet 25 Jan 2008 8:00
Prispevkov: 3000
Aktiv.: 21.14
Kraj: Koroška Bela

PrispevekObjavljeno: Pon Mar 07, 2016 12:17 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
lojzek
Član
Član



Pridružen-a: Pet 25 Jan 2008 8:00
Prispevkov: 3000
Aktiv.: 21.14
Kraj: Koroška Bela

PrispevekObjavljeno: Pet Maj 06, 2016 11:21 am    Naslov sporočila:   Odgovori s citatom

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
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
dgrude
Član
Član



Pridružen-a: Sob 15 Nov 2008 13:44
Prispevkov: 176
Aktiv.: 1.33
Kraj: Velike Lašče

PrispevekObjavljeno: Pet Maj 06, 2016 11:53 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
lojzek
Član
Član



Pridružen-a: Pet 25 Jan 2008 8:00
Prispevkov: 3000
Aktiv.: 21.14
Kraj: Koroška Bela

PrispevekObjavljeno: Pet Maj 06, 2016 12:43 pm    Naslov sporočila:   Odgovori s citatom

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
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
lojzek
Član
Član



Pridružen-a: Pet 25 Jan 2008 8:00
Prispevkov: 3000
Aktiv.: 21.14
Kraj: Koroška Bela

PrispevekObjavljeno: Sre Avg 10, 2016 1:38 pm    Naslov sporočila:   Odgovori s citatom

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.



meni.png
 Opis:
 Velikost datoteke:  5.01 KB
 Pogledana:  3428 krat

meni.png




Nazadnje urejal/a lojzek Sre Avg 10, 2016 1:41 pm; skupaj popravljeno 1 krat
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
tilz0R
Član
Član



Pridružen-a: Čet 31 Maj 2012 15:39
Prispevkov: 854
Aktiv.: 9.60
Kraj: Črnomelj

PrispevekObjavljeno: Sre Avg 10, 2016 1:40 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
lojzek
Član
Član



Pridružen-a: Pet 25 Jan 2008 8:00
Prispevkov: 3000
Aktiv.: 21.14
Kraj: Koroška Bela

PrispevekObjavljeno: Sre Avg 10, 2016 1:47 pm    Naslov sporočila:   Odgovori s citatom

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?
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
tilz0R
Član
Član



Pridružen-a: Čet 31 Maj 2012 15:39
Prispevkov: 854
Aktiv.: 9.60
Kraj: Črnomelj

PrispevekObjavljeno: Sre Avg 10, 2016 1:51 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
lojzek
Član
Član



Pridružen-a: Pet 25 Jan 2008 8:00
Prispevkov: 3000
Aktiv.: 21.14
Kraj: Koroška Bela

PrispevekObjavljeno: Čet Avg 11, 2016 10:56 am    Naslov sporočila:   Odgovori s citatom

Very Happy Princip deluje! Prvič sem uporabil arraye in pointerje in vse kaže, da jih bom počasi zastopil.

Tilzor, thx Smile
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
lojzek
Član
Član



Pridružen-a: Pet 25 Jan 2008 8:00
Prispevkov: 3000
Aktiv.: 21.14
Kraj: Koroška Bela

PrispevekObjavljeno: Pet Avg 26, 2016 1:02 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Osnove programiranja AVR-jev Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Pojdi na stran Prejšnja  1, 2, 3 ... 23, 24, 25, 26  Naslednja
Stran 24 od 26

 
Pojdi na:  
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: 145 dni


Powered by phpBB © 2001, 2005 phpBB Group