Spisu treści:

Mikrokontroler AVR. Przełącz diody LED za pomocą przełącznika przyciskowego. Odbijanie przycisku.: 4 kroki
Mikrokontroler AVR. Przełącz diody LED za pomocą przełącznika przyciskowego. Odbijanie przycisku.: 4 kroki

Wideo: Mikrokontroler AVR. Przełącz diody LED za pomocą przełącznika przyciskowego. Odbijanie przycisku.: 4 kroki

Wideo: Mikrokontroler AVR. Przełącz diody LED za pomocą przełącznika przyciskowego. Odbijanie przycisku.: 4 kroki
Wideo: AVR ATmega8: Przerzutnik Schmitta na wejściu mikrokontrolera. 2024, Lipiec
Anonim
Image
Image

W tej sekcji dowiemy się, jak utworzyć kod programu C dla ATMega328PU, aby przełączać stan trzech diod LED zgodnie z danymi wejściowymi z przełącznika przyciskowego. Zbadaliśmy również rozwiązania problemu „Switch Bounce”. Jak zwykle zmontujemy obwód elektryczny w oparciu o AVR ATmega328, aby sprawdzić działanie kodu programu.

Krok 1: Napisanie i zbudowanie aplikacji mikrokontrolera AVR w kodzie C przy użyciu zintegrowanej platformy programistycznej Atmel Studio 7

Pisanie i budowanie aplikacji mikrokontrolera AVR w kodzie C przy użyciu zintegrowanej platformy programistycznej Atmel Studio 7
Pisanie i budowanie aplikacji mikrokontrolera AVR w kodzie C przy użyciu zintegrowanej platformy programistycznej Atmel Studio 7
Pisanie i budowanie aplikacji mikrokontrolera AVR w kodzie C przy użyciu zintegrowanej platformy programistycznej Atmel Studio 7
Pisanie i budowanie aplikacji mikrokontrolera AVR w kodzie C przy użyciu zintegrowanej platformy programistycznej Atmel Studio 7
Pisanie i budowanie aplikacji mikrokontrolera AVR w kodzie C przy użyciu zintegrowanej platformy programistycznej Atmel Studio 7
Pisanie i budowanie aplikacji mikrokontrolera AVR w kodzie C przy użyciu zintegrowanej platformy programistycznej Atmel Studio 7

Jeśli nie masz Atmel Studio, powinieneś go pobrać i zainstalować.

www.microchip.com/mplab/avr-support/atmel-studio-7

W pierwszych kilku wierszach mamy pewne definicje kompilatora.

F_CPU definiuje częstotliwość zegara w hercach i jest powszechny w programach korzystających z biblioteki avr-libc. W tym przypadku jest używany przez procedury opóźniające do określenia sposobu obliczania opóźnień czasowych.

#ifndef F_CPU

#define F_CPU 16000000UL // mówienie częstotliwości kryształu kontrolera (16 MHz AVR ATMega328P) #endif

#include // nagłówek, aby włączyć kontrolę przepływu danych przez piny. Definiuje piny, porty itp.

Pierwszy plik dołączany jest częścią avr-libc i będzie używany w prawie każdym projekcie AVR, nad którym pracujesz. io.h określi, jakiego procesora używasz (dlatego określasz część podczas kompilacji), a następnie dołączy odpowiedni nagłówek definicji IO dla używanego przez nas układu. Po prostu definiuje stałe dla wszystkich twoich pinów, portów, rejestrów specjalnych itp.

#dołącz // nagłówek, aby włączyć funkcję opóźnienia w programie

Biblioteka util/delay.h zawiera kilka podprogramów dla krótkich opóźnień. Funkcja, której będziemy używać, to _delay_ms().

Używamy definicji do zadeklarowania portów i pinów naszego przycisku i diody LED. Korzystanie z instrukcji defines, takich jak ta, pozwala nam modyfikować tylko 3 łatwe do znalezienia linie, jeśli przeniesiemy diodę LED do innego pinu I/O lub użyjemy innego AVR.

#define przełącznik BUTTON1 1 // podłączony do portu B pin 1

#define LED1 0 // Led1 podłączony do portu B pin 0 #define LED2 1 // Led2 podłączony do portu C pin 1 #define LED3 2 // Led3 podłączony do portu D pin 2

Ostatnie dwa definiują czasy konfiguracji instrukcji (w milisekundach) odbicia przełącznika i czas oczekiwania przed ponownym naciśnięciem przycisku. Czas odbicia należy dostosować do czasu, jaki zajmuje przełącznikowi przejście z cyfrowego wysokiego do cyfrowego niskiego po całym odbiciu. Zachowanie odbicia będzie się różnić w zależności od przełącznika, ale zwykle wystarczy 20-30 milisekund.

