Zitat Zitat von Sternthaler
So, da ich nicht weiß, ob dir diese Beschreibung überhaupt weitergeholfen hat, höre ich hier erst einmal auf. (Ist doch etwas aufwändig)
Wenn dir das aber helfen konnte, dann melde dich mal, und ich werde auch noch zu internen Interrupts (ADC, Timer) etwas schreiben.
Hallo Sternthaler,
deine Taster-Interrupt-Erklärung ist super!
gilt dein Angebot noch? Ich wäre dir sehr dankbar, wenn du mir die anderen Interrupts auch noch erklären würdest.

Ich habe jetzt mal zu Übungszwecken, um die Zusammenhänge zu begreifen, versucht ein kleines Programm zu schreiben, in das ich alle nötigen Funktionen etc. direkt eingebunden habe. Damit lässt sich die StatusLED schalten und der Tasterinterrupt geht auch.
Mein nächstes Ziel ist nun, nach der Tastergeschichte mit Hilfe von Timer2-Interrupt eine Wartezeit einzubauen, nach der die LED gelb leuchtet.
Kann es sein, das ich hierfür die "SIGNAL (SIG_OVERFLOW2)" ändern müsste?
Leider ist mir diese Funktion ziemlich unverständlich.
Code:
//----------------------------------------------------------------
//bitschiebereien und interrupts

#include <avr/io.h>
#include <avr/interrupt.h>

//----------------------------------------------------------------
// variablen in global.c definiert:
volatile int switched;              //für tasterinterrupt

volatile unsigned char count36kHz;  //für timer2 interrupt	
volatile unsigned long timebase;    //für timer2 interrupt

//----------------------------------------------------------------
// eigene variablen
volatile int zeit;                 //für timer2 interrupt
long i;	//fürs warten
//----------------------------------------------------------------
// Funktionen
//----------------------------------------------------------------
// warten
void warten(void)
{
  for(i=0;i<500000;i++);
}
//----------------------------------------------------------------
//Interruptfunktion taster in asuro.c
SIGNAL (SIG_INTERRUPT1) 
{
  switched = 1;
  GICR &= ~(1 << INT1);            // Externen Interrupt 1 sperren
}
//----------------------------------------------------------------
//taster interrupt einschalten
void StartSwitch (void)
{
  DDRD &= ~(1 << PD3);             // PD3 als Eingang
  PORTD &= ~(1 << PD3);            // PD3 auf LOW
  
  MCUCR &= ~((1 << ISC11) | (1 << ISC10)); // Low level erzeugt Interrupt
  GICR |= (1 << INT1);                     // Externen Interrupt 1 zulassen
}
//----------------------------------------------------------------
//taster interrupt ausschalten
void StopSwitch (void)
{
  GICR &= ~(1 << INT1);            // Externen Interrupt 1 sperren
}
//----------------------------------------------------------------
//timer2 interrupt einschalten
void TimerInit (void) // teil der init in asuro.c
	/*
    Timer2, zum Betrieb mit der seriellen Schnittstelle, fuer die
    IR-Kommunikation auf 36 kHz eingestellt.
  	*/
{
  TCCR2 = (1 << WGM20) | (1 << WGM21) | (1 << COM20) | (1 << COM21) | (1 << CS20);
  OCR2  = 0x91;                    // duty cycle fuer 36kHz
  TIMSK |= (1 << TOIE2);           // 36kHz counter
}
//----------------------------------------------------------------
//Interruptfunktion timer2 in asuro.c
SIGNAL (SIG_OVERFLOW2)
{
  TCNT2 += 0x25;
  count36kHz ++;
  if (!count36kHz)
    timebase ++;
#ifdef RC5_AVAILABLE
  if (enableRC5 && !(count36kHz % 8)) 
    IsrRC5(); // wird alle 222.2us aufgerufen
#endif  
}

//----------------------------------------------------------------
//----------------------------------------------------------------

int main(void)
{
	sei (); //Interrupts erlauben
	//cli (); //Interrupts verbieten

	//led vorbereiten
	DDRB |= (1<<PB0); // Datenrichtungsregister für LED-grün auf Ausgang
	DDRD |= (1<<PD2); // für rot auf ausgang
	
	//----------------------------------------------------------------
	// Ampel
	// grün
	PORTB |= (1<<PB0); // Ausgang für grün schalten
	warten();
	// gelb
	PORTD |=  (1<<PD2); // rot dazu einschalten
	warten();
	// rot
	PORTB &= ~(1<<PB0); // grün ausschalten
	warten();
	// aus
	PORTD &= ~(1<<PD2); // rot auschalten
	// Ampel Ende
	//----------------------------------------------------------------

	warten();
	warten();	

	//----------------------------------------------------------------
	// Taster Interrupt
	switched = 0;
	StartSwitch ();
	while (switched == 0)   // wenn kein taster gedrückt ist rot leuchten
	{
      PORTB &= ~(1<<PB0);   // grün ausschalten
	  PORTD |=  (1<<PD2);   // rot einschalten	
	}

	PORTB |= (1<<PB0);      // grün einschalten
	PORTD &= ~(1<<PD2);     // rot auschalten

	//switched = 0;
	//StartSwitch ();
	
	StopSwitch ();
	// Taster Interrupt Ende
	//----------------------------------------------------------------

	// und jetzt nach 1sek led gelb mit timer2 interrupt ?????????
	//----------------------------------------------------------------
	// timer2 Interrupt
	// zeit = 1;
	TimerInit ();
	if ( zeit == 1)
	{
	  PORTB |= (1<<PB0);    // grün einschalten
	  PORTD |=  (1<<PD2); 	// rot einschalten
	}	
	//----------------------------------------------------------------

	while(1);
	return(0);
}
Schöne Grüsse
M.