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] [ATmega8][C] - Wrażliwość wejścia PD6 na zakłócenia przy dotyku kabla

Vister26 08 Cze 2014 22:29 1695 8
REKLAMA
  • #1 13690936
    Vister26
    Poziom 8  
    Posty: 27
    Napisałem taki oto prosty program.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Z założenia wynika, że po zwarciu PD6 do GND powinien zmieniać się stan na PD2. Rzeczywiście tu jest OK. Ale problem jest w tym, że aby przełączyć stan diody wystarczy, że dotknę aluminiową końcówką kabelka(połączeniowego) do PD6. Wtedy dioda również zmienia stan. Co ciekawe kiedy dotykam palcem to procesor nie reaguje. W czym może być problem?
  • REKLAMA
  • #2 13690993
    Fredy
    Poziom 27  
    Posty: 915
    Pomógł: 117
    Ocena: 28
    Musisz włączyć podciągnięcie wejścia.
    No i dodatkowo zrób jakiś debouncing, albo daj opóźnienia bo ta pętla pędzi ci kilka milionów razy na sekundę.
    Ogólnie aby zadziałało dodaj rezystor zewnętrzny na wejście np 10k, albo użyj wewnętrznego przez wpisanie jedynki na PIN czyli PIND|= KEY.
  • REKLAMA
  • #3 13691011
    Kuzyn
    Poziom 17  
    Posty: 237
    Pomógł: 21
    Ocena: 64
    Nie ustaliłeś kierunku pinu KEY
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Oraz określ jakiś stan początkowy na pinie LED. Np.:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Fredy napisał:

    Ogólnie aby zadziałało dodaj rezystor zewnętrzny na wejście np 10k, albo użyj wewnętrznego przez wpisanie jedynki na PIN czyli PIND|= KEY.

    Jesteś pewien, że czegoś nie pokręciłeś? Zamiast PIND powinno być PORTD i to już kolega ma.
  • #4 13691096
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    Kuzyn napisał:
    Nie ustaliłeś kierunku pinu KEY
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Więc linia ta jest ustawiona jako wejście - POPRAWNIE - nie ma potrzeby nic zmieniać, ta instrukcja jest zbędna.

    Kuzyn napisał:
    Oraz określ jakiś stan początkowy na pinie LED. Np.:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Stan jest określony i nie ma potrzeby określać go powtórnie - jest to 0 i jeśli tak ma być - instrukcja jest zbędna.
  • #5 13691111
    Vister26
    Poziom 8  
    Posty: 27
    Fredy napisał:
    Musisz włączyć podciągnięcie wejścia.

    Nic z tego nie rozumiem. Jest jakaś dokumentacja do tego całego avr-gcc? Bo przeszukuje i czytam te wszystkie "kursy", a nawet testowe programy w nich zawarte nie działają.

    @Edit
    Czyli w końcu co trzeba zmienić, żeby zadziałało?
  • REKLAMA
  • #6 13691537
    dziechu
    Poziom 27  
    Posty: 1609
    Pomógł: 27
    Ocena: 71
    Poczytaj nie kursy C, ale dokumentację procesora.

    Dodano po 2 [minuty]:

    Rezystancja podciągania jest dość duża i zakłócenia podczas dotykania pinu metalowymi przedmiotami może wymuszać przypadkowe stany. Dolutuj opornik, np. 1k miedzy pin KEY a + zasilania procesora.
  • REKLAMA
  • #8 13692693
    Vister26
    Poziom 8  
    Posty: 27
    @dziechu Ja to robię na płytce stykowej. Dodałem tam gdzie mówisz rezystor 10k. Dodatkowo dodałem kondensator 100nF między GND i pin KEY (ma zmniejszać ilość błędów i rzekome drgania styków). Teraz działa jak marzenie. Cała filozofia: schemat by mirekk36
    Teraz tylko ciekawi mnie jak wewnętrznie podciągać linię do VCC. Bo te sposoby z neta mimo wszystko wymagają dodania zewnętrznie tych dwóch elementów.
  • #9 13692831
    dondu
    VIP Zasłużony dla elektroda
    Posty: 13906
    Pomógł: 1292
    Ocena: 809
    Fredy napisał:
    Ogólnie aby zadziałało dodaj rezystor zewnętrzny na wejście np 10k, albo użyj wewnętrznego przez wpisanie jedynki na PIN czyli PIND|= KEY.

    Po pierwsze nie PIND tylko PORTD, po drugie autor już to zrobił, czyli włączył wewnętrzny rezystor pull-up:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    ... o czym autor nie ma pojęcia:

    Vister26 napisał:
    Teraz tylko ciekawi mnie jak wewnętrznie podciągać linię do VCC. Bo te sposoby z neta mimo wszystko wymagają dodania zewnętrznie tych dwóch elementów.

    bo zamiast skorzystać ze wskazanego linku i zawartego tam kursu AVR, woli pytać na forum.

    Vister26 napisał:
    Dodałem tam gdzie mówisz rezystor 10k. Dodatkowo dodałem kondensator 100nF między GND i pin KEY (ma zmniejszać ilość błędów i rzekome drgania styków). Teraz działa jak marzenie. Cała filozofia: schemat by mirekk36

    a ta filozofia, to rzeczywiście "filozofia" człowieka nie posiadającego wykształcenia elektronicznego i świadomie narażającego początkujących na problemy:





    Zacznij więc czytać materiały, które Ci wskazałem - poświęć na to czas, a zaczniesz iść do przodu szybciej i skuteczniej, a zrozumiesz nie tylko programowanie, ale także zjawiska fizyczne i elektronikę.

Podsumowanie tematu

✨ W dyskusji poruszono problem wrażliwości wejścia PD6 mikrokontrolera ATmega8 na zakłócenia przy dotyku kabla. Użytkownik zauważył, że dioda LED podłączona do PD2 zmienia stan nie tylko przy zwarciu PD6 do GND, ale także przy dotykaniu metalowym przedmiotem. Uczestnicy forum zasugerowali włączenie podciągania wejścia oraz dodanie rezystora pull-up (np. 10k) i kondensatora (100nF) w celu zredukowania zakłóceń. Wskazano również na konieczność debouncingu oraz poprawności użycia rejestrów PORTD i PIND. Użytkownik zastosował zalecane zmiany, co poprawiło działanie układu.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA