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

Atmega8 UART - problem z przyciskami na liniach PC2-PC5 w BASCOM

donjuan222 30 Gru 2013 04:50 1368 4
REKLAMA
  • #1 13114782
    donjuan222
    Poziom 9  
    Witam
    Próbowałem na zrobić komunikację przez UART (tak i programowy jak i sprzętowy) między mikrokontrolerami Atmega8-16PU (DIP28) i Atmega8A-AU (QFP32). Program jest wzorowany na programie z książki Pawła Borkowskiego AVR&ARM7. W książce interfejs UART jest przedstawiony na przykładzie programu który łączy ze sobą dwa mikrokontrolery. do każdego z nich jest podłączona dioda i przycisk. Naciśnięcie przycisku na pierwszym mikrokontrolerze powoduje zgaszenie diody na drugim i na odwrót. Dioda jest gaszona na czas przycisku. Żeby sobie poćwiczyć zabawę z UARTami spróbowałem dodać kolejne przyciski i diody. Jak się okazało mikrokontroler głupieje gdy w programie istnieją wicej niż dwa przyciski. Co ciekawe, nie może żaden z przycisków być podpięty do wejścia PC2-PC5 (UART jest na PD0, PD1).
    Sprawdzałem analizatorem stanów (SALEAE) co się dzieje. Dopóki naciskam przycisk na lini PC0, PC1 jest wszystko w porządku. Naciśnięcie przycisku z którejkolwiek lini wywołuje dziwne zachowanie na liniach TXD/RXD. Ulegają one zawieszeniu i zapętleniu. Wysyłają cały czas impulsy prostokątne:
    Atmega8 UART - problem z przyciskami na liniach PC2-PC5 w BASCOM
    W obu mikrokontrolerach jest dokładnie taki sam kod.
    Kod programu:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Próbowałem już różnych sposóbów i różnych konfiguracji portów. Zawsze działają maksymalnie dwa przyciski na mikrokontroler.
  • REKLAMA
  • #2 13114880
    alien_audio
    Poziom 21  
    Witam.
    Jeżeli konfigurujesz pin jako wejście to
    używaj instrukcji : Config Pinc.0 = Input
    zamiast : Config Portc.0 = Input

    Jak wykrywasz zmianę stanu przycisku i wysyłasz dane przez RS
    to wstaw małe opóźnienie aby uniknąc drgania styków.
  • REKLAMA
  • #3 13115002
    yokoon
    Poziom 29  
    alien_audio napisał:
    Witam.
    Jeżeli konfigurujesz pin jako wejście to
    używaj instrukcji : Config Pinc.0 = Input
    zamiast : Config Portc.0 = Input

    Jak wykrywasz zmianę stanu przycisku i wysyłasz dane przez RS
    to wstaw małe opóźnienie aby uniknąc drgania styków.


    Witam.

    Myślę, iż kolega się myli.
    Według mnie powinno być tak:

    Config Portc.0 = input
    Portc.0 = 1

    If Pinc.0 = 0 Then
    ........
    Pinx.x używamy przy odczycie stanu danego pinu.
  • REKLAMA
  • #4 13116895
    donjuan222
    Poziom 9  
    Dzięki wielkie - rzeczywiście chodziło o brak opóźnienia. Zasugerowałem się tym co było akurat w tej książce, choć Marcin Wiązania podkreślał konieczność stosowania opóźnień...
    Dzięki wielkie

    A tak z innej beczki - jak rozumiem PORTX.X stosujemy do przypisania wartość do wyprowadzenia, a PINX.X, gdy chcemy odczytać tę wartość?
  • #5 13116993
    tank_driver
    Poziom 17  
    Dokładnie, i lepiej mocno to zapamiętaj gdyż niektóre mikrokontrolery przyjmują n.p. set PINC.1, co powoduje... zmianę stanu tego pinu na przeciwny! Powoduje to niezwykle trudne do wykrycia błedy, szczególnie na początku kariery programisty:)

    Czyli:
    set PINC.1 = pin 1 portu C będzie "1"
    set PINC.1 = pin 1 portu C będzie "0"
    set PINC.1 = pin 1 portu C będzie znów "1" itp.

    A MZ lepsze niż stosowanie opóźnień do eliminacji drgań styków jest używanie stosownych instrukcji, w tym przypadku nazywać będzie się ona "debounce".

    Pozdrawiam,
    TD
REKLAMA