top of page

Przesuwanie bitów

Na kolejnych zajęciach większość osób miała już skonfigurowane środowisko więc pierwszy projekt jaki zrobiliśmy to podobny projekt do ostatnich zajęć czyli naprzemienne miganie diodą. Kod programu poniżej.

Sporo osób ma zainstalowany system operacyjny windows 10 i jest tam spory problem z obsługą środowiska Atmel Studio. Chyba najlepszym rozwiązaniem tego problemu jest skonfigurowanie Eclipse i ToolChaina dla AVR ale o tym powstanie osobny artykuł.

Następnym krokiem w programowaniu mikrokontrolerów AVR było poznanie przesuwania bitów w rejestrze. Projekt który wymyśleliśmy to przesuwanie rejestru PORTA na którym mieliśmy zapaloną jedną diodę. Przy wykorzystaniu dwóch przycisków mogliśmy przesuwać diodę w lewo i w prawo.

Samo przesuwanie rejestru odbywa się w następujący sposób:

1) mamy rejestr który ma nastepujący zapis bitowy 1111 1110(0xfe) - oznacza to że dioda na pinie 0 się świeci.

2) przesuwamy cały rejestr np. w lewo czyli wykonujemy nastepującą operację PORTA=PORTA<<1;

3) otrzymujemy następującą wartośc rejestru 1111 1100 - powoduje to jednak zapalenie się dwóch diód dlatego musimy wykonać operację logiczną

4) wykonujemy operację LUB na rejestrze PORTA, PORTA|=0x01 - spowoduje to zmianę rejstru na wartość 1111 1101

5) otrzymujemy gotowe przesunięcie wykonując dwie operacje na rejestrze: przesunięcie w lewo, wykonanie operacji LUB dla tego rejestru.

6) przesuwanie w prawo odbywa się w podobny sposób, jednak wartością z którą porównujemy jest 0x80:

PORTA=PORTA>>1;

PORTA|=0x80;

Poniżej znajduję się gotowy schemat połączenia:

Podłączamy diody do portu A. Do pinów PC0 i PC1 podłączamy przyciski za pomocą których odbywało się będzie sterowanie.

Kod programu:

/* * App_LEFTright.c * * Created: 2016-03-14 17:56:10 * Author : KAWA */ #define F_CPU 1000000 #include <avr/io.h> #include <util/delay.h> int main(void) { //Inicjalizacja portów DDRD=0xff;//ustawione jako wyjście DDRC|=(0<<PC0)|(0<<PC1);//ustawienie pinu PC0 i PC1 jako wejście char led8 = 0xfe;//zmienna do przypisywania do portu A while (1) { if((PINC & (1<<PINC0))==0)//załączenie przycisku { if(led8!=0x7f) { led8=led8<<1; led8|=0x01; } _delay_ms(100); } else if((PINC & (1<<PINC1))==0)//załączenie przycisku { if(led8!=0xfe) { led8=led8>>1; led8|=0x80; } _delay_ms(100); } PORTD=led8; } } Początkowe linie w których dodajemy biblioteki oraz definiujemy porty jako wejście/wyjście pominę, ponieważ są opisane w wcześniejszym artykule. Zacznijmy od linii z deklaracją zmiennej o nazwie led8, służy ona do przypisywania jej wartości do wartości rejestru PORTA jej typ jest to char ponieważ ma on także 8 bitów wielkości w pamięci. W pętli głównej mamy warunki sprawdzania kliknięcia poszczególnych przycisków PC0 i PC1, w zależności od tego który klikniemy przechodzimy do odpowiedniej części kodu.

W każdej częsci kodu odpowiedzialnej za kliknięcie występuje warunek który sprawdza czy nie przekroczyliśmy zakresu, czyli czy dioda znajduje się w granicach (0 i 7 bit). Jeśli przesuwamy w lewo to sprawdzamy czy dioda nie jest na końcu, jeśli nie jest to przesuwamy ją. Podobnie jest z przesuwaniem w prawo, jednka w tym wypadku sprawdzamy czy dioda nie jest na początku rejestru i jeśli nie jest to przesuwamy.


Wyróżnione posty
Ostatnie posty
Archiwum
Wyszukaj wg tagów
Nie ma jeszcze tagów.
Podążaj za nami
  • Facebook Basic Square
  • Twitter Basic Square
  • Google+ Basic Square
bottom of page