ATtiny2313 C/T a tlačítko, běžící text pomocí časovače

Zdravím vás,
chěl bych vás poprosit o pomoc. Jsem začátečník a dostal jsem za úkol udělat program.
Zadání: Napište program pro “bežící světlo”. Svítit bude vždy jedna LED 400ms. Po spuštění programu světlo “poběží” vpravo. Po každém stisknutí tlačítka se směr změní v opačný. Časový interval realizujte časovačem.

Zkoušel jsme tento program vytvářet, ale vůbec nevím jak tam dát časovač a tlačítko. Prosím poraďte

Zde je program co jsem zatím udělal

#define F_CPU 2000000UL //20 MHz - základní frekvence
#include <avr/io.h> //vloží knihovnu vstupů a výstupů (PORT, DDR)
#define PORT PORTB
#define DDR DDRB

int main(void)
{
DDR = 0xFF; //nastaveni brany jako vystupni
PORT = 0xFF; //zhasnuti diod

char i;

while(1)
{
	for (i = 0; i <= 7; i++)
	{
		PORT &= ~(1 << i);   //dioda sviti
		_delay_ms(500);   //POZOR !!!    nastavit jako C/T
		PORT |= (1 << i);   //dioda nesviti
		_delay_ms(500);   //POZOR !!!    nastavit jako C/T  
	}
}
    
    while(1)
{
	for (i = 0; i <= 0; i--)
	{
		PORT &= ~(1 >> i);   //dioda sviti
		_delay_ms(500);   //POZOR !!!    nastavit jako C/T
		PORT |= (1 >> i);   //dioda nesviti
		_delay_ms(500);   //POZOR !!!    nastavit jako C/T  
	}
}

}

Předem děkuji za vaše odpovědi a rady.

:arrow_right: administrator: přejmenováno z "ATtiny2313 C/T a Tlačítko"

casovac znamena ze pouzijes niektory timer procesora na odcitanie casu. timer nastavis niekde za nastavenim portu (za tvoje DDR = 0xFF; PORT = 0xFF;). Nastavis ho tak aby napocita do tych 400ms, a potom vyvolal prerusenie. V preruseni budes potom posuvat tu rozsvietenu LEDku. Prerusenie od timera musis povolit, a tiez musis povolit globalne prerusenie, aby ti fungovalo prerusenie od timera. To sa povoluje sei();. Vykonanie prerusenia bude niekde mimo hlavnej slucky, akoby ina funkcia. v hlavnej slucke mozes potom kontrolovat stav tlacitka.

nerucim za drobne chyby


#define F_CPU 2000000UL //20 MHz - základní frekvence 
#include <avr/io.h> //vloží knihovnu vstupů a výstupů (PORT, DDR) 
#include <avr/interrupt.h>//knihovna pro preruseni


//definice
#define PORT PORTB 
#define DDR DDRB
 
//promenne
volatile unsigned char smer = 0x00, posun = 0x80;


//obsluha preruseni
ISR(TIMER1_COMPA_vect)			
{
//smer vlevo
if(smer == 0xFF)
{	
	//rotace diod vlevo
	PORT = ~posun;	
	if(posun == 0x80)posun = 0x01;
	else posun <<= 1;
	
}
//smer vpravo
if(smer == 0x00)//pokud je smer roven 0xFF provadime posun vpravo
{
	//rotace diod vpravo
	PORT = ~posun;
	if(posun == 0x01)posun = 0x80;
	else posun >>= 1;
}	

}


int main(void) 
{ 
DDR = 0xFF; //nastaveni brany jako vystupni 
PORT = 0xFF; //zhasnuti diod 

//nastaveni timeru
TCCR1B=0x0C;//nastaveni timeru na frekvenci 78 125Hz, rezim compare match s prerusenim

//hodnota pri ktere dojde k preruseni 78 125 / 2.5 = 31 250d. tj. 0x7DFA
OCR1AH=0x7D;
OCR1AL=0xFA;

TIMSK=0x40;//povoleni preruseni timeru 1

sei();//povoleni globalniho preruseni




	while(1) 
	{ 
	
		//ceka na zmacknuti tlacitka na PD0
		if((PIND & 0x01) == 1)
		{
		_delay_ms(100);//zpozdeni pro osetreni zakmitu
		while(((PIND & 0x01) == 1));//ceka na pusteni tlacitka
		smer = ~smer;//zmena smeru otaceni
		}
	}
}

Všem vám moc děkuju za rady a pomoc