#define DEBOUNCE_TIME 25 // czas oczekiwania na przycisk "odbicia"

#define LOCK_INPUT_TIME 300 // czas oczekiwania po naciśnięciu przycisku

nieważne init_ports_mcu()

{

Ta funkcja jest wywoływana tylko raz na początku naszego programu, aby zainicjować piny wejściowe i wyjściowe, których będziemy używać.

Dla przycisku będziemy używać rejestrów PORT i PIN do zapisu i odczytu. Z AVR-ów odczytujemy pin używając jego rejestru PINx i zapisujemy do pinu używając jego rejestru PORTx. Musimy napisać do rejestru przycisku, aby umożliwić podciąganie.

W przypadku diody LED wystarczy użyć rejestru PORT do zapisu, jednak potrzebujemy również rejestru kierunku danych (DDR), ponieważ styki we/wy są domyślnie ustawione jako wejścia.

Najpierw ustawiamy piny I/O diody LED jako wyjście, używając rejestru kierunku danych.

DDRB=0xFFu; // Ustaw wszystkie piny PORTB jako wyjście.

Następnie jawnie ustaw pin przycisku jako dane wejściowe.

DDRB &= ~(1<

Następnie piny PORTB są ustawione wysoko (+5 woltów), aby go włączyć. Piny wyjściowe są początkowo w stanie wysokim, a ponieważ nasza dioda LED jest podłączona jako aktywna w stanie wysokim, zostanie włączona, chyba że wyraźnie ją wyłączymy.

I na koniec włączamy wewnętrzny rezystor podciągający na pinie wejściowym, którego używamy dla naszego przycisku. Odbywa się to po prostu przez wyprowadzenie jedynki do portu. Gdy jest skonfigurowane jako wejście, powoduje to włączenie podciągania, a gdy jest skonfigurowane jako wyjście, spowoduje to po prostu wyprowadzenie wysokiego napięcia.

PORTB = 0xFF; // Ustaw wszystkie piny PORTB jako HIGH. Dioda jest włączona, // włączony jest również wewnętrzny rezystor Pull Up pierwszego pinu PORTB. DDRC=0xFFu; // Ustaw wszystkie piny portu PORTC jako wyjście. PORTC=0x00u; // Ustaw wszystkie piny PORTC w stan niski, co spowoduje jego wyłączenie. DDRD=0xFFu; // Ustaw wszystkie piny portu PORTD jako wyjście. PORTD=0x00u; // Ustaw wszystkie piny portu PORTD w stan niski, co spowoduje jego wyłączenie. }

unsigned char button_state()

{

Ta funkcja zwraca wartość logiczną wskazującą, czy przycisk został naciśnięty. Jest to blok kodu, który jest stale wykonywany w nieskończonej pętli, a zatem odpytuje stan przycisku. Tutaj też odbijamy przełącznik.

Teraz pamiętaj, że gdy wciśniemy przełącznik, pin wyjściowy wejściowy jest przyciągany do masy. Dlatego czekamy, aż pin spadnie.

/* przycisk jest wciśnięty, gdy bit BUTTON1 jest wyczyszczony */

jeśli (!(PINB & (1<

Robimy to sprawdzając, czy bit jest czysty. Jeśli bit jest czysty, wskazujący, że przycisk jest wciśnięty, najpierw opóźniamy o czas określony przez DEBOUNCE_TIME, który wynosi 25ms, a następnie ponownie sprawdzamy stan przycisku. Jeśli przycisk zostanie wciśnięty po 25ms, przełącznik jest uważany za odbity i gotowy do wyzwolenia zdarzenia, a więc powracamy do naszej procedury wywołania. Jeśli przycisk nie jest wciśnięty, wracamy 0 do naszej procedury wywołania.

_delay_ms (DEBOUNCE_TIME);

jeśli (!(PINB & (1<

int główny (unieważniony)

{

Nasza główna rutyna. Główna funkcja jest unikalna i wyróżnia się spośród wszystkich innych funkcji. Każdy program w C musi mieć dokładnie jedną funkcję main(). główne to miejsce, w którym AVR rozpoczyna wykonywanie kodu po pierwszym włączeniu zasilania, więc jest to punkt wejścia programu.

znak bez znaku n_led = 1; // początkowo numer diody LED jest teraz włączony

Wywołanie funkcji inicjującej używane piny I/O:

init_ports_mcu();

nieskończona pętla, w której działa nasz program:

gdy (1)

{

Gdy stan_przycisku zwraca jeden wskazujący, że przycisk został naciśnięty i odbity, a następnie przełącza bieżący stan diod LED zgodnie z parametrem n_led.

if (button_state()) // Jeśli przycisk jest wciśnięty, przełącz stan i opóźnienie diody LED o 300 ms (#define LOCK_INPUT_TIME)

{ switch(n_led){ przypadek 1: PORTB ^= (1<<LED1); PORTC ^= (1<<LED2); przerwa;

Te instrukcje używają operatorów bitowych języka C. Tym razem używa wyłącznego operatora OR. Kiedy XOR PORT z wartością bitową bitu, który chcesz przełączyć, ten jeden bit jest zmieniany bez wpływu na inne bity.

przypadek 2:

PORTC ^= (1<<LED2); PORT ^= (1<<LED3); przerwa; przypadek 3: PORTD ^= (1<<LED3); PORTB ^= (1<<LED1); n_led=0; // zresetuj przerwanie numeru diody LED; } n_led++; // kolejna dioda zapala się _delay_ms(LOCK_INPUT_TIME); } } powrót (0); }

Więc teraz, kiedy uruchomisz ten program, powinieneś być w stanie nacisnąć przycisk, aby przełączać się diody LED. Ze względu na nasze opóźnienie zdefiniowane przez LOCK_INPUT_TIME, możesz nacisnąć i przytrzymać przycisk, co spowoduje, że diody LED będą się wyłączać i włączać w stałym tempie (nieco więcej niż co 275ms).

Programowanie zakończone.

Kolejnym krokiem jest wbudowanie projektu i pliku hex programu do mikrokontrolera za pomocą programu avrdude.

Możesz pobrać plik main.c z programem w kodzie c:

Krok 2: Przenoszenie pliku HEX programu do pamięci Flash chipa

Przenoszenie pliku HEX programu do pamięci Flash chipa
Przenoszenie pliku HEX programu do pamięci Flash chipa
Przesyłanie pliku HEX programu do pamięci Flash chipa
Przesyłanie pliku HEX programu do pamięci Flash chipa

Pobierz i zainstaluj AVRDUDE. Najnowsza dostępna wersja to 6.3: Pobierz plik zip

Najpierw skopiuj plik hex programu do katalogu AVRDUDE. W moim przypadku jest to ButtonAVR.hex

Następnie wpisz w okienku DOS polecenie: avrdude –c [nazwa programisty] –p m328p –u –U flash:w:[nazwa twojego pliku hex].

W moim przypadku jest to: avrdude –c ISPProgv1 –p m328p –u –U flash:w:ButtonAVR.hex

To polecenie zapisuje plik hex do pamięci mikrokontrolera.

Obejrzyj film ze szczegółowym opisem wypalania pamięci flash mikrokontrolera:

Nagrywanie pamięci flash mikrokontrolera…

Ok! Teraz mikrokontroler pracuje zgodnie z instrukcjami naszego programu. Sprawdźmy to!

Krok 3: Odblokowanie przełącznika sprzętowego

Odbijanie przełącznika sprzętowego
Odbijanie przełącznika sprzętowego

Oprócz odbicia przełącznika programowego możemy zastosować technikę odbicia przełącznika sprzętowego. Podstawową ideą takiej techniki jest użycie kondensatora do odfiltrowania szybkich zmian w sygnale przełącznika.

Jaką wartość kondensatora należy wybrać? Będzie to ostatecznie zależeć od tego, jak słabo działa przycisk w odniesieniu do tego konkretnego problemu. Niektóre przyciski mogą wykazywać niesamowite odbijanie, ale inne będą miały bardzo mało. Niska wartość kondensatora, taka jak 1,0 nanofaradów, zareaguje bardzo szybko, z niewielkim lub żadnym wpływem na odbijanie. I odwrotnie, wyższa wartość kondensatora, taka jak 220 nanofaradów (która nadal jest dość mała pod względem kondensatorów), zapewni powolne przejście od napięcia początkowego do końcowego (5 V do 0 V). Przejście widoczne przy pojemności 220 nanofaradów jest jednak nadal dość szybkie w sensie rzeczywistym, a zatem może być używane na słabo działających przyciskach.

Krok 4: Obwód elektryczny

Obwód elektryczny
Obwód elektryczny
Obwód elektryczny
Obwód elektryczny
Obwód elektryczny
Obwód elektryczny

Połącz elementy zgodnie ze schematem ideowym.

Zalecana: