Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Europejski lider sprzedaży techniki i elektroniki.
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[Atmega 8]Układ z LCD nie działa poprawnie po ponownym włączeniu zasilania

Arkadiusz G. 10 Lut 2012 01:35 2722 11
  • #1 10 Lut 2012 01:35
    Arkadiusz G.
    Poziom 8  

    Witam!

    Nadeszło moje drugie starcie z Atmegą 8. W przeciwieństwie do tego, co robiłem wcześniej, teraz robię to dla siebie - uczę się przed zrobieniem czegoś co mi się w końcu może przydać ;)

    Moim problemem jest 'dziwne' zachowanie się układu, w momencie wypięcia zasilania. A konkretniej - zaraz po zaprogramowaniu układ działa i zlicza czas zgodnie z tym jak ustawiłem program. Jednak w momencie wypięcia programatora i wpięcia go ponownie, lub podania zasilania z baterii, układ już nie zlicza, a przynajmniej tego nie widać. Albo zwraca dosłownie jakieś 'paści'

    Zliczanie obrazuję za pomocą wyświetlacza LCD 2x16 zgodnego z HD44780. Niestety nie wiem dokładnie co to za 'marka' bo nigdzie nie jest to wyraźnie napisane.

    Podłączenia i program jest oparty na zawartości tej strony:
    http://project.irone.org/2x16-lcd-with-atmega-8.html - podłączenie LCD względem tego.
    http://project.irone.org/digital-clock-with-atmega.html - zliczanie bez guzików w oparciu o tą zawartość (biblioteka lcd.h to w gruncie rzeczy kod z tej strony wyżej).

    Kod mojego programu:

    Code:
    #include <avr/io.h>
    
    #include <avr/interrupt.h>
    #include <stdio.h>
    #include <util/delay.h>
    #include "lcd.h"                    //header lcd
    #include "lcd.c"
    #define PINPAD PINB
    #define PORTPAD PORTB
    #define DDRPAD DDRB
    #define MENIT    1
    #define JAM    2
    #define START    0
    volatile unsigned char menit,jam;    //variabel penampung adc
    //deklarasi lcd ke stdio

    static int lcd_putchar(char c, FILE *stream); //prototype

    static FILE mystdout = FDEV_SETUP_STREAM(lcd_putchar, NULL,_FDEV_SETUP_WRITE);

    static int lcd_putchar(char c, FILE *stream)
    {
       if(c == 'n')
       {
          lcd_putchar('r', stream);
       }
       LCD_send_char(c);
       return(0);
    }

    void delay_ms(int ms) //fungsi delay mili sekon
    {
       for(int i=0;i<=ms;i++){_delay_ms(1);};
    }

    int zegar()
    {
       int sekundy=0;
       int minuty=0;
       int par_minuty=0;
       while(1)
       {
          if(par_minuty==0)




          {
             sekundy++;
             delay_ms(100);
             if(sekundy==60)
             {
                par_minuty=1;
             }
          }
          else
          {
             minuty++;
             par_minuty=0;
             sekundy=0;
             if(minuty==2)
             {
                minuty=0;
             }
          }
          LCD_send_command(LCD_CLR);
          LCD_send_command(0x80); //cursor line1
          printf("%2d:%2d",minuty,sekundy);
          LCD_send_command(LCD_CLR);
       }
       return 0;
    }

    int main (void)
    {
    DDRPAD=0X00;
    PORTPAD=0X0F;
    delay_ms(500);
    LCD_init();
    stdout = &mystdout;
    LCD_send_command(LCD_CLR);
    LCD_send_command(LCD_HOME);
    //addr lcd =jam addr 0xc0,menit addr 0xc3, detik addr 0xc6
    printf("     Witam!     ");
    LCD_send_command(LCD_CLR);
    LCD_send_command(LCD_HOME);
    zegar();
    return(0);
    }


    Jestem pewien, że mój problem jest błahy, łatwy do naprawienia. Niestety nie mam pojęcia nawet pod jakimi hasłami wyszukiwać rozwiązania mojego kłopotu. Dla tego zwracam się tutaj na forum ;). Jest to dla mnie wszystko o tyle dziwne, że w moim pierwszym projekcie nie było takich problemów - po wyłączeniu zasilania od razu całość działała jak należy...

    Bardzo bym prosił o pomoc, a przynajmniej podpowiedź pod jakimi hasłami szukać rozwiązania, bo już pół dnia się z tym męczę. Także proszę wziąć pod uwagę, że ze mnie elektronik żaden, choć jednocześnie jestem chętny do nauki ;)

  • #2 10 Lut 2012 02:50
    Ture11
    Poziom 33  

    Ojej, pierwszy raz widzę, żeby pin R/W wyświetlacza HD44780 był podłączony do procesora... Może się mylę, ale skoro już tak, to czy jest to zdefiniowane w programie? Zazwyczaj R/W był łączony do masy, ale też i ja za bardzo nie znam się na języku C, więc nie wiem, co tam jest odnośnie obsługi tego pinu r/w.

  • Pomocny post
    #3 10 Lut 2012 03:08
    dondu
    Moderator Mikrokontrolery Projektowanie

    Arkadiusz G. napisał:
    Moim problemem jest 'dziwne' zachowanie się układu, w momencie wypięcia zasilania. A konkretniej - zaraz po zaprogramowaniu układ działa i zlicza czas zgodnie z tym jak ustawiłem program. Jednak w momencie wypięcia programatora i wpięcia go ponownie, lub podania zasilania z baterii, układ już nie zlicza, a przynajmniej tego nie widać. Albo zwraca dosłownie jakieś 'paści'

    Pokaż schemat.
    RESET masz podciągnięty do Vcc rezystorem?
    Zdarza się, że programator może przeszkadzać w działaniu układu.



    Ture11 napisał:
    Ojej, pierwszy raz widzę, żeby pin R/W wyświetlacza HD44780 był podłączony do procesora...
    .... Zazwyczaj R/W był łączony do masy, ale też i ja za bardzo nie znam się na języku C, więc nie wiem, co tam jest odnośnie obsługi tego pinu r/w.

    http://radzio.dxp.pl/hd44780/hd44780_podstawy.htm
    http://radzio.dxp.pl/hd44780/hd44780_avr_4-bit_rw_c.htm

  • #4 10 Lut 2012 10:22
    Arkadiusz G.
    Poziom 8  

    @Ture - nawet na tym forum znalazłem informację, że tak trzeba ;) a z tego co czytałem, to czasem i sygnał na tą nóżkę się wysyła

    @dondu - reset klocka jest rezystorem podciągnięty i w drugą stronę zgodnie z tym:
    http://hobby.abxyz.bplaced.net/img/art001_schemat1_min.png
    z tej strony:
    http://hobby.abxyz.bplaced.net/index.php?pid=4&aid=1

    Tylko tak teraz myślę, że może za mały rezystor dałem, i dla tego takie paści wychodzą, bo wszędzie się mówi o 1k, a ja dałem 270 z powodu braku tego pierwszego. Tylko, że wtedy układ co najwyżej chyba by nie działał prawda?

    Problem jednak polega na tym, że układ taki sam, tylko zrobiony pod mój poprzedni schemat działa jak najbardziej poprawnie dla sterowania serwomechanizmami. Oto on:
    [Atmega 8]Układ z LCD nie działa poprawnie po ponownym włączeniu zasilania
    Po ponownym wpięci zasilania układ od razu wraca do swoich zadań.


    Obecny schemat:
    [Atmega 8]Układ z LCD nie działa poprawnie po ponownym włączeniu zasilania

    Edit: Dla pewności jeszcze poszukałem czy nie mam 1k rezystora i się znalazł, przy okazji wymiany, okazało się, że jednak reset nie był podciągnięty do +... musiałem pomylić otwory w tej mojej płytce. Tak więc teraz już jest 1k, podciągnięty do +5V... ale błąd nadal występuje. Układ odlicza prawidłowo zaraz po zaprogramowaniu... po wypieciu zasilania, lcd zgłasza kolejno: 1rząd czarnych kwadratów, a potem jest pusty. Żeby znów zaczął prawidłowo liczyć, trzeba go na nowo programować...

    Edit2: Od razu w sumie, przy okazji schematów blokowych, wrzucę schemat PCB, może kolejne błędy ujawnią się.
    [Atmega 8]Układ z LCD nie działa poprawnie po ponownym włączeniu zasilania

  • #6 10 Lut 2012 13:17
    Arkadiusz G.
    Poziom 8  

    Co do filtrowania zasilania: układ jest zasilany przez programator z USB... z tego co czytałem i sam się zresztą przekonałem, sygnał 5V z usb jest już 'bardzo' ustabilizowany. LCD zasilany jest także z programatora. W wypadku zasilania bateryjnego (którego nie wprowadziłem jeszcze) Filtracja jak najbardziej ma miejsce - W schemacie płytki jest po lewej stronie.

    Prosiłbym o informację, czy zasilanie USB także muszę filtrować przez kondensatory? Bo przez stabilizator nie ma już sensu chyba, prawda?:)

    Z tym rezystorem to faktycznie gafa. Nie wiem skąd mi się wzięło 1k zamiast 10k. Czeka mnie wizyta w sklepie.

  • #7 10 Lut 2012 13:26
    dondu
    Moderator Mikrokontrolery Projektowanie

    Oj, musisz bardzo zweryfikować swoją wiedzę w tym zakresie :)
    Zakłócenia powstają na każdym kroku, łącznie z tym, że generuje je także sam mikrokontroler. To baaaardzo szeroki temat. Jeżeli chcesz się z nim zapoznać, to w spisie treści z linku powyżej znajdziesz na dole osobny dział gdzie jest wiele informacji na ten temat. Przy okazji zerknij na płytę główną swojego komputera gdzie zobaczysz, że przy każdym scalaku jest co najmniej 1 kondensator filtrujący jego zasilanie, a czasami jest ich kilka.

    Ale na początek nie czytając niczego dodaj po prostu kondensatory filtrujące (100nF) tuż przy odpowiednich pinach mikrokontrolera i LCD.
    Możesz je dolutować od spodu płytki.


    Rezystor 1k na pinie RESET nie będzie wpływał negatywnie na pracę mikrokontrolera, a jedynie może uniemożliwić jego programowanie.

  • #8 10 Lut 2012 13:53
    Arkadiusz G.
    Poziom 8  

    Ok ;) Na pewno to poprawię.

    Weryfikuję tylko co mam zrobić:
    Na LCD podpiąć pin 2 z masą przez kondensator.
    Na mikrokontrolerze:
    Vcc i AVcc podpiąć z masą przez kondensator(dławika nie posiadam, ale nie korzystam z przetwornika)
    Aref do masy przez kondensator (dławika nie posiadam)
    Podłączyć rezystor 10k pod reset

    Dobrze rozumuję? :)

    Człowiek całe życie się uczy... Miałem nadzieję, że jednak podłączenie tego wszystkiego będzie jednak trochę prostsze, ale bez jakiejś grubej książki o kontrolerach sobie na dłuższą metę chyba nie poradzę ;)
    Ale tak jak pisałem: na temat elektroniki, jestem zielony - uważam za sukces sam fakt, że mi to w ogóle działa ;)

  • #10 10 Lut 2012 14:16
    Arkadiusz G.
    Poziom 8  

    Podpiąłem te trzy kondensatorki, niestety problem nadal występuje.

    Może faktycznie gdzieś to się wykrzacza przy programowaniu z winy rezystora (choć sobie tego nie wyobrażam...). Tylko dla czego zaraz po, układ działa( nawet przez godzinę), ale po wypięciu zasilania szlag go trafia?

    Sprawdziłem wcześniej jeszcze, czy ten problem występuje przy samej bibliotece (kod z tej strony którą podałem w pierwszym poście). I wtedy także się wykrzacza.

    Dodatkowo wymieniłem kontroler -> także ten sam efekt.

    Zauważyłem jeszcze inną rzecz: program który wgrywam nie zawsze zaskakuje. Efekt jest taki sam, jak przy wypięciu zasilania. Na ekranie krzaczki, albo zupełna pustka. Nie zdarza mi się to zawsze, tylko co któryś raz. Może strzelony jest LCD? Bo w sumie go dostałem w spadku...

    edit:
    Konkretnie jak wygląda 'krzaczenie się": Przez czas ustawiony w programie przed inicjalizacją ekranu wyświetlane są czarne kwadraty w pierwszej linii. Następnie jest funkcja inicjalizacji na której nic się nie wyświetla - i tak już do końca.

  • #11 10 Lut 2012 14:30
    dondu
    Moderator Mikrokontrolery Projektowanie

    Czy masz włączoną weryfikację zapisu programu? Otrzymujesz komunikat, że zapis jest OK?
    Jakie masz dostępne przyrządy pomiarowe?

    EDIT:

    Arkadiusz G. napisał:
    Konkretnie jak wygląda 'krzaczenie się": Przez czas ustawiony w programie przed inicjalizacją ekranu wyświetlane są czarne kwadraty w pierwszej linii. Następnie jest funkcja inicjalizacji na której nic się nie wyświetla - i tak już do końca.

    Wygląda na to, że komunikacja jest OK.


    EDIT 2:
    Nieco pozmieniałem - nie znam tej biblioteki więc sprawdź:
    Kod: c
    Zaloguj się, aby zobaczyć kod

  • #12 10 Lut 2012 14:50
    Arkadiusz G.
    Poziom 8  

    Przy programowaniu uC mam takie informacje:

    Code:
    > "make.exe" program
    
    avrdude -p atmega8 -P usb -c usbasp    -U flash:w:lcd4.hex

    avrdude: AVR device initialized and ready to accept instructions

    Reading | ################################################## | 100% 0.02s

    avrdude: Device signature = 0x1e9307
    avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed
             To disable this feature, specify the -D option.
    avrdude: erasing chip
    avrdude: reading input file "lcd4.hex"
    avrdude: input file lcd4.hex auto detected as Intel Hex
    avrdude: writing flash (2090 bytes):

    Writing | ################################################## | 100% 16.65s

    avrdude: 2090 bytes of flash written
    avrdude: verifying flash memory against lcd4.hex:
    avrdude: load data flash data from input file lcd4.hex:
    avrdude: input file lcd4.hex auto detected as Intel Hex
    avrdude: input file lcd4.hex contains 2090 bytes
    avrdude: reading on-chip flash data:

    Reading | ################################################## | 100% 10.96s

    avrdude: verifying ...
    avrdude: 2090 bytes of flash verified

    avrdude done.  Thank you.


    > Process Exit Code: 0
    > Time Taken: 00:28


    Programuje się dobrze. Przy kompilacji mam jedynie warning, że nie ma prototypu funkcji zegar();

    Z przyrządów pomiarowych mam dostępny jedynie miernik uniwersalny z wyższej półki.
    Pomierzyłem napięcia na nóżkach i jeśli chodzi o napięcia jakie wyświetlacz dostaje, to są identyczne czy wyświetlacz działa, czy nie.

    Wprowadziłem pętlę główną do programu - dalej bez zmian. Później zweryfikuję tą bibliotekę, bo wygląda na to, że to jej wina.

    Edit:
    Wpadłem na pomysł, żeby poszukać innej biblioteki i się udało. Okazuje się, że biblioteka ze strony:
    http://extremeelectronics.co.in/avr-tutorials/using-lcd-module-with-avrs/
    nadaje się idealnie. I działa prawidłowo. Szkoda tylko, że wcześniej nie wpadłem na to, aby sprawdzić inną... Minusem tej jest jak dla mnie tylko fakt, że przy wyświetlaniu pokazywany jest także kursor w postaci migającego pola lub podkreślenia... Ale nie miałem czasu na większą analizę kodu, więc nie sprawdziłem jak to można wyeliminować... ;)

 Szukaj w ofercie
Zamknij 
Wyszukaj w ofercie 200 tys. produktów TME