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

[Atmega8A][C] - rezysory pullup - niedziałające przyciski

Dople 08 Mar 2013 13:29 1464 3
REKLAMA
  • #1 12032486
    Dople
    Poziom 19  
    Mój problem wygląda następująco:
    Podłączyłem poprzez przycisk wejście (podciągnięte wewnętrznymi rezystorami) mikrokontrolera z masą. Za jego pomocą planowałem po prostu sterować zapalaniem się diody, która jest podłączona do wyjścia.
    Niestety uC nie reaguje na zmiany w żaden widoczny sposób, gdy pin do którego podłączyłem przycisk nie jest podłączony zewnętrznym rezystorem do zasilania.

    Kondensatory (ceramiczne 100nF - nie posiadam niestety tantalowych) są pomiędzy Vcc, a GND, AREF i GND, oraz pomiędzy AVcc i GND. Jest także dławik 10uH pomiędzy AVcc i Vcc. RESET oczywiście podciągnięty przez 10kΩ do Vcc.

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


    Gdy nacisnę przycisk dioda świeci "mniej". Po zamianie w switch-u przypadków (naciśnięcie przycisku zapala diodę) wszystko wygląda w porządku, choć dioda nie świeci pełną jasnością.
    Próbowałem pisać kod także z pętlami warunkowymi if.
    Z tego co wyczytałem w "internetach" podciąganie wejścia, na którym jest przycisk do Vcc przez rezystor zewnętrzny nie powinno być potrzebne.
    Taktowanie wewnętrznym kwarcem, fusebity nie ruszane. Sprawdziłem też jak działa na nieużywanym do tej pory mikrokontrolerem (także Atmega8A).
    Używanie delay-ów w różnych miejscach kodu w różnych przypadkach zwykle nic nie zmienia, albo sprawia, że dioda "mryga".
    volatile z przyzwyczajenia wstawiam.

    Przypuszczam, że problem leży w kodzie, choć nie mogę się pozbyć wrażenia, że... wewnętrzne rezystory mają za dużą rezystancję... :))
    Pewnie problem jest banalny, ale zaczynam się powoli frustrować.

    Mam nadzieję, że temat trafił na dobrą tablicę i tu nic nie pomyliłem. ;-)
  • REKLAMA
  • #2 12032536
    charwer
    Poziom 15  
    Cześć.
    Polecę Ci lekturę znajdującą się pod TYM adresem.

    Myśle, że sporo Ci ona wyjaśni.

    Pozdrawiam.
  • REKLAMA
  • Pomocny post
    #3 12032649
    BlueDraco
    Specjalista - Mikrokontrolery
    1. Do których linii i w jaki sposób są podłączone przycisk i dioda? Schemat!

    2. Masz dwa proste błędy - w ATmega rezystory podciągające wejścia włącza się poprzez ustawienie linii portu jako wejścia ORAZ zapis jedynki do rejestru PORTx, czyli:
    DDRB=0x00;
    PORTB=0xFF;

    No i sprawdzanie wciśnięcia przycisku: pojedynczy & zamiast podwójnego!

    3. Nieprawdziwych informacji i błędnych programów pod podanym wyżej adresem czytać nie radzę.
    W obecnej postaci Twojego programu jeszcze nie musisz ignorować drgań styków. Kiedy będziesz musiał, należy to zrobić zupełnie inaczej niż we wzmiankowanym tekście.
  • #4 12033344
    Dople
    Poziom 19  
    Bardzo dziękuję. W zasadzie jednym z problemów był podwójny & zamiast pojedyńczego - ta zmiana sprawiła, że nie musiałem dawać zewnętrznego rezystora między Vcc, a pinem przycisku. Nagle wartość w DDRB (pinu, gdzie był przycisk) zaczęła mieć znaczenie. :)
    Już raz operatory logiczne sprawiły mi problem, ale w mgnienia oku sobie poradziłem - teraz już tak nie było.

    Obecnie zrobiłem układ, w którym jest dioda i dwa przyciski - jeden zapala, natomiast drugi gasi ("zaświeca" i "gasi"? ;) ).

    Z realizacją tego na jednym przycisku chyba sobie poradzę. ;)

    @charwer: trafiłem na to wcześniej, ale dopiero po przeczytaniu posta Bluedraco postanowiłem przetestować jeden z programów: nie działał, mimo, że był "na żywca zerżnięty". Nie dopatruje się przyczyn, mam inne cele na najbliższy czas. :)
REKLAMA