Witam.
Ucze sie programowac procesor AVR. Mam zestaw uruchomieniowy AVT 992. Procesor, ktory programuje to AVR AT90S8535. Napisalem program w C (avr-gcc), ktory najpierw inicjalizuje wyswietlacz LCD, a nastepnie ma wypisac znak. Ustawiam migajacy kursor, 4-bitowy interfejs, przechodzenie kursora w prawo po wypisaniu znaku. Czynnosci te wykonywane sa prawidlowo. Nastepnie wypisuje znak. Poniewaz mam interfejs 4-bitowy, ustawiam RS i wysylam dwa razy po 4 bity. W efekcie uzyskuje 2 znaki (a nie jeden, jak mozna by sie tego spodziewac). Po sprawdzeniu w tabeli znakow, wynika, ze 4 bity ustawione byly na 1111 a kolejne 4 odpowiadaja tym ustawionym przeze mnie. Wyglada to na tryb 8 bitowy, mimo tego ze ustawialem tryb 4 bitowy. Bylbym wdzieczny za ogledziny kodu i wskazanie, gdzie popelnilem blad. Z gory dziekuje za okazana pomoc.
P4-PB7 = bity danych PB3 = enable PB2 = RS
#define __AVR_AT90S8535__ #include <avr/io.h>
void czekaj(void) { int i, j;
for (i = 0; i < 1000; i++) for (j = 0; j < 1000; j++) ; }
int main(void) { int i;
outp(0xff, DDRB);
for (i =0; i < 3;i++) { outp(0, PORTB); sbi(PORTB, PB4|PB5); sbi(PORTB, PB3); czekaj(); }
/* tryb 4-bitowy */ outp(0, PORTB); sbi(PORTB, PB5); sbi(PORTB, PB3); // enable czekaj();
/* ustawienia w trybie 4-bitowym */ outp(0, PORTB); sbi(PORTB, PB5|PB4); sbi(PORTB, PB3); // enable czekaj();
outp(0, PORTB); sbi(PORTB, 0); sbi(PORTB, PB3); czekaj();
/* kursor */ outp(0, PORTB); sbi(PORTB, PB3); czekaj();
outp(0, PORTB); sbi(PORTB, PB7|PB6|PB5|PB4); // miganie, itp. sbi(PORTB, PB3); czekaj();
/* czyszczenie ekranu */ outp(0, PORTB); sbi(PORTB, PB3); czekaj();
outp(0, PORTB); sbi(PORTB, PB4); sbi(PORTB, PB3); czekaj();
/* wypisz znak */ outp(0, PORTB); sbi(PORTB, PB2); // RS sbi(PORTB, PB5); sbi(PORTB, PB3); // enable czekaj(); cbi(PORTB, PB3);
outp(0,PORTB); sbi(PORTB, PB2); sbi(PORTB, PB6); sbi(PORTB, PB3); czekaj(); cbi(PORTB, PB3); outp(0, PORTB);
return 0; }
W efekcie uzyskuje na ekranie
/0
i migajacy po tych znakach kursor.
Trix.