Guten Tag Leute!

Hab mich lange um die Interrupts gedrückt, aber irgendwie will ichs heut
wissen, und die Dinger nun endlich angehn.

Es würde mich freuen, wenn hier ein kleines aber feines Tutorial entsteht. Betonung liegt auf klein und fein.

Zunaechst mal wo liegt ueberhaupt mein Problem/was ist mein Stand?:
Hab nun so weit im Atmega8 Datenblatt gewühlt und folgendes zusammengetragen:

Code:
//Wissenswertes zu Interrupts auf AVRs: 
//   Global Interrupt Enable I-Bit im GICR Register ist normalerweise LOW wenn Interupt ausgeführt wird
//   Interrupts haben zwar eine Priorität, können sich aber normalerweise nicht gegenseitig unterbrechen
//   Interrupt Schachtelung mittels manuellem I-Bit setzen möglich
//   Information im Statusregister SREG geht bei Interruptausführung verloren wenn man nicht sorgetraegt
//   Befehle: _SEI() = Set I Bit - Aktiviert Interruptfaehigkeit
//            _CLI()= Clear I Bit - Schaltet Interruptfaehigkeit aus
//            _SLEEP() = uC geht in den Sleep Modus und wartet auf naechsten Interrupt
Auch die Intterruptvektortabelle des Atmega 8 (auf Seite 44) ist mir ins Auge gestochen. Gut so weit. Was ich nun aber nicht gefunden habe, ist
wo /wie schreibe ich nun eine ISR für einen Interrupt???

Prinzipiell sollte es ja so gehen wie bei folgendem Programmbeispiel - einem RS232 Mirror:
Code:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>

#define SYSCLK		7372800
#define BAUD		38400UL
#define UBRR_BAUD	((SYSCLK/(16*BAUD))-1)

/* USART initialisieren */
void uart_init(void);


int main(void)
{
	/* USART initialisieren */
	uart_init();

	sei();

	/* Nichts tun. Die Interrupts erledigten den Rest */
	while (1)
		;
}

void uart_init(void)
{
	/* Baudrate einstellen ( Normaler Modus ) */
	UBRRH = (unsigned char) (UBRR_BAUD>>8);
	UBRRL = (unsigned char) UBRR_BAUD;

	/* Aktivieren des Empfängers, des Senders und des "Daten empfangen"-Interrupts */
	UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);

	/* Einstellen des Datenformats: 8 Datenbits, 1 Stoppbit */
	UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
}

/* Interrupt wird ausgelöst sobald neue Daten im USART-Empfangspuffer liegen */
SIGNAL(SIG_UART_RECV)
{
	unsigned char buffer;

	/* Daten aus dem Puffer lesen ... */
	buffer = UDR;

	/* ... warten bis der Sendepuffer leer ist ... */
	while ( !( UCSRA & (1<<UDRE)) )
		;
	/* ... und gleich wieder zurück schicken */
	UDR = buffer;
}
Aber woher weiß ich bzw. der Verfasser dieses Codes das der Interrupt ausgerechnet SIG_UART_RECV heißt? Dazu habe ich weder im Datenblatt noch sonst wo was gefunden.

Wär super, wenn mir da jemand auf die Sprünge helfen könnte!

Vielen Dank schon mal im Voraus !

uC