- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 10 von 20

Thema: ATTiny13A Schalter abfragen/entprellung mit Variablen

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    10.06.2014
    Beiträge
    9

    Frage ATTiny13A Schalter abfragen/entprellung mit Variablen

    Hallo liebe Community!

    Seit einigen Tagen bin ich "stiller" Leser hier und habe mir schon einige Tipps und Anregungen geholt

    Leider sitze ich noch immer an einem kleinen Problem:

    Ich habe einen ATTiyn13A auf einem Versuchsboard aufgebaut. Als Programm nutze ich das AtmelStudio 6.1

    -Die Anschlüsse PB0 und PB1 sind jeweils mit einer LED verbunden.

    -Die Anschlüsse PB3 und PB4 jeweils mit einem Taster der mit der anderen Seite auf GND liegt.

    Das Endergebnis soll einmal so Aussehen das eine gewisse Reihenfolge und Häufigkeit einiger Taster gedrückt werden muss um z.B. eine Segmentanzeige zu Aktivieren. (Klar das der Tiny13 da schnell ausgelastet ist mit Ports aber ich habe auch noch einen 2313A da. Der Tiny13 ist erstmal für den Test gedacht)

    Z.B. wenn Taster 1 5mal betätigt wurde und danach Taster 2 3mal soll auf der Segmentanzeige eine 8 aufleuchten.


    Angefangen habe ich mit einem Taster der wenn er gehalten wurde eine LED leuchten lies. Dies funktionierte auch.

    Wenn ich jedoch statt der LED eine Variable hochzählen will und zb wenn die Variable 5 erreicht die LED anschalten soll geht sie gar nicht an. Egal wie schnell oder häufig man die Taste drückt.

    Dann habe ich versucht mit jedem Tastendruck die LED zu invertieren. dh. 1.Druck an, 2.Druck aus usw... Jetzt geht die LED allerdings mal an und mal wieder aus, mal bleibt sie einfach an... Sehr unkontrolliert...

    Da habe ich an eine Entprellung gedacht die wie unten eingebaut ist. Jedoch flackert die LED jetzt nur währen die Taste gedrückt ist und die Schaltzustände sind weiterhin sehr unkontrolliert....

    Vielleicht kann mir jemand einen Denkanstoß geben?

    Hier das aktuelle Programm:
    Code:
    /*
     * LED_Anzeige.c
     *
     * Created: 18.05.2014 19:27:56
     *  Author: Dennis
     */ 
    #define F_CPU 9000000UL
    #include <util/delay.h>
    #include <avr/io.h>
    
    unsigned char Taster1;
    unsigned char Taster2;
    
    void entprellung( volatile uint8_t *port, uint8_t maske ) {
    	uint8_t   port_puffer;
    	uint8_t   entprellungs_puffer;
    	
    	for( entprellungs_puffer=0 ; entprellungs_puffer!=0xff ; ) {
    		entprellungs_puffer<<=1;
    		port_puffer = *port;
    		_delay_us(150);
    		if( (*port & maske) == (port_puffer & maske) )
    		entprellungs_puffer |= 0x01;
    	}
    }
    
    
    int main (void)
    {
    	DDRB=0x03; //Ein /Ausgänge ;
    	PORTB = 0x18; //Pullup aktivieren (PB3+PB4)
    	Taster1 = 0;
    	Taster2 = 0;
    	while(1)
    	{
    		entprellung( &PINB, (1<<PINB3) ); // ggf. Prellen abwarten 
    		if(!(PINB & (1 << PB3)))
    		{
    			Taster1++;
    			PORTB^=0x02;  //PB1 invertieren
    			
    		}
    		entprellung( &PINB, (1<<PINB4) ); // ggf. Prellen abwarten 
    		if(!(PINB & (1 << PB4)))
    		PORTB^=0x01; //PB0 invertieren
    		//PORTB&=~(1<<PB0);	//PB0 ausschalten
    	}
    }
    Vielen Dank für eure Mühe im Voraus!

    Gruß
    Dennis
    Geändert von Denn Is (10.06.2014 um 23:22 Uhr) Grund: Code überarbeitet

  2. #2
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.653
    Hallo Dennis, willkommen im Forum!
    ... Vielleicht kann mir jemand einen Denkanstoß geben? ...
    Zuerst kurz und schnell zum Problem (bei mir kommen Prellprobleme ohne Entprellen fast nicht vor - seltsam). Eine pfiffige Lösung zum Entprellen ist es, die Taste mehrfach abzufragen (vielleicht quick´n-dirty ...) :

    if ( (taste-an) || (taste-an) || (taste-an) ) { irgendwas(); }
    das steht irgendwo in den Tiefen des Forums als :
    while((PollSwitch() == 0) || (PollSwitch() == 0) || (PollSwitch() == 0))

    So ne Lösung läuft auf meinem Pacer total problemlos - der Pacer hatte anfangs auch nen tiny13.

    Noch ein bisschen wie ich mir die Tastenbedienung zurecht gestrickt habe :
    Code:
    // ...
      #define IsBitSet(ADDR,BIT)     (((ADDR)  &  (1<<BIT))?1:0)    // Fragt Bit = 1?
      #define IsBitClr(ADDR,BIT)     (!((ADDR)  &  (1<<BIT))?1:0)   // Fragt Bit = 1?
    // ...
      #define PrtTAST       PIND    //
      #define Tst_1            6    //
      #define Tst_2            7    //
    // ...
      #define Taste1_an     IsBitClr (PrtTAST, Tst_1)       // Taster 1 gedrückt ??
      #define Taste1_aus    IsBitSet (PrtTAST, Tst_1)       // Taster 1 gelöst ??
      #define Taste2_an     IsBitClr (PrtTAST, Tst_2)       // Taster 2 gedrückt ??
      #define Taste2_aus    IsBitSet (PrtTAST, Tst_2)       // Taster 2 gelöst ??
    //... oder mit Buchstaben (verwende ich mittlerweile bei Tasten lieber) :
      #define TasteA_an     IsBitClr (PRTtstLCD, Tst_A)     // Taster A gedrückt ??
      #define TasteA_aus    IsBitSet (PRTtstLCD, Tst_A)     // Taster A gelöst ??
      #define TasteB_an     IsBitClr (PRTtstLCD, Tst_B)     // Taster B gedrückt ??
      #define TasteB_aus    IsBitSet (PRTtstLCD, Tst_B)     // Taster B gelöst ??
    // ... und das geht NOCH deutlich kürzer in dieser Form :
      #define TAan          IsBitClr (PRTtstLCD, Tst_A)     // Taster A gedrückt ??
      #define TAaus         IsBitSet (PRTtstLCD, Tst_A)     // Taster A gelöst ??
      #define TBan          IsBitClr (PRTtstLCD, Tst_B)     // Taster B gedrückt ??
      #define TBaus         IsBitSet (PRTtstLCD, Tst_B)     // Taster B gelöst ??
    // - - - - - - - - - - - - - - -
    // Da dies keine Funktion ist, erfolgt der Aufruf so (NUR beispielsweise) :
    // - - - - - - - - - - - - - - -
    // ...
        if ( TAan ) off = 99;   // Taste A gedrückt ?? Ausgangsflag setzen
        while ( TAan ) {}       // Weiter nur mit gelöster Taste
        if ( off == 99 )            //
        {                           //
          off       = 0;            //
          break;                    //
        }                           //
    Hoffentlich hilfts Dir bei Deiner Tastendrückerei.

    Nachtrag: Dein 150µs-wait für die Entprellung ist schon ok, beim Tastendrücken hat der Controller sozusagen alle Zeit der Welt. Ich orientiere mich bei Mehrfach-Tastendruck am Zeitschema meiner TV-IR-Fernbedienungen. Die senden bei gedrückter Taste etwa alle 100ms - 150ms (MILLI-) ein Signal, wenn man mehrere, unterschiedliche Tasten drückt werten die auch ein Toggelbit aus (wurde die Taste zwischendurch gelöst?) und lassen einem z.T über zwei Sekunden Zeit für ein Mehrfachtasten-Telegramm.
    Geändert von oberallgeier (11.06.2014 um 09:18 Uhr) Grund: Nachtrag: Pausen- und andere Zeiten (Tastenhaptik)
    Ciao sagt der JoeamBerg

Ähnliche Themen

  1. Attiny13a RS232
    Von flecralf im Forum C - Programmierung (GCC u.a.)
    Antworten: 1
    Letzter Beitrag: 09.10.2013, 18:27
  2. Variablen ändern sich durch Berechnung anderer Variablen
    Von Amri im Forum C - Programmierung (GCC u.a.)
    Antworten: 0
    Letzter Beitrag: 03.05.2013, 17:30
  3. Kann Schalter nicht abfragen
    Von Icon2k im Forum C - Programmierung (GCC u.a.)
    Antworten: 4
    Letzter Beitrag: 30.07.2010, 17:51
  4. Entprellung
    Von wolfshund im Forum Microcontroller allgemeine Fragen/Andere Microcontroller
    Antworten: 2
    Letzter Beitrag: 08.05.2007, 20:21
  5. Entprellung
    Von djdune im Forum Elektronik
    Antworten: 9
    Letzter Beitrag: 10.06.2004, 21:49

Stichworte

Berechtigungen

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

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad