-
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
-
Hallo faratt,
hat leider eine Weile gedauert, aber jetzt konnte ich mich deinem Problem etwas näher widmen. Deine Lösung funktioniert zwar, aber es sollte etwas anders gelöst werden. Der Fehler steckt wie du schon richtig erkannt hast, in der PollSwitch Funktion.
RN-User thowil hatte mich schon vor über einem Jahr auf den Fehler hingewiesen und mir eine funktionierende Lösung geschickt. Leider habe ich die wohl irgendwie verschlampt. :oops:
Schande über mich.
So geht es richtig:
Code:
DDRD |= SWITCHES; // Port-Bit SWITCHES als Output
SWITCH_ON; // Port-Bit auf HIGH zur Messung
i = ReadADC(SWITCH, 10);
DDRD &= ~SWITCHES; // Port-Bit SWITCHES als Input
SWITCH_OFF; // Port-Bit auf LOW (PullUp abschalten)
Der Port Bit muß am Ende der Funktion wieder auf Eingang geschaltet werden. Diese Zeile fehlte.
-
Cool!
Sobald ich wieder Zugriff auf meinen Asuro habe, werd ichs mal ausprobieren.
Wird die Sache dann im nächsten Lib-Release geändert?
Gruß farratt