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

Czy poprawnie podłączyłem wyświetlacz S65 do Atmegi? Długość kabli 30cm

Tarkowski01 26 Lut 2010 12:41 3067 11
REKLAMA
  • #1 7752913
    Tarkowski01
    Poziom 11  
    Posty: 64
    Ocena: 1
    Witam,
    mam problem z podłączeniem wyświetlacza S65.
    Mam wolne następujące wyjścia:
    PB2,PB1,PB0,PD7,PD6
    podłączam do nich wejścia wyświetlacza opisane na stronie:
    http://www.superkranz.de/christian/S65_Display/DisplayHardware.html
    PB2->RS
    PB1->RESET
    PB0->CS
    PD7->CLK
    PD6->DAT
    Następnie w bibliotece zmieniam definicje pinów na:
    #define LCD_MISO PB3
    #define LCD_RS PB2
    #define LCD_RESET PB1
    #define LCD_CS PB0
    #define LCD_SCK PD7
    #define LCD_MOSI PD6
    Czy dobrze przypisałem wyjścia?
    Nie wiem po co jest LCD_MISO? u mnie wisi w powietrzu.

    Ponadto zastanawia mnie, czy sygnał może ulec zniekształceniu i nie dojść do wyświetlacza z powodu dość długiego okablowania. tzn mikrokontroler z wyświetlaczem jest połączony około 30cm kabelkami o różnej długości.

    Mam kwarc 16MHz i tak też jest ustawione w bibliotece.
  • REKLAMA
  • Pomocny post
    #2 7753038
    SnowBizz
    Poziom 15  
    Posty: 134
    Pomógł: 9
    Ocena: 4
    Nie możesz przypisać pinów z innych portów niż port B,
    wynika to z budowy pliku lcd.asm, gdzie cała inicjalizacja i sterowanie odywa się właśnie po porcie B.
    Owszem możesz zmienić kolejność wyprowadzeń przez odpowiednie #define, ale tylko w obrębie tego portu. No chyba, że przerobisz plik lcd.asm.
  • #3 7753054
    Tarkowski01
    Poziom 11  
    Posty: 64
    Ocena: 1
    Cytat:
    Po drugie nie możesz przypisać pinów z innych portów niż port B

    Bardzo cenna uwaga. Moje niedopatrzenie.

    Cytat:
    Po pierwsze pin MISO nie może wisieć w powietrzu! MISO i MOSI to wyjście i wejście danych SPI.

    No właśnie nie rozumiem tego. MISO to przecież wejście SPI. Wyświetlacz nie wysyła żadnych danych. Poza tym na schemacie nie jest pokazane gdzie mam podczepić ten pin?

    Po co w ogóle jest deklaracja MISO w bibliotece?
  • #4 7753066
    SnowBizz
    Poziom 15  
    Posty: 134
    Pomógł: 9
    Ocena: 4
    może patrzysz na zły schemat, bo ja na schemacie nie widze MISO..
    Tu masz pinout z tego LCD do tego schematu co podałeś..
    Link
  • REKLAMA
  • #5 7753298
    Tarkowski01
    Poziom 11  
    Posty: 64
    Ocena: 1
    Właśnie o tym mówię,że na schemacie nie ma miso, a w bibliotece jest. I nie wiem co z nią zrobić.
  • REKLAMA
  • #6 7756454
    SnowBizz
    Poziom 15  
    Posty: 134
    Pomógł: 9
    Ocena: 4
    Wyrzuć #define od MISO z pliku lcd.h, zakomentuj linijke kodu z lcd.asm:
    "sbi PORTB, LCD_MISO" i powinno działać.
  • #7 7773247
    Tarkowski01
    Poziom 11  
    Posty: 64
    Ocena: 1
    Rozwiązałem problem. Był jak każdy tego typu problem- żałosny.
    Kolor tła był biały i kolor teksu był zbliżony do bieli. stąd nie zauważyłem, że wyświetlacz poprawnie wyświetla.

    Ale teraz mam nowy problem.
    Wiem że kiedyś czytałem na ten temat wątek, ale teraz nie mogę go znaleźć.

    Otóż korzystając z funkcji:
    put_char(45+i*CHAR_W,60,txt[i],0); // 0 deg. rotated

    zamiast sensownego teksu wyświetlają mi się jakieś bezsensowne piksele. Tylko jedna litera 'l' poprawnie mi się wyświetla. (Wyświetlam tekst "hello world" :) )

    Jednak wyświetlanie poszczególnych liter działa prawidłowo. To znaczy bez pętli.
        //put_char(45+8,60,'H',0);   // 0 deg. rotated
        //put_char(45+16,60,'E',0);   // 0 deg. rotated
        //put_char(45+24,60,'l',0);   // 0 deg. rotated
        //put_char(45+32,60,'l',0);   // 0 deg. rotated
        //put_char(45+40,60,'o',0);   // 0 deg. rotated


    Tak wygląda obsługa wyświetlania tekstu (to nie działa):
    
      uint8_t i;
      char txt[]={'H','e','l','l','o',' ','w','o','r','l','d',0};//
      i=0;
      while (txt[i]!=0)
      {
        put_char(45+i*CHAR_W,60,txt[i],0);   // 0 deg. rotated
        i++;
      }
  • #8 7776579
    Tarkowski01
    Poziom 11  
    Posty: 64
    Ocena: 1
    Posunąłem się trochę do przodu i wiem, że problem leży w tej tablicy:
    char txt[]={'H','e','l','l','o',' ','w','o','r','l','d',0};//

    Zauważyłem, że kompilatorowi robi różnicę, czy ma do czynienia z:
    txt[0] czy z 'H'.

    Myślę sobie, że może jest to związane z optymalizacją kodu i trzeba jakąś dyrektywę wstawić żeby kompilator nie optymalizował tej zmiennej...
    (obecnie przy kompilacji jest -0)

    Może macie jakieś pomysły, bo już naprawdę nie wiem jak to ugryźć.
  • REKLAMA
  • #9 7777118
    SnowBizz
    Poziom 15  
    Posty: 134
    Pomógł: 9
    Ocena: 4
    Tak na szybko wklep: unsigned char txt[13]={"Hello World"};

    Wynikiem tego:"45+i*CHAR_W" jest 45+0, a nie 45+8, nie wiem czy ma to jakieś znaczenie, ale może próbujesz wyświetlać coś poza ekranem..?
  • #10 7777349
    Tarkowski01
    Poziom 11  
    Posty: 64
    Ocena: 1
    Na pewno nie próbuję wyświetlać poza ekranem. W przykładzie zamieściłem od drugiej litery. równie dobrze może być:
    put_char(0x0000,60,'H',0);

    i takie coś działa


    To inaczej zapytam:
    jaka jest różnica między:

    unsigned char my_txt[12]={'H','E','L','L','O',' ','W','O','R','L','D',0x00};
    my_txt[0] i 'H'

    Przychodzi mi do głowy tylko uszkodzenie uC. Nie jestem w stanie wytłumaczyć tego w żaden inny sposób...
  • #11 7781064
    Tarkowski01
    Poziom 11  
    Posty: 64
    Ocena: 1
    Znalazłem błąd. Nie wiem skąd to się wzięło i nie wiem jak to jest możliwe, ale...

    Problem leżał w tym, że tworzyłem kod który nie mieścił się na mikrokontrolerze i część napisu w ogóle nie była zapisywana w pamięci. Jednak jest to bardzo niezrozumiałe, gdyż avr studio ma zabezpieczenie przed takimi wypadkami. W momencie, gdy chcemy wgrać zbyt duży program normalnie protestuje. Stąd też nie sprawdzałem długości kodu zakładając, że gdy napiszę za dużo zostanę poinformowany przez program.

    Druga możliwość- chyba bardziej prowdopodobna- to uszkodzone końcowe adresy pamięci. Chociaż nie wiem czy możliwe jest tak wybiórcze uszkodzenie pamięci. :)

    tak czy owak.

    Solved
  • #12 8254287
    ravmar
    Poziom 22  
    Posty: 692
    Pomógł: 5
    Ocena: 74
    Tarkowski01 bezpośrednio się podpinałeś z LCD do uC ? czy zastosowałeś rezystory pomiędzy na schemacie ?

Podsumowanie tematu

✨ Użytkownik ma problem z podłączeniem wyświetlacza S65 do mikrokontrolera Atmega, używając pinów PB2, PB1, PB0, PD7 i PD6. Wskazówki dotyczące podłączenia i definicji pinów w bibliotece zostały omówione, z uwagą, że pin MISO nie jest używany w tym przypadku. Użytkownik obawiał się, że długość kabli (30 cm) może wpłynąć na jakość sygnału. Po kilku odpowiedziach, problem został rozwiązany, gdy okazało się, że wyświetlacz działa, ale tekst był niewidoczny z powodu podobieństwa kolorów. Następnie pojawił się nowy problem z wyświetlaniem tekstu, który został zidentyfikowany jako wynik przekroczenia pamięci mikrokontrolera. Użytkownik ostatecznie rozwiązał problem, odkrywając, że kod nie mieścił się w pamięci, co prowadziło do nieprawidłowego działania.
Wygenerowane przez model językowy.
REKLAMA