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.

ATMEGA2560 [C] - Dziwne zachowanie pinów

Super_technik 01 Sty 2017 15:56 612 4
  • #1 01 Sty 2017 15:56
    Super_technik
    Poziom 9  

    Witam
    Korzystam z płytki MEGA2560 przeznaczonej do Arduino. Do niej jest podłączona płytka RAMPS oraz wyświetlacz graficzny.
    To oczywiście cała elektronika do drukarki 3d jednak nie o to chodzi. Rozpocząłem zabawę z tymi płytkami i chciałem po testować bootloader z karty SD. Ten działa poprawnie jednak za każdym razem a chciałem aby próbował programować ATmegę tylko gdy jest włożona karta SD oraz naciśnięty przycisk enkodera. Sprawa wydaje się bardzo łatwa jednak coś to nie chce działać jak należy.

    Tak wygląda cały kod.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Nie ma tu nic skomplikowanego. Na początku są definicje, później ustawianie pinów i portów, a dalej nieskończona pętla sprawdzająca dwa piny. Jeden jest od detekcji karty SD a drugi od przycisku enkodera.
    Dwie diody są podpięte do pinów mikrokontrolera oraz plusa zasilania. Naciśnięcie przycisku lub włożenie karty SD powinno wyłączyć diodę. Tak niestety nie jest.
    Zacząłem sprawdzać kod na symulatorze ATMEL Studio 7 i odkryłem dziwną rzecz. Jeśli pin od czerwonej diody to PORTF3 to w chwili ustawienia go także ustawia się PIN F3. Na innych pinach takie coś nie występuje.
    Ktoś zapyta co to ma do rzeczy. Nie wiem czy ma ale w realu diody albo w ogóle nie świecą albo zbliżanie dłoni powoduje ich zaświecanie. Zaraz będzie że jest jakieś uszkodzenie w elektronice. Jakoś nie za bardzo. Marlin to jedno z wielu oprogramowań do drukarek 3d i tu wszystko działa jak należy.
    Nie wiem czemu tak jest że nawet na symulatorze są takie dziwne rzeczy.

    0 4
  • #2 01 Sty 2017 16:37
    el2010tmp
    Poziom 25  

    A co to takiego?

    Super_technik napisał:
    # define LED_RED _BV(3)


    Makro _BV(x) zwraca wartość pinu a Ty chcesz zdefiniować jego numer. Wystarczy więc po prostu:
    #define LED_RED 3
    Podobnie w pozostałych przypadkach.

    0
  • Pomocny post
    #3 01 Sty 2017 18:16
    tmf
    Moderator Mikrokontrolery Projektowanie

    el2010tmp napisał:
    A co to takiego?
    Super_technik napisał:
    # define LED_RED _BV(3)


    Makro _BV(x) zwraca wartość pinu a Ty chcesz zdefiniować jego numer. Wystarczy więc po prostu:
    #define LED_RED 3
    Podobnie w pozostałych przypadkach.


    Przecież zastosowanie tam _BV jest całkowicie poprawne. Potrzebuje maskę bitową do funkcji sterujących LEDami, a nie nr pinu.

    1
  • Pomocny post
    #4 01 Sty 2017 21:32
    Eagle
    Poziom 23  

    Cytat:
    albo zbliżanie dłoni powoduje ich zaświecanie


    To jedynie wskazuje na pin będący w stanie wysokiej impedancji. Poprawnie załączasz pull up, więc zjawisko nie powinno występować, chyba że jest tam dodatkowy bufor w sensie bramki, której wejście jest nie spolaryzowane. Napisz coś więcej o pinie z którego czytasz stan karty.

    Cytat:
    Jeśli pin od czerwonej diody to PORTF3 to w chwili ustawienia go także ustawia się PIN F3.


    To poprawne zachowanie, gdy wystawisz wartość na wyjście, to możesz tą wartość odczytać z bufora wejściowego.

    1
  • #5 01 Sty 2017 22:05
    Super_technik
    Poziom 9  

    Eagle napisał:
    gdy wystawisz wartość na wyjście, to możesz tą wartość odczytać z bufora wejściowego.

    To dobrze bo już nie miałem pewności.
    Eagle napisał:
    To jedynie wskazuje na pin będący w stanie wysokiej impedancji. Poprawnie załączasz pull up, więc zjawisko nie powinno występować

    Jednak występuje. Pin jest połączony bezpośrednio.


    --------------------------------------------------------------------------------
    Po poprawce działa jak trzeba.
    Kod: c
    Zaloguj się, aby zobaczyć kod

    0