PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit Tastern bei Asuro -> leifern falsche Werte



Froschi
10.01.2007, 19:43
Hallo zusammen,
Ich habe heute meinen Asuro fertiggesellt und er funktioniert eigentlich auch ganz gut, nur manche taster liefern aus irgend einem grund falsche Werte. Ich hab schon hier im Forum gesucht, allerdings nichts gefunden, was auf mein Problem passt. Ich hab bereits die modifizierte Asuro.c von RoberNetz runtergeladen und eingebunden, dadurch wurde ein Fehler behoben.
Nun aber zu meinen Fehlern:
Taster3: 6 anstatt 4 -> Kurzschluss mit Taster2? Wenn ja, wo kann dieser Kurzschluss entstehen?
Taster4: liefert 7 statt 8 wenn davor nicht Taster5 gedrückt wurde.
Taster6 liefert 31 statt 32 wenn davor nicht Taster5 gedrückt wurde.

Außerdem glaub ich (weiß ich noch nicht ganz genau), dass bei mir der linke Motor, wenn er eineschaltet wird, ein signal eines Tasters sendet.
Vielen Dank schonmal im Voraus
Grüße Martin

Downad
10.01.2007, 20:34
hallo,


schau mal im forum -->suchen hilft! [-(

tipp:
SUCHEN -->Suchabfrage == taster

===> ca. 40 Treffer seit dezember 06

----
die taster werden über den analog wandler am asuro betrieben ausgewertet (bitte verbessert mich fals ich was falsches sage)

durch die toleranz der widerstände
durch den Kondensator c7
durch keine ahnung was alles (Lötzinn menge, leiterbahn, wetter, wochentag, monstellung und so weiter =P~ )

treten machmal [ hihi ] bei der Tasterabfrage unsauberkeiten auf.

gruß
downad

radbruch
10.01.2007, 20:38
Hallo

Hier der betreffende Ausschnitt aus der asuro.c:

unsigned char PollSwitch (void)
{
unsigned int i;
int ec_bak=autoencode;
autoencode=FALSE;
DDRD |= SWITCHES; // Switches as Output
SWITCH_ON; // Output HIGH for measurement
ADMUX = (1 << REFS0) | SWITCH; // AVCC reference with external capacitor
Sleep(10);

ADCSRA |= (1 << ADSC); // Start conversion
while (!(ADCSRA & (1 << ADIF)));// wait for conversion complete
ADCSRA |= (1 << ADIF); // clear ADCIF
i = ADCL + (ADCH << 8);

SWITCH_OFF;
Sleep(5);
autoencode=ec_bak;
//return ((unsigned char) ((( 1024.0/(float)i - 1.0)) * 61.0 + 0.5));
//return ((10240000L/(long)i-10000L)*61L+5000L)/10000;
return ((10240000L/(long)i-10000L)*63L+5000L)/10000;
}

Mit der letzten Zeile werden die Tasterwerte "kallibriert". Bei mir gilt die letzte Zeile, mit der vorletzten hatten meine Taster die Werte 1,2,4,7,15,31. Richtig ist 1,2,4,8,16,32. Die Werte müssen zusammen 63 ergeben sonst funzt es nicht!

Gruß

mic

Mucki
10.01.2007, 22:45
Hi,

wie auch im Forum zu finden, sollte man den Kondensator komplett entladen. Durch mehrmaliges aufrufen der PollSwitch() Funktion kannst du dies erreichen. 5-7 mal reicht in aller Regel aus. Das geht natürlich auf die Geschwindigkeit deiner Programme, wenn du das häufig machst.

FYI,
Mucki

Froschi
10.01.2007, 23:26
Danke für die Antworten, die Kalibrierung hat funktioniert.
Mein größeres Problem ist aber, dass ich nicht weiß an welcher Stelle ich mit dem Suchen nach dem Kurzschluss (sollte es denn einer sein) anfangen sollte, welcher den dritten Taster dazu veranlasst, immer die 6 statt der 4 zu melden.
MfG Froschi

radbruch
11.01.2007, 00:40
Hallo


die Kalibrierung hat funktioniert
Das freut mich und bestätigt meine Meinung über die meisten Tastenprobleme hier im Forum.

Hier (http://home.planet.nl/~winko001/Asuro/Info/AsuInfPagFrm.htm) gibts eine klasse Doku zu den Tastern und den Messwerten für die Widerstände.




Durch mehrmaliges aufrufen der PollSwitch() Funktion kannst du dies erreichen
Das erreicht man auch so:
sw0=PollSwitch(); // Schalter einlesen und für eine Runde speichern
sw1=PollSwitch();
sw2=PollSwitch();
if ((sw0==sw1) && (sw0==sw2)) sw=sw0; else sw=0;

Man erkennt, hier werden die Taster dreimal eingelesen UND dann werden die Werte auf Gleichheit überprüft bevor sie als gültig akzeptiert werden. Elegant und funktionell..

Demo-Code für Funktion und Geschwindigkeit möchte ich euch nicht zumuten *grins*

Gruß

mic

damaltor
11.01.2007, 15:15
wenn das dein problem noch nicht behoben hat, dann schau mal in die anleitung; recht weit am ende ist ein schaltplan der asuro platine. da siehst du, was alles wo angeschlossen gehört und wo evtl der kurzschluss liegen könnte.

Froschi
11.01.2007, 16:29
Also ich bin nun etwas weiter gekommen:
Ich erhalte, wenn ich K4 drücke, die 6, wenn ich aber K4 zusammen mit K5 drücke aber nicht ebenfalls die 6 sondern die 8. Wenn ich das richtig verstanden habe, dann rechnet der A/D-Konverter doch Spannungen in Bitfolgen. Ist es möglich, dass es sich nicht um einen Kurzschluss handelt, sondern eigentlich eher der Widerstand bei K4 etwas //edit: kleiner (ist, als er sein sollte?

damaltor
12.01.2007, 12:09
also wenn du zwei taster gleichzeitig drückst, bekommst du die SUMME der gedrückten taster. also kannst du nicht bei nur k4 das gleiche bekommen wie mit mehreren tastern zusammen.

Froschi
13.01.2007, 12:50
Das hab ich schon verstanden.
Ich hab mir nur überlegt, die einzige Möglichkeit an der ein "sinnvoller" kurzschluss entstehen könnte, wäre die in der Skizze rot markierte Stelle.
http://img146.imageshack.us/img146/393/k4k5kurzud6.jpg
Wenn aber an dieser Stelle ein Kurzschluss wäre, dann müssten doch gleiche Werte kommen, egal ob K4 oder K5 gedrückt wird?
Deswegen ist es doch eigenlich wahrscheinlicher, dass R28 anstatt 16kOhm nur knapp 11kOhm besitzt.
Wenn man die beiden Schalter k5 und k4 gleichzeitig schließt sind normalerweise doch R28 und R29 parallel geschaltet, also müsste gelten 1/Rgesamt = 1/R28 + 1/R29, bei meiner Rechnung also etwa 10,77 kOhm für Rgesamt.

m.a.r.v.i.n
13.01.2007, 17:04
Warum mißt du du nicht einfach die Widerstände durch. Kein Multimeter vorhanden? Vielleicht hast du einfach nur 2 Widerstände verwechselt.

Froschi
13.01.2007, 21:31
stimmt eigentlich gute idee;) soweit hab ich jetz noch nich gedacht. Werd ich mal tun und wenn ich irgendwelche probleme oder erfolge hab dann veröffentlich ich se:)

Froschi
13.01.2007, 21:44
mann mann manchmal ist die lösung doch soo einfach...
also ich hab jetzt zumindest mal den vermeintlichen 16kOhm-Widerstand nachgemessen, er hat tatsächlich nur 10kOhm wenn ich mich nicht vermessen hab. Jetzt muss ich nur noch sein vertauschtest schwesterchen finden und alles sollt in butter sein:).
danke m.a.r.v.i.n für den zwar simplen aber äußerst hilfreichen tipp.
Grüße Froschi

