- 3D-Druck Einstieg und Tipps         
Seite 3 von 3 ErsteErste 123
Ergebnis 21 bis 23 von 23

Thema: Asuro: PollSwitch im Interrupt betrieb

  1. #21
    Benutzer Stammmitglied
    Registriert seit
    23.08.2007
    Beiträge
    61
    Anzeige

    Praxistest und DIY Projekte
    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

  2. #22
    Erfahrener Benutzer Roboter Genie Avatar von m.a.r.v.i.n
    Registriert seit
    24.07.2005
    Ort
    Berlin
    Beiträge
    1.247
    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.
    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.

  3. #23
    Benutzer Stammmitglied
    Registriert seit
    23.08.2007
    Beiträge
    61
    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

Seite 3 von 3 ErsteErste 123

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress