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

[AtMega8] [AtMega8][C] - Niestabilne działanie wyświetlacza WH1602B1 z interfejsem SPI

jfSeth 01 Paź 2014 20:49 939 4
REKLAMA
  • #1 14007318
    jfSeth
    Poziom 8  
    Witam.
    Próbuję podłączyć wyświetlacz WH1602B1 z interfejsem SPI pod Atmege8, problem w tym, że po uruchomieniu programu raz mi się pojawia napis (klasyczne) "Hello world" - tak jak ma być, a raz nie i na wyświetlaczu wtedy jest pusto, albo są jakieś krzaczki, albo pojawia się nie cały napis. Nie wiem czy problem w tym, że mam ustawiać jakieś opóźnienia w procedurze która wysyła dane, czy tych opóźnień nie ma być. Czy też problemem jest częstotliwość SCK. SCK nie wiem dokładnie jakie mam ustawić bo w dokumentacji tego wyświetlacza przy inicjalizacji (Function set, Entry mode set) mam Fosc=540kHz (strona 30) F_CPU standardowo mam na 8Mhz więc mam dzielnik albo przez 8 (1Mhz) albo przez 16 (500 kHz) (znając życie pewnie przez 16). Myślałem jeszcze nad tym, że może chodzi o to, że potrzeba dać jakieś opóźnienia po wywołaniu makrodefinicji np. CSB_LOW czy RS_HIGH, o to, żeby poczekać aż napięcie "ustawi" się. Po za tym mam jeszcze pytanie odnośnie przerwania SPI_STC_vect - kiedy ono jest wywoływane? Myślałem nad tym, żeby w tym przerwaniu ustawić jakąś zmienną która będzie kontrolować wysyłanie (np. jeśli przerwanie to jest po zakończeniu transmisji to w nim mogę ustawić zmienną która zezwoli na wysłanie kolejnego bajtu)

    datasheet WH1602B1

    Pinout:
    Mój LCD ma takie:
    RS (tak jak w hd44780 pin RS)
    CSB (chip select) musi być 0 żeby czytał
    SCLK (clock) zegar
    SID (input data) dane WE

    I podłączam to pod:
    RS: PD5
    CSB: PD6
    SCLK: PB5
    SID: PB3 (MOSI (Master Out/Slave In))

    Mój kod:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • REKLAMA
  • #3 14007920
    jfSeth
    Poziom 8  
    Wcześniej też próbowałem ustawić te bity CPOL i CPHA na 1 ale o dziwo jak je ustawiłem to nic się nie pojawiało a jak ustawiłem na 0 to czasem te hello world się pojawiło teraz jak próbuje to jak na razie kompletnie nic już się nie pokazuje :( Jak ustawiałem CPHA to pamiętam, że wysypywało mi krzaczki, a bez CPHA tekst wyświetlał się normalnie. Więc raczej ma być chyba na zero.
  • REKLAMA
  • Pomocny post
    #4 14007942
    tmf
    VIP Zasłużony dla elektroda
    Ustaw PB2 jako wyjście i wykorzystaj go jako np. CS. Jeśli PB2 (SS) jest wejściem to niski poziom logiczny na tym pinie wyłącza tryb master SPI. Jako, że masz ten pin najwyraźniej niepodłączony, potencjał na nim pływa i ci losowo wyłącza master SPI.
  • #5 14010480
    jfSeth
    Poziom 8  
    Mam! :) Poradziłem sobie. Na wszelki wypadek podpiąłem rezystor 1k pod SCK ale niepotrzebnie. Działa prawidłowo bez niego. Problem było właśnie nie ustawienie tych pinów (całe SPI). Zobaczyłem do dokumentacji AtMega8 i tam miałem taką tabelkę które piny jakie trzeba ustawić w jakim trybie i dla trybu Master jest to: SS, SCK, MOSI na Out, Miso na In, ustawiłem kierunki tak jak na tabelce i SS dałem jako CSB a RS podpiąłem niżej do PB1 i działa pięknie.

    Jakby co kod:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
REKLAMA