Hier also das Programm:

Code:
#include <stdint.h>
#include "asuro.h"
#include <stdlib.h>

static volatile uint8_t switched=0;

ISR(INT1_vect)
{
	StopSwitch();
	switched=1;
}

inline void msleep(uint16_t time)
{
	uint16_t i;
	for(i=time;i>0;i--)
		Sleep(72);
}

void write(char* text)
{
	uint8_t i=0;
	while((text[i]!='\0')&&(i<255))
		i++;
			
	SerWrite((unsigned char*)text,i);
}

void writeint(int16_t zahl)
{
	char text[7]={'\0'};
	itoa(zahl,text,10);
	write(text);
}


int main(void)
{
	Init();
	write("\n\rSchaltertest im Interruptbetrieb\n\r");
	
	while(1)
	{
		StatusLED(GREEN);
		
		StartSwitch();				//Interruptbetrieb starten
		while(switched==0);			//Wenn kein Schalter betätigt, dann mach nix
		
		StatusLED(RED);
		writeint(PollSwitch());		//gib Schalterwert aus
		write("\n\r");				//gib Zeilenumbruch aus
		msleep(500);				//warte...
		switched=0;					//switched zurücksetzen
	}	
}
Möglicherweise müsst ihr das Programm noch ein wenig anpassen, damits bei euch läuft. Ich hab einige Funktionen mit in den Code gepackt, die bei höheren Lib-Versionen (die ich nicht verwende, weil ichs lieber selber machen will) möglicherweise standarmäßig dabei sind.

Nun zu den Ergebnissen:

Wenn man die original PollSwitch()-Funktion verwendet passiert folgendes im Hyperterminal:
Code:
Schaltertest im Interruptbetrieb
1
0
0
4
0
0
0
0
2
0
0
0
Die innere while-Schleife wird gar nicht erst betreten, weil der Interrupt schon durch die StartSwitch()-Funktion ausgelöst wird. Damit wird PollSwitch ausgeführt, ohne das ein Schalter gedrückt wurde. Das erzeugt die vielen Nullen. Die anderen Zahlen stimmen jeweils mit der entsprechenden Taste überein.

Ersetzt man in der PollSwitch, das letzte SWITCH_OFF durch ein SWITCH_ON erhält man das gewünschte Ergebnis:
Code:
Schaltertest im Interruptbetrieb                                
1 
2 
4 
8 
16
32
32
32
16
8
4
2
1
Gruß farratt