Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

Re: String ausgeben Kategorie: Programmierung (von Udo - 28.03.2005 15:16)
Als Antwort auf Re: String ausgeben von Olaf - 27.03.2005 23:54
Ich nutze:
C-Control II Unit, C164CI-ControllerBoard, eigenes Board, OSOPT_V2
> > key = Taste();
> > if key > -1 and key ... usw.
> >
> > GruÃ?
> >
> > Udo
>
> Hallo Udo,
>
> danke für Deinen Tipp.
> Die Funktion Taste sieht so aus:
>
>
> function Taste () returns int
> {
> int u1, u2, key;
>     while (ports.adc(7)>900);
>     u1= ports.adc(7);
>     u2= ports.adc(7);
>     if (math.abs(u1-u2))< 4
>     {
>       if u1<901 key=3;//3
>       if u1<825 key=6;//6
>       if u1<755 key=9;//9
>       if u1<690 key=12;//#
>       if u1<620 key=2;//2
>       if u1<550 key=5;//5
>       if u1<480 key=8;//8
>       if u1<410 key=0;//0
>       if u1<335 key=1;//1
>       if u1<270 key=4;//4
>       if u1<190 key=7;//7
>       if u1<110 key=11;//*
>       if u1>1000 key=-1;
>     }
>     return key;
> }
>

>
> Das habe ich schon probiert, was Du mir geschrieben hast. Leider funktioniert es auch nicht !?
>
> Wie würdest Du denn solch ein Problem angehen?
>
> Danke!
>
> MfG
>
> Olaf

Hallo,

Du machst mehrere prinzipielle Fehler.
Zunächst darfst Du in Deinem Hauptprogramm die Funktion Taste nur 1 mal aufrufen und dann nur
noch die zugewiesene Variable benutzen wie oben beschrieben. Andernfalls machst Du 4 Tastatur-
abfragen in Folge und alle 4 müssten ein identisches Ergebnis liefern, damit der Programmablauf
Sinn macht.

Die Funktion Taste hat auch so ihre Probleme. Das erste ist, die Funktion wird nie mehr verlassen,
wenn keine Taste gedrückt wird (kann aber auch Absicht sein). Danach fragst Du 2 mal den AD-
Wandler ab und vergleichst die beiden Werte. Aber was, wenn die Differenz eben nicht kleiner als
4 ist? Dann wird key zurückgeliefert ohne dass jemals ein Wert zugewiesen wurde. Da diese Abfrage
sehr schnell geht, ist die Wahrscheinlichkeit, dass dies geschieht sogra recht hoch. Du musst sicher-
stellen, dass der AD-Wandler solange abgefragt wird, bis die Differenz kleiner 4 ist und erst danach
darfst Du den Wert zuordnen.

Weiterhin kann es Sinn machen, die Funktion Taste() erst dann wieder zu verlassen, wenn die Taste
losgelassen wurde. So können auf einfache Weise fehlerhafte Doppeleingaben vermieden werden. Bei
normaler Betätigung einer Taste ist diese Verzögerung kaum spürbar.

Hier ein Beispiel aus der mitgelieferten CD. Da sich das Beispiel auf die Station bezieht, sind die
AD-Werte nicht mit Deinen vergleichbar, aber ich denke das Funktionsprinzip ist erkennbar.

int keycode; muss global definiert sein.

 
/*HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH*/
/*HHHHHHHHHH      KEYBOARD DECODER AND UTILITIES        HHHHHHHHHH*/
/*HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH*/
/* NOMINAL ADC READINGS:                                          */
/* 1=264  2=329  3=394  4=459  5=524  6=590 7=655 8=788 9=721     */
/* 0=855  CLEAR=923  ENTER=992  F1=67  F2=133 F3=196              */
/******************************************************************/

/***********************************/
/* Get single Key #                */
/***********************************/
function getkey()returns int
{
int adcval;
int oldval;
  if ports.adc(7)< 32 {keycode=255;return keycode;}
// let the adc value get stable
  oldval=0;
  while math.abs(oldval-ports.adc(7))>10
  {oldval=ports.adc(7);sleep 20;}
// decode the pressed key
  adcval=ports.adc(7);
  if adcval>32 {keycode=10;}//F1   -  67
  if adcval>98 {keycode=11;}//F2   - 134
  if adcval>161 {keycode=12;}//F3  - 200
  if adcval>229 {keycode=1;} //    - 264
  if adcval>294 {keycode=2;} //    - 330
  if adcval>359 {keycode=3;} //    - 395
  if adcval>424 {keycode=4;} //    - 461
  if adcval>489 {keycode=5;} //    - 526
  if adcval>555 {keycode=6;} //    - 592
  if adcval>620 {keycode=7;} //    - 657
  if adcval>686 {keycode=9;} //    - 727
  if adcval>753 {keycode=8;} //    - 790
  if adcval>820 {keycode=0;} //    - 858
  if adcval>888 {keycode=13;}//CLEAR - 926
  if adcval>957 {keycode=14;}//ENTER - 996
  return keycode;
}
//----------------------------------
//----  WAIT FOR KEY RELEASE--------
//----------------------------------
function wait_for_release()
{
     while keycode != 255
     {keycode=getkey();}
}



    Antwort schreiben


Antworten: