logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Sterowanie wyświetlaczem Opel przez zmodyfikowane I2C w Bascom 8051 - jak?

robiw 28 Wrz 2005 16:10 4048 12
  • #1 1856442
    robiw
    Poziom 26  
    Posty: 2030
    Pomógł: 25
    Ocena: 133
    Witam Szanownych Kolegów i BARDZO proszę o pomoc.
    Chciałbym z pakietu Bascom 8051 sterować wyświetlaczem z samochodu Opel, który pracuje na "zmodernizowanej" szynie I2C - dodana została dodatkowa linia MRQ (linia rozkazowa - Master Request?). W sieci dwóch gości opisało sposób transmisji, który zasadniczo nie różni się od I2C poza wystawianiem sygnałui "0" w czasie transmisji danych do wyświetlacza - oto linki:
    http://www.carluccio.de/index.php?page=pro-tid
    http://www.eelkevisser.nl/bulot.htm

    Ponoć bez problemu można sterować tym wyświetlaczem z poziomu Bascoma (tak przynajmniej twierdzi Dario Carluccio), mnie jednak się nie udało - nie pokazuje nic. Oto program (zresztą typowy):

    Config Scl = P3.0
    Config Sda = P3.1
    Config I2cdelay = 1


    ' P1.2 bedzie asygnowane jako MRQ

    Do ' glowna petla programu

    P1.2 = 0 ' MRQ na logiczne "0"
    Waitms 1 ' czeka 1 ms
    P1.2 = 1 ' MRQ na logiczne "1"
    I2cstart ' inicjuje magistrale
    I2cwbyte &H4D ' wysyla adres TIDa - 4Dh

    P1.2 = 0 ' MRQ na logiczne "0"
    I2cwbyte 1 ' wygasza wszystkie piktogramy (3 bajty)
    I2cwbyte 1 ' czyli pierwsze 3 bajty danych do wyświetlacza
    I2cwbyte 1

    I2cwbyte 164 ' wysyla napis do TIDa (10 bajtow)
    I2cwbyte 220
    I2cwbyte 196
    I2cwbyte 203
    I2cwbyte 229
    I2cwbyte 233
    I2cwbyte 64
    I2cwbyte 174
    I2cwbyte 93
    I2cwbyte 64 ' ostatni bajt danych

    P1.2 = 1 ' MRQ na logiczne "1"

    I2cstop ' konczy transmisje i zwalnia magistrale
    Waitms 255 ' czeka 0.25s i powtarza petle

    Loop
    End

    Próbowałem w pętli z innymi adresami, próbowałem zwiększać I2cdelay ale bez efektu. Bardzo proszę o pomoc - może to jakiś bugs. Nie wiem też bo ponoć dane do wyświetlacza są wysyłane tak: 7 bitów danych, bit kontroli parzystości i bit potwierdzenia ale w Bascomie nie ma jak tego zmieniać. POMOCY... robiw
  • #2 1858089
    maya30
    Poziom 12  
    Posty: 24
    Pomógł: 1
    Zgromadziłeś wszystkie potrzebne informacje , więc przeszkodą pewnie jest brak znajomości języka.

    A oto potrzebne informacje:

    1 Podłącz prawidłowo wyświetlacz.
    8 / 10 cyfr Opis

    1. / 3. 12V Zasilanie
    3. / 6. 0V Masa
    5. / 1. 12V Załącza wyświetlacz
    6. / x 12V Załącza podświetlanie (bez podświetlania LCD nie działa)
    7. / 4. ? Reguluje jasność podświetlania
    8. / 2. 5V normalnie 0V RDS
    9. /10. SCL
    10./12. MRQ
    11./11. SDA

    Sygnał Master Request jest wykorzystywany w magistrali I2C gdzie wiele procesorów może inicjować transmisje i tak jest zapewne w OPLU


    2 Adres urządzenia na magistrali jest rzeczą najważniejszą, błędny powoduje, że układ nie reaguje.
    Prawidłowy adres to: 9B dla wyświetlacza 10 cyfrowego
    94 dla wyświetlacza 8 cyfrowego

    3 Co do transmiji to musisz posłać 3 bajty symboli i 8 lub 10 bajtów danych w zależności od typy wyświetlacza.

    Miłej zabawy!
  • #3 1858095
    robiw
    Poziom 26  
    Posty: 2030
    Pomógł: 25
    Ocena: 133
    Witaj.
    Wszystko podłączyłem prawidłowo a cały protokół załatwia ten program z postu ale NIE DZIAŁA. Prawidłowy adres to chyba 4D (strona Dario Carluccio) bo ten 9B to jest już z bitem kontroli parzystości a to załatwia sam protokół. Próbowałem różnych rozwiązań ale nadal nie działa... robiw
  • #4 1858172
    maya30
    Poziom 12  
    Posty: 24
    Pomógł: 1
    Na podanych przez Ciebie stronach są 2 wersje wyświetlacza 8 i 10 cyfrowego, które się różnią. Może dla zawężenia tematu podaj który masz.
    Z tego co wiem transmija I2C zawsze wymaga bitu parzystości.
  • #6 1858742
    maya30
    Poziom 12  
    Posty: 24
    Pomógł: 1
    Znalazłem pewne niedopatrzenie w programie.
    I upieram się przy adresie 94h lub 9B skąd 4d?

    Config Scl = P3.0
    Config Sda = P3.1
    Config I2cdelay = 1


    ' P1.2 bedzie asygnowane jako MRQ

    Do ' glowna petla programu

    P1.2 = 0 ' MRQ na logiczne "0" 'TID odpowiada SDA-0
    delay
    delay ' 200 mikrosekund
    P1.2 = 1 ' MRQ na logiczne "1" 'TID odpowiada SDA-1

    I2cstart ' inicjuje magistrale SDA-0
    'SCL-0


    I2cwbyte &H94 ' wysyla adres TIDa - 94h

    P1.2 = 0 ' MRQ na logiczne "0"
    I2cwbyte 1 ' wygasza wszystkie piktogramy (3 bajty)
    I2cwbyte 1 ' czyli pierwsze 3 bajty danych do wyświetlacza
    I2cwbyte 1 ' lub 0 wtedy bez kreski

    I2cwbyte 164 ' wysyla napis do TIDa (10 bajtow)
    I2cwbyte 220
    I2cwbyte 196
    I2cwbyte 203
    I2cwbyte 229
    I2cwbyte 233
    I2cwbyte 64
    I2cwbyte 174
    I2cwbyte 93
    I2cwbyte 64 ' ostatni bajt danych

    P1.2 = 1 ' MRQ na logiczne "1"

    I2cstop ' konczy transmisje i zwalnia magistrale
    Waitms 255 ' czeka 0.25s i powtarza petle
    ' nie musisz tak długo wystarczy 500 mikrosekund
    Loop
    End


    przeanalizuj wykresy jak carluccio. Pozdro.
  • #7 1861001
    robiw
    Poziom 26  
    Posty: 2030
    Pomógł: 25
    Ocena: 133
    Właśnie Carluccio napisał mi odpowiedź:

    Hallo Robert,

    you wrote:
    > I think that there are 3 possible problems:
    > 1. MRQ damage Bascom's I2C protocol (need to create own protocol or
    > library change - ice.lib)
    > 2. Speed of this protocol is to high
    > 3. Opel complicated own protocol

    You are right. Look on my page and implement the TID protocol as I
    described.

    With parity, Start, Stop, Test. MRQ and Bit-Synchronisation.

    Than it should work fine.

    Bye, Dario.

    ------------------
    Problemem więc będzie bit-synchronisation i Test - jak na moje możliwości. No i nie wiem czy max dla tej magistali to chyba tylko 2 kHz...
    robiw

    Dodano po 6 [minuty]:

    >P1.2 = 0 ' MRQ na logiczne "0" 'TID odpowiada SDA-0
    >delay
    >delay ' 200 mikrosekund
    >P1.2 = 1 ' MRQ na logiczne "1" 'TID odpowiada SDA-1

    a swoją drogą to napisałem zamiast tych delay taką pętlę (do loop until) aż TID odpowie SDA na "0" ale on "nie zdejmuje" "1" z szyny i program nie idzie dalej... robiw

    Dodano po 4 [godziny] 11 [minuty]:

    Witam ponownie.
    Ciągle zastanawiam się co może być źle: próbowałem wszystkich adresów i różnych opóźnień jednak wydaje mi się, że tutaj trzeba napisać własny protokół "na piechotę" - tak zresztą zrobił dla wyświetlacza 8-znakowego Łukasz Szamota-Nagy - na stronie EElkie Viesser (z pierszego postu) udostępnił źródło (w asemblerze) i HEXa - zmieniłem żródło dla TIDa 10-znakowego, skompilowałem do HEXa (programem ASM51) ale niestety Bascom HEXów nie czyta tylko BINy więc nie mogłem sprawdzić czy to działa. Swoją drogą Dario twierdzi, że korzystając z jego strony nie powinno być problemu - niestety źródeł tam nie ma :-(. Zastanawia mnie też fakt, że jak rozpoczynam transmisję "zciągając" MRQ na logiczne "0" to TID nie odpowiada "zciągnięciem" SDA na "0". Czekałem (w pętli) i nic. Może trzeba jakoś wcześniej zainicjować tego TIDa - pisze o tym Szamota-Nagy lub Carluccio na stronie Eelke. Odnośnie końcówki nr.2 - tam trzeba podać 5V (lub 12V) to wtedy na tej dolnej linii możemy wyświetlać - inaczej wyświetla się tam data (z TIDa).
    Robiąc te wszystkie doświadczenia, za którymś razem zauważyłem, że jak się tego TIDa zostawi na dłużej z którymś z programów to w końcu wygasi nawet górną, "swoją" linijkę - tak jakby coś "dziwnego" jednak przeczytał z tej magistrali... robiw
  • #8 1862492
    maya30
    Poziom 12  
    Posty: 24
    Pomógł: 1
    W podanych przez Ciebie źródłach pisze jak byk, że TID odpowiada SDA na 0 bo przeciesz musi potwierdzić zgłoszenie. Rozpisujemy się na temat programu a może jednak pprzyczyna leży jednak w hardware. Skrobnij schemacik to ułatwi nam zabawę.
    Jest jeszcze jedna rzecz mianowicie potwierdzanie przyjętego bajtu.
    Spróbój używać I2Cwbyte xxx,9 i tylko w ostatnim bajcie daj ,8
  • #9 1865179
    robiw
    Poziom 26  
    Posty: 2030
    Pomógł: 25
    Ocena: 133
    Witam
    Ack lub Nack działa tylko przy procedurze odczytu i2crbyte a nie i2cwbyte. Dzisiaj podłączyłem tego TIDa równolegle z innym TIDem połączonym z działającym radiem i wszystko było OK - wyświetlał. Dzisiaj także napisałem "na piechotę" obsługę i2c i też nie działa (listing poniżej). Nie wiem czy nie potrzeba wcześniej jakoś zainicjować tego TIDa. Dane do listingu: P3.0 to SCL, P3.1 to SDA, P1.2 to MRQ a P1.6 podłączone jest do diody LED, która mrugając pokazuje mi, że pętla się wykonuje. Niestety i tak nie działa... robiw

    listing:

    Disable Interrupts
    Dim Dana As Bit
    Dim Danaprocedury As Byte

    Declare Sub Sendi2cdata(danaprocedury As Byte)


    Do
    'glowne
    Waitms 255

    Do 'ustawiamy MRQ na 0 i TID odpowiada SDA na 0
    P3 = 255
    P1 = 255
    Dana = 1

    Reset P1.2
    'Delay
    Dana = P3.1
    P1.6 = Dana
    Loop Until Dana = 0

    Set P3.1 'przygotowanie do odczytu SDA

    Do 'ustawiamy MRQ na 1 i TID odpowiada SDA na 1
    Set P1.2
    'Delay
    Dana = P3.1
    P1.6 = Dana
    Loop Until Dana = 1

    Delay ' master czeka 200us
    Reset P3.1 'czyli i2c start
    'Delay 'master czeka 200us choc powinien ok 100 us
    'i wysyla adres poczawszy od stanu niskiego na SCL
    Call Sendi2cdata(77)
    'Delay ' nie wiem czy potrzebny
    Reset P1.2 'ustawia MRQ na 0
    Call Sendi2cdata(1)
    Call Sendi2cdata(1)
    Call Sendi2cdata(1)

    Call Sendi2cdata(123)
    Call Sendi2cdata(10)
    Call Sendi2cdata(21)
    Call Sendi2cdata(31)
    Call Sendi2cdata(41)
    Call Sendi2cdata(51)
    Call Sendi2cdata(61)
    Call Sendi2cdata(71)
    Call Sendi2cdata(81)
    Call Sendi2cdata(91)

    P3 = 0
    Delay
    Set P1.2 'ustawiamy MRQ na 1
    Delay
    P3 = 1
    Delay
    P3 = 3 'i2c stop

    Waitms 100


    Loop 'glowne

    '----------------------------------------------------------
    Sub Sendi2cdata(danaprocedury As Byte)
    Dim Parzyste As Byte
    Dim Wynik As Byte
    'procedura zaczyna transmisje od SCL = "0"

    Parzyste = 0

    Wynik = Danaprocedury And 64
    If Wynik = 64 Then
    ' "1"
    Parzyste = Parzyste + 1
    P3 = 2
    Delay
    P3 = 3
    Delay
    Else
    ' "0"
    P3 = 0
    Delay
    P3 = 1
    Delay
    End If

    Wynik = Danaprocedury And 32
    If Wynik = 32 Then
    ' "1"
    Parzyste = Parzyste + 1
    P3 = 2
    Delay
    P3 = 3
    Delay
    Else
    ' "0"
    P3 = 0
    Delay
    P3 = 1
    Delay
    End If

    Wynik = Danaprocedury And 16
    If Wynik = 16 Then
    ' "1"
    Parzyste = Parzyste + 1
    P3 = 2
    Delay
    P3 = 3
    Delay
    Else
    ' "0"
    P3 = 0
    Delay
    P3 = 1
    Delay
    End If

    Wynik = Danaprocedury And 8
    If Wynik = 8 Then
    ' "1"
    Parzyste = Parzyste + 1
    P3 = 2
    Delay
    P3 = 3
    Delay
    Else
    ' "0"
    P3 = 0
    Delay
    P3 = 1
    Delay
    End If

    Wynik = Danaprocedury And 4
    If Wynik = 4 Then
    ' "1"
    Parzyste = Parzyste + 1
    P3 = 2
    Delay
    P3 = 3
    Delay
    Else
    ' "0"
    P3 = 0
    Delay
    P3 = 1
    Delay
    End If

    Wynik = Danaprocedury And 2
    If Wynik = 2 Then
    ' "1"
    Parzyste = Parzyste + 1
    P3 = 2
    Delay
    P3 = 3
    Delay
    Else
    ' "0"
    P3 = 0
    Delay
    P3 = 1
    Delay
    End If

    Wynik = Danaprocedury And 1
    If Wynik = 1 Then
    ' "1"
    Parzyste = Parzyste + 1
    P3 = 2
    Delay
    P3 = 3
    Delay
    Else
    ' "0"
    P3 = 0
    Delay
    P3 = 1
    Delay
    End If

    'a teraz bit parzystosci

    Wynik = Parzyste Mod 2
    If Wynik = 0 Then
    ' "1" bo parzysta liczba jedynek
    P3 = 2
    Delay
    P3 = 3
    Delay
    Else
    ' "0" bo nieparzysta liczba jedynek
    P3 = 0
    Delay
    P3 = 1
    Delay
    End If

    'a teraz potwierdzenie odczytu

    P3 = 0 ' SCL na 0 i SDA na 0
    Delay ' SCL na 1 i SDA na 0
    P3 = 1
    Delay

    End Sub
    '-----------------------------------------------------------


    End
  • #10 1866228
    robiw
    Poziom 26  
    Posty: 2030
    Pomógł: 25
    Ocena: 133
    Witam ponownie. Dario Carluccio przesłał mi listing działającego programu pod tego TIDa ale bez komentarza i w dodatku to chyba pod AVR - może ktoś rozszyfruje - w załączniku... robiw
    Załączniki:
    • listing.txt (14.56 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #11 1881493
    takow
    Poziom 12  
    Posty: 86
    Pomógł: 2
    Ocena: 4
    Witam

    Już mnie trafia, ponieważ postanowiłem również ożywić swojego TIDa (8znaków) i nic.
    Może ktoś nam pomoże odpalić ten wyświetlacz w Bascomie, najlepiej AVR
  • #12 1913342
    Leo74
    Poziom 1  
    Posty: 1
    Po pierwsze zwolnij transmisję danych. W oplu chodzi ona bardzo wolno - do 1kHz (patrz wykresy Carluccio) - ustaw parametr na 255. Po drugie zrób spradzenie czy wyświetlacz odpowiedział na SDA po zmianie MRQ i dopiero później niech procesor startuje z resztą transmisji. Poza tym na samym początku zrób procedurę testu lini SDA,SCL i MRQ - pierwszy wykres Carluccio. Całą resztę można zrobić za pomocą standardowych poleceń Bascoma. I daj sobie spokój z procedurami sprawdzania parzystości i zmianą zawartości bajtu. Masz 10 cyfr - ustal raz na zawsze wartość bajtu, zadeklaruj tablicę i odwołuj się do zawartości tablicy. Dużo prostsze i szybsze.
    Powodzenia:D
  • #13 3283736
    sliver1
    Poziom 22  
    Posty: 870
    Pomógł: 2
    Ocena: 122
    troche stary temat odgrzebuje ale co tam;))
    udalo sie komus rozpracowac sterowanie oplowskim tidem z poziomu Bascom'a AVR?? Probuje przerobic kompa pokladowego na Atmega32 i wyswietlaczu LCD 2x8 tak, zeby wspolpracowal z tidem oplowskim.
    Za kazda pomoc bede wdzieczny (ale nie tak jak autor tego tematu - robiw. jemu udalo sie dzieki waszej pomocy rozpracowac sterowanie wyswietlaczem ale teraz nie chce sie podzieli choc czescia swojej wiedzy, przynajmnie nie za darmo.)
    Za pomoc oferuje 100punkcikow:)
    Pozdrawiam.

