Saper/nolin11
Guest
Thu Jul 19, 2007 6:24 pm
Witam,
Morduje LCD przez PCF8574

o ile inicjacja działa bez problemu to
przesyłanie tekstu (jak i pozostałe operacje nie działają) :/ może ktoś
"rzuci okiem" kto robił takie coś:
// PinoutPCF: P0-P3 -> D4-D7, P4 -> RS, P5 -> R/W (not used), P6 -> EN2
(not used), P7 -> EN
<code>
//globalna zmienna trzymająca stan portu pcf'a
uint8_t lcd_pcf_port;
void i2c_lcd_init(void) {
delay1ms(250);
lcd_pcf_port = 0xef; // RS=0
i2c_send8574(adr,lcd_pcf_port);
delay1us(10);
i2c_lcd_sendHalf(0x03,adr); // D4,D5 = 11 - data 8bit ; wg. noty hd44780
trzeba 3x wyslac to polecenie
delay1ms(10);
i2c_lcd_sendHalf(0x03,adr);
delay1us(500);
i2c_lcd_sendHalf(0x03,adr);
delay1us(500);
i2c_lcd_sendHalf(0x02,adr); // 4bit data
delay1us(500);
// tryb 4bit włączony
i2c_lcd_command(0x28,adr); // 4bit data - DL=0, 2 lines lcd - N=1, char
5x8 - F=0
i2c_lcd_command(0x08,adr); // Off: display, cursor, blinking
i2c_lcd_cls(adr);
i2c_lcd_command(0x06,adr); // Cursor shift: incr I/D=1, display shift off
S=0
i2c_lcd_command(0x0c,adr); // On: display; Off: cursor, blinking
// jak nawet wącze wyświetlanie kursora (0x0c|0x02) i/lub miganie
(0x0c|0x01) to jest dobrze i działa
}
</code>
Mój problem musi gdzieś leżeć koło funkcji command i data ale ja nic nie
widze co robił bym źle :/
I funkcje wysyłające dane i polecenia:
<code>
void i2c_lcd_command(uint8_t command, uint8_t adr) {
lcd_pcf_port &= 0xef; // RS=0
i2c_send8574(adr,lcd_pcf_port);
delay1us(100);
i2c_lcd_send(command, adr);
delay1us(100);
}
void i2c_lcd_data(uint8_t data, uint8_t adr) {
lcd_pcf_port |= 0x10; // RS=1
i2c_send8574(adr,lcd_pcf_port);
//delay1us(100);
i2c_lcd_send(adr,data);
}
// ----------------- Pozostale funkcje
void i2c_lcd_cls(uint8_t adr) {
i2c_lcd_command(0x01, adr); // lcd CLS
delay1ms(10);
}
void i2c_lcd_home(uint8_t adr) {
i2c_lcd_command(0x02, adr); // lcd_cursor: home
delay1ms(15);
}
void i2c_lcd_setPos(uint8_t yy, uint8_t xx, uint8_t adr) {
uint8_t n=0;
if (yy == 1) n = 0;
if (yy == 2) n = 64;
if (yy == 3) n = 12;
if (yy == 4) n = 76;
n += xx;
i2c_lcd_command((0x80|n), adr); // Set DDRAM addr
}
// pisanie
void i2c_lcd_str(char* str, uint8_t adr) {
char znak;
while(0 != (znak = *(str++))) i2c_lcd_data(znak, adr);
}
</code>
Aha i funkcja send8574 jest dobra gdyż cały czas z niej korzystam (od
początku jej napisania).
--
Saper/nolin11
majl:nolin11_USUN_TO_@interia.pl
gg:4476700
Michał Lankosz
Guest
Thu Jul 19, 2007 9:05 pm
A jak wygląda i2c_lcd_send? Nie widzę machania linią Enable.
Czy R/W wyświetlacza jest podłączone do masy czy P5? Chyba jest na masie...
Michał
Saper/nolin11
Guest
Thu Jul 19, 2007 10:00 pm
Michał Lankosz wrote:
Quote:
A jak wygląda i2c_lcd_send? Nie widzę machania linią Enable.
Czyzbys chcial kompletny kod ;> - i tak chciałem go udostępnić jak będzie
działał
Połączenia oparłem na an118 z bascom-avr (biblioteka i2c_lcd.lib).
Quote:
Czy R/W wyświetlacza jest podłączone do masy czy P5? Chyba jest na
masie... Michał
i2c_lcd_send - nic nadzwyczajnego taka sama jak w przypadku normalnie
podłączonego lcd czyli odwołuje się do sendHalf przesyłająć najpierw
starszą część potem młodszą.
A linia EN jest dobrze...
R/W do masy.
A psze:
<code>
void I2C_LCD_EPULSE(uint8_t adr) {
lcd_pcf_port |= 0x80; // EN=1
i2c_send8574(adr,lcd_pcf_port);
delay1us(50);
lcd_pcf_port &= 0x7f; // EN=0
i2c_send8574(adr,lcd_pcf_port);
delay1us(50);
}
void i2c_lcd_sendHalf(uint8_t data, uint8_t adr) {
delay1us(100);
// wykrojenie 4 starszych bitow i wyzerowanie 4 mlodszych ,a nastepnie
wpisanie w mlodsza czesc danych
lcd_pcf_port &= 0xf0;
lcd_pcf_port |= (0x0f & data);
i2c_send8574(adr,lcd_pcf_port);
delay1us(100);
I2C_LCD_EPULSE(adr);
}
void i2c_lcd_send(uint8_t data, uint8_t adr) {
// starsza część
delay1us(100);
i2c_lcd_sendHalf((data>>4), adr);
// młodsza część
delay1us(100);
i2c_lcd_sendHalf(data, adr);
delay1us(100);
}
</code>
--
Saper/nolin11
majl:nolin11_USUN_TO_@interia.pl
gg:4476700
Adam Dybkowski
Guest
Thu Jul 19, 2007 10:53 pm
Saper/nolin11 pisze:
Quote:
void I2C_LCD_EPULSE(uint8_t adr) {
lcd_pcf_port |= 0x80; // EN=1
i2c_send8574(adr,lcd_pcf_port);
[...]
Jeżeli chcesz swoje kody źródłowe udostępniać szerszej publiczności,
proponuję pisać je bardziej przejrzyście. Wystarczy trzymać się kilku
zasad. Jeden z wielu przykładów to wskazówki dla kodów źródłowych jądra
Linuxa (gdzie ludzi piszących kod są setki i jakoś muszą sobie radzić):
http://cs.wellesley.edu/~systems/Resources/LinusCodingStyle.txt
i nieco szerzej wytłumaczone:
http://www.linuxjournal.com/article/5780
--
Adam Dybkowski
http://www.amwaw.edu.pl/~adybkows/
Uwaga: przed wysłaniem do mnie maila usuń cyfry z adresu.
Michał Lankosz
Guest
Fri Jul 20, 2007 9:10 am
ZNALAZŁEM!
masz funkcję:
void i2c_lcd_send(uint8_t data, uint8_t adr);
a w funkcji i2c_lcd_data wywołujesz:
i2c_lcd_send(adr,data);
Jakoś od początku mi się nie podobało przekazywanie wszystkim funkcjom w
głąb parametru adr. Jeśli lcd_pcf_port jest zmienną globalną, niech adr też
nią będzie. I tak nie dasz rady w ten sposób obsłużyć więcej LCD pod różnymi
adresami (trzyma Cię jedna zmienna lcd_pcf_port), a i więcej pamięci stosu
zabiera taka polityka.
Quote:
Czyzbys chcial kompletny kod ;> - i tak chciałem go udostępnić jak będzie
działał
Nie potrzebuję. Sam pisałem w ASM na '51 z rejestrem 4094 pełniącym tą samą
rolę co u Ciebie PCF więc mam ten temat przerobiony.
Gdy program zadziała, proponuję wywalić wszystkie oprócz niezbędnych
opóźnienia. I2C jest sporo wolniejsze od LCD. Jeszcze zastanowił bym się,
czy nie 'wchłonąć' procedury i2c_lcd_sendHalf w i2c_lcd_send. Można
zaoszczędzić na czasie i pamięci RAM, a rozmiar kodu zwiększy się może o
kilka bajtów...
Pozdrawiam,
Michał
Saper/nolin11
Guest
Fri Jul 20, 2007 11:50 am
Adam Dybkowski wrote:
Quote:
Saper/nolin11 pisze:
void I2C_LCD_EPULSE(uint8_t adr) {
lcd_pcf_port |= 0x80; // EN=1
i2c_send8574(adr,lcd_pcf_port);
[...]
Jeżeli chcesz swoje kody źródłowe udostępniać szerszej publiczności,
proponuję pisać je bardziej przejrzyście. Wystarczy trzymać się kilku
zasad. Jeden z wielu przykładów to wskazówki dla kodów źródłowych jądra
Linuxa (gdzie ludzi piszących kod są setki i jakoś muszą sobie radzić):
http://cs.wellesley.edu/~systems/Resources/LinusCodingStyle.txt
i nieco szerzej wytłumaczone:
http://www.linuxjournal.com/article/5780
Narzekasz

,wiem o tym i jakoś staram się tego trzymać nawet jak pisze
własne programy ale jak piszę to pisze szybko i nie zastanawiam się co
naciskam :/ (mam na myśli Shift) - głupi nawyk z pascala :|
[odp. do postu pana Michała]
Też myślałem nad tym ale podczas inicjacji trzeba wysłać 3x 0x03 i nie
bardzo dało by się to przyciąć ale zjechałem do 1160b z 1214b

w tiny45
po usunięciu opóźnień.
--
Saper/nolin11
majl:nolin11_USUN_TO_@interia.pl
gg:4476700
Michał Lankosz
Guest
Fri Jul 20, 2007 7:57 pm
Quote:
[odp. do postu pana Michała]
Też myślałem nad tym ale podczas inicjacji trzeba wysłać 3x 0x03 i nie
bardzo dało by się to przyciąć ale zjechałem do 1160b z 1214b

w tiny45
po usunięciu opóźnień.
e...
lcd_pcf_port = 0xe0; // RS=0
i2c_send8574(adr,lcd_pcf_port);
lcd_pcf_port = 0xe3;
i2c_send8574(adr,lcd_pcf_port);
I2C_LCD_EPULSE(adr);
I2C_LCD_EPULSE(adr);
I2C_LCD_EPULSE(adr);
lcd_pcf_port = 0xe2;
i2c_send8574(adr,lcd_pcf_port);
I2C_LCD_EPULSE(adr);
i już jest tryb 4-bit,
o ile gdzieś się nie machnąłem, piszę pod presją żony wołającej na kolację
;)
Michał
Adam Dybkowski
Guest
Fri Jul 20, 2007 11:45 pm
Saper/nolin11 pisze:
Quote:
void I2C_LCD_EPULSE(uint8_t adr) {
lcd_pcf_port |= 0x80; // EN=1
Jeżeli chcesz swoje kody źródłowe udostępniać szerszej publiczności,
proponuję pisać je bardziej przejrzyście.
Narzekasz

,wiem o tym i jakoś staram się tego trzymać nawet jak pisze
własne programy ale jak piszę to pisze szybko i nie zastanawiam się co
naciskam :/ (mam na myśli Shift) - głupi nawyk z pascala
A ja akurat miałem na myśli ten nieszczęsny nawias klamrowy na końcu
linii deklarującej prototyp funkcji. Wg mnie takie jego użycie w wybitny
sposób zaciemnia kod (gdy ktoś się przyzwyczaił codziennie widzieć inny
styl kodowania), podobnie jak konstrukcje typu:
if (warunek) zrobcos;
zrobcoinnego;
--
Adam Dybkowski
http://www.amwaw.edu.pl/~adybkows/
Uwaga: przed wysłaniem do mnie maila usuń cyfry z adresu.
Michał Lankosz
Guest
Sat Jul 21, 2007 7:59 am
Użytkownik "Michał Lankosz" <mike2001@tlen.pl> napisał w wiadomości
news:f7pqln$v3k$1@opal.futuro.pl...
Quote:
ZNALAZŁEM!
masz funkcję:
void i2c_lcd_send(uint8_t data, uint8_t adr);
a w funkcji i2c_lcd_data wywołujesz:
i2c_lcd_send(adr,data);
Zadziałało?
Michał
Saper/nolin11
Guest
Wed Aug 01, 2007 4:30 pm
Michał Lankosz wrote:
Quote:
Użytkownik "Michał Lankosz" <mike2001@tlen.pl> napisał w wiadomości
news:f7pqln$v3k$1@opal.futuro.pl...
ZNALAZŁEM!
masz funkcję:
void i2c_lcd_send(uint8_t data, uint8_t adr);
a w funkcji i2c_lcd_data wywołujesz:
i2c_lcd_send(adr,data);
Zadziałało?
Michał
Oczywiście

, tu był błąd teraz już mam napisane tka że moge podlączyć
kilka wyświetlaczy przez PCF'a (odczytuje na początku stan funkcji z
układu)
--
Saper/nolin11
majl:nolin11_USUN_TO_@interia.pl
gg:4476700