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 

Začetniški problem v C-ju pri AVR-ju
Pojdi na stran Prejšnja  1, 2, 3 ... 21, 22, 23 ... 27, 28, 29  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
lojzek
Član
Član



Pridružen-a: Pet 25 Jan 2008 8:00
Prispevkov: 3352
Aktiv.: 17.02

PrispevekObjavljeno: Čet Okt 13, 2011 7:36 am    Naslov sporočila:   Odgovori s citatom

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:
Koda:
U=11.55V I=4.95A


V programu AVR Studio pa
Koda:
U=11.00V I=55.00


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 Brick wall
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: 3352
Aktiv.: 17.02

PrispevekObjavljeno: Pet Okt 14, 2011 10:57 am    Naslov sporočila:   Odgovori s citatom

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. Shame on you

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



Pridružen-a: Čet 20 Maj 2004 15:57
Prispevkov: 1712
Aktiv.: 7.71
Kraj: Ig

PrispevekObjavljeno: Pet Okt 14, 2011 4:04 pm    Naslov sporočila:   Odgovori s citatom

Lojzek, mislim, da tiči zajec v linkerju. Enkra se spomnim sem imel težave z izpisom spremenljivke tipa float. Nekaj guglanja me je privedlo do tega:

http://www.elektronik.si/phpBB2/viewtopic.php?t=10229&postdays=0&postorder=asc&highlight=float&start=225

LP G

_________________
.
._. _ _ ._. _.__. _|
[ (_](_)[ (_] /_(_]
._|
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: 3352
Aktiv.: 17.02

PrispevekObjavljeno: Sob Okt 15, 2011 8:05 am    Naslov sporočila:   Odgovori s citatom

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



Pridružen-a: Tor 28 Sep 2004 14:51
Prispevkov: 9406
Aktiv.: 42.36
Kraj: Kranj - struževo

PrispevekObjavljeno: Ned Okt 16, 2011 12:24 pm    Naslov sporočila:   Odgovori s citatom

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 Smile
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran MSN Messenger - naslov
zdovcj
Član
Član



Pridružen-a: Sob 18 Jul 2009 13:26
Prispevkov: 118
Aktiv.: 0.66
Kraj: Kovor

PrispevekObjavljeno: Ned Okt 16, 2011 6:57 pm    Naslov sporočila:   Odgovori s citatom

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



Pridružen-a: Pet 25 Jan 2008 8:00
Prispevkov: 3352
Aktiv.: 17.02

PrispevekObjavljeno: Pon Okt 17, 2011 6:18 am    Naslov sporočila:   Odgovori s citatom

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



Pridružen-a: Čet 09 Mar 2006 22:26
Prispevkov: 1030
Aktiv.: 4.69

PrispevekObjavljeno: Pon Jan 02, 2012 12:57 pm    Naslov sporočila:   Odgovori s citatom

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



Pridružen-a: Sre 22 Avg 2007 15:45
Prispevkov: 84
Aktiv.: 0.42
Kraj: Maribor

PrispevekObjavljeno: Pon Feb 06, 2012 9:20 am    Naslov sporočila:   Odgovori s citatom

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



Pridružen-a: Pet 25 Jan 2008 8:00
Prispevkov: 3352
Aktiv.: 17.02

PrispevekObjavljeno: Pon Feb 06, 2012 12:17 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Zajc
Neznanec
Neznanec



Pridružen-a: Ned 03 Apr 2011 13:05
Prispevkov: 7
Aktiv.: 0.04
Kraj: Postojna

PrispevekObjavljeno: Sob Mar 17, 2012 5:05 pm    Naslov sporočila:   Odgovori s citatom

Mene pa zanima zakaj mi PORTB=0x00 uposteva kot HIGH 0xFF pa LOW. AVR studio+winavr na atmega16.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
eddie
Član
Član



Pridružen-a: Sre 10 Dec 2003 21:02
Prispevkov: 706
Aktiv.: 3.18
Kraj: Severna primorska

PrispevekObjavljeno: Sob Mar 17, 2012 7:57 pm    Naslov sporočila:   Odgovori s citatom

Malo bolj točno opiši kaj sprašuješ. Kako je pa nastavljen DDRB?
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: 898
Aktiv.: 6.24
Kraj: Črnomelj

PrispevekObjavljeno: Sob Sep 07, 2013 11:47 am    Naslov sporočila:   Odgovori s citatom

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



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

PrispevekObjavljeno: Sob Sep 07, 2013 11:48 am    Naslov sporočila:   Odgovori s citatom

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



Pridružen-a: Pon 15 Dec 2003 0:10
Prispevkov: 2066
Aktiv.: 9.30
Kraj: Ljubljana

PrispevekObjavljeno: Ned Sep 08, 2013 2:53 pm    Naslov sporočila:   Odgovori s citatom

DDRLCD_RS_PORT definiraj pred DDR(x)
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 ... 21, 22, 23 ... 27, 28, 29  Naslednja
Stran 22 od 29

 
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: 48 dni


Powered by phpBB © 2001, 2005 phpBB Group