Demo entry 6658023

dfg

   

Submitted by sx on Nov 05, 2017 at 23:04
Language: C. Code size: 6.8 kB.

/* 
======================================================================

	1. ÓRA, 1. FELADATRÉSZ,  uC C bevezető ( uC ASM ZH után )

	- a mikrokontroller programozása "C" nyelven nagy vonalakban
	  azt jelenti, hogy "C" kódot írunk, és hozzá vesszük
	  a mikrokontroller specifikus változókat, utasításokat.

	- ilyen uC specifikus utasítások pl. PORT iránybeállítás [DDRx], 
	  PORT meghajtás [PORTx], IT beállítások.

	- FONTOS; hogy a "C" programozási nyelv használata egyszerűbbé
		  és gyorsabbá teszi feljesztést, de sok uC programozási 
		  és működési folyamatot elrejt előlünk.

----------------------------------------------------------------------

	- FONTOS; kérem ismétlésként nézzék át az első féléves 
		  "C PROGRAMOZÁS LABOR" anyagát, különösen az első négy 
		  labor anyagát, illetve a függvény kezelés labor anyagát!

======================================================================
*/

/*
==== 1111 1111 1111 =========================================

	1. AVR-C feladat: 
	
	  Két számmal műveleteket csinálunk 
	    ( + összeadás, - kivonás, * szorzás, / osztás, % osztás maradéka )
	    ( & bitenkénti ÉS, | bitenkénti VAGY, ^ bitenkénti KIZÁRÓ VAGY ) 
	    ( ~ bitenkénti NEGÁLÁS )

	  Eredményt kiiratjuk a LED-re

	  a , b : számértékek
	  c     : eredmény

-------------------------------------------------------------
*/

#include <avr/io.h>
int main()
{				// ==== C rész ==== ==== ====
	char a=6, b=2, c=0;	// deklarációk, változók kezdeti értékekkel
				// A következők közül mindig csak egy legyen aktív
	c= a + b;	// összeadás
//	c= a - b;	// kivonás
//	c= b - a;	// kivonás (negatív szám, 2-es komplemensben van írva)

//	c= a * b;	// szorzás
//	c= a / b;	// osztás
//	c= a % b;	// osztás maradéka (moduló)

//	c= a & b;	// bitenkénti ÉS
//	c= a | b;	// bitenkénti VAGY
//	c= a ^ b;	// bitenkénti KIZÁRÓ VAGY
//	c= ~a;		// bitenkénti NEGÁLÁS

//	c= b<<1;	// léptetés 1-el balra
//	c= b>>2;	// léptetés 2-el jobbra

			// ==== uC rész ==== ==== ====
	DDRB=0xF0;	// uC PORTB lábainak beállítása ki(1) - be(0) hexadecimálisan megadva 
	DDRD=0b11110000;// uC PORTD lábainak beállítása ki(1) - be(0) BINÁRISAN megadva

	PORTD = c;	// c változót kirakjuk PORTD-re, felső 4 Byte számít PORTD-n
	PORTB = (c<<4); // shift-elés 4-el balra, és utána c változót kirakjuk PORTB-re, 
			// felső 4 Byte számít PORTB-n is
			// A megadási elv ugyanaz mint assembly-ben, de sokkal egyszerűbb

    while(1){};		// végtelenségig pörög itt a program, EZ A SOR KÖTELEZŐ
return 0;
};


/*
==== 2222 2222 2222 =========================================

	2. AVR-C feladat:

	  Két számot összeadunk, kivonunk, shift-elünk, stb.,
	  az eredményt kiiratjuk a LED-re

	  DE FÜGGVÉNNYEL  (2 átadott és 1 visszatérési paraméter)!
	  (ismétlés, egyszerű "C" nyelven írt kódrészlet)

	  a , b : számértékek
	  c     : eredmény
-------------------------------------------------------------
*/

#include <avr/io.h>
char szamol(char a_x, char b_x);// függvény deklaráció

int main()
{
	char a=6, b=2, c=0;	// lokális változók

	c=szamol(a,b);		// FÜGGVÉNY hívás

	DDRB=0xF0;		// uC beállítás rész (lehetne ezt is külön függvénybe tenni, késöbb...)
	DDRD=0b11110000;	// PORTB és PORTD felso 4 bitje kimenet
	PORTD = c;		// felső 4 bit a PORTD-re megy
	PORTB = (c<<4); 	// shift-elés 4-el balra, alsó 4 bit a PORTB-re

    while(1){};			// végtelenségig pörög, KÖTELEZŐ
return 0;
};
// --- függvények --- --- --- --- --- --- --- --- ---

char szamol(char a_x, char b_x)	// függvény definició
{
	char c2;		// belső lokális változó

				// A következők közül mindig csak egy legyen aktív
	c2=(a_x + b_x);		// összeadás függvényben
//	c2=(a_x - b_x);		// kivonás
//	c2=(b_x - a_x);		// kivonás (negatív szám, 2-es komplemensben van írva)

//	c2=(a_x | b_x);		// bitenkénti VAGY
//	c2=(a_x ^ b_x);		// bitenkénti KIZÁRÓ VAGY
//	c2=(a_x << 1);		// léptetés 1-el balra

return c2;
}

/* 
==== 3333 3333 3333 =========================================

	3. AVR-C feladat: 
	
	  GOMB-ok és LED-ek kezelése
	  Ha GOMB-ot nyomok, világít valamelyik LED

	  FÜGGVÉNNYEL úgy, hogy;  
	    a függvénynek nincs bemeneti paramétere (void), 
	    a függvénynek nincs visszatérési értéke (void)

-------------------------------------------------------------
*/

#include <avr/io.h>
void gomb_led(void);		// függvény deklaráció

int main()
{
	DDRB=0xF0;		// uC beállítás 
	DDRD=0xF0; 		// PORTB és PORTD felső 4 bitje kimenet LED-ek
	DDRG=0x00;		// PORTG összes bitje bemenet (5 gomb itt van)

	while(1)		// végtelen ciklus, itt pörög a program
	{
		gomb_led();	// FÜGGVÉNY hívás, folyamatosan
	};

    while(1){};			// BAB
return 0;
}
// --- függvények --- --- --- --- --- --- --- --- ---

void gomb_led(void)			// függvény definició
{
	unsigned char gomb=0, led=0;	// lokális változók
	gomb = PING;			// PORTG beolvasása gomb változóba
	led  = gomb & 0b00011111;	// maszkolás és átmásolás a led változóba

	PORTD=  led;			// led változó kirakása a PORT-okra
	PORTB= (led << 4);
};

/*
==== 4444 4444 4444 4444 ========================================

	4. Feladat:

	- LED-ek villogjanak, azaz 500ms-ig világítsanak, 500ms-ig ne világítsanak a LED-ek
	- DELAY késleltetéssel (IT nélkül) megoldva

	  FÜGGVÉNNYEL úgy, hogy;  
	    a függvénynek nincs bemeneti paramétere (void), 
	    a függvénynek nincs visszatérési értéke (void)

-----------------------------------------------------------------
*/

#include <avr/io.h>
#define F_CPU  8000000UL	// CPU freki beállítása,  8MHz esetén
// #define F_CPU 16000000UL	// CPU freki beállítása, 16MHz esetén
#include <util/delay.h>		// _delay_ms(xx) függvényhez kell, F_CPU után van!

void led_delay(void);		// függvény deklaráció
int main()
{
	DDRB  = 0xF0;		// PORT-ok irány beállítása
	DDRD  = 0xF0;		// PORTB és PORTD felső 4 bitje kimenet

	do
	{
		led_delay();	// FÜGGVÉNY hívás
	}
	while(1);		// végtelenségig pörög

    while(1){};			// BAB
return 0;
};
// --- függvények --- --- --- --- --- --- --- --- ---

void led_delay(void)		// függvény definició
{
	PORTD = 0b11110000;	// LED-ek bekapcsolása
	PORTB = 0b11110000;
	_delay_ms(500);		// 500ms-os késleltetés

	PORTD = 0b00000000;	// LED-ek kikapcsolása
	PORTB = 0b00000000;	
	_delay_ms(500);		// 500ms-os késleltetés
};

/*
=============================================================================

	GYAKORLÓ és HÁZI FELADATOK:
		- egy darab LED folyamatosan fusson balra
		- Knight Rider futófény megvalósítása a LED-eken
		- 0-100-ig számolunk felfele, a LED-eken kijelezve, utána számolás újrakezdése

=============================================================================

This snippet took 0.01 seconds to highlight.

Back to the Entry List or Home.

Delete this entry (admin only).