Navod pro uplne zacatecniky

Z MAM wiki

Přejít na: navigace, hledání

Zde budeme pracovat na navodu v jazyku C (Michal Švadlenka --Svadlmi2 11. 4. 2010, 09:54 (UTC) a Petr Ježek)

Tak já už pracuji na Návod pro úplného začátečníka - v Assmebleru pro ATmega 168 - soupis a předvedení funkcí různých příkazů na dobře komentovaných příkladech. Tak jak bych si to představoval u tohoto předmětu, aby to každý pochopil. --Mottljir 8. 4. 2010, 10:05 (UTC)

Obsah

[editovat] Historie jazyka C

Jazyk C byl vymyšlen v 70. letech a poprvé implementován Dennisem Ritchiem na počítači DEC PDP-11 s operačním systémem UNIX. C je výsledkem vývoje staršího jazyka BCPL vyvinutého Kenem Thompsonem. Postupem času rostla popularita jazyka C a v roce 1983 byla ustanovena komise pro vytvoření normy ANSI (Amereican National Standard Institute). Proces standardizace trval 6 let a v konečné podobě přijata na konci roku 1989. Téměř všechny dnešní překladače tuto normu dodržují.

[editovat] C versus C++

Začátečníci jsou často zmatení rozdílem mezi C a C++. Stručně řečeno, C++ je rozšířenou verzí C, která byla vytvořena pro podporu objektově orientovaného programování. C++ obsahuje a podporuje úplný jazyk C a navíc má sadu objektově orientovaných rozšíření. Pokud se někdo bude chtít věnovat programování C++ budou pro vás znalosti jazyka C nejen užitečné, ale přímo nezbytné. Pro programování simulátoru AVR Dragon budeme využívat jazyk C.

[editovat] Základní prvky jazyka C

Zde jsou popsané základní prvnky jazyka C. Nesnážíme se zde popisovat jednotlivé příkazy jako je jak přiřadit proměné hodnotu, vytvořit podmínku nebo napsat cyklus. Předpokládáme, že čtenář již základy programování ovládá. Pro podrobnější popis jednotlivých základních příkazů je vhodná tato literatura

[editovat] Hlavičkový soubor

V C se informace o knihovních funkcích nacházejí v různých souborech dodávaných spolu s překladačem. Jména těchto souborů mají koncovku *.H. Překladač používá informace v těchto souborech pro správné zpracování knihovních funkcí. Tyto soubory přidáváme do programu pomocí

#include <jmeno_hlavickoveho_souboru>

Tento příkaz překladači říká aby začlenil do programu příslušný soubor. Toto velmi usnadňuje programátorům práci a nemusejí v každém novém programu definovat základní věci znovu. Typické hlavičkové soubory používané pro mikroprocesor ATmega168 jsou:

#include <avr/io.h> // zde je definovan napr. PORTB
#include <avr/iom168.h> // konstanty pro konkretni typ mikrokontroleru
#include <util/delay.h> // toto potrebuji pro pouziti funkce _delay_ms()

[editovat] Funkce

Všechny programy v jazyku C se skládají z jedné nebo více funkcí, které obsahují příkazy. Obecný formát funkce vypadá takto:

navratovy_typ jmeno_funkce(seznam_parametru)
{
  posloupnost prikazu
}

Můžeme si například naprogramovat jednoduchou funkci kde seznam parametrů budou čísla a a b a návratový typ bude hodnota součtu těchto dvou čísel. Zavoláním takové funkce se seznamem parametrů dostaneme výsledek. Každý program v jazyce C obsahuje alespoň jednu funkci main

[editovat] Jednoduché programy v jazyce C

[editovat] Jednoduchý program pro blikání LED diodami

[editovat] Popis

Programem si nastavíme jako výstup port C a v nekonečné smyčce provádíme přepínání výstupů. Na výstupy lze připojit například dvě LED diody a sledovat jak program funguje (je možné připojit i speciální dvoubarevnou diodu kterou lze přepólovat).

#include <avr/io.h> 
#include <avr/iom168.h>
#include <avr/delay.h>
#define xtal 8000000 //kmitocet krystalu 8MHz
 
unsigned char vystupLED1;
unsigned char vystupLED2;
 
void main(void)
{
 DDRC=0xff; //tady nastavime vystup LED diod na port C
 vystupLED1 = 0x55; //vystupu LED diody 1 prirazujeme adresu 0x55
 vystupLED2 = 0xAA; //vystupu LED diody 2 prirazujeme adresu 0xAA
 while(1)           //nekonecna smycka ve ktere provadime blikani LED diod, pripadne prepolovani
                    // napeti na jedne LED diode (musime mit vhodnou diodu)  
 {
  _delay_ms(500);
  PORTC = vystupLED1;
  _delay_ms(500);
  PORTC = vystupLED2;
 }
}


[editovat] Program pro ovládání LED diod tlačítky

[editovat] Popis

Nejprve se provede inicializace PORTB jako vstupního a PORTC jako výstupního.Nastavili jsme hodnotu pomocné proměnné c na nulu. Potom se v nekonečné smyčce, začínající příkazem while(1), pomocí příkazu PORTB = ~c; provádí zobrazování obsahu této pomocné proměnné. Chceme, aby se jedničky v jednotlivých bitech proměnné c projevily svitem LED diody, nuly naopak zhasnutím LED diody. Proto, s ohledem na naše zapojení, musíme na výstup PORTB poslat nikoli obsah proměnné c, ale hodnotu vzniklou z obsahu proměnné c negací jednotlivých bitů. Proto jsme použili operátor ~.

Před zobrazením hodnoty proměnné c ,ale ještě může dojít ke změně této hodnoty,pokud bude stisknuto některé tlačítko. K tomu jsme použili příkazy jako např.: if (PINB.3 = = 0 ) c = c»l ; kde PINB.3 snímá logickou úroveň na pinu 3 PORTB a interpretuje ji jako nulu či jedničku. Protože stisk tlačítka se projeví nulou,je prováděn test na stisknutí porovnáním sejmuté hodnoty s nulou. Stisknutí tlačítka se projeví provedením posunutím obsahu proměnné c o jedno místo doprava. Pokud nebude tlačítko stisknuto, neprovede se tento příkaz. Takto se provádí postupně test na stisknutí tlačítek 0, 1, ... 6. Nakonec jsme ještě zařadili časovou prodlevu 100 ms jako jednoduchý způsob ošetření zákmitů tlačítek.

#include <avr/io.h> 
#include <avr/iom168.h>
#include <avr/delay.h>

//Deklarace globalnich promenych
unsigned char c;

void main(void)
{
 //inicializace Port B - vstup (tlacitka)
 PORTB=0x00;
 DDRB=0x00;

 //inicializace Port C - vystup (LED diody)
 PORTC=0x00;
 DDRC=0xFF;

 c=0;
 while(1)
 {
  if (PINB.0 == 0) c = c + 1; //pricteni 1
  if (PINB.1 == 0) c = c - 1; //odecteni 1
  if (PINB.2 == 0) c = c << 1; //bitovy posun o jeden bit doleva
  if (PINB.3 == 0) c = c >> 1; //bitovy posun o jeden bit doprava
  if (PINB.4 == 0) c = -c; //bitovy doplnek,jednickovy doplnek
  if (PINB.5 == 0) c = 255; // nastaveni samych jednicek
  if (PINB.6 == 0) c = 0; //nastaveni samych nul
  PORTC = ~c; //0..LED sviti,1..LED nesviti
  _delay_ms(100);
 }
}


[editovat] Literatura

Osobní nástroje