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

ATMEGA88P+DS1337 - Błąd w programie zegarka binarnego, pomoc w debugowaniu

MacFis 18 Sty 2013 15:30 2466 8
REKLAMA
  • #1 11806328
    MacFis
    Poziom 17  
    Witam.
    Zbudowałem naręczny zegarek binarny, próbowałem napisać program, ale coś jest nie tak. Godzina wyświetlana jest na 4 diodach, minuty na 6. Komunikacja z DS1337 portami C4 i C5. Pod INT0 (D2) podpięty switch bez rezystora. Prosiłbym o sprawdzenie i pomoc w rozwiązaniu problemów.
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Na razie nie wykonałem procedury ustawiania godziny. Na początku kodu jest ustawiana. Problem w tym, że mimo podciągnięcia PD.2 reaguje nawet po dotknięciu płytki. Nie wiem czy uC wchodzi w powerdown, diody gasną, gdy dochodzi godzina 2 procek się już nie usypia. Nie wiem czy to nie przypadkiem wina tego INT0.
  • REKLAMA
  • #2 11806503
    BlueDraco
    Specjalista - Mikrokontrolery
    Na początek wyrzuć te dzielenia i po prostu skopiuj wymaskowaną zmienną Mm do portu B. przecież Mm zawiera bity - zera i jedynki, którymi chcesz wysterować diody. Konwersja z liczby binarnej na liczbę binarną przy użyciu dzielenia przez potęgi dwójki po prostu powala.
  • REKLAMA
  • #3 11807424
    MacFis
    Poziom 17  
    No tak tylko jak to później zrobię? Nie byłoby dla mnie problemu gdybym do minut używał tylko portu B. Jednak aby wyświetlić minuty potrzebuje pięciu B i jednego D, do godzin dwóch B i dwóch D. Jak to zrealizować?
  • Pomocny post
    #4 11809420
    BlueDraco
    Specjalista - Mikrokontrolery
    Np. testując bity. W C wyglądałoby to np. tak:

    if (m & 0b0100)
    PORTC |= 1 << PC5;
    else
    PORTC &= ~(1 << PC5);

    W każdym razie test wartości bitu robi się przez AND i nie trzeba w tym celu nic dzielić.
  • REKLAMA
  • Pomocny post
    #6 11846660
    siwy2411
    Poziom 11  
    pozwolę sobie
    BlueDraco napisał:
    if (m & 0b0100)
    //wybieramy 3 bit ze zmiennej m (wynika to z matematyki boolowskiej 1&1=1, 1&0=0 - czyli jeżeli 3 bit jest jedynką, to działanie to zwróci nam 1, jeżeli zerem to zero
    //wartość reszty bitów jest w tym przypadku bez znaczenia (0&1=0,0&0=0)
    PORTC |= 1 << PC5;
    //jeżeli powyższe działanie dało nam jedynkę, to ustawiamy pin 5 portu C na jedynkę
    else
    PORTC &= ~(1 << PC5);
    //analogicznie - jeżeli powyższe działanie dało nam zero, to ustawiamy pin 5 portu C na zero

    co do sposobu ustawiania wyjść(PORTC &= ~(1 << PC5) i PORTC |= 1 << PC5) - ustawianie w ten sposób pozwala zmienić wartość jednego, konkretnego bitu z całego rejestru nie naruszając wartości pozostałych
  • REKLAMA
  • Pomocny post
    #7 11847344
    Fredy
    Poziom 27  
    BlueDraco napisał:
    Np. testując bity. W C wyglądałoby to np. tak:

    if (m & 0b0100)
    PORTC |= 1 << PC5;
    else
    PORTC &= ~(1 << PC5);

    W każdym razie test wartości bitu robi się przez AND i nie trzeba w tym celu nic dzielić.


    tłumaczenie tego na bascom jest trywialne:

    if m=4 then Portc.5=1 else Portc.5=0
  • Pomocny post
    #8 11847963
    BlueDraco
    Specjalista - Mikrokontrolery
    Fredy - coś przekombinowałeś. Nie znam składni Bascom, ale to będzie coś raczej jak:
    if (m and 4) = 4 then

    Może wystarczy w warunku "m and 4" - nie wiem, jak Bascom ewaluuje wartości Boolowskie i nie chcę tego wiedzieć.

    A teraz napisz to dla potomnych w poprawnej składni Bascom... Z góry dziękuję.
  • #9 11850581
    Fredy
    Poziom 27  
    BlueDraco napisał:
    Nie znam składni Bascom, ale to będzie coś raczej jak:
    if (m and 4) = 4 then
    - dokładnie tak, pomyliłem się.
    Można chyba jeszcze tak to zrobić :
    if (m.3=4) then
REKLAMA