 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
madzi Član

Pridružen-a: Sre 24 Sep 2003 10:46 Prispevkov: 315 Aktiv.: 1.33 Kraj: Pragersko, Dragonja vas, Maribor
|
Objavljeno: Ned Jan 07, 2007 1:14 am Naslov sporočila: ATMega16 LCD težava pri izpisu |
|
|
Pozdravljeni!
Začel sem se igrati z programskim jezikom C in atmeli. Prej sem uporabljal asembler. C pa se zdaj učimo na faksu.
Imam pa problem z ADC na atmega16. Na lcd hočem izpisat vrednost ki jo vrne ADC ampak se mi na LCDju izpiše kot znak. Verjetno je to ascii znak vrednosti ki jo vrne ADC. Drugač deluje vredu ampak pa bi rad na lcd izpisal decimalno vrednost ali pa vsaj hex. ADC deluje v 8b načinu. Programiram pa v CodeVisionAVR. Kot vhod na ADC pa je priključen potenciometer.
Še izsek kode
Koda: |
cd_gotoxy(0,0);
lcd_putsf("Vrednost:");
result=read_adc(0) ;
lcd_gotoxy(0,1);
lcd_putchar( result);
|
|
|
Nazaj na vrh |
|
 |
VolkD Član


 
Pridružen-a: Pet 24 Sep 2004 21:58 Prispevkov: 14228 Aktiv.: 60.06 Kraj: Divača (Kačiče)
|
Objavljeno: Ned Jan 07, 2007 1:23 am Naslov sporočila: |
|
|
lcd_putchar je rutina v knjižnici lcd.lib, ki izpisuje posamezne char znake na LCD.
result pa je neka vrednost, ki je po vsej verjetnosti tipa integer.
Narediti moraš torej konverzijo.
nekaj takega torej :
Koda: |
char st[7];
st[0]=(result /100000)%10+'0';
st[1]=(result /10000)%10+'0';
st[2]=(result /1000)%10+'0';
st[3]=(result /100)%10+'0';
st[4]=(result /10)%10+'0';
st[5]= result %10+'0';
st[6]=0x00;
lcd_puts(st);
|
Za izpis uporabi torej raje lcd_puts funkcijo, ki izpiše string ne pa zgolj en char. _________________ Dokler bodo ljudje mislili, da živali ne čutijo, bodo živali čutile, da ljudje ne mislijo. |
|
Nazaj na vrh |
|
 |
snow Član


Pridružen-a: Tor 27 Dec 2005 14:02 Prispevkov: 341 Aktiv.: 1.44 Kraj: Ljubljana || Velenje
|
Objavljeno: Ned Jan 07, 2007 2:59 am Naslov sporočila: |
|
|
AVR-je poznam bolj od daleč, pa me zanima ali je zgornja koda z deljenjem hitrejša od n odštevanj?
No ker pa je C pač C, pa lahko dam par kosov kode, ki jo sam uporabljam pri izpisu števil.
Recimo kot tole (uporabljam s PICi):
Koda: |
void lcd_printlong(unsigned long long num)
{
unsigned long long t;
unsigned char n;
n=0;t=1000000000;while(num>=t){num-=t;n++;}lcd_putch(n+'0');
n=0;t=100000000;while(num>=t){num-=t;n++;}lcd_putch(n+'0');
n=0;t=10000000;while(num>=t){num-=t;n++;}lcd_putch(n+'0');
n=0;t=1000000;while(num>=t){num-=t;n++;}lcd_putch(n+'0');
n=0;t=100000;while(num>=t){num-=t;n++;}lcd_putch(n+'0');
n=0;t=10000;while(num>=t){num-=t;n++;}lcd_putch(n+'0');
n=0;t=1000;while(num>=t){num-=t;n++;}lcd_putch(n+'0');
n=0;t=100;while(num>=t){num-=t;n++;}lcd_putch(n+'0');
n=0;t=10;while(num>=t){num-=t;n++;}lcd_putch(n+'0');
lcd_putch(num+'0');
} |
Zgornja koda je za 32 bitna unsigned števila, predelava za 16-bitna pa bi zgledala nekako tako da pustiš odštevanja od 10000 navzdol.
Če pa boš hotel, da ne izpiše začetnih ničel, pa boš verjetno potreboval še eno spremenljivko. Kaj takega:
Koda: |
void lcd_printchar(unsigned char number)
{
unsigned char t,n,d=0;
n=0;t=100;while(number>=t){number-=t;n++;}if(n || d){d++;lcd_putch('0'+n);}
n=0;t=10;while(number>=t){number-=t;n++;}if(n || d){d++;lcd_putch('0'+n);}
d++;lcd_putch('0'+number);
} |
Ta pa je zgolj za 8 bitna števila. |
|
Nazaj na vrh |
|
 |
clownfish Član

Pridružen-a: Pet 05 Avg 2005 13:05 Prispevkov: 765 Aktiv.: 3.23 Kraj: Povir / Ljubljana
|
Objavljeno: Ned Jan 07, 2007 9:51 pm Naslov sporočila: |
|
|
Sam sem si napisal svoje rutine..
// lcd_num_255(n) izpis stevilke od 0 do 255
void lcd_num_255(uchar n)
{
uchar i;
lcd_char('0' + n/100);
i=n-((n/100)*100);
lcd_char('0' + i/10);
lcd_char('0' + i % 10);
}
v tvoji kodi boš pač nadomestil lcd_char z lcd_putchar
Pa še za števila od 0 do _99999
// lcd_num_99999(n) izpis stevilke od 0 do 99999
void lcd_numxy_99999(unsigned int n)
{
uint ostanek;
uchar dt,ti,st,de,en;
dt=n/10000;
ostanek=n-(dt*10000);
ti=ostanek/1000;
ostanek=ostanek-(ti*1000);
st=ostanek/100;
ostanek=ostanek-(st*100);
de=ostanek/10;
ostanek=ostanek-(de*10);
en=ostanek;
lcd_char('0' + dt);
lcd_char('0' + ti);
lcd_char('0' + st);
lcd_char('0' + de);
lcd_char('0' + en);
} |
|
Nazaj na vrh |
|
 |
Proteus Član



Pridružen-a: Sre 15 Jun 2005 10:03 Prispevkov: 1943 Aktiv.: 8.20
|
Objavljeno: Ned Jan 07, 2007 10:36 pm Naslov sporočila: |
|
|
Ni mi jasno, zakaj se vsi po vrsti tako izogibate zank v vaši kodi. Že pogled na klobase kode, ki zaradi tega nastanejo je enostavno grd
Koda: |
/**********************************************************/
/* Opis: Izpis int na LCD zaslon, na zadani poziciji */
/* Vhod: x - kolona; Y - vrstica; value - int vrednost */
/**********************************************************/
void LCD_WriteInt(unsigned char x, unsigned char y, unsigned int value) {
unsigned char string[5] = "";
unsigned char n = 0;
unsigned char i;
/* transformiraj stevilke v ASCII karakterje */
do {
string[n++] = (value % 10) + 48;
value /= 10;
} while (value);
/* cifre so zasukane, zato jih izpisemo obrnjeno */
for (i=0; i<n; i++) {
LCD_GoTo(x + i, y);
LCD_WriteByte( string[n - i - 1] );
}
} |
|
|
Nazaj na vrh |
|
 |
clownfish Član

Pridružen-a: Pet 05 Avg 2005 13:05 Prispevkov: 765 Aktiv.: 3.23 Kraj: Povir / Ljubljana
|
Objavljeno: Pon Jan 08, 2007 12:48 am Naslov sporočila: |
|
|
Proteus je napisal/a: |
Ni mi jasno, zakaj se vsi po vrsti tako izogibate zank v vaši kodi. Že pogled na klobase kode, ki zaradi tega nastanejo je enostavno grd |
lepota gor ali dol.. vsako stvar se da izvesti na tak ali drugačen način.. nekateri uporabljamo enega drugi drugega.
Pri tvojem primeru mi je zelo všeč, da si se problema lotil "od zadaj" in nato znake obrnjeno izpisal..
Vsekakor pa je tvoj primer zelo lep - šolski, vendar nam nekaterim ni tako pomembna koda še posebej če z code dolžino nismo omejeni.
Je pa tudi res, da kasneje ko npr z očmi razbereš vrednost z LCD-ja ni važno na kakšen način kontroler zračuna in izpiše številko ali pa koliko bytov kode, spremenljivk ali časa porabi za to. Že sam izpis na LCD je polžje počasen in tako ali tako procesor 95% ali še več samo čaka v kakšnih delay zankah... |
|
Nazaj na vrh |
|
 |
