PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : STK500 - Taster länger drücken -> Schneller hochzählen



Kesandal
17.06.2011, 10:43
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 :D ) 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 :D


Mein Ansatz ist der folgende:





// 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

BurningWave
17.06.2011, 11:01
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();
}

Richard
17.06.2011, 11:21
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 :D ) 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 :D


Mein Ansatz ist der folgende:





// 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

Vitis
17.06.2011, 11:40
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.

radbruch
17.06.2011, 12:59
Eine Version für die bee:


#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;
}