Podsumowanie tematu

✨ Dyskusja dotyczy sterowania wyświetlaczem samochodowym Opel (TID) za pomocą zmodyfikowanej magistrali I2C w środowisku Bascom 8051. Wyświetlacz wykorzystuje standard I2C rozszerzony o dodatkową linię MRQ (Master Request), co komplikuje komunikację. Kluczowe problemy to prawidłowe podłączenie wyświetlacza, dobór właściwego adresu urządzenia na magistrali (wskazywane adresy to 9B, 94h lub 4D, z uwzględnieniem bitu parzystości), synchronizacja bitów, obsługa linii MRQ oraz niska prędkość transmisji (do około 1-2 kHz). Wskazano, że standardowe procedury I2C w Bascom mogą nie działać bez modyfikacji, gdyż protokół Opla wymaga bit-synchronizacji, testu i potwierdzenia (ACK) specyficznego dla tego wyświetlacza. Zalecane jest spowolnienie transmisji, dokładne sprawdzenie sygnałów SDA, SCL i MRQ oraz implementacja własnej obsługi protokołu zgodnie z opisem Dario Carluccio. W dyskusji pojawiły się także przykładowe fragmenty kodu i sugestie dotyczące inicjalizacji i potwierdzania bajtów. Użytkownicy zgłaszają trudności z uzyskaniem poprawnego działania, a także próbują implementacji na mikrokontrolerach AVR. Wskazano, że podświetlenie wyświetlacza musi być prawidłowo zasilone, a adresy i protokół transmisji muszą być ściśle przestrzegane, aby wyświetlacz reagował na polecenia.
Wygenerowane przez model językowy.
REKLAMA