Program řízení jasu LED v C pro ATMEGA8 - začátečník

Prosím potřeboval bych pomoc s programem který jsem napsal. Jedná se o řízení jasu LED individualně bez použití vnitřních vestavěných periferií. Jsem na začátku takže se mi jedná o to pochopit proč to tak je a proč ne. Jde o to že program nahraju korektně a proběhne jen jednou a neopakuje se, přitom to mám ve smyčce “while”.Asi jsem udělal nějakou začátečnickou chybu a nevidím ji. Používám WinAVR s PonyProgramatorem. Vlastním knihy C od Herouta 1 , od Burkharda C pro mikrokontrolery a od Vani AVR v C a internet. Už nad tim ležim tři večery a nemůžu se tim prokousat a to jsem to už i několikrát přepsal.Asi to neni úplně ono ale jak jsem se již zmínil jde mi o to pochopit co a jak a kde a proč.Tady je můj bastl program přikládám jako soubor.Předem děkuji za pomoc a případnou kritiku.

Doplnění na apel. Chování programu: Jas LED diody po zapnutí stoupá až dosáhne maxima tak začne jas LED diody klesat až do nuly a to se má opakovat do kola a to se nestane. Proces proběhne jen jednou a pak LEDka zůstane zhasnutá.

Doplněn rychlý komentář do programu.Snad to bude jasné.

:arrow_right: administrator: přejmenováno z “Pomoc s programem v C ATMEGA8 začátečník”
jasled.c (2.14 KB)

Program je pěkně napsaný, s odsazením atd.
Problém je v tom, že jsi nám neřekl co má dělat.
Bez toho je velice obtížné prokousávat se příkazy a zjišťovat co dělají.
K tomu přispívá i absece kometářů v kódu.
Na první pohled jsem si všiml jenom FCPU. Myslím, že má být F_CPU.

Pardon. Chování programu: Jas LED diody po zapnutí stoupá až dosáhne maxima tak začne jas LED diody klesat až do nuly a to se má opakovat do kola a to se nestane. Proces proběhne jen jednou a pak LEDka zůstane zhasnutá.

O absenci komentářů vím, první verze byla i s komentáři jenže jsem to tolikrát přepisoval, že už jsem to tam nedopisoval a je to chyba které se budu snažit vyvarovat. Je mi jasné, že za půl roku bych asi nevěděl co jsem tim myslel.

:arrow_right: administrator: příspěvek byl upraven
Předchozí příspěvek se necituje!

  1. proměnné v časových smyčkách musí být deklarované jako volatile.
    Jinak optimizátor celou smyčku vyhodí, protože nedělá nic užitečného.

  2. chybí závorky kolem bloků “else”.

Takto to chodí

[code]void cekej(unsigned int doba){ //deklarace casove smycky
volatile unsigned int j;
for(j=0; j<doba; j++);
}

int main(void)
{

//ADCSRA=0xFF; ??
DDRC=0b00100000;
PORTC=0xFF;
pom=0;
doba=0;

while(1)

{
if(!pom)
{
if(doba > 1000)
pom=1;
else
{
for(pwm=0; pwm<3; pwm++)
{
PORTC = (1<<LED);
cekej(doba);
PORTC &= ~(1<<LED);
cekej(1000);
};

        doba += 5;								
        }
  
  }//if(!pom)										
		
     
  else
  {		
		if(doba<1)	
		pom=0;		
			else		
			{
           for(pwm=0; pwm<3; pwm++)
           {						
				PORTC = (1<<LED);				
				cekej(doba);
				PORTC &= ~(1<<LED);
				cekej(1000);
				};
			doba -= 5;
			}
  }

}//while

}//main
[/code]

Teď už je mi to jasný kde jsem udělal chybu. Děkuji moc. Mám se pořád co učit.

Jen pro info ADCSRA=0xFF; tam bylo jen proto, že jsem prve odstraňoval jinou chybu z důvodu víceúčelového vývodu jsem chtěl vypnout AD převodník a nastavit vývod pouze jako Out. Ale v tom problém nebyl. Já hlupák jsem si neuvědomil kdy jsem měl původní zápis DDRC=0b00000100; se čte zleva do prava a ne zprava doleva takže jsem měl LEDku připojenou na špatném vývodě, který byl definnován jako vstup a nefungovalo mi to vůbec.

Musim se vrhnout do AVRstudia a prokousat simulátor nebo poraďte jiný.