|
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
lojzek Član
Pridružen-a: Pet 25 Jan 2008 8:00 Prispevkov: 3352 Aktiv.: 17.02
|
Objavljeno: Čet Okt 13, 2011 7:36 am Naslov sporočila: |
|
|
Ponovno sem tukaj.
Zahtevno vprašanje:
Zakaj popolnoma enaka ukazna vrstica s popolnoma enakimi vrednostmi spremenljivk U in I naredi drugačen izpis, če se izvede v programu DEV C++ in AVR studiu?
Edina (mislim da matematično nepomembna) razlika je pri spremenljivki U, ki je pri DEV tipa unsigned int, pri AVR Studio pa unsigned long.
Instrukcija:
Koda: |
sprintf (tekst, "U=%.2d.%.2dV I=%.1d.%.2dA",
U/100, U%100, I/100, I%100);
//pretvorba stevilke v string:
//tekst = rezultat;
//"%.2d" = desetiška številka, z dvema ciframa
//U ,I = stevilo, ki ga želiš pretvoriti
|
Pri uporabi - točni določitvi - vrednosti spremenljivke U = 1155 in I = 495
V simulaciji na računalniku v programu DEV C++ izpiše - array tekst postavi na vrednost:
V programu AVR Studio pa
Skratka, pri U ne izračuna decimalke, I pa izračuna in izpiše popolnoma napačno
Tudi pri sami simulaciji v AVR studio je rezultat tak, kot na LCD zaslonu |
|
Nazaj na vrh |
|
|
lojzek Član
Pridružen-a: Pet 25 Jan 2008 8:00 Prispevkov: 3352 Aktiv.: 17.02
|
Objavljeno: Pet Okt 14, 2011 10:57 am Naslov sporočila: |
|
|
Na nekaj pa lahko odgovorim sam sebi. Mogoče pa tudi komu drugemu, ki bo naletel na enak problem.
S simulacijami in ročnim vnašanjem vrednosti, ki sem jih želel izpisat, sem ugotovil, da mi oba argumenta U in I nekako "združi in povozi".
Vzrok vsega je, da sprintf v AVR studiu ne želi številke, ki ima v spominu rezerviranih več mest kot pa int.
Tako da mojega tipa številke "long", dolgega 4 mesta, sprintf ne prebavi pravilno.
Rešitev je konvert long -> int in izpis se izvede pravilno.
Druga možnost (nepreverjena) je morebiti uporaba sprintf_P (če zastopim komentar v stdio.h, naj bi ta prebavila "infinite size" argumentov) |
|
Nazaj na vrh |
|
|
RGorazd Član
Pridružen-a: Čet 20 Maj 2004 15:57 Prispevkov: 1712 Aktiv.: 7.71 Kraj: Ig
|
|
Nazaj na vrh |
|
|
lojzek Član
Pridružen-a: Pet 25 Jan 2008 8:00 Prispevkov: 3352 Aktiv.: 17.02
|
Objavljeno: Sob Okt 15, 2011 8:05 am Naslov sporočila: |
|
|
No glavno, da sva ugotovila. Meni kar ustreza uporaba pretvorbe long -> int. Tisti long potrebujem pred izpisom, ker je zaradi računanja cifra večja od 65535. Pri samem izpisu pa je največ 4000.
Je pa prvič, da se srečujem z sprintf funkcijo. Ta namreč zasede že sama cca 2kb spomina, tako da je pri tinnyjih itak ne moreš uporabit. |
|
Nazaj na vrh |
|
|
aly Član
Pridružen-a: Tor 28 Sep 2004 14:51 Prispevkov: 9406 Aktiv.: 42.35 Kraj: Kranj - struževo
|
Objavljeno: Ned Okt 16, 2011 12:24 pm Naslov sporočila: |
|
|
Saj se jo da tudi "na roke" zaobiti.
Za izpis številke greš po vrsti, cifro po cifro, znak po znak:
(n/1000) + 0x30 = tisočica v ascii
(n/100) + 0x30 = stotica v ascii
itd..
Pridobljene znake namečeš na izhodni port (npr usart, lcd).
Decimalno piko postaviš po želji nekam vmes. _________________ I'm going to stand outside, so if anyone asks, I'm outstanding |
|
Nazaj na vrh |
|
|
zdovcj Član
Pridružen-a: Sob 18 Jul 2009 13:26 Prispevkov: 118 Aktiv.: 0.66 Kraj: Kovor
|
Objavljeno: Ned Okt 16, 2011 6:57 pm Naslov sporočila: |
|
|
aly je napisal/a: |
(n/1000) + 0x30 = tisočica v ascii
(n/100) + 0x30 = stotica v ascii
|
Ko dobiš tisočice, jih moraš odšteti, drugače ti ta algoritem za stotice vrže ven neko dvomestno število (v primeru, da je število večje od tisoč). Če prišteješ še ascii kodo za ničlo, boš dobil nek čuden znak.
Pravilno bi šlo nekako takole:
(n/1000) + 0x30 = tisočica v ascii
((n - (n/1000)*1000)/100) + 0x30 = stotica v ascii
... |
|
Nazaj na vrh |
|
|
lojzek Član
Pridružen-a: Pet 25 Jan 2008 8:00 Prispevkov: 3352 Aktiv.: 17.02
|
Objavljeno: Pon Okt 17, 2011 6:18 am Naslov sporočila: |
|
|
@aly: Takle princip, kot ga ti predlagaš, običajno uporabljam. Ga je v točno tej temi omenil (mislim da) silvo_v. Zaradi "poenostavitve" programa, in da mi ena rutina lahko piše vse potrebne podatke na ekran, sem uporabil to funkcijo. Podatki so namreč različnih dolžin in različnih tipov.
Seveda je ta "poenostavitev" poskrbela za to, da je program sedaj (ko je šele 20% razhroščen), že dolg okoli 4500kb, od tega polovico zaseda stdio.h. Brez te sprintf funkcije bi ga prav gotovo stlačil v tinyja26, tako pa tiči v overkill megi8. |
|
Nazaj na vrh |
|
|
RUros Član
Pridružen-a: Čet 09 Mar 2006 22:26 Prispevkov: 1030 Aktiv.: 4.69
|
Objavljeno: Pon Jan 02, 2012 12:57 pm Naslov sporočila: |
|
|
Sprva se mi je zdelo da bo enostavno uporabiti kodo od atmega324 za attinya pa mi ne gre in ne gre. Zanima me zakaj mi omenjega koda ne dela na attiny13. Namenjena za branje tipk.
Koda: |
//funkcija
void tipke()
{
static char newPIND=0;
static char oldPIND=0xff;
newPIND=PIND;
PRITISKI_TIPK |= (((oldPIND ^ newPIND) & oldPIND) >> 2) & 0x03;
SPUSTI_TIPK |= (((oldPIND ^ newPIND) & newPIND) >> 2) & 0x03;
oldPIND=newPIND;
}
//uporaba funkcije v while(1)
tipke();
if(PRITISKI_TIPK)
{
if(PRITISKI_TIPK & 0x01)
{
PRITISKI_TIPK=PRITISKI_TIPK & (~0x01);
//naredi nekaj
}
if(PRITISKI_TIPK & 0x02)
{
PRITISKI_TIPK=PRITISKI_TIPK & (~0x02);
//naredi nekaj
}
}
|
Koda lepo deluje z atmega324, nevem pa zakaj noče delati z drugim uC. Uporaba funkcije je pravilna, problem je v stavku kjer se nahaja xor in & operacije. Tu ne razumem najbolje kaj bi moral prilagoditi svojemu uC-ju.
EDIT:
Problem rešen:
Koda: |
void tipke()
{
static char newPINB=0;
static char oldPINB=0xff;
newPINB=PINB&0x03;
PRITISKI_TIPK=(oldPINB^newPINB)&newPINB;
SPUSTI_TIPK=(oldPINB^newPINB)&oldPINB;
oldPINB=newPINB;
}
|
|
|
Nazaj na vrh |
|
|
majkel Član
Pridružen-a: Sre 22 Avg 2007 15:45 Prispevkov: 84 Aktiv.: 0.42 Kraj: Maribor
|
Objavljeno: Pon Feb 06, 2012 9:20 am Naslov sporočila: |
|
|
Ali mi lahko kdo pomaga oz vsaj razloži kako s pomočjo termistorja izmeriti temperaturo. Imam Termistor NTCLE100E3103JB0 10K@25°C. Pull up je 4.64K. Imam atmega16a.Vseskupaj programiram v codevision-u.Prebral vse mogoče pdf-e pa ne zaštekam zadeve.
Proim za pomoč |
|
Nazaj na vrh |
|
|
lojzek Član
Pridružen-a: Pet 25 Jan 2008 8:00 Prispevkov: 3352 Aktiv.: 17.02
|
Objavljeno: Pon Feb 06, 2012 12:17 pm Naslov sporočila: |
|
|
1. Dejstvo: NTC pomeni, da upornost s temperaturo pada
2. določi si temperaturni obseg meritev MIN in MAX.
3. iz karakteristike NTC-ja (ali pa s poskusom) določi vrednosti upornosti NTCja pri temperaturah iz tč.2
4. Dejstvo: atmega zna izmeriti NAPETOST na svojih ADC vhodih. in sicer v obsegu od 0V do recimo 5V (odvisno, kako si mego skonfiguriral in s čim jo napajaš)
5. Problem: kako upornost NTC spremeniti v napetost? rešitev: Ohmov zakon. Preko predupora skozi NTC pošiljaš določen tok in na njem se pojavi napetost, ki jo lahko z mego izmeriš. Ta napetost se s temperaturo NTC spreminja.
6. Velikost predupora določiš tako, da bo napetost na NTCju pri upornostih iz tč. 3 v merilnem območju Mege (tč.4). Koristno je, če je napetost na NTCju v čimvečjem merilnem obsegu Mege. S tem pridobiš točnost meritev.
Kako pa potem iz dobljenega rezultata pretvorbe ADC vhoda izračunat nazaj temperaturo... Pri tem pa pomagajo malce logike, znanja osnovnošolske matematike, svinčnik, papir in kalkulator. Ter seveda že narisana (ali izmerjena) karakteristika NTCja |
|
Nazaj na vrh |
|
|
Zajc Neznanec
Pridružen-a: Ned 03 Apr 2011 13:05 Prispevkov: 7 Aktiv.: 0.04 Kraj: Postojna
|
Objavljeno: Sob Mar 17, 2012 5:05 pm Naslov sporočila: |
|
|
Mene pa zanima zakaj mi PORTB=0x00 uposteva kot HIGH 0xFF pa LOW. AVR studio+winavr na atmega16. |
|
Nazaj na vrh |
|
|
eddie Član
Pridružen-a: Sre 10 Dec 2003 21:02 Prispevkov: 706 Aktiv.: 3.18 Kraj: Severna primorska
|
Objavljeno: Sob Mar 17, 2012 7:57 pm Naslov sporočila: |
|
|
Malo bolj točno opiši kaj sprašuješ. Kako je pa nastavljen DDRB? |
|
Nazaj na vrh |
|
|
tilz0R Član
Pridružen-a: Čet 31 Maj 2012 15:39 Prispevkov: 898 Aktiv.: 6.24 Kraj: Črnomelj
|
Objavljeno: Sob Sep 07, 2013 11:47 am Naslov sporočila: |
|
|
Imam problem z makroji v C-ju.
Imam deklarirane makroje:
Koda: |
#define SET_BIT(port,pin) port|=1<<pin
#define CLR_BIT(port,pin) port&=~(1<<pin)
#define CHECK_BIT(port,pin) (port&(1<<pin))
#define DDR(x) DDR ## x
#define PORT(x) PORT ## x
#define PIN(x) PIN ## x
#define LCD_RS_PORT B
#define LCD_RS_PIN PINB7
|
In znotraj main funkcije bi rad uporabil nekaj v tem smislu (S tem bi nastavil PINB7 na output):
Koda: |
SET_BIT(DDR(LCD_RS_PORT), LCD_RS_PIN);
|
In pri tem fašem error, da makro "DDRLCD_RS_PORT" ne obstaja.
Kako bi lahko naredil, da bi makro "DDR" zaznal "DDRB" namesto "DDRLCD_RS_PORT"? _________________ Knowledge sharing is caring.
majerle.eu | stm32f4-discovery.net
Nazadnje urejal/a tilz0R Sob Sep 07, 2013 11:48 am; skupaj popravljeno 1 krat |
|
Nazaj na vrh |
|
|
tilz0R Član
Pridružen-a: Čet 31 Maj 2012 15:39 Prispevkov: 898 Aktiv.: 6.24 Kraj: Črnomelj
|
Objavljeno: Sob Sep 07, 2013 11:48 am Naslov sporočila: |
|
|
Imam problem z makroji v C-ju.
Imam deklarirane makroje:
Koda: |
#define SET_BIT(port,pin) port|=1<<pin
#define CLR_BIT(port,pin) port&=~(1<<pin)
#define CHECK_BIT(port,pin) (port&(1<<pin))
#define DDR(x) DDR ## x
#define PORT(x) PORT ## x
#define PIN(x) PIN ## x
#define LCD_RS_PORT B
#define LCD_RS_PIN PINB7
|
In znotraj main funkcije bi rad uporabil nekaj v tem smislu:
Koda: |
SET_BIT(DDR(LCD_RS_PORT), LCD_RS_PIN);
|
In pri tem fašem error, da makro "DDRLCD_RS_PORT" ne obstaja.
Kako bi lahko naredil, da bi makro "DDR" zaznal "DDRB" namesto "DDRLCD_RS_PORT"? _________________ Knowledge sharing is caring.
majerle.eu | stm32f4-discovery.net |
|
Nazaj na vrh |
|
|
int47 Član
Pridružen-a: Pon 15 Dec 2003 0:10 Prispevkov: 2066 Aktiv.: 9.30 Kraj: Ljubljana
|
Objavljeno: Ned Sep 08, 2013 2:53 pm Naslov sporočila: |
|
|
DDRLCD_RS_PORT definiraj pred DDR(x) |
|
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: 49 dni
Powered by phpBB © 2001, 2005 phpBB Group
|