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.

Poprawa programu - mrugające diody

Grymasek 27 Lip 2013 15:27 1374 7
  • #1 27 Lip 2013 15:27
    Grymasek
    Poziom 8  

    Witam,

    napisałem prosty program, który zwyczajnie powoduje mruganie diodami. Wszystko działa zgodnie z oczekiwaniami, ale gdy próbuję wykonać operację "If" to już nie jest tak różowo.

    Code:

    $regfile = "m8adef.dat"                                     'zadeklarowanie użytego procesora
    $crystal = 1000000                                          'zadeklarowanie szybkości wewnętrznego kwarcu



    Config Portb = &B11111111
    Portb = &B11111111
    Config Portd = &B11111001
    Portd = &B11111001






    Do


    Toggle Portb.0
    Waitms 20
    Toggle Portb.1
    Waitms 20
    Toggle Portb.2
    Waitms 20
    Toggle Portb.3
    Waitms 20
    Toggle Portb.0
    Waitms 20
    Toggle Portb.1
    Waitms 20
    Toggle Portb.2
    Waitms 20
    Toggle Portb.3
    Waitms 20

    If Pind.1 = 1 Then Portd.0 = 0
    If Pind.2 = 0 Then Portd.1 = 1


    Loop


    Problem polega na tym, że gdy zwieram pinD.0 lub pind.1 z masą nic się nie dzieje. Dioda jest podłączona do wyjścia D0. Gdzie jest błąd? Korzystam z książki mikrokontrolery dla początkujących.

    Pozdrawiam.

    0 7
  • #2 27 Lip 2013 15:54
    tank_driver
    Poziom 16  

    Ech...

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Dioda PORTD.1, przycisk PORTD.0 (do masy). Działa?

    0
  • #3 28 Lip 2013 15:02
    Grymasek
    Poziom 8  

    Dziękuje bardzo, działa i zrozumiałem już zasadę działania. ;) Jeśli można jeszcze o coś zapytać...

    Ćwiczyłem trochę na powyższym przykładzie i próbowałem wykonać kilka przełączników, jednak działają dosyć... niespodziewanie. kiedy naciśnięty jest przycisk pierwszy można sterować 2-gim, jednak kiedy nie to drugi przycisk w ogóle nie reaguje... Można coś doradzić?

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod
    $regfile = "m8adef.dat"

    $crystal = 1000000

    Config Portb = Output : Set Portb
    Config Pinb.0 = Input : Set Portb.0
    Config Portd = Output : Set Portd
    Config Pind.0 = Input : Set Portd.0
    Config Pind.2 = Input : Set Portd.2

    Do

    If Pind.2 = 0 Then
    Waitms 20
    If Pind.2 = 0 Then
    Portb.2 = 1
    Else
    Portb.2 = 0
    End If
    End If

    If Pinb.0 = 0 Then
    Waitms 20
    If Pinb.0 = 0 Then
    Toggle Portb.1
    Else
    Portb.1 = 0
    End If
    End If

    Loop
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    0
  • #4 28 Lip 2013 20:40
    tank_driver
    Poziom 16  

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Przyjrzyj się jeszcze instrukcji ALIAS aby nie myliły Ci się oznaczenia pinów i portów:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Od teraz zamiast wpisywać Pind.2 w funkcjach / komendach wpisujesz po prostu Przycisk1.

    Pozdrawiam!

    0
  • #5 28 Lip 2013 23:30
    Grymasek
    Poziom 8  

    Super, dzięki! :) Coraz więcej łapię. Z funkcją alias potrenuję jutro. Jest jeszcze jedno. Kiedy wykonuje polecenie "Debounce" z użyciem funkcji "wait" automatycznie cały uC jest zablokowany do czasu wykonania operacji, czyli dopóki np dioda nie mrugnie 4 razy w ciągu 4 sekund nie mogę zmienić stanów przycisków. Aby było to możliwe muszę użyć funkcji "Sub"?

    0
  • #7 29 Lip 2013 09:40
    tank_driver
    Poziom 16  

    I tak - i nie. Sub nie jest funkcją a podprogramem (lub procedurą).

    Podprogram -> wywołujemy go bez przekazywania mu czegokolwiek
    Procedura -> wywołujemy go z przekazaniem mu zmiennej (zmiennych) ale niczego nie zwraca
    Funkcja -> wywołujemy ją z przekazaniem jej zmiennej (zmiennych) i zwraca ona wynik (przydatne n.p. do obliczeń lub zapisujemy do "wynik" potwierdzenie poprawności wykonania operacji od czego może zaleć dalszy ciąg programu).

    Ale im wcześniej nauczysz używać się TIMER-ów tym lepiej dla Ciebie. Tak naprawdę nie jest to nic trudnego, ba, z TIMER-ami jest nawet łatwiej. TIMER-y w rzeczywistości są licznikami (8 lub 16 bitowymi) które, w podstawowej konfiguracji generują sygnały przerwań po przepełnieniu (czyli doliczeniu do wartości maksymalnej - 255 dla TIMER0). Ten sygnał wywołuje podprogram w którym cyklicznie coś robimy (n.p. zmieniamy stan PINU na przeciwny).

    Rzut oka: http://avrhelp.mcselec.com/ CONFIG TIMER0 (TIMER1, TIMER2), chociaż przykłady są dosyć zawiłe. Wieczorem podeślę "łatwiejszy" :)

    EDIT: znalazłem to, łatwiejsze do ogarnięcia na początek (od strony 13) http://www.zstio-elektronika.pl/pliki_t_elektronik/SP-Kurs_bascom15_1.pdf

    EDIT2: Zatem, jeśli już skonfigurujesz TIMER0/1/2 aby generował sygnał przerwania co jakiś tam czas, uP skoczy do podprogramu którego nazwę podasz w konfiguracji tego timera. I co dalej? No powiedzmy że klawisze sprawdzasz DEBOUNCE'm -> skaczesz nim to podprogramu w którym robisz n.p. TOGGLE zezwol_na_mruganie. W popdrogramie obsługi przerwania (które wywoływane jest cyklicznie, w pożądany rytm "mrugania") robisz:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Pozdrawiam!

    0
  • #8 31 Lip 2013 08:29
    Grymasek
    Poziom 8  

    Dzięki, ćwiczę na przykładach z poleconego kursu. Zobaczymy, może coś z tego będzie.

    Dzięki za rady i pozdrawiam!

    0