Witam.
Właśnie piszę programik obsługujący LCD poprzez I2C. Problem w tym, że niektóre funkcje kitu zdają się nie żyć.
Konkretnie wysłanie takich funkcji jak 0xA1, 0xA2 - czyli wyświetlanie liczby typu bajt i word, zwraca informacje o błędzie komunikacji.
Czy to pomyłka w druku w EP, czy rzeczywiście ktoś (autor?) nie zaimplementował tych funkcji w kitowym procku.
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ęAVT 5154 - niedziałające funkcje
Moderatorzy:Jacek Bogusz, Grzegorz Becker, procesorowiec, robertw, Moderatorzy
W momencie gdy pod numerem funkcji mam 0xA1, układ krzyczy o błędzie.
Natomiast wszystkie inne funkcje, tzn. pisanie znaku, sterowanie kontrastem, jasnością wyświetlacza, włączanie i wyłączanie diod działa świetnie. Jeżeli chodzi o problemy natury czasowej, to dodanie kilku milisekundowego delaya za stopem, a przed kolejnym startem załatwiło wszystkie problemy z niestablinościa zachowania kitu.
Korzystam z biblioteki I2C (TWI) Master Software Library by Peter Fleury.
Przykładowa funkcja zmiany kontrastu wygląda tak:
Natomiast "wyświetl bajt" wygląda tak i nie działa:
Natomiast wszystkie inne funkcje, tzn. pisanie znaku, sterowanie kontrastem, jasnością wyświetlacza, włączanie i wyłączanie diod działa świetnie. Jeżeli chodzi o problemy natury czasowej, to dodanie kilku milisekundowego delaya za stopem, a przed kolejnym startem załatwiło wszystkie problemy z niestablinościa zachowania kitu.
Korzystam z biblioteki I2C (TWI) Master Software Library by Peter Fleury.
Przykładowa funkcja zmiany kontrastu wygląda tak:
Kod: Zaznacz cały
void Contrast(unsigned char addr, unsigned char data)
{
unsigned char ret;
ret = i2c_start(addr+I2C_WRITE);
if ( ret ) {
i2c_stop(); delay_ms(50);
}else {
i2c_write(0x64);
i2c_write(data);
i2c_stop();
delay_ms(50);
}
}
Kod: Zaznacz cały
void PutByte(unsigned char addr, unsigned char data){
unsigned char ret;
ret = i2c_start(addr+I2C_WRITE);
if ( ret ) {
i2c_stop(); delay_ms(50);
}else {
i2c_write(0xA1);
i2c_write(data);
i2c_stop();
delay_ms(50);
}
}
Witam,
Sprawdziłem u mnie i jest OK. Pokaż schemat swojego sterownika, napiszę prosty program, prześlę Ci BINa, zaprogramujesz i zobaczymy. Układ jest prosty i nie było z nim problemu, wykorzystuje TWI Atmegi8. Może jakieś problemy z połączeniem magistrali, zakłócenia, za szybko itp. Może kwestia Twojej biblioteki. Po co jest "ret = i2c_start(addr+I2C_WRITE);" robertw
Sprawdziłem u mnie i jest OK. Pokaż schemat swojego sterownika, napiszę prosty program, prześlę Ci BINa, zaprogramujesz i zobaczymy. Układ jest prosty i nie było z nim problemu, wykorzystuje TWI Atmegi8. Może jakieś problemy z połączeniem magistrali, zakłócenia, za szybko itp. Może kwestia Twojej biblioteki. Po co jest "ret = i2c_start(addr+I2C_WRITE);" robertw
Mam płytę STK500 a na niej ATMEGA16. Do linii PC0 i PC1 odpowiednio podłączone SCL i SDA kitu. W kicie są rezystory podciągające do +5V po 4.7k. Kit zasilany z STK500.
Dostępne do wykorzystania mam ledy na PORTB i przyciski na PORTD
ret = i2c_start(addr+I2C_WRITE); według dokumentacji bilbioteki to:
Issues a start condition and sends address and transfer direction
addr address and transfer direction of I2C device
0 device accessible
1 failed to access device
Czyli wykonuje start magistrali wysyłając adres z bitem kierunku. czyli np u mnie 0x80+0x00.
Zwraca 1 gdy urządzenie nie odpowiedziało - w dalszej części programu "1" powoduje wywołanie wyłączenie magistrali i2c_stop().
Prędkości testowałem różne, nawet na 10kHz funkcja A1 nie działa.
Wątpię żeby to było spowodowane zakłóceniami lub problemami z połączeniem. Właśnie dopisałem funkcję do wysyłania zawartości tablicy2x16 na wyświetlacz i działa bardzo dobrze i w 100% powtarzalnie.
Jedynie przy tej funkcji 0xA1 mam ten "User Program transmit error". Wg artykułu w EP, taki komunikat wyświetla się przy niekompletnej ramce, albo nieznanej funkcji.
Niestety nie mam możliwości podejrzenia oscyloskopem co tam na magistrali się dzieje.
Dodano po chwili:
Dokładny opis biblioteki znajduje się http://homepage.hispeed.ch/peterfleury/ ... aster.html
Dostępne do wykorzystania mam ledy na PORTB i przyciski na PORTD
ret = i2c_start(addr+I2C_WRITE); według dokumentacji bilbioteki to:
Issues a start condition and sends address and transfer direction
addr address and transfer direction of I2C device
0 device accessible
1 failed to access device
Czyli wykonuje start magistrali wysyłając adres z bitem kierunku. czyli np u mnie 0x80+0x00.
Zwraca 1 gdy urządzenie nie odpowiedziało - w dalszej części programu "1" powoduje wywołanie wyłączenie magistrali i2c_stop().
Prędkości testowałem różne, nawet na 10kHz funkcja A1 nie działa.
Wątpię żeby to było spowodowane zakłóceniami lub problemami z połączeniem. Właśnie dopisałem funkcję do wysyłania zawartości tablicy2x16 na wyświetlacz i działa bardzo dobrze i w 100% powtarzalnie.
Jedynie przy tej funkcji 0xA1 mam ten "User Program transmit error". Wg artykułu w EP, taki komunikat wyświetla się przy niekompletnej ramce, albo nieznanej funkcji.
Niestety nie mam możliwości podejrzenia oscyloskopem co tam na magistrali się dzieje.
Dodano po chwili:
Dokładny opis biblioteki znajduje się http://homepage.hispeed.ch/peterfleury/ ... aster.html
Ostatnio zmieniony 31 sty 2009, o 17:11 przez sinuhe, łącznie zmieniany 1 raz.
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 25 gości