Zitat Zitat von Wsk8
Du solltest noch bedenken, dass solche delay-befehle und so bei zu großen werten etwas ungenau werden. Über 5-6s solltest du nicht nehmen. Bei diesen Anwendungen zwar nicht dramatisch, aber wenn es mal genau gehen soll, doch ein wichtiger Faktor.
Sobald ich Interrupts kann, werde ich das mit Timer-Interrupt und sleep ergänzen.
Ist bereits auf eine Lochrasterplatine gelötet, der Chip steckt nur im Sockel - also gut ergänzbar

Ich denke, ich poste das mal, falls weiter Anfänger nach einem Demoprogramm suchen

Code:
//----------------------------------------------------------------------
#define 	F_CPU 1000000	// Taktfrequenz des myAVR-Boards
#include	<avr\io.h>		// AVR Register und Konstantendefinitionen
//----------------------------------------------------------------------
uint16_t weckton () 
{

	int i=0;

	for (i; i<3000; i++)
	{
		PORTB=PORTB|(1<<PB2); // us = mikrosekunden ; 200us -> 5000Hz
		waitMs(0.8);
		PORTB=PORTB&(~(1<<PB2));
		waitMs(0.8);

	}
	waitMs(70);

	for (i; i<3000; i++)
	{
		PORTB=PORTB|(1<<PB2); // 200us -> 5000Hz
		waitMs(1);
		PORTB=PORTB&(~(1<<PB2));
		waitMs(1);

	}

	waitMs(50);

	for (i; i<2000; i++)
	{
		PORTB=PORTB|(1<<PB2); // us = mikrosekunden ; 200us -> 5000Hz
		waitMs(1.5);
		PORTB=PORTB&(~(1<<PB2));
		waitMs(1.5);

	}

	return 0; 
}

main ()						
{
	DDRB=0b11110110;
	PORTB=0b00011001;
	waitMs(500);
	PORTB=PORTB&(~(1<<PB4));

	while(true)   // wichtig, dass Controller mehrmals if-abfragt!!!
	{

		if(!(PINB&(1 << PB0)))     // Wenn Taster1 gedrückt, dann
		{
			PORTB=PORTB|(1<<PB1);  // Status-LED: 2 min

			for (int j=0; j<24;j++)    //24* 5sek = 2Min (*10=20 min)
			{
				waitMs(6000);     // 1000ms *60 sek -> min -> *2 min (6sek  ~ 5sek laut AVR)
				// waitms schafft nur 64K Zyklen, je nach Taktung zb. 30 sek -> Schleife
			}

			while (true)
			{
				weckton (); 
			}

		}

		if(!(PINB&(1 << PB3)))     // Wenn Taster3 gedrückt, dann
		{
			PORTB=PORTB|(1<<PB4); // Status-LED: 5 min

			for (int g=0; g<60;g++)    //600* 5sek = 50Min (60*5 = 5 min)
			{
				waitMs(6000);     // 1000ms *60 sek -> min -> *20 min (6sek  ~ 5sek laut AVR)
				// waitms schafft nur 64K Zyklen, je nach Taktung zb. 30 sek -> Schleife
			}

			while (true)        //5 min
			{
				weckton (); 
			}

		}

	}
}

Danke, Micha

Mfg