- LiTime Speicher und Akkus         
Ergebnis 1 bis 5 von 5

Thema: STK500 - Taster länger drücken -> Schneller hochzählen

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    17.09.2005
    Beiträge
    114

    STK500 - Taster länger drücken -> Schneller hochzählen

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo,

    zugegeben... Ich weiß nicht welchen Titel ich wählen soll

    Ich habe hier eine Aufgabe aus unserem Kurs bei der ich nicht so recht weiterkomme:

    Der Wert einer Variablen vom Typo unsigned int soll auf einem Display angezeigt werden. Mit 2 Tasten soll dieser Wert erhöht bzw. erniedrigt werden können.
    Kurzes drücken: +1 bzw. -1.
    Wird eine Taste etwas länger gedrückt soll sich der Wert mit einer gegebenen Frequenz in einerschritten verändern bis die Taste losgelassen wird
    Was ich machen soll ist mir (glaube ich ) klar.
    Ich verstehe jedoch nicht was mit dem fett-markierten Satz genau gemeint ist.
    Frequenz....
    Soll ich hier mit irgendeinem Timer arbeiten? - oder wie stellen sich die Herren das vor


    Mein Ansatz ist der folgende:


    Code:
     
    // includes etc.
    
    int main() {
       DDRC = 0xFF;
       lcd_init();
       unsigned int val = 0;
       while(1){
          lcd_setcursor(0, 0);
          lcd_putdez_uint(val);
          _delay_ms(100);
     
          while ((PINA) == 0xff);
     
          if (PINA & _BV(7)){
             val+=1000;
          }
          if (PINA & _BV(6)){
             val-=1000;
          }
          return 0;
       }
    }
    Danke im Voraus
    kesandal

  2. #2
    Erfahrener Benutzer Roboter Experte Avatar von BurningWave
    Registriert seit
    22.12.2007
    Ort
    nahe Stuttgart
    Alter
    29
    Beiträge
    656
    Mit Timern arbeiten ist immer gut, damit kannst du die Taste auch gleich entprellen. Ich hätte das einfach ungefähr so gemacht:

    while(1)
    {
    if(Taste1)
    var++;
    else if(Taste2)
    var--;

    _delay_ms(150);
    WertAnzeigen();
    }
    meine Homepage: http://www.jbtechnologies.de
    Hauptprojekte: Breakanoid 2 - Sound Maker

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.01.2006
    Beiträge
    4.555
    Zitat Zitat von Kesandal Beitrag anzeigen
    Hallo,

    zugegeben... Ich weiß nicht welchen Titel ich wählen soll

    Ich habe hier eine Aufgabe aus unserem Kurs bei der ich nicht so recht weiterkomme:



    Was ich machen soll ist mir (glaube ich ) klar.
    Ich verstehe jedoch nicht was mit dem fett-markierten Satz genau gemeint ist.
    Frequenz....
    Soll ich hier mit irgendeinem Timer arbeiten? - oder wie stellen sich die Herren das vor


    Mein Ansatz ist der folgende:


    Code:
     
    // includes etc.
    
    int main() {
       DDRC = 0xFF;
       lcd_init();
       unsigned int val = 0;
       while(1){
          lcd_setcursor(0, 0);
          lcd_putdez_uint(val);
          _delay_ms(100);
     
          while ((PINA) == 0xff);
     
          if (PINA & _BV(7)){
             val+=1000;
          }
          if (PINA & _BV(6)){
             val-=1000;
          }
          return 0;
       }
    }
    Danke im Voraus
    kesandal
    1:Wenn Taste gedrückt dann Wert = Wert +/- 1
    2: Wait xyz s, = Zählfrequenz
    3: Taste immer noch gedrückt dann bei 1 Weitermachen
    4: .......................

    Das wäre die einfachste Form, man kann das natürlich auch mittels Timer IRQ machen und dort die Taste abfragen. Man sollte aber darauf achten genügend Zeit für "einen" Tastendruck zu lassen, sonst zählt das immer gleich mehrmals . Vorteil des IRQ, der Prozessor kann nebenbei noch andere Aufgaben erledigen.

    Gruß Richard

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    49
    Beiträge
    2.253
    ich hab das gerade bei einem Projekt so gemacht:

    Tastenabfrag im Timer Int, der alle 10ms kommt.
    Wenn Taste gedrückt, dann werden beide Variablen hochgezählt, die erste bis 4, dann wird die Taste als gedrückt erkannt und der Tastenwert
    wird in eine globale Variable geschrieben. Die zweite Variable kann hoch bis 200 zählen, das sind dann 2 Sekunden, sprich die Taste lange gedrückt und es wird ebenfalls ein globales Flag gesetzt.
    Wird zwischendurch keine Taste als gedrückt gelesen werden beide Zählariablen auf 0 gesetzt, Das FLag gelöscht, der Tastenwert auf 0 und die
    Aufwärtszählerei beginnt beim nächsten Tastendruck von vorne.

    Dann habe ich in der Mainloop nur noch die Abfrage ob ein Tastenwert >0 da ist, wenn Tastenwert gesetzt, dann erhöhe / erniedrige um 1, wenn Langzeitflag gesetzt dann eben nochmal 3 dazu oder herunter.
    Vor den Erfolg haben die Götter den Schweiß gesetzt

  5. #5
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Eine Version für die bee:

    Code:
    #include <avr/io.h>
    #include <util/delay.h>
    #include "lcd_lib.c"
    
    #define taster_auf (lcd_getkeys()&1) // true wenn Taster gedrückt
    #define taster_ab  (lcd_getkeys()&2)
    
    uint16_t val = 0; // globale Variable für den Wert
    
    void lcd_put_val(void) // val auf LCD ausgeben
    {
    	// lcd_setcursor(0, 0);
    	// lcd_putdez_uint(val);
    	lcd_locate(0, 0);
    	lcd_writeInteger(val, 10);
    	lcd_writeString("  ");
    }
    
    int main(void) {
    
    	lcd_init();
    	lcd_writeString("Hello");
    	while(!taster_auf && !taster_ab);
    	lcd_cls();
    	while(taster_auf || taster_ab);
            lcd_put_val();
       
    	while(1)
    	{
    		if(taster_auf && !taster_ab && (val<999))
    		{
    			val++;
    			lcd_put_val();
    			_delay_ms(300); // Startdelay
    			while(taster_auf && !taster_ab && (val<995))
    			{
    				val+=5;
    				lcd_put_val();
    				_delay_ms(200); // Wiederholung
    			}
    		}
    
    		if(!taster_auf && taster_ab && (val>0))
    		{
    			val--;
    			lcd_put_val();
    			_delay_ms(300);
    			while(!taster_auf && taster_ab && (val>5))
    			{
    				val-=5;
    				lcd_put_val();
    				_delay_ms(200);
    			}
    		}
    	}
    	return 0;
    }
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

Ähnliche Themen

  1. toggle wenn länger wie
    Von voll-milch im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 7
    Letzter Beitrag: 17.01.2010, 21:39
  2. suche Bauteil das Druck ausübt um Tasten zu drücken
    Von flubbyeick im Forum Suche bestimmtes Bauteil bzw. Empfehlung
    Antworten: 8
    Letzter Beitrag: 10.03.2009, 00:08
  3. Taster / Schalter drücken
    Von pyrox im Forum Allgemeines zum Thema Roboter / Modellbau
    Antworten: 7
    Letzter Beitrag: 17.09.2008, 00:55
  4. Länger zurückfahren
    Von Lync im Forum Asuro
    Antworten: 13
    Letzter Beitrag: 24.07.2007, 21:39
  5. Abfragen aller 8 Taster am STK500, wie mach ich das?
    Von Edi im Forum C - Programmierung (GCC u.a.)
    Antworten: 5
    Letzter Beitrag: 09.11.2006, 16:15

Berechtigungen

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

LiFePO4 Speicher Test