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 

ATMega16 LCD težava pri izpisu

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> AVR, LPC900, x51
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
madzi
Član
Član



Pridružen-a: Sre 24 Sep 2003 10:46
Prispevkov: 315
Aktiv.: 1.33
Kraj: Pragersko, Dragonja vas, Maribor

PrispevekObjavljeno: Ned Jan 07, 2007 1:14 am    Naslov sporočila:  ATMega16 LCD težava pri izpisu Odgovori s citatom

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



Pridružen-a: Pet 24 Sep 2004 21:58
Prispevkov: 14228
Aktiv.: 60.06
Kraj: Divača (Kačiče)

PrispevekObjavljeno: Ned Jan 07, 2007 1:23 am    Naslov sporočila:   Odgovori s citatom

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



Pridružen-a: Tor 27 Dec 2005 14:02
Prispevkov: 341
Aktiv.: 1.44
Kraj: Ljubljana || Velenje

PrispevekObjavljeno: Ned Jan 07, 2007 2:59 am    Naslov sporočila:   Odgovori s citatom

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



Pridružen-a: Pet 05 Avg 2005 13:05
Prispevkov: 765
Aktiv.: 3.23
Kraj: Povir / Ljubljana

PrispevekObjavljeno: Ned Jan 07, 2007 9:51 pm    Naslov sporočila:   Odgovori s citatom

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



Pridružen-a: Sre 15 Jun 2005 10:03
Prispevkov: 1943
Aktiv.: 8.20

PrispevekObjavljeno: Ned Jan 07, 2007 10:36 pm    Naslov sporočila:   Odgovori s citatom

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



Pridružen-a: Pet 05 Avg 2005 13:05
Prispevkov: 765
Aktiv.: 3.23
Kraj: Povir / Ljubljana

PrispevekObjavljeno: Pon Jan 08, 2007 12:48 am    Naslov sporočila:   Odgovori s citatom

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



Pridružen-a: Pet 24 Sep 2004 21:58
Prispevkov: 14228
Aktiv.: 60.06
Kraj: Divača (Kačiče)

PrispevekObjavljeno: Pon Jan 08, 2007 1:30 pm    Naslov sporočila:   Odgovori s citatom

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



Pridružen-a: Sre 15 Jun 2005 10:03
Prispevkov: 1943
Aktiv.: 8.20

PrispevekObjavljeno: Pon Jan 08, 2007 5:29 pm    Naslov sporočila:   Odgovori s citatom

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



Pridružen-a: Tor 21 Jun 2005 0:21
Prispevkov: 58
Aktiv.: 0.24
Kraj: Ptuj

PrispevekObjavljeno: Ned Jan 14, 2007 4:35 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> AVR, LPC900, x51 Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

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


Powered by phpBB © 2001, 2005 phpBB Group