Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[M32][C] Zegarek LCD(w budowie) Prośba o krytykę.

Antystatyczny 19 Lip 2012 20:19 1646 20
  • #1 19 Lip 2012 20:19
    Antystatyczny
    Poziom 16  

    Witam. Napisałem wstęp do zegarka LCD. Obecnie program wyświetla sekundy w postaci binarnej na porcie A. Proszę o zerknięcie w program pod kątem ewentualnego uproszczenia/zmniejszenia objętości kodu.
    Pozdrawiam.

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0 20
  • #2 19 Lip 2012 20:38
    stanleysts
    Poziom 27  

    bez przesady z takim kodem do uproszczenia jak on ma kilka linijek...
    napisz całość to potem można myśleć

    0
  • #3 19 Lip 2012 20:48
    LordBlick
    VIP Zasłużony dla elektroda

    Załóżmy, że procesor będzie tak zajęty, że nie obsłuży stanu

    Kod: C
    Zaloguj się, aby zobaczyć kod
    i bedzie 61 sekund... Można sprawdzać, czy większe niż 59 i odejmować 60, ale jest jeszcze jedna możliwość - przerwanie nastąpi dokładne tuz za spełnieniem warunku tego if-a i zgubimy sekundę... Najlepiej przenieść ta imprezkę w tym przypadku do przerwania, bo nie zajmuje ona zbyt dużo czasu procesora.
    volatile musi być zawsze gdy dzielisz dane pomiędzy procedurami zwykłymi i obsługą przerwania.

    0
  • #4 19 Lip 2012 21:17
    Antystatyczny
    Poziom 16  

    Zastanawiałem się nad tym i na razie podjąłem decyzję o pozostawieniu tego tak jak jaest. Oczywiście wiem, do czego zmierzasz, Lordblick. Jeśli będę miał jakiś problem, zmienie == na >=. Reszta kodu wygląda ok? Obecnie piszę naliczanie godzin i minut. Obsługę LCD zostawiam na koniec, bo to będzie dla mnie najtrudniejsze.

    Dodano po 1 [minuty]:

    O, albo zrobię tak, jak sugerujesz. Naliczanie i obsługa sekund w przerwaniu. Jeszcze to przetestuję i ewentualnie skoryguję. Cenna uwaga, dzięki!

    Dodano po 16 [minuty]:

    Obecny kod wygląda następująco:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Obsługa sekund nie jest jeszcze w przerwaniu. Godziny i minuty są rozbite na jedności i dzięsiątki, bo najpierw wyświetlę to na wyświetlaczu LED, który bedę multipleksował z częstotliwością 488 Hz przy pomocy przerwania od timer0.
    Po testach rozpocznę pisanie procedury obsługi LCD (w tym miejscu będę miał kilka pytań)

    0
  • #5 19 Lip 2012 21:36
    tmf
    Moderator Mikrokontrolery Projektowanie

    Trochę dziwny ten kod. Sekundy masz jako liczbę binarną, minuty i godziny masz w BCD, w dodatku rozpakowanym. Trochę to niewygodne. No i jeśli minuty i godziny mogą być w spakowanym BCD to robi się normalne dodawanie + korekcję z binarnego na BCD. Wtedy te wszystkie ify są niepotrzebne. No i wygodniej jest wykorzystać EPOCH i potem rozbić konwersję z EPOCH na czas w dowolnym formacie (odpowiednik funkcji z nagłówka time.h). Wtedy można najlepiej wykorzystać zasoby MCU, np. timera, co ma znaczenie jeśli układ działa z baterii. I kod w przyszłości łatwiej wykorzystać w innym systemie, np. dysponującym 32-bitowym timerem.

    0
  • #6 19 Lip 2012 21:47
    Antystatyczny
    Poziom 16  

    Wszystkie zmienne zadeklarowałem jako jednobajtowe, więc nie wiem, dlaczego nagle są w kodzie BCD. Kodu BCD w ogóle nie zamierzam uzywać, bo wystawię na port sterujący segmentami odpowiednie liczby właczające odpowiednie piny/segmenty aktualnie wyświetlanej cyfry. Jestem BARDZO początkujący i nie rozumiem np. co to znaczy EPOCH.
    Można ciut bardziej łopatologicznie?

    0
  • #8 19 Lip 2012 21:56
    Antystatyczny
    Poziom 16  

    Całe obliczanie czasu w przerwaniu? Czytałem tu, że obsługa przerwania ma być jak najkrótsza. Na pewno mam całe obliczanie wpakować w przerwanie timera 2?

    0
  • #10 19 Lip 2012 22:02
    Antystatyczny
    Poziom 16  

    RTC zastosuję w projekcie prędkościomierza rowerowego z wyświetlaniem czasu i daty. Dziekuje za cenną podpowiedź.

    Dodano po 1 [minuty]:

    A literkę ź generujemy naciśnięciem klawiszy prawy alt i x :D

    0
  • Pomocny post
    #11 19 Lip 2012 22:12
    LordBlick
    VIP Zasłużony dla elektroda

    Antystatyczny napisał:
    Jestem BARDZO początkujący i nie rozumiem np. co to znaczy EPOCH.
    Żyjemy w czasach, gdy ta informacja jest dostępna na wyciągnięcie kursora myszy...

    0
  • #12 19 Lip 2012 22:21
    Antystatyczny
    Poziom 16  

    Przeczytałem o EPOCH i nie widzę związku z moim programem. Nie widzę, bo pewnie o czymś nie wiem :(

    0
  • #13 19 Lip 2012 22:31
    LordBlick
    VIP Zasłużony dla elektroda

    Ano związku z tym co stworzyłeś, nie ma, ale jak się wczytać, to padła ze strony tmf wzmianka o możliwości użycia tej metody. Tym niemniej nie jesteś na tak zaawansowanym etapie... ;)

    Antystatyczny napisał:
    Całe obliczanie czasu w przerwaniu? Czytałem tu, że obsługa przerwania ma być jak najkrótsza. Na pewno mam całe obliczanie wpakować w przerwanie timera 2?
    Nie zauważyłem nic czasochłonnego w tych kilku if-ach, a można minuty i godziny trzymać w jednym bajcie, tak jak sekundy...

    0
  • #15 20 Lip 2012 12:41
    Antystatyczny
    Poziom 16  

    Ok, dzięki za podpowiedzi. Za chwilę zmodyfikuję kod według Waszych wskazówek.

    Dodano po 4 [godziny] 28 [minuty]:

    Teraz mam nastęujący kod:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Zrobiłem jak radzili koledzy. Nie oparłem się o EPOCH, bo nie bardzo widzę sens używania tej metody naliczania czasu w 32 bitowej zmiennej. Mogę ewentualnie "zlepić jedności i dziesiątki" w jeden bajt, a następnie wyłuskiwać z bajtu dane dla poszczególnych cyfr wyświetlacza LED. Wersja LCD będzie miała zadeklarowane zmienne sekunda, minuta i godzina.

    0
  • Pomocny post
    #16 20 Lip 2012 12:55
    LordBlick
    VIP Zasłużony dla elektroda

    Antystatyczny napisał:
    Mogę ewentualnie "zlepić jedności i dziesiątki" w jeden bajt
    Właśnie temu się dziwimy, że tak nie jest, skoro sekundy nie są rozbite... ;)
    Antystatyczny napisał:
    więc nie wiem, dlaczego nagle są w kodzie BCD
    A to akurat wystarczy sobie wpisać w Google, co oznacza "rozpakowany/spakowany BCD" i będziesz wiedział, że jednak kolega wyżej ma rację.

    0
  • #17 20 Lip 2012 19:16
    Antystatyczny
    Poziom 16  

    Mam pewną zagwozdkę:

    Jak kompilator potraktuje tę linię?:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Chodzi mi o to, że nie do końca jestem pewien ile ampersandów mam wpisać. Jeśli kompilator traktuje to jako operację na bitach - wystarczy jeden ampersand, a jeśli na wyrażeniach - muszą być dwa. Program kompiluje się bez błędu zarówno z jednym, jak i z dwoma ampersandami.

    0
  • #18 20 Lip 2012 19:33
    Krauser
    Poziom 26  

    Podwójny - logiczny. Wynikiem godzina1 == 2 jest prawda lub fałsz. W innych przypadkach możesz się naciąć jak będziesz to traktował zamiennie np. 2 & 1 to 0(fałsz), a 2(prawda) && 1(prawda) = prawda. W C prawda jest różna od zera, a fałsz jest równy 0.

    0
  • #19 20 Lip 2012 21:01
    Antystatyczny
    Poziom 16  

    Obecnie program wygląda następująco:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Program, po dodaniu procedury klawisze() nie chce się skompilować. Oto log:
    avr-gcc (WinAVR 20100110) 4.3.3
    Copyright (C) 2008 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions. There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


    Compiling C: przerwanie.c
    avr-gcc -c -mmcu=atmega32 -I. -gdwarf-2 -DF_CPU=16000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=./przerwanie.lst -std=gnu99 -MMD -MP -MF .dep/przerwanie.o.d przerwanie.c -o przerwanie.o
    przerwanie.c: In function 'klawisze':
    przerwanie.c:61: error: expected expression before '}' token
    przerwanie.c: At top level:
    przerwanie.c:62: error: expected '=', ',', ';', 'asm' or '__attribute__' before '--' token
    przerwanie.c:63: error: expected identifier or '(' before '}' token
    przerwanie.c:64: error: expected identifier or '(' before 'return'
    przerwanie.c:65: error: expected identifier or '(' before '}' token
    make.exe: *** [przerwanie.o] Error 1

    > Process Exit Code: 2
    > Time Taken: 00:01

    Sprawdzałem po kilka razy i wydaje mi się, że nigdzie nie zapomniałem nawiasów itd. Macie jakieś sugestie?

    0
  • #20 20 Lip 2012 21:33
    Krauser
    Poziom 26  

    A tymczasem w Eclipse

    [M32][C] Zegarek LCD(w budowie) Prośba o krytykę.

    Za If( !klawisz4 ) masz klamrę odwrotnie.

    0
  • #21 20 Lip 2012 21:34
    zumek
    Poziom 39  

    Antystatyczny napisał:
    .. Macie jakieś sugestie?

    Ja mam taką.
    Weź się chłopie porządnie za naukę, która jest dostępna za darmo i jest na wyciągnięcie (jak już ktoś napisał) myszy np. Wikipedia. Przecież nikt za Ciebie nie będzie poprawiał kropek, przecinków, czy innych znaczków w Twoim kodzie. Jeśli nie potrafisz znaleźć tak prostego błędu jak poniższy, ...
    Kod: c
    Zaloguj się, aby zobaczyć kod

    .. to może weź się lepiej za np. ... coś innego :?:

    Temat zamykam.

    3.1.17. Zabronione jest publikowanie wpisów obniżających ogólny poziom dyskusji, wynikających z lenistwa lub zawierających roszczeniowy charakter wypowiedzi.
    3.1.16. Publikowanie wpisów zawierających pytanie/zgłoszenie problemu, na które udzielono już poprawnej odpowiedzi. Przed publikacją wpisu Użytkownik zobowiązany jest do sprawdzenia za pomocą wyszukiwarki Forum, czy dany problem był już poruszany.

    0