m.a.r.v.i.n
14.01.2007, 00:45
Hi,

10k Widerstände gibt es nur 2 Stück. Beim Asuro ist das R13 und beim IR Transceiver R6.

damaltor
14.01.2007, 16:08
achtung: wenn du die widerstände misst während der asuro mit spannung versorgt wird, ist die messung mist! vertraue nur auf messwerte bei abgeschaltetem asuro.

inka
17.02.2007, 18:27
hi radbruch,

return ((10240000L/(long)i-10000L)*63L+5000L)/10000;
Mit der letzten Zeile werden die Tasterwerte "kallibriert". Bei mir gilt die letzte Zeile, mit der vorletzten hatten meine Taster die Werte 1,2,4,7,15,31. Richtig ist 1,2,4,8,16,32. Die Werte müssen zusammen 63 ergeben sonst funzt es nicht!

wie kann ich die werte, die von den tastern geliefert werden ausgeben? Auch mit "SerWrite"?
Ich habe ein kleines progrämmchen zusammengestrickt, könnte ich es - nach entsprechender erweiterung - auch dazu benutzen?

#include "asuro.h"
unsigned char sw;
unsigned char sw0;
unsigned char sw1;
unsigned char sw2;
int main(void) // start hauptprogramm

{
SerWrite("\n\r tastenabfrage_2007_02_17 ",28); // wer bin ich
Init (); // was wir da initialisiert?

while (1) // tastenabfrage

{
sw0=PollSwitch(); // Schalter einlesen und für eine Runde speichern
sw1=PollSwitch();
sw2=PollSwitch();
if ((sw0==sw1) && (sw0==sw2)) sw=sw0; else sw=0;


if (sw0==16) {StatusLED (YELLOW);
SerWrite("\n\r taste K2 ",12);}

else if (sw0>0) {StatusLED (RED);
SerWrite("\n\r taste gedrueckt ",19);
}
else {StatusLED (GREEN);}
}
while (1); // endlosschleife
return 0; // wird nicht mehr ausgeführt
} // ende hauptprogramm

