text: [Asuro] Problem bei Tasterabfrage mittels PollSwitch [Archiv] - Roboternetz
  Roboternetz > Microcontroller > Atmel AVR Controller und Programmierung > C - Programmierung (GCC u.a.) > [Asuro] Problem bei Tasterabfrage mittels PollSwitch
  Archiv verlassen und diese Seite im Standarddesign anzeigen : [Asuro] Problem bei Tasterabfrage mittels PollSwitch
  jenser21228.01.2005, 23:19Hallo Zusammen,
  ich habe mir vor Weihnachten einen Asuro gekauft und ihn gestern und heute zusammen gel�tet. Nun bin ich dabei, meine ersten Programme zu schreiben und habe beim Abfragen der Schalter an der Vorderseite ein Problem.
  Mein Programm l�sst den Asuro so lange fahren, bis er gegen ein Objekt st�sst. Dann dreht er sich um ein paar Grad und f�hrt weiter. Im Prinzip nicht schwierig.
  Nun habe ich das Problem, dass der Asuro ein St�ck f�hrt und dann wendet, obwohl er nirgendwo dran gekommen ist. Wenn ich mit dem Finger einen Taster ber�hre, dann dreht er sich auch - so soll es ja sein. Aber wieso dreht er sich, obwohl er im freien Raum steht? Das passiert auch, wenn ich ihn in der Luft halte. Oftmals dreht er sich sogar ein paarmal.
  Vielleicht hatte jemand von Euch �hnliche Probleme?
  jenser21230.01.2005, 10:32Nach einer Menge Tests und Debug-Ausgaben �ber die IR-Schnittstelle bin ich der Sache auf den Grund gegangen.
  Durch ein Sleep in der while-Schleife funktioniert die Tasterabfrage nun wie gew�nscht!
  sleepms ist eine eigene Funktion, die den Asuro f�r die angegebenen ms schlafen l�sst.
  RCO30.01.2005, 13:55Das ist ja merkw�rdig! Hab schon �berelgt, warum esnicht klappt, ab das es daran liegt!?
  jenser21230.01.2005, 15:21Ich bin am �berlegen, ob es �berhaupt clever war, immer wieder run aufzurufen. Bei einer Rekursion muss sich das Programm ja irgendwie seinen R�ckweg merken. Bei einer normalen Endlosschleife ist dies nicht der Fall.
  Sehe ich das richtig? Vielleicht h�ngt es auch damit zusammen.
  jenser21231.01.2005, 11:29Also an der Rekursion hat es nicht gelegen.
  Daf�r ist mir etwas anders aufgefallen. Wenn ich den Asuro in der Hand halte, verh�lt er sich so, wie er soll. er f�hrt und f�hrt und f�hrt... und wenn ich einen Taster dr�cke macht er einen Turn.
  Stelle ich ihn auf den Boden und er schrubbert so vor sich hin, dann macht er auf gerader Strecke einen Turn, obwohl kein Taster ber�hrt wurde.
  RCO31.01.2005, 11:41Das gleiche passiert, wenn ich Ihn in der Hand halte und die Reifen ein klein wenig blockiere. Vielleicht ist die Spannung ein wenig instabil, schalte doch mal einen Kondensator 470�F oder 100 an die Versorgungsspannung. Vielleicht auch mal statt der batterien ein stabiles Netzteil oder so.
  jenser21231.01.2005, 18:58Vielen Dank f�r den Tipp, Moritz! Werde ich umgehend ausprobieren (sobald ich einen Kondensator habe).
  Ich erz�hle besser nicht, dass ich vor 12 Jahren eine Elektronikerausbildung absolviert habe. Da m�sste ich das ja eigentlich noch wissen.... :-)
  RCO31.01.2005, 19:14Parallel, also + na + und - an -.
  Ich vermute es nur mla, weil vermutlich wenn eine MOtor blockiert die Spannung einbrucht, da zuviel Strom flie�t, dadurch macht der uC dann schonmal Mist. Ein Ph�nomen, was oft auftritt ist ein Reset oder so.
  jenser21201.02.2005, 08:54Hat geklappt! Ich habe den Kondensator auf die Unterseite der Platine gel�tet, an der Stelle an der die Versorgungskabel angel�tet sind.
  Jetzt l�uft er, wie ich mir das vorstelle. *juhu*
  RCO01.02.2005, 09:12Tja, vielleicht waren auch nur die Batterien etwas schwach.
  Ich habe den Kondensator auf die Unterseite der Platine gel�tet, an der Stelle an der die Versorgungskabel angel�tet sind.
  Ich w�rde ihn erst Hinter dem Schalter anl�ten, denn ich meine zu galuben, dass immer ein geringer Strom flie�t. Das w�re ja Mist, wenn sich das Ding �ber Nacht entl�dt.
  jenser21201.02.2005, 09:30Tja, vielleicht waren auch nur die Batterien etwas schwach.
  Gut m�glich. Ich habe nicht gerade die besten gekauft.
  Oh, das w�re wirklich schlecht. Ok, da muss ich mir wohl einen anderen Platz raussuchen. W�re ja auch zu einfach gewesen...O:)
  Peda20.02.2005, 21:28Hallo,
  ich hatte bei meinem Asuro genau dasselbe Problem(hab das gleiche Programm geschrieben), das er sich immer gedreht hat obwohl nirgendwo angesto�en ist. Ich habs dann Softwaretechnisch gel�st indem ich die PollSwitch-Funktion zweimal aufrufe und dann jeweils vergleiche ob das Ergebnis identisch ist somit werden solche Spannungsschwankungen oder �hnliches rausgefiltert.
  Ich hab allerdings bei anderen Versuchen noch andere Probleme die auch den oben genannten �hnlich sind. Bei der Auswertung der Odometrie-Daten differenzieren die Werte anscheinend sehr stark je nachdem wie hell die umgebung beleuchtet ist oder wie weit das Zahnr�dchen vom Transistor entfernt ist. Somit ist ein errechnen der momentanen Geschwindigkeit schwierig und eigentlich recht unbrauchbar. Hat da vielleicht jemand eine Idee wie man das in den Griff bekommt?
  jenser21221.02.2005, 14:17Hi Peda,
  bei der Odometrie habe ich folgendes gemacht:
  Zuerst wird Min und Max des linken und rechten Sensors ermittelt (in dem ich den Asuro einfach f�r ein paar Umdrehungen fahren lasse und die Odometrie auswerte).
  Anhand dieser Werte kannst ich dann pr�fen, ob der Sensor nun hell oder dunkel ist. Anbei ein kleines Beispiel-Programm.
  #define DUNKEL 0
  #define HELL 1
  unsigned int lowLeft = 512;
  unsigned int highLeft = 512;
  unsigned int lowRight = 512;
  unsigned int highRight = 512;
  unsigned char getLeftStatus(unsigned int data) {
  unsigned int diffLow = data - lowLeft;
  unsigned int diffHigh = highLeft - data;
  if (diffLow < diffHigh) {
  unsigned char getRightStatus(unsigned int data) {
  unsigned int diffLow = data - lowRight;
  unsigned int diffHigh = highRight - data;
  unsigned int speed = 100;
  if (data[0] < lowLeft) {
  lowLeft = data[0];
  } else if (data[0] > highLeft) {
  highLeft = data[0];
  if (data[1] < lowRight) {
  lowRight = data[1];
  } else if (data[1] > highRight) {
  highRight = data[1];
  BackLED(getLeftStatus(data[0]), getRightStatus(data[1]));
  Peda22.02.2005, 21:39Hi Jens,
  danke f�r deinen L�sungsvorschlag, probier ich gleich mal aus. Das k�nnte gut funktionieren.
  Ich hab da allerdings im moment noch ein anderes problem. wenn ich mit dem flash-Tool etwas auf den Prozessor draufspielen will dann. bekomme ich fast nie eine verbindung mit Asuro. das erste mal klappt es meistens doch dann geht meistens denn ganzen abend nix mehr. Was ist da los, sind die batterien leer, ist das licht schlecht?? der transceiver-test funktioniert einwandfrei und wenn programme laufen dann sendet der asuro auch fehlerfrei an den Transceiver.
  Grave8010.03.2005, 15:46Hi, Peda, das gleiche Problem hatte ich zum anfagn auch mit der �bertragung, bei mir lag es einfahc nur an den batterien die waren zu schwach, jetzt klappt alles prima.
  JETZT AN DIE ANDEREN!!!
  habe da nen problem mit den Pollswitch also der taster 1 wird nur durch die Dezimalzahl 33 anstatt 32 angesprochen und der taster 6 l�st teilweise fehler aus, habe den dann ausm programm komplett entfernt , jetzt geht alles und komischerweise bewirkt der taster auch das was er urspr�nglich sollte obwohl er auskommentiert ist, wie kann das sein???
  bei dem taster6 steht in der fehlerbehebung das es durch bauteiltoleranzen dazu kommen kann das der uC den falsch erkennt und das das sp�ter softwarem�ssig behoben werdne kann, doch wie steht leider nicht in der beschreibung, weiss da jemand von euch was???
  Weja11.03.2005, 14:26Hallo Grave80,
  Im Handbuch steht genau:
  "In seltenen F�llen kann es vorkommen, dass durch Bauteiletoleranzen ein falsches Muster erkannt wird. Das kann aber sp�ter softwareseitig behoben werden.�
  Das betrifft bei Dir Taste 1 mit dem Wert 33. Die Softwarekorrektur kann dann so aussehen.:
  x=PollSwitch(); if (x>31) x--;
  Was passiert denn bei Taster 6 ? Welche Fehler ?
  Ich hab mir vorgenommen eine verbesserte Asuro Bibliothek zu schreiben, dasollten PollSwitch Probleme mit behoben werden.
  Siehe Thema: erweiterte ASURO Bibliothek
  Grave8012.03.2005, 09:42hoi weja
  also bei taster 6 is das seltsam also wenn ich ne for schleife schreibe das der bei pollswitch==1 irgendwas macht oder halt was anderes dann macht der imme rdas was im else bereich steht und das ganz komische ist wenn ich die For schleife dann auskommentiere funktioniert alles prima und der Taster1 macht auch genau das was er machen soll ich pack mal meenen quellcode mit rein wenn es klappt
  Sone verbesserte Bibliothek w�re nicht schlecht aber ich will mich jetzt in embedded C programmierung versuchen , aber wenn de sone bibliothek fertig hast w�rde mich die mal interessieren
  mfg Grave80
  Arexx-Henk12.03.2005, 10:24Hallo Grave80,
  in die pollswitch function im datei asuro.c bevindet sich ein verzogerung Sleep(10) vielleicht hilfts wenn du diesen wert etwas grosser macht.
  in pollwitch function wird zuerst die microcontroller pin PD3 hoch gemacht (SWITCH_ON), dan einige zeit gewartet (Sleep(10)), und dann wird die gedruckten Tasten spannungswert ausgelesen. Die Sleep(10) ist notwendig weil ein Kondensator an dieser Stelle angeschlossen ist und dann daurts etwas bis bei einem tastendruck die Spannung sich ausgewertet hat.
  KlausR25.03.2005, 23:49Ich bin am �berlegen, ob es �berhaupt clever war, immer wieder run aufzurufen. Bei einer Rekursion muss sich das Programm ja irgendwie seinen R�ckweg merken. Naja, wie du selbst schon festgestellt hast, lag es nicht am rekuriv aufgerufenen run(). Allerdings ist das rekursiv Aufrufen ne schlechte Idee, denn in der Tat will der kleine Atmega8 bei jedem Aufruf die R�cksprungadresse sichern. Nur hat er nur 512 Bytes Ram, und jeder Aufruf ben�tigt zwei Bytes. Dem AVR geht also ruck zuck der Speicher aus. Allerdings gibt es zun�chst keine Fehlermeldung, der AVR wird nur munter Speicherinhalte, u.U. den Inhalt von Variablen, �berschreiben. -Klaus
  Christian 2529.05.2005, 21:12Hallo, also ich habe auch das selbe Problem wie Jenser (auch bei einem ganz einfachen Programm) und dieses Problem l��t sich auch durch eine sleep Funktion l�sen. (siehe auch http://www.roboternetz.de/phpBB2/viewtopic.php?p=85276#85276). Mich w�rde mal interessieren wieso dieses Anhalten des Prozessors die L�sung bringt??? W�re es davor w�rde ich es ja noch verstehen da man sagen k�nnte der wartet erstmal bis die Spannung wieder konstant ist und schaut dann. Aber danach???
  crazypenguin30.01.2006, 15:27Hallo, das ist mein erster Beitrag hier, ich hab auch mit dem Asuro angefangen. Kann es damit zusammenh�ngen, da� der Kondensator der zwischen den Tastern und dem AVR liegt, erst entladen werden mu� um einen definierten Zustand abfragen zu k�nnen? Ich hab ein �hnliches Programm geschrieben, da� den Asuro dazu bringt, bei einer Kollision umzudrehen. Am Anfang dieses Programmes entlade ich den zugeh�rigen Kondensator �ber mehrmalige Aufrufe von Pollswitch(), damit tritt ein solches Problem nicht auf.