VolkD Član


 
Pridružen-a: Pet 24 Sep 2004 21:58 Prispevkov: 14228 Aktiv.: 60.06 Kraj: Divača (Kačiče)
|
Objavljeno: Pon Jan 08, 2007 1:30 pm Naslov sporočila: |
|
|
Proteus je napisal/a: |
Ni mi jasno, zakaj se vsi po vrsti tako izogibate zank v vaši kodi. Že pogled na klobase kode, ki zaradi tega nastanejo je enostavno grd |
Tvoja koda je nedvomno lep primer uporabe zank. Vendar, ko se gre za pojasnilo začetniku, je potrebno vzeti v obzir tudi razumljivost delovanja.
Ko bo to enkrat dojel, bo hitro videl tudi vzorec, ki se ponavlja. Vse kar ima neko pravilo, pa se da sprogramirat dalje..
Ravno neke klobase pa zaradi tega ne nastajajo, ker če pogledaš mojo in tvojo kodo, boš ugotovil, da ima moja nekaj manj vrstic..... _________________ Dokler bodo ljudje mislili, da živali ne čutijo, bodo živali čutile, da ljudje ne mislijo. |
|
Nazaj na vrh |
|
 |
Proteus Član



Pridružen-a: Sre 15 Jun 2005 10:03 Prispevkov: 1943 Aktiv.: 8.20
|
Objavljeno: Pon Jan 08, 2007 5:29 pm Naslov sporočila: |
|
|
teslo je napisal/a: |
... vendar nam nekaterim ni tako pomembna koda še posebej če z code dolžino nismo omejeni. |
Problem vsake kode, ki jo napišeš je v tem, da ne veš, kdaj jo boš ponovno rabil. Vsekakor je nesmiselno, da jo za vsak projekt pišeš na novo. Zato tudi obstaja možnost izdelave raznih knjižnic.
Sicer pa tudi moja ni optimirana na minimum. Optimirana je na maksimalno razširljivost, zato tudi sta tam podfunkciji LCD_GoTo in LCD_WriteByte. Gre za drugonivojski funkciji za dostop do HW, kar pomeni, da mi je popolnoma vseeno ali je v ozadju navaden ali grafični LCD, lahko pa je tudi LED, do njega dostopam vedno z istim naborom funkcij (no ja, pri grafiki jih je še nekaj poleg).
Pri meni je del LCD knjižnice opcijski, tako da v odvisnosti od HW poleg pripnem še eno podknjižnico.
teslo je napisal/a: |
Že sam izpis na LCD je polžje počasen in tako ali tako procesor 95% ali še več samo čaka v kakšnih delay zankah... |
To sploh ni pomembno, ker je človek še bistveno počasnejši.
Reakcije na tipkovnico so pri meni nastavljene na 0,02 sekunde in so več kot dovolj hitre. Izpis na LCD pa je običajno narejen na 0,5 sekunde, pa še to je preveč. Izpise na LCD pač daš na najnižjo prioriteto in se z njimi ukvarjaš šele, ko počistiš nujne opravke. |
|
Nazaj na vrh |
|
 |
Ch4N93 Član

Pridružen-a: Tor 21 Jun 2005 0:21 Prispevkov: 58 Aktiv.: 0.24 Kraj: Ptuj
|
Objavljeno: Ned Jan 14, 2007 4:35 pm Naslov sporočila: |
|
|
Podajam dva primera pisanja na standarden LCD (npr. 2x16, 4x20).
Koda: |
sprintf(lcd_buffer,"U = %f",U); //pretvorba float v char z uporabo sprintf (knjižnica stdio.h)
lcd_gotoxy(0,0);
lcd_puts(lcd_buffer);
ali
ftoa(U1, 3, lcd_buffer); //pretvorba float v char z uporabo ftoa (porabi manj sistemskih sredstev; knjižnica stdlib.h)
lcd_gotoxy(0,0);
lcd_putsf("U = ");
lcd_puts(lcd_buffer);
|
Seveda je potrebno definirati spremenljivko "lcd_buffer": char lcd_buffer[16];
"U = %f" pri sprintf: %f pomeni, da je spremenljivka U, ki jo prirejamo v lcd_buffer tipa float. Za več poglej v help.
Za pretvorbo float v char s sprintf je potrebno v nastavitvah "project -> configure" na zavihku "C Compiler" pri opciji "(s)print features izbrati "float, width, precision". Treba pa je vedeti, da se z uporabo sprintf za float velikost kode zelo poveča, zato je bolj primerna uporaba "ftoa". |
|
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: 493 dni
Powered by phpBB © 2001, 2005 phpBB Group
|