ATmega8: Funkční rutina v MikroC pro výpis na LCD displej

Zdravim ,
resim problem s magou8 a LCD, programuju v mikro C takze pouzivam knihovny , a dorazil jsem k tomu ze bezporblemu vypisu text jako pole charu,
ale jakmile chci zobrazovat hodnoty z AD prevodniku tak to zacne hazet rozsypany caj a zacne se to chovat absolutne nesmyslne pise to paznaky blika to a podobne, zkousel jsem i vypisovat pri for cyklu promenou I kterou jsem kazdym krokem inkrementoval a ani toto nefunguje.
nemate nekdo nejaky jednoduchy priklad ktery funguje?
diky

:arrow_right: administrator: přejmenováno z "ATMEGA8 LCD"

Co sem zkusit hodit kousek nefunkčního kódu, aby se našlo, kde je zakopanej pes ?

[code]
sbit LCD_RS at PORTB.B0;
sbit LCD_EN at PORTB.B1;
sbit LCD_D4 at PORTB.B2;
sbit LCD_D5 at PORTB.B3;
sbit LCD_D6 at PORTB.B4;
sbit LCD_D7 at PORTB.B5;

sbit LCD_RS_Direction at DDRB.B0;
sbit LCD_EN_Direction at DDRB.B1;
sbit LCD_D4_Direction at DDRB.B2;
sbit LCD_D5_Direction at DDRB.B3;
sbit LCD_D6_Direction at DDRB.B4;
sbit LCD_D7_Direction at DDRB.B5;

double A = 53.062720452;
double K = -0.006147642;
double e = 2.7182818;
  int vys = 0;
  unsigned int pom = 0;
   int i = 0;

void main(){
Lcd_Init();
Lcd_Cmd(LCD_CLEAR);
Lcd_Cmd(LCD_CURSOR_OFF);

while(1){
pom = ADC_Read(5);
vys = A*pow(e,K*pom);
 i++;
 if(i>=20){

Lcd_Cmd(LCD_CLEAR);
Lcd_Out(1,1, “vzdalenost”);
Lcd_Out(2,1,vys);

     }


}

}[/code]

tady je ten kod na adc prevodniku je IR senzor vzdalenosti, vysledek kodu je takovy ze se nic nezobrazi jen extreme skoro okem neroznatelne blika kurzor na prvni pozici a obcas s emihle nejaka cara i na dalsich pozicich ale cist to nejde a vypada to spis jako ze nevypise vubec nic

Myslím, že Lcd_Out zobrazuje jenom text. To znamená, že musíte načtenou hodnotu z AD převodníku převést na text - tedy posloupnost znaků a pak teprve odeslat do Lcd_Out.

Místo
Lcd_Out(2,1,vys);
vlož následující :

char txt[7];
IntToStr(vys, txt);
Lcd_Out(2,1,txt);

Tohle by mělo šlapat.

stale nic

pridal jsem pred smysku while vypis textu : vzdalenost, a delay 1s vysledek je ten ze vypise delay cca 1S pak kratce blikne a zse vypise ten napis a takhle porad odkola

Vyhoď to mazání LCD. Pokud chceš použít proměnnou i jako filtr zobrazení, musíš ji po vypsání na displej zase vynulovat. Jinak se 20x neprovede nic a pak se 236x po sobě provede vymazání displeje, výpis nápisu “vzdalenost”, počká se 1s (jestli je zde ten delay), vypíše se číslo z AD převodníku a po pár milisekundách se to opakuje.

Udělal bych to takhle :

    while(1)
    {
      pom = ADC_Read(5);
      vys = A*pow(e,K*pom);
      i++;
      if(i>=20)
      {
        ;Lcd_Cmd(LCD_CLEAR);
        Lcd_Out(1,1, "vzdalenost");
        char txt[7];
        IntToStr(vys, txt);
        Lcd_Out(2,1,txt);
        i=0;
      }
    }

nebo jenom takhle :

    while(1)
    {
      pom = ADC_Read(5);
      vys = A*pow(e,K*pom);

      ;Lcd_Cmd(LCD_CLEAR);
      Lcd_Out(1,1, "vzdalenost");
      char txt[7];
      IntToStr(vys, txt);
      Lcd_Out(2,1,txt);
    }

pri tomto zapisu to poblikava a vypisuje paznaky v prvni polovine prvniho radku.

Tak vyhoď to pravidelný mazání LCD.

Já tam místo

// Lcd_Cmd(LCD_CLEAR);

napsal

;Lcd_Cmd(LCD_CLEAR);

To je tím, že pro mikrokontroléry používám asm a tam je středník oddělovačem poznámky.

zacina to trosku podobat, na zacatku to vypada slibne pak se hned zacinaji nacitat cista a zase vypis rozsypaneho caje:-(

A vypíšou se alespoň nějaká čísla nebo hned, jak se mají začít psát, tak se sype čaj ?

vypise se asi tak jedo nebo dve

Vyřaď čtení z převodníku a výpočty a tu proměnnou “vys” dej cyklicky měnit a vypisovat. Třeba od 0 do 1000 - nebo do přetečení, to je jedno. Mám tady MikroC, ale jenom v demo verzi, takže se díky float knihovně nevejdu do 2kWord, takže si to tady neodkrokuju…

porad to same ale kdyz vyhodim cykl a porjedu to jen jednou tak to funguje

To mi nějak nedává smysl. Tu definici char txt[7]; máš pořád v tý smyčce ? Jestli jo, tab bych jí zkusil přendat k definicím ostatních proměnných, ale teoreticky by to mělo být jedno.

Ještě mě napadlo dát po vypsání hosnoty 1 sek. delay a načítat vys od nuly a sledovat, za jak dlouho to rozsype ten čaj.

Druhá možnost by byla nechat program tak, jak je, ale zpomalit systémové hodiny. Teda pokud Ti neběží mcu na IntRC 1 MHz. Pokud ano, zkus v mikroC (ale ne u mcu) nastavit vyšší kmitočet hodin. Program se zkompiluje pro rychlejší hodiny, ale v mcu zůstanou stejné. Tím pádem se zpomalí časování signálů pro LCD. Pokud byl problém tam, mělo by to začít fungovat.

zkusim az dorazim domu , mam tam externi krystal 12mhz, stejne tak mam v microC nastavenou frekvenci 12mhz ale muzu zkusit to nejak upravit

Tak nejdřív zkus dát 1 sek. pauzu po vypsání hodnoty. Pokud to bude dělat hlouposti po náhodném počtu čísel, dá se předpokládat, že by to mohl způsobit právě nějaké časování na hranici možností.

Pokud to bude dělat hlouposti náhodně, tak klidně ten 12 MHz krystal tam nech, ale v MikroC nastav 16 nebo 20 MHz. MikroC přepočítá časování a tudíž při reálných 12 MHz by mělo být časování pomalejší.

A ještě něco. Možná je to zbytečné, ale zkus dát taky 50-100 ms delay před LCD_Init().

tak ani po sekundach pred initem ani zmena frekvence, ale zkusil jsem si udelat parkrat zasebou vypis na display A, pak B pak zase A s delay mezi to fungovalo bezproblemu , ale jakmile jsem to hodil to nejakeho cyklu tak to zas ehazelo ten caj, kdyz udelam cykl do-while tak to ale jednou projde jakmile udelam while tak to nejede ani jednou