PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : M32 ADC Werte bereich definieren



copcom-weber
14.07.2010, 08:50
Und zwar

bekomme ich Werte, die um 1 bis 2 schwanken (also 256 und 255) an meinem M32 ADC-Kanal von meiner Tastaturmatrix und möchte diese Werte dann direkt angezeigt bekommen(welche Taste es nun ist)
Ist das so möglich oder muss ich immer über if, else if ... die Wertebereiche wie (264<adc2&&adc2<268) abarbeiten?

RobbyMartin
15.07.2010, 11:44
ja genau das sollte funktionieren probieren geht über studieren ;)

if (ad>255&&ad<256){

blaaaabla....

}

lg Martin

copcom-weber
15.07.2010, 13:44
gibt es denn keine andere möglichkeit als das so abzuarbeiten?

radbruch
15.07.2010, 14:27
Hallo

Vielleicht könnest du die niederwertigsten Bits einfach ignorieren: if((ad/2) == xxx) oder if((ad/4) == xxx)

(Dann könntest du allerdings auch gleich linksbündige 8-Bit-Werte einlesen)

Wieviele Tasten und welche Werte hast du denn?

Gruß

mic

copcom-weber
15.07.2010, 14:50
ignorieren geht nicht da ich 180 ,200, 230, 280, 300,370, 440, ... 920 habe.

habe ne 3x4 matrix von 0-9,*,# also 12

radbruch
15.07.2010, 15:09
So vielleicht:


#define tastentoleranz 5
int adc2;
// 180 ,200, 230, 280, 300,370, 440, ... 920

if(adc2 < (180-tastentoleranz))
{
// Taste 1
}
else if(adc2 < (200-tastentoleranz))
{
// Taste 2
}
else if(adc2 < (230-tastentoleranz))
{
}
else if(adc2 < (280-tastentoleranz))
{
}
else if(adc2 < (300-tastentoleranz))
{
}
// ...
else if(adc2 < (920-tastentoleranz))
{
// Taste x
}

copcom-weber
15.07.2010, 16:47
ja so in der art habe ich das ja auch schon gemacht also geht das wohl nur so.
habe es in eine funktion mit rückgabewert gemacht und kann somit programme auswählen oder zahlen eingeben.

nagut. trotzdem danke

Richard
15.07.2010, 20:51
Hmm, ich weiß jetzt nicht genau ob ich das Problem richtig
verstanden habe, aber zumindest das letzte Digit wird immer
"waggeln", das ist in der Digital Technik bekannt und kann
auch nicht verhindert werden. Man kann höchstens einen besseren
ADC mit z.B. 14 Bit Auflösung nehmen und überschüssige Bits
abschneiden /wegfallen lassen. Das LSB wird immer schwanken...

Das kommt daher das die digitale Darstellung Genau genommen
keine Nachkomma Stellen kennt , Darstellen kann. es gibt halt nur
1 oder 0, kein halb an/aus. Ab eines gewissen Analog Wert kann
der Wandler nicht mehr zwischen AN/AUS..H/L unterscheiden und
wechselt dann je nach einfallender "Störgröße" den Pegel.

Gruß Richard

copcom-weber
16.07.2010, 09:13
ja das mit dem digit war mir klar.
hatte mich nur gefragt ob man direkt über "# define ..." einen bereich angeben kann. weil
"# define hallo 5" soetwas geht ja aber sowas wie
"# define hallo 3-6"? ist das möglich?

und noch was kleines am rande?
die adc kanäle kann man als I/O ports benutzen aber nicht anders rum oder?

Hubert.G
16.07.2010, 11:35
Ein ((Hallo >=3) && (Hallo <=6)) sollte schon gehen. Da müssen beide Bedingungen Wahr sein.

Beim M32 geht nur der PortA als ADC aber auch als I/O.

copcom-weber
16.07.2010, 12:32
habe das nun folgendermaßen gemacht:


int tastenfeld(void)
{
nummer=0;
numer=nummer;
i=0;
flag=1;
do{
adc2 = readADC(ADC_2);
mSleep(10);
adc2a = readADC(ADC_2);
mSleep(10);
adc2b = readADC(ADC_2);
adc=adc2+adc2a+adc2b;
adc=adc/3;
if (nummer>numer)
{
nummer=nummer*10;
numer=nummer;
}
setCursorPosLCD(0,i+9);
if(adc2>262&&adc2<266)
{
writeStringLCD("3");
nummer=nummer+3;
num[i]=3;
i=i+1;
mSleep(300);
}
else if(adc2>282&&adc2<286)
{
writeStringLCD("6");
nummer=nummer+6;
num[i]=6;
i=i+1;
mSleep(300);
}
else if(adc2>302&&adc2<306)
{
writeStringLCD("9");
nummer=nummer+9;
num[i]=9;
i=i+1;
mSleep(300);
}
else if(adc2>324&&adc2<328)
{
flag=0;
}
else if(adc2>361&&adc2<365)
{
writeStringLCD("2");
nummer=nummer+2;
num[i]=2;
i=i+1;
mSleep(300);
}
else if(adc2>400&&adc2<404)
{
writeStringLCD("5");
nummer=nummer+5;
num[i]=5;
i=i+1;
mSleep(300);
}
else if(adc2>443&&adc2<447)
{
writeStringLCD("8");
nummer=nummer+8;
num[i]=8;
i=i+1;
mSleep(300);
}
else if(adc2>490&&adc2<494)
{
writeStringLCD("0");
nummer=nummer*10;
num[i]=0;
i=i+1;
mSleep(300);
}
else if(adc2>552&&adc2<556)
{
writeStringLCD("1");
nummer=nummer+1;
num[i]=1;
i=i+1;
mSleep(300);
}
else if(adc2>647&&adc2<651)
{
writeStringLCD("4");
nummer=nummer+4;
num[i]=4;
i=i+1;
mSleep(300);
}
else if(adc2>765&&adc2<769)
{
writeStringLCD("7");
nummer=nummer+7;
num[i]=7;
i=i+1;
mSleep(300);
}
else if(adc2>918&&adc2<921)
{
if(i==0)
{
clearPosLCD(0,i+9,1);
}
else
{


i=i-1;
nummer=nummer-num[i];
clearPosLCD(0,i+9,1);
}
mSleep(200);
}
}while(flag==1);
sound(100,100,50);
nummer=nummer/10;
clearPosLCD(0,9,i);
return nummer;
}

# zum bestätigen und
* um zu löschen.

habe aber probleme wenn ich die 0 eingebe dann spuckt der immer ganz komische werte aus.
und wenn ich bei einer 4 stelligen zahl die letzte ziffer lösche gibt er am ende nur 2 ziffern aus auch wenn ich die 4 durch eine andere ersetzt habe
(wenn ich 1564 eingebe, 4 lösche und dafür eine 2 mache also 1562 gibt er nur 15 zurück)

wkrug
16.07.2010, 13:43
Eventuell ginge es auch über eine switch / case Anweisung ?!


switch (ad)
{
case >3&&<6:
//Eine Routine
break;

case >6&&<9:
//Eine andere Routine
break;

default:
//Keine Bedingung erfüllt
};