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

ATMEGA 16 + wyświetlacz i spadek napięcia

skyguy 14 Cze 2010 22:36 1743 7
  • #1 8191164
    skyguy
    Poziom 14  
    Koledzy, uruchomiłem schemat gdzie do ATMEGI16 podłączyłem wyświetlacz przez porty B (B2-B7), do porów D podłączyłem diody jako wskaźniki bitowe.
    Programowo ustawiłem wszystkie wyjścia portu D na 1 i zauważyłem dziwny spadek napięcia na PD0 i PD1 do ok. 4,7V. Na innych pinach D jest 5,2. Ten spadek występuje tylko przy programie wykorzystującym wyświetlacz przy innych algorytmach nie inicjujących wyświetlacz nie występuje, na każdym pinie jest 5,2V - przy tym samym schemacie - dlatego wydaje mi się że błędu w schemacie nie ma.

    ALGORYTM:

    #include <avr/io.h>
    //
    #define LCD  PORTB
    #define E  3
    #define RS  2
    //
    #define SET_E   LCD |= _BV(E)
    #define CLR_E   LCD &= ~_BV(E)
    //
    #define SET_RS  LCD |= _BV(RS)
    #define CLR_RS  LCD &= ~_BV(RS)
    
    // funkcja opóźniająca o x*1ms
    void waitms(char x)
    {
    unsigned char a, b; // zmnienne licznikowe
    for( ; x > 0; --x) // ta pętla zostanie wykonana x-razy
      for(b = 10; b > 0; --b) // a ta 10 razy
    	for(a = 100; a > 0; --a) // natomiast ta 100 razy
    	__asm("nop"); // dodatkowa instrukcja opóźniająca o 1 cykl
    	// razem to da opóźnienie ok. x * 1ms
    	// x od 0 do 255
    }
    
    // pcodedura zapisu bajtu do wyświetlacza LCD
    // bez rozróżnienia instrukcja/dana
    void write_to_lcd(char x)
    {
    SET_E; // ustaw na E stan wysoki
    LCD = ((LCD & 0x0F) | (x & 0xF0)); // zapis pierwszej połówki bajtu
    CLR_E; // opadające zbocze na E -> zapis do wyświetlacza
    SET_E; // ustaw na E stan wysoki
    LCD = ((LCD & 0x0F) | ((x & 0x0F) << 4)); // zapis drugiej połowki bajtu
    CLR_E; // opadające zbocze na E -> zapis do wyświetlacza
    waitms(1); // czekaj 1ms
    }
    
    // procedura zapisu instrukcji do wyświetlacza LCD
    void write_command(char x)
    {
    CLR_RS; // niski stan na RS -> zapis instrukcji
    write_to_lcd(x); // zapis do LCD
    }
    
    // procedura zapisu danej do wyświetlacza LCD
    void write_char(char x)
    {
    SET_RS; // wysoki stan na RS -> zapis danej
    write_to_lcd(x); // zapis do LCD
    }
    
    // procedura zapisu tekstu do wyświetlacza LCD
    void write_text(char * s)
    {
    while(*s) // do napotkania 0
      {
      write_char(*s); // zapisz znak wskazywany przez s na LCD
      s++; // zwiększ s (przygotuj nastepny znak)
      }
    }
    
    // procedura inicjalizacji wyświetlacza LCD
    void lcd_init(void)
    {
    waitms(15); // czekaj 15ms na ustabilizowanie się napięcia zasilającego
    CLR_E; // E = 0
    CLR_RS; // RS = 0
    char i; // zmianna licznikowa
    for(i = 0; i < 3; i++) // trzykrotne powtórzenie bloku instrukcji
      {
      SET_E; // E = 1
      LCD &= 0x3F; //
      CLR_E; // E = 0
      waitms(5); // czekaj 5ms
      }
    SET_E; // E = 1
    LCD &= 0x2E; //
    CLR_E; // E = 0
    waitms(1); // czekaj 1ms
    write_command(0x28); // interfejs 4-bity, 2-linie, znak 5x7
    write_command(0x08); // wyłącz LCD, kursor i miganie
    write_command(0x01); // czyść LCD
    write_command(0x06); // bez przesuwania w prawo
    write_command(0x0C); // włącz LCD, bez kursora i mrugania
    }
    
    // program główny
    int main(void)
    {
    // konfiguracja portów we/wy
    
    
    
    DDRA =  0x00; //wejsia A
    PORTA = 0xFF; //wejscia 5V
    
    DDRB = 0xFF;  //wyjscia B na LCD
    DDRD = 0xFC; //wyjscia D
    PORTB = 0xFF; //ustawienei pojedynczych bitow na B
    
    //while(1)
    {
    PORTD = PINA; //ustawenia bitow na D
    
    // inicjalizacja LCD
    lcd_init();
    // zapisz na LCD przykładowy tekst
    write_text("Wyświetlacz A16");
    // petla nieskończona
    }
    
    while(1)
    return 0;
    }
    

    Z programowaniem AVR dopiero raczkuje dlatego przyznam, że do zainicjowania wyświetlacza użyłem gotowego rozwiązania - co nie znaczy nie mam kompetnie o tym pojęcia. Ja nie znalazłem przyczyny więc liczę na wasze sokole-oko.

    Zapraszam do dyskucji

    Proszę pamiętać o używaniu znaczników code. - arnoldziq
    Przeniesiono z Programowanie Ogólne. - arnoldziq
  • Pomocny post
    #2 8191425
    Przemo1268
    Poziom 20  
    Kolega błędnie przypisał kierunek portu:
    zamiast: DDRD = 0xFC; //wyjscia D powinno być DDRD = 0xFF; //wyjscia D
  • #3 8192925
    skyguy
    Poziom 14  
    Dzięki za zainteresowanie jednak to jest pozostałość po różnych próbach jakie podejmowałem w celu ustalenia przyczyny, oryginalnie jest 0xFF i spadek napięcia dalej występuje.
  • Pomocny post
    #4 8193289
    tmf
    VIP Zasłużony dla elektroda
    A ten zaobserwowany efekt powoduje jakąś nieprawidłowość? Bo jeśli nie to nie ma się czym przejmować. W sumie ciągniesz dosyć spory prąd z pinów i teraz zależnie jak są rozwiązane połączenia wewnątrz procesora to możesz obserwować takie efekty - ale wszystko ciągle się mieści w specyfikacji.
  • #5 8193346
    skyguy
    Poziom 14  
    W sumie nie,
    chyba, że niektóre podzespoły nie rozpoznają 4,7V jako logiczna jedynkę.
    Dopiero składam mój schemat i wzbogacam go o nowe elementy i to zjawisko mnie zdziwiło, jeżeli miałby to być błąd to wole go odrazy wyeliminować niż się z nim tłuc i rozgryzać przy bardziej rozbudowanym projekcie...
    Czyli co - można powiedzieć że to norma?
  • Pomocny post
    #6 8193399
    lucas_mcs
    Poziom 22  
    Nie wiem co to za wyświetlacz, ale spróbuj uruchomić go bez podświetlenia, najlepiej byłoby spojrzeć na prąd każdej lini wyświetlacza czy jest zgodny ze specyfkacją (ile można z każdej nóżki wyciągnąć)
  • #8 8194019
    skyguy
    Poziom 14  
    Myślę że to nie jest wina nadmiernego pożerania przez wyświetlacz prądu z tego względu, iż jest on zasilany prosto z 5V a nie przez ATmege. Z ATmegi idą jedynie dane i stery.
    Narazie będę pracował tak, może ATmega jest uszkodzona - ma jakieś przebicie na któryś z pinów od wyświetlacza i kiedy go używam coś ulatuje...

    Dzięki za zainteresowanie
REKLAMA