Zdravím všechny,
Mam velmi specificky problém a potřeboval bych poradit. Nejsem uplný začátečník, ale ani vybodej programátor. Potřebuji zobrazit proměnou (int) na LCD displej ( s řadičem HD44780), to znamená jako string, abych viděl jaká hodnota je ulozená v proměny. Při jejím výpisu dochází k velmi zajímavým úkazům, někdy se zobrazí v naprostém pořádku ale někdy úplně jiná hodnota či naproste nesmysli jako jsou kostičky a podobně. Už jsme zkoušel vše. zkoušel jsme přepsat funkce ale bez výsledně, vše je stejně. Měnil jsme nastaveni kompilátoru, nastaveni optimalizace,…a dokonce jsem z nouze měnil i procesor za jiný kus (mega16) ale bez výsledně. Po naběhnuti napájeni se dejou naprosto stejné věci.
Please help me (((((
tadz je ukazka kodu
vse mma rodeleny do modulu
jeden pro lcd
a druhy pro main
#include "System.h"
#include "LCD_displey.h"
void dobezna_hrana_LCD(unsigned char instrukce_data,unsigned char W_R)
{
/* Instrukce 0
Data 1
Write 0
Read 1 */
mSet_PortC_pin_level(RS,instrukce_data);
mSet_PortC_pin_level(RW,W_R);
//RS= instrukce_data ;
//RW= W_R ;
vDelay_ms(1);
mSet_PortC_pin_level(E,log_1);
// E= 1; // E jde z 0 do 1
vDelay_ms(1);
mSet_PortC_pin_level(E,log_0);
//E = 0; // E z 1 do 0, zapisový
vDelay_ms(1);
}
void write_LCD(unsigned char znak) // znk musi vit v apostrofech 'A' !!!!
{
pozice= pozice + 1;
#asm("RCALL CEK1M");
if (!((pozice==16) || (pozice==32))) { // skoci do if jen kdyz poyice se nebude rovnat 17 nebo 34
PORTC = (znak & 0xF0 ); // (znak & oxF0)= horni bity, pote privedeni na port
dobezna_hrana_LCD(1,0); // zapis hornich 4 bitu, E=1 - data;RW=0 - zapis
#asm("RCALL CEK1M");
PORTC = (znak<<4); // (znak & 0xF0)= dolni bity,posun o 4 bity do leva, pote privedeni na port
dobezna_hrana_LCD(1,0); // zapis spodnich 4 bitu, E=1 - data;RW=0 - zapis
#asm("RCALL CEK1M");
}
if (pozice==16){
radek=2;
PORTC = 0xC0; // 1100 0000
dobezna_hrana_LCD(0,0); // instrukce, skos na 2. radek na adesu 40
#asm("RCALL CEK1M");
PORTC &=0x0F;
dobezna_hrana_LCD(0,0); // instrukce, skos na 2. radek na adesu 40
#asm("RCALL CEK1M");
PORTC = (znak & 0xF0 ); // (znak & oxF0)= horni bity, pote privedeni na port
dobezna_hrana_LCD(1,0); // zapis hornich 4 bitu, E=1 - data;RW=0 - zapis
#asm("RCALL CEK1M");
PORTC =(znak<<4); // (znak & 0xF0)= dolni bity, posun o 4 bity do leva,pote privedeni na port
dobezna_hrana_LCD(1,0); // zapis spodnich 4 bitu, E=1 - data;RW=0 - zapis
#asm("RCALL CEK1M");
}
if (pozice == 32) { // testovani konce druheroho radku a vraceni na pocatek LCD
erace_LCD(); // vymaze LCD
#asm("RCALL CEK1M");
radek=1;
pozice=0;
PORTC = (znak & 0xF0 ); // (znak & oxF0)= horni bity, pote privedeni na port
dobezna_hrana_LCD(1,0); // zapis hornich 4 bitu, E=1 - data;RW=0 - zapis
#asm("RCALL CEK1M");
PORTC =(znak<<4); // (znak & 0xF0)= dolni bity, posun o 4 bity do leva,pote privedeni na port
dobezna_hrana_LCD(1,0); // zapis spodnich 4 bitu, E=1 - data;RW=0 - zapis
#asm("RCALL CEK1M");
}
}
void write_string_LCD(unsigned char flash *cp) //retezec musi byt v uvozvkach "ahoj" !!!!!
{
for (; *cp; cp++)
{
write_LCD(*cp); }
}
void write_stringRAM_LCD(unsigned char pom_stringRAM) //vypise rovnou promenou int write_stringRAM_LCD(a), unsigned int a;
{
unsigned char *cp;
itoa(pom_stringRAM,cp);
for (; *cp; cp++)
{ write_LCD(*cp); }
}
no a modulu main mam
void main(void)
{
vInit_LCD();
write_string_LCD("34 1692 947 1695 32 78 47 28");
erace_LCD();
void write_stringRAM_LCD(1635);
a tak dale
takze po zapnuti napajeni se mi obcas zobrazi 1635 nekdz 1000 nekdz 1483 a abz toho nebylo dost tak inejaky paznaky. talsi zajimava vec je ze retezec pred tim mi to v pohode chyby vypise.
administrator: příspěvek byl upraven