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.

[BASCOM] Attiny2313 nie działają przyciski

kaka0204 27 Paź 2013 15:07 1419 15
  • #1 27 Paź 2013 15:07
    kaka0204
    Poziom 28  

    Witam.
    Uczę się bascoma. Napisałem kod, który liczy do pewnej liczby z częstotliwością 1Hz. Niby wszystko jest ok, ale nie do końca. Męczę się z tym już kilka godzin. Mianowicie nie działają przyciski. Do PORTD.0 i PORTD.1 są podłączone 2 przyciski, które zwierają dany port do masy. Funkcja, która po naciśnięciu jednego z przycisku powinna inkrementować i dekrementować zmienną Minuty., wygląda tak.


    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod



    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Niestety po naciśnięciu przycisku nic się nie dzieje. Tak wygląda cały kod

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Co robię nie tak?
    Pozdrawiam.

    0 15
  • Pomocny post
    #2 27 Paź 2013 15:25
    PROXAQQ
    Poziom 13  

    Sprawdzasz stan wysoki, a piszesz, że zwierasz wejścia przyciskami do masy. Zamień "1" na "0".
    W aliasach zamień Portd na Pind.

    0
  • Pomocny post
    #3 27 Paź 2013 15:27
    BlueDraco
    Specjalista - Mikrokontrolery

    Czy włączyłeś podciąganie linii portów, do których są podłączone przyciski?

    Obsługa przycisków w programie też jest "nie tak". Naciśnięcie przycisku powoduje, że na wejściu będziesz miał 0, nie 1. To, co dalej robisz w programie, też jest średnio sensowne, ale to zauważysz dopiero wtedy, kiedy wykryjesz poprawnie naciśnięcie przycisku.

    0
  • #4 27 Paź 2013 15:44
    kaka0204
    Poziom 28  

    PROXAQQ napisał:
    Sprawdzasz stan wysoki, a piszesz, że zwierasz wejścia przyciskami do masy. Zamień "1" na "0".
    W aliasach zamień Portd na Pind.

    Czemu dałem 1 zamiast 0? Ale pomyłka. Portd zmienione na Pind, pull-up właczone. Działa :)
    Dzięki bardzo, ale przy naciskaniu przycisku ekran bardzo przygasa, można ten defekt jakoś usunąć?
    Pozdrawiam.

    0
  • Pomocny post
    #5 27 Paź 2013 15:46
    BlueDraco
    Specjalista - Mikrokontrolery

    Tak, ustaw linie portu jako wejścia. Zapewne przygasa z powodu zbyt dużego prądu wyjściowego uC.

    0
  • #6 27 Paź 2013 16:14
    kaka0204
    Poziom 28  

    BlueDraco napisał:
    Tak, ustaw linie portu jako wejścia. Zapewne przygasa z powodu zbyt dużego prądu wyjściowego uC.

    może źle się wyraziłem. Ekran przy naciśnięciu przycisku mignie i na 100% nie jest to spowodowanie przez pobieranie zbyt dużego prądu z uC.
    Ps. ustawienie linii portb jako wejścia, także nie rozwiązuje problemu = ekran dalej miga w takt inkrementacji zmiennej.

    0
  • Pomocny post
    #7 27 Paź 2013 16:20
    PROXAQQ
    Poziom 13  

    Ma czym wyświetlasz dane? Pokaż program obsługi wyświetlania.

    0
  • #8 27 Paź 2013 16:25
    kaka0204
    Poziom 28  

    Na wyświetlaczu LED. Oto cały kod:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    0
  • Pomocny post
    #9 27 Paź 2013 16:40
    PROXAQQ
    Poziom 13  

    Podejrzewam, że te Waitms w obsłudze przycisków blokują wyświetlanie. Spróbuj je do testu usunąć. Oczywiście przyciski nie będą wtedy działać poprawnie, ale sprawdzisz wyświetlanie.
    Obsługa wyświetlania powinna być przeniesiona do obsługi przerwania, ale to już większa przeróbka programu. To przygasanie tak bardzo przeszkadza?

    0
  • #10 27 Paź 2013 16:51
    kaka0204
    Poziom 28  

    PROXAQQ napisał:
    Podejrzewam, że te Waitms w obsłudze przycisków blokują wyświetlanie. Spróbuj je do testu usunąć.

    Tak po usunięciu waitms ekran już nie miga.
    PROXAQQ napisał:
    To przygasanie tak bardzo przeszkadza?

    Niby nie, ale wolałbym gdyby jego nie było :)

    0
  • #11 27 Paź 2013 16:59
    PROXAQQ
    Poziom 13  

    No to musisz tak napisać program, żeby nie używać funkcji Waitms.

    0
  • #12 27 Paź 2013 17:08
    kaka0204
    Poziom 28  

    Hmm. Nie wiem jak. Bascoma uczę się od dopiero 2 dni. Może kolega podać jakiś przykład?

    0
  • Pomocny post
    #13 27 Paź 2013 17:44
    BlueDraco
    Specjalista - Mikrokontrolery

    Jeśli dopiero dwa dni, to nie stracisz dużo, jeśli rzucisz go w kąt i zaczniesz się uczyć C. Gorąco polecam.

    0
  • #14 27 Paź 2013 18:30
    kaka0204
    Poziom 28  

    BlueDraco napisał:
    Jeśli dopiero dwa dni, to nie stracisz dużo, jeśli rzucisz go w kąt i zaczniesz się uczyć C. Gorąco polecam.

    C się uczyłem, ale w ogóle mi nie wchodzi, dlatego spróbowałem swoich sił w bascomie i sądzę, że przy nim już zostanę.

    0
  • Pomocny post
    #15 27 Paź 2013 19:58
    Wojtek75
    Poziom 23  

    Poczytaj sobie w helpie o "debounce".

    0
  • Pomocny post
    #16 27 Paź 2013 21:34
    emarcus
    Poziom 34  

    kaka0204 napisał:
    Hmm. Nie wiem jak. Bascoma uczę się od dopiero 2 dni. Może kolega podać jakiś przykład?


    1. Do rozpoznania naciśniętego przycisku zastosuj "DEBOUNCE"
    2. Do pomiaru czasu w multiplexing zastosuj dowolnyTimer (może byc timer1, skoro już zacząłes go używac). Dla ławości rachunków zastosuj podstawowy czas pomiaru 4 mSec.
    Co 4 mS zrobisz multiplexing cyfr wyświetlacza i incrementuj zmienną np. 'Z' . Gdy zmienna 'Z' osiągnie 250, masz wtedy 1 Sec; zerujesz 'Z' i incrementujesz sekundy.
    W ten sposób wykorzystujesz ten sam timer do naliczania sekund jak i multiplexing.
    W obecnym programie, który podałeś, dla m/plexing cyfr czas liczy processor co jest zupełnie bez sensu mając do dyspozycji 2 timery.
    Musisz zrozumiec że AVR to "Single Task" uControler (NIE wykonuje więcej niz 1 czynnośc w tymsamym czasie) i jeżeli każesz mu odliczyc kilkadziesiąt msekund aby sprawdzic naciśnięcie przycisku to oczywiście nie będzie w stanie obsłużyc wyświetlacza co 5 msec. Przy okazji stosuj pomocnicze flagi jezeli zachodzi potrzeba.

    e marcus

    0