- Labornetzteil AliExpress         
Ergebnis 1 bis 3 von 3

Thema: Tastendruck

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    13.04.2008
    Beiträge
    34

    Tastendruck

    Anzeige

    Powerstation Test
    Hallo Leute,

    ich stehe gerade auf dem Schlauch!
    Vielleicht kann mir einer helfen.

    Folgendes Programm funktioiert:
    Code:
    //--------------------------------------------------------------
    // Interruptvector Overflow Timer2
    //--------------------------------------------------------------
    ISR(TIMER2_OVF_vect)
    {
        //------------------------------------------------
        // Systemfunktionen
        //------------------------------------------------
        TCNT2   = 0x64;     //Nachladen des Timer2 - Register 
        
        //------------------------------------------------
        //Taste abfragen
        //------------------------------------------------
     	byTaste = (PIND  & (1 << biD0_D2_Reserve));
    
    	//wurde Taste betätigt?
    	if (byTaste) 
    		PORTC |= (1<<boD0_C5_Reserve);
    	else  
    		PORTC &= ~(1<<boD0_C5_Reserve);
    }
    
    
    //-----------------------------------------------------------------------
    // Hauptprogramm
    //-----------------------------------------------------------------------
    int main(void)
    {
        init(); //Initialisierung
    
        //-----------------------------------------------------------------------
        // Hauptschleife
        //-----------------------------------------------------------------------
        while (1)
    	{
                 ;
            }
    }
    Wenn ich die Taste drücke, wird der Ausgang geschaltet - wenn ich loslasse, geht der Ausgang auf = 0.

    Dieser Code funktioniert nicht:
    Code:
    //--------------------------------------------------------------
    // Interruptvector Overflow Timer2
    //--------------------------------------------------------------
    ISR(TIMER2_OVF_vect)
    {
    
        //------------------------------------------------
        // Systemfunktionen
        //------------------------------------------------
        TCNT2   = 0x64;     //Nachladen des Timer2 - Register 
        
        //------------------------------------------------
        //Taste abfragen
        //------------------------------------------------
     	byTaste = (PIND  & (1 << biD0_D2_Reserve));
    }
    
    
    //-----------------------------------------------------------------------
    // Hauptprogramm
    //-----------------------------------------------------------------------
    int main(void)
    {
        init(); //Initialisierung
    
        //-----------------------------------------------------------------------
        // Hauptschleife
        //-----------------------------------------------------------------------
        while (1)
    	{
    
    		//wurde Taste betätigt?
    		if (byTaste) 
    			PORTC |= (1<<boD0_C5_Reserve);
    		else  
    			PORTC &= ~(1<<boD0_C5_Reserve);
        }
    }
    Da die Variable 'byTaste' global ist, muss der Zustand auch überall verfügbar sein. Aber es ist nicht nicht der Fall, der Ausgang wird nicht geschaltet.

    Der Fehler sitzt warscheinlich wieder zwischen meinen Ohren.

    Danke für jede Hilfe.

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    20.05.2006
    Ort
    Lippe
    Alter
    54
    Beiträge
    524
    Hallo,

    beide Programme funktionieren nicht. Es fehlen z.B. die Deklarationen und die Funktion init() gibt es auch nicht.

    Da meine Glaskugel wieder da ist, kann ich sie ja mal ausprobieren

    Sie sagt mir, ändere
    Code:
    uint8_t byTaste;
    in
    Code:
    volatile uint8_t byTaste;
    Bitte funktionsfähigen Code mit Copy and Past einfügen. Auch nicht abschreiben.

    Gruß

    Jens

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    13.04.2008
    Beiträge
    34
    Hallo Jens,


    die Funktion init() ist schon vorhanden,
    aber danke für den Hinweis, denn volatile war das Zauberwort.

    Jetzt funktioniert es!!
    volatile müssen alle globalen Variablen markiert werden, die in Interrupt-Handlern verwendet werden.
    Danke für die Hilfe!

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress