avr mikrokontroler-razložitev dela programa

Problemi z drugimi jeziki kot so c++, cgi, java, itd.
Odgovori
rokysan
Prispevkov: 1
Pridružen: 20.06.2012 21:31:37

avr mikrokontroler-razložitev dela programa

Odgovor Napisal/-a rokysan » 20.06.2012 21:35:24

Lepo bi prosu če mi lahko kateri po domače pove kako in kaj deluje ta koda kar sem napisal...res lepo prosim sem čisti laik in nujno rabim :? :?

Koda: Izberi vse

#include "main.h"

volatile char STATUS;
volatile long mstick;
char PRITISKI_TIPK;	//0-tipka1, 1-tipka2,
char SPUSTI_TIPK;	//2-tipka3, 3-tipka4

int main()
{
	int res=0;
	char cnt100ms=0;
	char znak;
	int zakasnitev=0;
	int zakasnitev_stevec=0;
	char LEDprikaz=0;	//0-zgornjih 8-bitov AD-pretvornika
						//1-grafični prikaz AD 0-8 diod
						//2-grafični prikaz AD 8-0 diod
						//3-utripanje diod 1
						//4-utripanje diod 2
						//5-utripanje diod 3
						//6-utripanje diod 4
						//7-utripanje diod 5
						//8-utripanje diod 6
	Init();
	sei();

	PORTD |= 0x80;	//Vključi LCD osvetlitev
	LCDInit();
	stdout = &LCDstream;
	//stdout = &RS232stream;
	
	while (1)
	{
	//--------- izvajaj pogosto ---------------
		if (UCSR0A & (1<<RXC0))
		{
			znak=UDR0;
			printf("%c",znak);
		}
	//-----------------------------------------	
		if (STATUS & Flag10ms)
		{
			STATUS &=~ Flag10ms;
	//--------- izvajaj na 10ms ---------------
			BeriTipke();
			if (PRITISKI_TIPK)	//če je bila katera od tipk pritisnjena, ukrepaj
			{
				if (PRITISKI_TIPK & 0x01)	//Če je bila pritisnjena T1
				{
					PRITISKI_TIPK &=~0x01;	//zbriši sporočilno zastavico
					zakasnitev--;			//zmanjšaj trajanje zakasnitve
					if (zakasnitev < 0) zakasnitev=0;	//popravi če smo jo zmanjšali pod nič (0 = 0.1s)
					fprintf(&RS232stream,"\r\nČasovni razmak: %d desetink sekunde\r\n", zakasnitev+1);
				}				
				if (PRITISKI_TIPK & 0x02)	//Če je bila pritisnjena T2
				{
					PRITISKI_TIPK &=~0x02;	//zbriši sporočilno zastavico
					zakasnitev++;			//povečaj trajanje zakasnitve
					if (zakasnitev>19) zakasnitev=19; //popravi če smo jo povečali čez maksimum (19 = 2s)
					fprintf(&RS232stream,"\r\nČasovni razmak: %d desetink sekunde\r\n", zakasnitev+1);
				}				
				if (PRITISKI_TIPK & 0x04)	//Če je bila pritisnjena T3
				{
					PRITISKI_TIPK &=~0x04;	//zbriši sporočilno zastavico
					LEDprikaz++;			//Spremeni prikaz na LED diodah
					if (LEDprikaz > 8) LEDprikaz=0;
					OsveziLED(LEDprikaz,res);
					fprintf(&RS232stream,"\r\nTip prikaza na LED diodah: %d\r\n",LEDprikaz);
				}				
				if (PRITISKI_TIPK & 0x08)	//Če je bila pritisnjena T4
				{
					PRITISKI_TIPK &=~0x08;	//zbriši sporočilno zastavico
					LCD_ClrScr();			//Zbriši LCD
					fprintf(&RS232stream,"\r\nLCD zbrisan.\r\n");
				}				
			}
	//-----------------------------------------	
			cnt100ms++;
			if (cnt100ms == 10)
			{
				cnt100ms=0;
	//--------- izvajaj na 100ms --------------
				//Trenutno se nič ne izvaja na 100ms
	//-----------------------------------------	
				zakasnitev_stevec++;
				if (zakasnitev_stevec > zakasnitev)
				{
					zakasnitev_stevec=0;
	//--------- izvajaj na zakasnitev * 0.1s --------------
					res=ADpretvorba();
					fprintf(&RS232stream, "Vrednost AD pretvornika: %04d\r",res);
					OsveziLED(LEDprikaz,res);
	//-----------------------------------------------------	
				}
			}
		}
	}
	return 0;
}

