Hier also das Programm:
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.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 } }
Nun zu den Ergebnissen:
Wenn man die original PollSwitch()-Funktion verwendet passiert folgendes im Hyperterminal:
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.Code:Schaltertest im Interruptbetrieb 1 0 0 4 0 0 0 0 2 0 0 0
Ersetzt man in der PollSwitch, das letzte SWITCH_OFF durch ein SWITCH_ON erhält man das gewünschte Ergebnis:
Gruß farrattCode:Schaltertest im Interruptbetrieb 1 2 4 8 16 32 32 32 16 8 4 2 1







Zitieren
Lesezeichen