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

AVR - ATMega32A - Brak reakcji na przyciski, mikrokontroler widzi je jako wciśnięte

trynitor 19 Sty 2017 23:33 927 5
  • #1 16213160
    trynitor
    Poziom 7  
    Witam serdecznie,

    Wykonałem płytkę PCB, której sercem jest ATMega32A. Na płytce znajdują się takie moduły jak:
    - wyświetlacz alfanumeryczny,
    - moduł komunikacyjny USB - FT232RL,
    - tor analogowy przetwarzający sygnał analogowy składający się z dwóch wzmacniaczy i komparatora,
    - dioda kontrolna, monitorująca działanie programu.
    Wszystkie powyższe moduły działają bez zarzutu. Przetestowałem każdy z nich i nie dopatrzyłem się żadnych zastrzeżeń.

    Mam problem z (chyba) najłatwiejszą sprawą - przyciskami (5 szt. zwykłych, prymitywnych microswitchy).
    Mianowicie procesor nie reaguje na zmiany stanów przycisków. Widzi je tak, jakby ciągle były wciśnięte. Sprawdzałem zwarcia/zimne luty w otoczeniu przycisków i na liniach z nimi związanych i wszystko jest OK. Sprawdzałem miernikiem poziomy napięć i też wszystko się zgadza - pin mikrokontrolera do którego podłaczony jest przycisk ma potencjał 5V w sytuacji gdy przycisk jest wyciśnięty i 0V gdy przycisk jest naciśnięty. Zatem od strony hardware microswitchy wszystko wygląda jak najbardziej w porządku.
    Niestety prymitywny program zapalający/gaszący diodę nie działa tak jak powinien (po naciśnięciu przycisku dioda pali się przez 300ms po czym gaśnie, a program czeka na ponowne wciśnięcie przycisku). Program działa tak jakby przycisk był ciągle wciśnięty i ciagle wchodzi w pętlę zapalania diody i gaszenia po czasie 300ms. Sama dioda działa dobrze - testowałem ją przy innej okazji.
    Opisany wyżej program to tylko przykład. Próbowałem obsługiwać przyciski nie tylko z użyciem diody, ale także wyświetlacza alfanumerycznego i efekt ten sam - procesor widzi tak jakby przycisk był ciagle naciśnięty.
    Co wiecej, każdy z porgramów testowałem na innej, zupełnie niezależnej płytce z tym samym mikrokontrolerm (ATMega32A) i wszystko działa jak należy, stąd wniosek że w kodzie programu nie ma błędu powodującego takie dziwne zachowanie procesora.

    Podsumowując.
    Czy macie pomysł gdzie szukać błędu skoro:
    - inne, bardziej skomplikowane moduły na płytce działają,
    - hardware (ścieżki, luty, poziomy napięć) przycisków bez zarzutu,
    - kod programu na innej płytce z tym samym procesorem (ATMega32A) działa,

    Dlaczego zatem, procesor widzi przyciski tak jakby były nieustannie wciśnięte?
    Załaczam kod programu testowego oraz schemat.

    #include <avr/io.h>
    #include <util/delay.h>
    
    int main(void)
    {
    	DDRC |= (1<<PC7);
    	DDRC &= ~(1<<PC4);
    
    	PORTC |= (1<<PC7);
    	PORTC |= (1<<PC4); 
    	
    	while (1) 
    {
    		if (bit_is_clear(PINC, PC4))
    		{
    			_delay_ms(50);
    			PORTC &= ~(1<<PC7);
    			//PORTC |= (1<<PC4);
    			_delay_ms(300);
    			PORTC |= (1<<PC7);
    		}
    }
    }
    
  • #2 16213199
    nolens_volens
    Poziom 15  
    Skoro jest tak jak piszesz, to może "functions that are not supported since WinAVR20050214":
    Link

    W jakim środowisku programujesz?
    Nowy Toolchain, czy zabytkowe WinAVR?
  • #3 16213235
    BlueDraco
    Specjalista - Mikrokontrolery
    Czy sprawdziłeś przyciski miernikiem z piszczkiem - wciśnięty/zwolniony?

    Miałem kiedyś coś takiego - wlutowałem w płytkę przyciski czworonożne przekręcone o 90 stopni, więc stale było zwarcie do masy.
  • #4 16213268
    Konto nie istnieje
    Konto nie istnieje  
  • #5 16215097
    trynitor
    Poziom 7  
    1. Sprawdziłem przyciski od strony hardware, "przedzwoniłem" co trzeba. Przyciski mam wlutowane prawidłowo :)
    2. Używam AtmelStudio 7.0. z pakietem frameworków który jest w zestawie.
    3. Zgodnie z "datasheet" mikrokontrolera, JTAG jest wyłaczony wtedy, gdy odpowiedni checkbox jest zaznaczony innymi słowy JTAG jest zaprogramowany kiedy bit JTAGEN jest w stanie niskim. Dołaczam konfigurację moich fusebitów jako załacznik do tego posta.

    Dodam, że do innej płytki z tym samym mikrokontrolerem ATMega32A wgrywam ten sam plik .elf i przyciski działają.

    Mam dodatkowe pytanie: programuje przez ISP, czy jestli odznaczę checkboxa JTAGEN (włacze JTAGEN) to nic mi się nie zepsuje i dalej będę mógł programować przez ISP?
  • #6 16215169
    trynitor
    Poziom 7  
    Problem rozwiązany.
    Zmyliła mnie nota katalogowa, w której jest napisane że stan niski na JTAGEN oznacz że interfejs JTAG jest włączony. Do tego Atmel Studio przy JTAGEN miał zaznaczonego checkboxa co wiązałem ze stanem wysokim bitu JTAGEN, a więc z wyłączonym JTAG. Zaryzykowałem i go odznaczyła i teraz przyciski działają.

    Dzięki :)
REKLAMA