100

AVR C – Pierwszy program

Zaczynając naukę programowania zaczyna się od wyświetlenia na ekranie komputera napisu Hello Word. W przypadku nauki programowania mikrokontrolerów wyświetlenie jakiegokolwiek napisu na ekranie komputera na pierwszych zajęciach może się okazać problematyczne. Przyjmijmy, że nasz Hello Word będzie wyświetlony na diodach.

m32-300x200

Kurs programowania mikrokotrolerów jest przeznaczony dla rodziny AVR AtMega i oparty o model AtMega644p. Do celów kursu wykorzystuje płytkę prototypową firmy AND-TECH EvB 5.1.

Zakładam, że osoby czytające ten wpis mają już jakąś wiedzę dotyczącą programowania, a nawet znają już język C przynajmniej w podstawowym stopniu. Dalszym założeniem jest iż takowe osoby wiedzą co nie co o elektronice i byle „dioda” ich nie wystraszy.

Programowanie mikrokontrolerów nie różni się zbytnio od programowania komputerów. Nasz program zaczniemy od dołączenia bibliotek z których będziemy korzystać wraz z podstawowymi definicjami.

/*	Definicje	*/
#define F_CPU 16000000UL	//Definicja czestotliwosci procesora
#define LEDS	PORTB

/*	Dolaczane biblioteki	*/
#include <avr/io.h>			//Biblioteka wejsc/wyjsc
#include <util/delay.h>		//Biblioteka opoznien
#include <stdint.h>			//Biblioteka typow liczb

I tak biblioteka <avr/io.h> zapewnia nam informacje o obsłudze wejść i wyjść. <util/delay.h> pozwoli nam na wstawianie opóźnień czasowych, przydatnych jak byśmy chcieli jakieś zmiany pracy naszego układu zarejestrować „gołym okiem”. Następną biblioteką którą wykorzystamy jest <stdint.h> . W tej bibliotece przechowywane są informacje o typach liczb.

A po co te definicje? Pierwsza definicja jest potrzebna aby opóźnienia działały. Sam uC nie wie jakim zegarem jest taktowany, temu trzeba go o tym poinformować. Jeżeli wiemy z jaką częstotliwością jest taktowany nasz układ to możemy przeliczyć ile takich taktów musi odmierzyć aby minęła jedna sekunda. No dobra, a druga definicja? To już kwestia udogodnienia, abyśmy nie musieli pamiętać gdzie podpięliśmy swoje diody.

Okey, mamy już jakieś podstawy do dalszego programowania ale gdzie będzie umieszczony nasz główny program? Otóż trzeba zauważyć zasadniczą różnicę pomiędzy programowaniem komputerów, a mikrokontrolerów. Program na komputerze wywoływany jest raz i przestaje pracować gdy wykona swoje zadanie. Innego typu pracy chcemy od naszych mikrokontrolerów. One mają pracować nieprzerwanie, wykonując pewne operacje. Z tej przyczyny nasz program będzie już w założeniu wyglądał inaczej niż byśmy pisali go dla komputera.

/*	Funckja main()	*/
int main()
{
	/*	Petla nieskonczona	*/
	while(1)
	{
		;
	}
}

W funkcji main() mamy pętlę nieskończoną while(1) to ona zapewnia nam ciągłe wykonywanie się określonych zadań. W tym momencie pętla jest pusta, co daje nam efekt cyklicznego powtarzania polecenia „nic”. No dobra chcemy, żeby nasz procek wykonywał coś więcej. Baa najlepiej aby wykonywał dokładnie to co założyliśmy. I tu nasuwa się pytanie… co my założyliśmy…. A no tak, mieliśmy napisać Hello Word dla mikrokontrolera i zrealizować to na diodach LED.  Proponuje to zrobić poprzez cykliczne (trzeba jakoś wykorzystać bibliotekę opóźnień) zaświecanie i gaszenie diod LED.