//Tabela kombinacij za zadnji način utripanja
#define LED_SEKV_DOLZINA	14
const char LEDsekvenca[LED_SEKV_DOLZINA]={	0x00,
											0x81,
											0x42,
											0x24,
											0x18,
											0x3c,
											0x7e,
											0xff,
											0x7e,
											0x3c,
											0x18,
											0x24,
											0x42,
											0x81};

void OsveziLED(char tip, int vrednostAD)
{
	static char korak=0;
	static char stari_tip=0;
	int tmp,i;
	char PORTBtmp;	//začasna vrednost, da se prikaže na LEDicah samo končno stanje, ne pa tudi vsa vmesna

	if (stari_tip != tip) korak=0;	//če se je tip utripanja spremenil, resetiraj na začetek sekvence
	stari_tip=tip;
	switch (tip)
	{
		case 0: //0-zgornjih 8-bitov AD-pretvornika
				PORTB=vrednostAD>>2;
				break;

		case 1: //1-grafični prikaz AD 0-8 diod
				tmp=vrednostAD/1023.0*8;
				PORTBtmp=0;
				for (i=0;i<tmp; i++)
				{
					PORTBtmp|=1<<i;
				}
				PORTB=PORTBtmp;
				break;

		case 2: //2-grafični prikaz AD 8-0 diod
				tmp=vrednostAD/1023.0*8;
				PORTBtmp=0;
				for (i=0;i<tmp; i++)
				{
					PORTBtmp|=0x80>>i;
				}
				PORTB=PORTBtmp;
				break;

		case 3: //3-utripanje diod 1
				if (korak==0) PORTB=0;
				else PORTB=(1<<korak)-1;
				korak++;
				if (korak > 8) korak=0;
				break;

		case 4: //4-utripanje diod 2
				if (korak==0) PORTB=255;
				else PORTB=255-((1<<korak)-1);
				korak++;
				if (korak > 8) korak=0;
				break;

		case 5: //5-utripanje diod 3
				if (korak==0) PORTB=0;
				else PORTB=255-((1<<(8-korak))-1);
				korak++;
				if (korak > 8) korak=0;
				break;

		case 6: //6-utripanje diod 4
				if (korak==0) PORTB=255;
				else PORTB=(1<<(8-korak))-1;
				korak++;
				if (korak > 8) korak=0;
				break;

		case 7: //7-utripanje diod 5
				PORTB=(1<<korak) | (0x80>>korak);
				korak++;
				if (korak > 7) korak=0;
				break;

		default: //8-utripanje diod 6
				PORTB=LEDsekvenca[(int)korak];
				korak++;
				if (korak >= LED_SEKV_DOLZINA) korak=0;
				break;
	}
}

ISR(TIMER0_COMPA_vect)
{
	static char cnt10ms=10;
	mstick++;
	cnt10ms--;
	if (cnt10ms == 0)
	{
		cnt10ms=10;
		STATUS |= Flag10ms;
	}
}

Uporabniški avatar
krho
Prispevkov: 709
Pridružen: 11.01.2003 23:02:56

Re: avr mikrokontroler-razložitev dela programa

Odgovor Napisal/-a krho » 22.06.2012 19:32:41

Mislim, da programski jezik delphi nima nič skupnega s AVR mikrokontrolerji, še manj pa s programskim jezikom C, v katerem je napisana zgornja koda....

G16
Prispevkov: 462
Pridružen: 11.02.2005 21:54:48

Re: avr mikrokontroler-razložitev dela programa

Odgovor Napisal/-a G16 » 03.07.2012 12:10:58

Sicer obstaja tudi pascal za AVR mikrokontrolerje, ampak tole, ker imaš ti, je C koda.
Saj maš vse zraven pokomentirano, in lahko sklepaš, kaj ta koda dela. Ob pritisku tipk ti izpiše nek tekst na LED zaslon, pa raven maš več načinov utripanja nekih led diod, ki so gor priključene.

Odgovori