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.

wyświetlacz 7 segmentowy - nie działa wyświetlanie liczb jedna po drugiej

26 Sie 2014 17:38 1788 28
  • #1 26 Sie 2014 17:38
    2443453
    Użytkownik usunął konto  
  • #3 26 Sie 2014 19:05
    2443453
    Użytkownik usunął konto  
  • #4 26 Sie 2014 19:11
    dondu
    Moderator Mikrokontrolery Projektowanie

    Prawie dobrze lecz błędne jest to:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    powinno być:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    jeżeli to ma zerować wybrane bity.


    Z innej beczki:

    1. zmienna dp jest typu int. Wystarczy by była unsigned char.

    2. Skoro zmienna dp może być tylko 1 (TRUE) lub 0 (FALSE), to po co sprwadzasz warunek w ten sposób:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    wystarczy tak:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #5 26 Sie 2014 19:14
    BlueDraco
    Specjalista - Mikrokontrolery

    Wystarczy:
    if (dp) ...

    0
  • #6 26 Sie 2014 19:15
    dondu
    Moderator Mikrokontrolery Projektowanie

    Słusznie :)
    No i komentuj swój kod byśmy wiedzieli, co chcesz w danej linii zrobić.

    A tak w ogóle, dlaczego ciągle zmieniasz piny z wejść na wyjścia i odwrotnie?
    Nie pokazujesz schematu więc nie możemy tego przeanalizować, ale jeżeli nie ma potrzeby to ustaw je jako wyjścia, a diody zapalaj poprzez PORT.

    0
  • #7 26 Sie 2014 20:44
    2443453
    Użytkownik usunął konto  
  • #9 26 Sie 2014 21:25
    2443453
    Użytkownik usunął konto  
  • #10 26 Sie 2014 22:29
    BlueDraco
    Specjalista - Mikrokontrolery

    Może, skoro uparłeś się, żeby ten kod był 10-krotnie dłuższy, niż potrzeba.

    Na początek mógłbyś zauważyć, że sekwencja zaświecająca kropkę nie zależy od wyświetlanej cyfry, więc można ją wyrzucić poza switch.
    Potem łatwo spostrzec, że dla każdej cyfry robisz dokładnie to samo, tylko używając różnych wartości danych - wystarczy je wrzucić w tablicę i cały switch staje się zbędny. Procedura (która jest całkowicie zbędna) przyjmie wtedy postać:

    PORTB |= ...;
    PORTD |= ...
    PORTB &= pb[digit];
    PORTD &= pd[digit];
    if (dp) PORTD &= ~(1 << DP);

    - czyli mamy 5 linii kodu zamiast 80.

    0
  • #11 26 Sie 2014 22:48
    2443453
    Użytkownik usunął konto  
  • #12 27 Sie 2014 15:20
    2443453
    Użytkownik usunął konto  
  • #13 27 Sie 2014 17:31
    el2010tmp
    Poziom 25  

    Jeśli na tych wyjściach masz tylko wyświetlacz to ustaw DDR-y na początku programu.
    Natomiast tablice stałych lepiej zdefiniować globalnie a najlepiej w pamięci flash, zaoszczędzisz trochę RAM-u.
    Znak ~ musiałeś dodać przed pb[digit] i pd[digit] ponieważ nie dodałeś go w tablicy.

    0
  • #14 27 Sie 2014 20:22
    2443453
    Użytkownik usunął konto  
  • #15 27 Sie 2014 23:13
    BlueDraco
    Specjalista - Mikrokontrolery

    Będzie - musisz dać rezystory do katod.

    0
  • #16 29 Sie 2014 21:14
    2443453
    Użytkownik usunął konto  
  • #17 29 Sie 2014 21:42
    el2010tmp
    Poziom 25  

    goldcap napisał:
    TIMSK0 |= (1<<TOIE0);

    Skoro załączasz przerwanie po przepełnieniu to użyj właściwego wektora:
    ISR(TIMER0_OVF_vect)
    Poza tym w przerwaniu wyświetlaj po jednej cyfrze.

    0
  • #18 29 Sie 2014 23:25
    2443453
    Użytkownik usunął konto  
  • #20 31 Sie 2014 09:07
    BlueDraco
    Specjalista - Mikrokontrolery

    Zmienne d i d1 nie mają jawnie nadanych wartości początkowych, więc są one losowe.

    0
  • #21 31 Sie 2014 09:28
    zumek
    Poziom 39  

    BlueDraco napisał:
    Zmienne d i d1 nie mają jawnie nadanych wartości początkowych, więc są one losowe.


    Pętle while(), wyglądają dużo gorzej :cry:

    0
  • #22 31 Sie 2014 18:20
    2443453
    Użytkownik usunął konto  
  • #23 15 Wrz 2014 20:38
    2443453
    Użytkownik usunął konto  
  • #24 15 Wrz 2014 21:00
    BlueDraco
    Specjalista - Mikrokontrolery

    To znaczy, że kod działa zgodnie z tym, jak jest napisany - popatrz, jakie wartości przyjmuje zmienna w.

    0
  • #25 15 Wrz 2014 21:33
    2443453
    Użytkownik usunął konto  
  • #26 15 Wrz 2014 21:59
    zumek
    Poziom 39  

    goldcap napisał:
    Nie czaje tego...

    No to prześledź krok po kroku całe przerwanie dla w=4.

    0
  • #27 18 Wrz 2014 19:23
    2443453
    Użytkownik usunął konto  
  • #28 18 Wrz 2014 20:37
    zumek
    Poziom 39  

    goldcap napisał:
    Zrobiłem coś takiego:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    I nadal nie działa.

    Jesteś mistrzem w preparowaniu zbędnego kodu :D
    Spróbuj zastosować tablice zamiast switch/case .
    Poczytaj również, o 'zaklęciu' volatile.
    Kilka drobnych poprawek.
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Tobie pozostawiam ...'stablicowanie' cyfr :|

    0
  • #29 19 Wrz 2014 21:51
    2443453
    Użytkownik usunął konto