Aby to zrobić przypisujemy do zmiennej LEDS oznaczającej port który wcześniej zdefiniowaliśmy pewną wartość. Jako, że port w tej konkretnej AtMedze posiada 8 pinów, to zapalmy na początek cztery pierwsze diody. Osiem stanów wyjść portu jest reprezentowane poprzez kombinację od 0 do 255.  Trudno przeliczyć która kombinacja za co będzie odpowiadać, ale jest na to rada. Możemy użyć zapisu binarnego i tak, tylko pierwsze cztery świecące diody LED możemy zapisać jako 0b11110000. No już jest fajniej, a czy w tym przypadku nie dało by się to jakoś skrócić? A można, wystarczy użyć zapisu hexadecymalnego. I tak cztery bity w stanie wysokim to F, czyli dla całego portu to będzie: 0xF0. Dobra następny stan będzie na odwrót, analogicznie przypiszemy wartość 0x0F. Ale ale Czy zdołamy to zobaczyć? Otóż nie koniecznie bo procesor wykonuje miliony operacji na sekundę (sami zdefiniowaliśmy F_CPU). To teraz trzeba dodać opóźnienie. 0.5 sekundy powinno starczyć, używamy do tego funkcji w bibliotece <until/delay.h> o nazwie _delay_ms() z parametrem ilości milisekund. A wszystko jest wewnątrz pętli nieskończonej.

/*	Funckja main()	*/
int main()
{
	/*	Petla nieskonczona	*/
	while(1)
	{
		LEDS = 0xf0;		//Zapalenia pierwszej tetrady
		_delay_ms(500);		//Opoznienie 0.5s
		LEDS = 0x0f;		//Zapalenie drugiej tetrady
		_delay_ms(500);		//Opoznienie 0.5s
	}
}

 

Dobra czy napisaliśmy już pełny program? Nie! Zapomnieliśmy o konfiguracji naszego mikrokontrolera. Napiszmy sobie funkcję którą wywołamy na początku trwania programu o nazwie ConfIO().

/*	Funckja main()	*/
int main()
{
	/*	Konfiguracja procesora	*/
	ConfIO();
	
	/*	Petla nieskonczona	*/
	while(1)
	{
		LEDS = 0xf0;		//Zapalenia pierwszej tetrady
		_delay_ms(500);		//Opoznienie 0.5s
		LEDS = 0x0f;		//Zapalenie drugiej tetrady
		_delay_ms(500);		//Opoznienie 0.5s
	}
}

Funkcja ConfIO() będzie nam służyła do konfiguracji portu na wyjścia. Za konfigurację portu służy nam rejestr DDRx. Konfigurujemy port B więc używamy rejestru DDRB. Bity wysokie w tym rejestrze będą oznaczały tryb działania pinu jako wyjście, a niskie jako wejście.

void ConfIO(void)
{
	/*	DDRx rejestr ustawiajacy tryb pracy pinow, 1 - wyjscie, 0 - wejscie	*/
	DDRB = 0xff;			//Port diod LED
	/*	PORTx rejestr ustawiajacy stany pinow	*/ 
	PORTB = 0xff; 			//Ustawienie wartosci stanu wysokiego
}

Teraz napisaliśmy swój pierwszy program, wystarczy połączyć wszystko w całość 🙂
W ten sposób napisaliśmy swój pierwszy program dla procesora AVR

 

/*****************************************************************
 * 
 *	R01_Diody
 *	Diody_na_przemian
 *	main.c
 *	Plik : main.c	
 *	Mikrokontroler : Atmel AVR atmega644p
 *	Kompilator : avr-gcc Toolchain
 *	Autor : Mariusz Czajkowski
 *	Źródło : http://uengineering.net/
 *	Data : 08.12.2012
 *
 *****************************************************************/

 /*****************************************************************
 * 
 *	PORTB podlaczony do diod LED
 *	PORTC<0,1> podlaczony do przyciskow
 *
 *****************************************************************/

/*	Definicje	*/
#define F_CPU 16000000UL	//Definicja czestotliwosci procesora
#define LEDS	PORTB

