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] - Błąd w obsłudze wyświetlacza HD44780 2x16, konfiguracja portów C

Chey 30 Lis 2012 10:51 3672 10
REKLAMA
  • #1 11592353
    Chey
    Poziom 9  
    Witam!

    Po raz milionowy poruszam temat wyświetlacza LED.

    Proszę o sprawdzenie, gdzie robię błąd (od razu zaznaczam, ze przeszukałem internet, forum itp, ale dalej nie wiem dlaczego nie działa)

    układ:
    -atmega8
    -wyświetlacz LED: 2x16 oparty na HD47780
    -biblioteki: 4bit z odczytem flagi zajętosci
    - Eclipse + avr plugin
    -wszystko podłączone do portu C

    RS -> PC2
    R/W -> PC0
    E -> PC1

    Szyna danych:
    DB4 -> PC3
    DB5 -> PC4
    DB6 -> PC5
    DB7 -> PC6

    Wyświetlacz po podłączeniu do programatora włącza podświetlenie i pierwszy wiersz kwadracików (po tym wnioskuje, że jest sprawny)

    Plik .h
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Mój program(może tutaj jest coś źle?):
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Program się kompiluje, bo zaprogramowaniu na wyświetlaczu nic się nie dzieje
    Podłączenia sprawdziłem - zgodne ze schematem.
  • REKLAMA
  • #2 11592416
    akajarz
    Poziom 23  
    Wyświetlacz się nie inicjalizuje.
    Pracujesz na wewnętrznym zegarze? Masz gdzieś zdefiniowaną częstotliwość procka np
    #define F_CPU 1000000UL ?
  • REKLAMA
  • #3 11592466
    Chey
    Poziom 9  
    Tak, wewnętrzny zegar, częstotliwość zdefiniowana jest przez Eclipsa (sprawdziłem wpisując"#define F_CPU 1000000UL" - nic się nie zmienia)
  • #5 11592582
    Chey
    Poziom 9  
    akajarz, Sprawdziłem tą bibliotekę

    Zmieniłem:
    (plik .h)
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Program:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Znowu wszystko się kompiluje i znowu to samo (pierwszy wiersz prostokątów)
  • REKLAMA
  • Pomocny post
    #6 11592617
    akajarz
    Poziom 23  
    Zastanów się nad użyciem petli while, bo w pierwszym programie w petli cały czas czyścisz i wyświetlasz coś, więc może tego nawet nie zobaczysz tak szybko będzie się zmieniać. Natomiast w drugim programie nic ci się nie wyświetli bo program wpadnie w nieskończonę petlę i już z niej nie wyjdzie, instrukcje po while(1); już się nie wykonają.
    Zrób tak.
    1. inicjalizacja wyświetlacza
    2. clrscr i wyświetl coś
    3. while(1);

    Dodano po 15 [minuty]:

    W pliku lcd.h musisz jeszcze zdefiniowac kilka rzeczy, najważniejsze to ustawić wyswietlacz w tryb memory mapped mode.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #7 11592781
    Chey
    Poziom 9  
    Cytat:
    W pliku lcd.h musisz jeszcze zdefiniowac kilka rzeczy, najważniejsze to ustawić wyswietlacz w tryb memory mapped mode.

    A nie w tryb IO port mode?

    Zrobiłem tak:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    lub tak:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Powinien wyświetlić napisy, poczekać 2,5sec i ponownie wyczyścić itp

    Efekt dalej ten sam (żadnej reakcji wyświetlacza)
  • REKLAMA
  • #8 11592856
    akajarz
    Poziom 23  
    Racja, IO port mode.
    Co do problemu już nie mam pomysłu, u mnie to działa wyśmienicie.
  • #9 11593208
    Chey
    Poziom 9  
    Problem rozwiązany.

    Odłączyłem wszystkie kabelki od avr żeby sprawdzić czy jest styk pomiędzy wyświetlaczem a kabelkiem (wszystko było OK), podłączyłem ale tym razem do PORT D. Na obu bibliotekach wszystko śmiga. Być może przeszkadzało to, że pin reset oraz PC6 to ten sam pin, a programator był cały czas podłączony (ale nie jestem pewien czy tak jest)

    akajarz, dzięki za pomoc
  • #11 11595384
    Chey
    Poziom 9  
    Czytałem artykuły na tej stronie (polecam). AVCC miałem podłączone do zasilania i zmasowane przez kondensator 100nF.
REKLAMA