Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

AVT992

xnor
AVT992

Postautor: xnor » 12 maja 2003, o 22:48

Cześć!
Od jakiegoś czasu jestem użytkownikiem kitu jak w tytule. Obecnie programuje 8515-ke, tak by wyswietlal mi cos na LCD (16x1). Problem polega na tym ze układ zachowuje sie dziwnie po zaprogramowaniu. Wygląda to mniej więcej tak: Podczas programowania na wyswietlaczu "smigają" co najmniej ciekawe znaki (wyswietlacz jest podłączony pod ten sam port co ISP STK200/300). Po zaprogramowaniu układ raz zaskakuje a raz nie. Po jakim czasie z nieznanych przyczyn włącza się lub nie. W trybie "działającym" po wyciągnięciu zasilacza (12V stab.) z sieci i po jego załączeniu układ albo startuje albo nie (4 razy na 5 załączeń nie startuje). Resetowanie "ręczne" przyciskiem "RESET" nie dość że nie jest łatwe (dostęp) to i tak nic nie daje (no może po 10 razie). Próbowałem już wielu rzeczy. Np wyswietlacz włączałem dopiero po zaprogramowaniu. Wyciągałem przed resetem złącze ISP i zaraz po programowaniu (choć programator ma wyjścia 3-stanowe), nawet poprawiałem luty żeby wykluczyć brak solidnego połączenia i nic.
Poniżej wysyłam programik który powinien działać. Mam prośbę. czy ktoś mógłby go przetestować u siebie? Ja używałem już wszystkiego do programowania. Ostatnio CodeVisionAVREval + AVRStudio PonyProg + AVRGCC+AVRStudio. Prosze o jakas pomoc czy sugestie. Z góry dziękuję.
A oto program. Wyswietla napis POLMOS ;)

#include <stdio.h>
#include <90s8515.h>

#define RS 2
#define EN 3
#define D4 4
#define D5 5
#define D6 6
#define D7 7

#define LCD_ENTRY_INC 0x06 //tryb inkrementacji adresu w DDRAM
#define LCD_START_LINIA_1 0x40 //adres DDRAM pierwszej linii
#define LCD_START_LINIA_2 0x40 //adres DDRAM drugiej linii
#define CLEARLCD 0x01
#define ON 0x0C //wyswietlanie bez kursora

void Czekaj (int p);
void InicjujLCD (void);
void ZapiszLCD (unsigned char Dana);
void ZapiszDaneLCD (unsigned char Dana);
void ZapiszRejestrLCD (unsigned char Dana);

unsigned char tekst[6]={'P','O','L','M','O','S'};

void Czekaj(int p) //petla opozniajaca
{
unsigned char k=12;
while(p--)
{
while(k--); //czas realizacji 10us
k=12;
}
}

void InicjujLCD(void)
{
DDRB=0xfc;
Czekaj(5000); //opoznienie okolo 50ms
ZapiszRejestrLCD(0x2C); //wlacz tryb 4-bitowy/2 linie/5x11 punktow
Czekaj(4); //40us
ZapiszRejestrLCD(ON);
Czekaj(4); //40us
ZapiszRejestrLCD(CLEARLCD);
Czekaj(153); //1,53ms
ZapiszRejestrLCD(LCD_ENTRY_INC);
Czekaj(4); //40us
ZapiszRejestrLCD(0x02);
Czekaj(4); //40us
}

void ZapiszLCD(unsigned char Dana)
{
PORTB.EN=0;
PORTB.D7=0;
PORTB.D6=0;
PORTB.D5=0;
PORTB.D4=0;
if(Dana&0x80) PORTB.D7=1; //sprawdza wartosc bitu 8 zmiennej "Dana"
if(Dana&0x40) PORTB.D6=1; //sprawdza wartosc bitu 7 zmiennej "Dana"
if(Dana&0x20) PORTB.D5=1; //sprawdza wartosc bitu 6 zmiennej "Dana"
if(Dana&0x10) PORTB.D4=1; //sprawdza wartosc bitu 5 zmiennej "Dana"
Czekaj(5); //sygnal
PORTB.EN=1; //aktywnosci
Czekaj(5); //na linii danych
PORTB.EN=0; //wyswietlacza
PORTB.D7=0;
PORTB.D6=0;
PORTB.D5=0;
PORTB.D4=0;
if(Dana&0x08) PORTB.D7=1; //sprawdza wartosc bitu 4 zmiennej "Dana"
if(Dana&0x04) PORTB.D6=1; //sprawdza wartosc bitu 3 zmiennej "Dana"
if(Dana&0x02) PORTB.D5=1; //sprawdza wartosc bitu 2 zmiennej "Dana"
if(Dana&0x01) PORTB.D4=1; //sprawdza wartosc bitu 1 zmiennej "Dana"
Czekaj(5);
PORTB.EN=1;
Czekaj(5);
PORTB.EN=0;
Czekaj(5);
}

void ZapiszDaneLCD(unsigned char Dana){
PORTB.RS=1; //zapis danych do DDRAM (RS=1)
ZapiszLCD(Dana);
}

void ZapiszRejestrLCD(unsigned char Dana){
PORTB.RS=0; //zapis danych sterujacych
ZapiszLCD(Dana);
}


int main(void)
{
unsigned char index=0;
InicjujLCD();
for(index=0;index<6;index++){
ZapiszDaneLCD(tekst[index]);
}
return 0;
}

Wróć do „Kity AVT”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 7 gości