/*	Dolaczane biblioteki	*/
#include <avr/io.h>			//Biblioteka wejsc/wyjsc
#include <util/delay.h>		//Biblioteka opoznien
#include <stdint.h>			//Biblioteka typow liczb

/*	Funkcje wlasne	*/
void ConfIO(void)
{
	/*	DDRx rejestr ustawiajacy tryb pracy pinow, 1 - wyjscie, 0 - wejscie	*/
	DDRB = 0xff;			//Port diod LED
	/*	PORTx rejestr ustawiajacy stany pinow	*/ 
	PORTB = 0xff; 			//Ustawienie wartosci stanu wysokiego
}

/*	Funckja main()	*/
int main()
{
	/*	Konfiguracja procesora	*/
	ConfIO();
	
	/*	Petla nieskonczona	*/
	while(1)
	{
		LEDS = 0xf0;		//Zapalenia pierwszej tetrady
		_delay_ms(500);		//Opoznienie 0.5s
		LEDS = 0x0f;		//Zapalenie drugiej tetrady
		_delay_ms(500);		//Opoznienie 0.5s
	}
}

 

Mariusz Czajkowski

Wykształcenie: magister inżynier Automatyki i Robotyki. Zainteresowania techniczne: Programowanie, Elektronika, Mikrokontrolery, Sterowniki PLC.

100 Comments

  1. Pingback: A片
  2. Pingback: Grandpashabet
  3. Pingback: grandpashabet
  4. Pingback: fuck google
  5. Pingback: madridbet
  6. Pingback: meritking giriş
  7. Pingback: meritking
  8. Pingback: grandpashabet
  9. Pingback: child porn
  10. Pingback: porn
  11. Pingback: grandpashabet
  12. Pingback: meritking
  13. Pingback: izmir escort
  14. Pingback: child porn
  15. Pingback: child porn
  16. Pingback: xxlargeseodigi
  17. Pingback: fuck google
  18. Pingback: porn
  19. Pingback: porn
  20. Pingback: porn
  21. Pingback: porn
  22. Pingback: porn
  23. Pingback: çeşme transfer
  24. Pingback: esenler escort
  25. Pingback: erzurum escort
  26. Pingback: izmir travesti
  27. Pingback: hd porno izle
  28. Pingback: izmir travesti
  29. Pingback: sikiş
  30. Pingback: yasam ayavefe
  31. Pingback: kralbet
  32. Pingback: grandpashabet
  33. Pingback: grandpashabet
  34. Pingback: grandpashabet
  35. Pingback: child porn
  36. Pingback: porna
  37. Pingback: casino porna
  38. Pingback: child porn
  39. Pingback: anal porn
  40. Pingback: child porn
  41. Pingback: child porn
  42. Pingback: child porn
  43. Pingback: jojobet
  44. Pingback: jojobet twitter
  45. Pingback: child porn
  46. Pingback: meritking
  47. Pingback: child porn
  48. Pingback: child porn
  49. Pingback: anal porn
  50. Pingback: spinco
  51. Pingback: iyibilirdik
  52. Pingback: meritking
  53. Pingback: casino porna
  54. Pingback: porn
  55. Pingback: bursa travesti
  56. Pingback: child porn
  57. Pingback: escort bayan
  58. Pingback: bmw
  59. Pingback: kadinlar
  60. Pingback: porn
  61. Pingback: bugatti tumblr
  62. Pingback: ankara travesti
  63. Pingback: edebiyat tumblr
  64. Pingback: ankaratravesti.xyz
  65. Pingback: children porn
  66. Pingback: child porn
  67. Pingback: rize tumblr
  68. Pingback: child porn
  69. Pingback: gece tumblr
  70. Pingback: sakakrizi tumblr
  71. Pingback: inovapin.com
  72. Pingback: biznes kniga
  73. Pingback: porn
  74. Pingback: child porn
  75. Pingback: ankara psikolog
  76. Pingback: hardcore porn
  77. Pingback: child porn
  78. Pingback: child porn
  79. Pingback: child porn watch
  80. Pingback: meritking giriş