- das "entprellen" der taster funktioniert aber nicht so ganz. Beim längerem drücken ist es ok, beim antippen nicht.:-( fehlt da bei mir noch was?
- auch scheinen mir da zuviele geschweifte klammern zu sein, oder täusche ich mich da?
danke

radbruch
17.02.2007, 18:50
Hallo

Das Ergebniss einer erfolgreichen Abfrage steht in sw und nicht in sw0!

...
sw0=PollSwitch(); // Schalter einlesen und für eine Runde speichern
sw1=PollSwitch();
sw2=PollSwitch();
if ((sw0==sw1) && (sw0==sw2)) sw=sw0; else sw=0;

SerWrite("\n\r",2);
PrintInt((int)sw);
...

Gruß

mic

inka
18.02.2007, 14:45
hi,

Mit der letzten Zeile werden die Tasterwerte "kallibriert". Bei mir gilt die letzte Zeile, mit der vorletzten hatten meine Taster die Werte 1,2,4,7,15,31. Richtig ist 1,2,4,8,16,32. Die Werte müssen zusammen 63 ergeben sonst funzt es nicht!

bei mir war es hier das gleiche mit den 15 und 31. Habe also die asuro.c entsprechend geändert.
Gleich eine frage zum verständnis:
die asuro.c ist doch sowas wie eine standardbibliothek, beim entwickeln von programmen wird es sicher öfters vorkommen, dass sie individuell geändert wird. Wie dokumentiert man sowas? Ich kann doch unmöglich in 3 jahren, wenn eine neue version rauskommt, wissen was ich da alles geändert habe?
Oder macht man eigene bibliotheken? Wenn ja, werden die in der reihenfolge eingebunden wie sie in der "test.c" aufgeführt sind verwendet, will heissen wird die funktion für "polswitch" aus der ersten oder aus der zweiten datei genommen die per include eingebunden werden?
Sollte die asuro.c und asuro.h auch immer im avr-projekt verzeichnis, oder irgendwo "zentral" abgespeichert sein und misamt pfad dahin eingebunden werden?

m.a.r.v.i.n
18.02.2007, 16:32
Hi,

genau das wollen wir mit der neuen Asuro Lib V2.70 vereinfachen. Alle Werte die von Asuro zu Asuro unterschiedlich sein können, wie z.B. dieser Wert für die PollSwitch Funktion kommen in eigene Header-Datei names myasuro.h.
So braucht man bei Updates der Asuro Lib nicht jedesmal die Einstellungen neu korrigieren.

Das ganze setzt aber schon voraus, das es nur eine zentrale Asuro Lib und zentrale Header Files gibt und nicht jeweils eine Kopie in jedem Ordner.

damaltor
19.02.2007, 22:32
Wenn du selbst neue Funktionen schreibst, dann kommen diese im allgemeinen nicht in die asuro.c. solltest du eine funktion haben, die dir extrem nützlich erscheint, dann poste sie hier im forum, dann wird über eine aufnahme in die asuro.c diskutiert. ansonsten kannst du recht gut eigene bibliotheken schreiben, die reihenfolge der einbundung ist egal, allerding sollte die asuro.c an erster stelle stehen da evtl die anderen neuen bibliotheke darauf basieren bzw auf diese angewiesen sind.