Archiv verlassen und diese Seite im Standarddesign anzeigen : asuro+taster = eigenartig
hallo leute,
ich wollte das Beispielprogramm aus der Anleitung gerade probieren, das folgendes aussieht
#include "asuro.h"
int main(void)
{
Init();
MotorDir(FWD,FWD); // Beide Motoren auf vorwärts
MotorSpeed(120,120); // Beide Motoren etwa halbe Kraft voraus
StatusLED(YELLOW); // Status-Leuchtdiode auf grün schalten
while (PollSwitch()==0)
{ // Solange keine Kollision erfolgte...
SerWrite("Alles OK!\n",10); // ... Euphorie verbreiten
}
MotorSpeed(0,0); // Kollision! Sofort anhalten!
StatusLED(RED); // Statusleuchtdiode rot schalten
while (1)
{
SerWrite("Aua!\n",5); // und weinen!
}
return 0;
}
nun, das komische ist, dass asuro mal losfährt bis es hindernis trifft, dann bleibt er stehen. aber ein anderes mal fährt er nur irgendwie eine sekunde oder nicht mal und dann steht er, als ob ein der taster gedruckt würde. hat es mit dem berüchtigten C7 zu tun? kann man es irgendwie umgehen, dass es gleich zu anfang entladen ist?
radbruch
09.06.2007, 01:41
Hallo
PollSwitch() ist eine der übelsten asuro-Funktionen. Benutze mal die Suche-Funktion des Forums mit z.B. diesen Begriffen: "asuro AND tasten AND pollswitch AND problem" und du findest Threads wie diesen:
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=25323
Gruß
mic
[Edit]
Es ist schon erstaunlich, wie oft das Rad hier schon neu erfunden wurde. Nach 5 Min. RN-Forumsuche findet man echte Juwelen:
https://www.roboternetz.de/phpBB2/viewtopic.php?p=107255#107255
Wenn man Glück hat beim Suchen...
Die sechs taktilen Sensoren - genannt "Taster" - werden raffiniert über Widerstände über einen Analog-Digital-Konverter (ADC4) ausgewertet. Hierbei muss man unbedingt die Werte 1,2,4,8,16,32 erhalten, wenn der entsprechende Taster gedrückt wird.
Folgendes ist hierbei zu beachten, damit das richtig funktioniert:
1) Kalibration in myasuro.h vornehmen:
/* Tastaturabfrage */
/*! Faktor zur Berechnung der gedrueckten Tasten.\n
Der Originalwert ist \b 61L und koennten im Bereich zwischen ca. 58L und
65L schwanken. Dieser Wert gleicht Toleranzen der Widerstaende an den
Tastern aus.
*/
#define MY_SWITCH_VALUE 61L /*!< Multiplikator fuer Tasterwerte */
Beginnen Sie mit 61 und testen Sie entsprechend dem unter 3) angehängten Programm.
2) Der Wert aus myasuro.h wird in Pollswitch(...) in der Datei switches.c verwendet:
unsigned char PollSwitch (void)
{
unsigned int i;
int ec_bak = autoencode; // Sichert aktuellen Zustand
/*
Autoencode-Betrieb vom ADC-Wandler unterbinden.
*/
autoencode = FALSE;
DDRD |= SWITCHES; // Port-Bit SWITCHES als Output
SWITCH_ON; // Port-Bit auf HIGH zur Messung
ADMUX = (1 << REFS0) | SWITCH; // AVCC reference with external capacitor
Sleep (10);
ADCSRA |= (1 << ADSC); // Starte AD-Wandlung
while (!(ADCSRA & (1 << ADIF))) // Ende der AD-Wandlung abwarten
;
ADCSRA |= (1 << ADIF); // AD-Interupt-Flag zuruecksetzen
i = ADCL + (ADCH << 8); // Ergebnis als 16-Bit-Wert
SWITCH_OFF; // Port-Bit auf LOW
Sleep (5);
/*
Autoencode-Betrieb vom ADC-Wandler wiederherstellen.
*/
autoencode = ec_bak;
/*
Die Original Umrechenfunktion von Jan Grewe - DLR wurder ersetzt durch
eine Rechnung ohne FLOAT-Berechnungen.
return ((unsigned char) ((( 1024.0/(float)i - 1.0)) * 61.0 + 0.5));
Wert 61L evtl. anpasssen, falls fuer K1 falsche Werte zurueckgegebn werden.
*/
return ((10240000L / (long)i - 10000L) * MY_SWITCH_VALUE + 5000L) / 10000;
}
3) Mit folgendem Programm kann getestet werden:
#include "asuro.h"
int main(void)
{
int radix = 10;
int poll = 0;
char wert[3];
Init();
while(1)
{
poll = PollSwitch();
int i;
for(i=0;i<3;++i)
wert[i]=' ';
itoa (poll, wert, radix);
SerWrite (wert, 3);
SerWrite ("\n\r", 2);
}
}
4) Einzeltaster 1,2,4,8,16,32 - alles o.k.?
5) Jetzt mehrere Taster drücken. Summe muss stimmen. Nein? Go to 1) ;-)
radbruch
09.06.2007, 11:33
Hallo
Fehlt vielleicht noch der Hinweis, dass die Datei myasuro.h nur in der asuro-Lib ab Version 2.7 vorhanden ist. Benutzer der orginalen CD-Libary bzw. Versionen vor 2.7 müssen die Anpassung direkt in der PollSwitch-Funktion in asuro.c ändern.
Gruß
mic
Ja, das ist richtig. Ich bin implizit davon ausgegangen, dass niemand mehr daran interessiert ist, alte Versionen der ASURO-Lib zu verwenden. :)
moment, mal ganz langsam für mich als abslute anfänger, woher weiss ich welche version die bibliothek ist (obwohl wahrscheinlich stimmt es, was ihr sagt, dass die version < 2.7 ist). ich werd dann nachher mit dem taster test probieren, hab grad wenig zeit
Wenn Du das File asuro.h öffnest, findest Du eine ausgefeilte Versionsinformation mit allen Änderungen. Lenkung der Dokumente gemäß Qualitätsmanagement vom Allerfeinsten. ;-)
nun ich habe in asuro.h und asuro.c reingeguckt und da steht als letzte änderung version 2.10, datum 17.10.2003. das ist doch wohl neuer als 2.7? oder heißt 2.7 = 2.70 ? dann ist 2.10 << 2.7(0).
und muss ich die datei myasuro.h erst erstellen? und switch.c? all die hab ich nicht. oder soll ich einfach in asuro.c die noch nicht vorhandenen Zeilen einfach reinschreiben? bin noch so völlig aufm schlauch #-o
und muss ich die datei myasuro.h erst erstellen? und switch.c? all die hab ich nicht. oder soll ich einfach in asuro.c die noch nicht vorhandenen Zeilen einfach reinschreiben? bin noch so völlig aufm schlauch oh Gott
Aha, Du scheinst noch wenig Ahnung vom Programmieren in C zu haben. Daher lässt Du am besten die Finger von den Dateien in der Bibliothek bzw. besorgst Dir zuerst mal die aktuelle Version. O:)
version 2.10, datum 17.10.2003
2.70 ist die aktuelle Version von 2007. Das Datum steht übrigens dabei!
Also besorge Dir - zu Deinem eigenen Vorteil - die neueste Version der ASURO-Lib.
Link: https://www.roboternetz.de/phpBB2/viewtopic.php?t=30004
ooooo..........man.....warum habe ich bloß das gefühl dass ich in dieses thematik nie richtig reinkommen würde. muss man dafür informatik studieren? :cry: ich habe e-technik gemacht, könnte das jemals hinbekommen?
also ich habe die neue lib runtergeladen und ich hoffe dass ich irgendwie durchsteige. programmieren war / ist noch nie meine stärke. aber was nicht ist, kann ja (vielleicht) noch werden :Haue
E-Technik ist doch keine schlechte Grundlage für die Robotik. Jetzt fehlt Dir eben noch der Informatik- und Feinmechanik-Part. Ich gebe Dir mal ein paar Links:
http://www.informatik.uni-bremen.de/dfki-robotik/uploads/media/C_Programming_short070507.pdf
http://ulrichradig.de/site/infos/pdf/AtmelCprogramming.pdf
http://www2.its.strath.ac.uk/courses/c/
https://www.roboternetz.de/wissen/index.php/Fallstricke_bei_der_C-Programmierung
http://en.wikipedia.org/wiki/Bitwise_operation
http://en.wikipedia.org/wiki/Bit_manipulation
http://www.atmel.com/dyn/resources/prod_documents/doc2486.pdf
http://www.atmel.com/dyn/resources/prod_documents/doc0856.pdf
http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=50106
so da hab ich schon die nächste frage: was heiß
Zität:
Um die Lib neu zu übersetzen startet man den Make Prozess im Verzeichnis /lib mit:
make clean
make all
Zität Ende
sorry, ich hoffe ich nerve nicht mit den für euch sicherlich selbstverständliche frage :(
wow moment, hab gesehen ich habe die alte version der lib runtergeladen. jetzt habe ich die neue und installiert. aber dann beschwrt sie sich bei der installation weil winavr woanders installiert ist. kann man dem sagen wo winavr installiert ist? oder muss die lib dort installiert werden, wo winavr auch ist?
Schau mal in Dein makefile in C:\ASURO_SRC\AsuroLib\lib
Dort findest Du:
# Define directories, if needed.
DIRAVR = C:/WinAVR
DIRAVRBIN = $(DIRAVR)/bin
DIRAVRUTILS = $(DIRAVR)/utils/bin
DIRINC = .
DIRLIB = $(DIRAVR)/avr/lib
LIB = asuro
LIBFILE = lib$(LIB).a
HEADER = asuro.h
Da kannst Du Dein WinAVR einrichten, falls notwendig.
Der Compiler C:\WinAVR\bin\avr-gcc.exe wandelt Deine Sourcecode-Dateien mit der Endung c um in Objektdateien mit der Endung o.
Der Linker C:\WinAVR\bin\avr-ld.exe bindet diese Objektdateien zusammen zu einer ausführbaren Datei, hier mit der Endung hex.
Im Makefile findest Du z.B. als Anweisung für den Linker:
## Objects that must be built in order to link
OBJECTS = globals.o adc.o encoder.o encoder_low.o i2c.o leds.o lcd.o motor.o motor_low.o print.o rc5.o sound.o switches.o time.o uart.o version.o
soo, ich habe nun das programm zum testen der tasterwerte (ich nenne es test.c, wie einfallsreich !!!) ausprobiert und irgendwie hab ich für k1 - k4 die richtigen werte (1,2,4,8) aber für k5 und 6 habe ich 15 und 31, ganz egal wie ich MY_SWITCH_VALUE verändere (von 58 - 65). so wie ich verstehe, muss ich nur in myasuro.h diesen wert ändern, und das test.c neu kompilieren. oder habe ich was vergessen.
und noch was, wenn ich asuro einschalte, dann sehe ich in hyperterminal lauter null's, die runter rattern, wenn kein taster gedruckt wird. ist das normal, dass daurnd zeichen gesendet werden? und was ist die funktion itoa ? die definition finde ich nirgends. HILFEEEEEEE!!!!!!!!!
Nein, ich denke, Du solltest erst libasuro.a neu linken, da myasuro.h via Kompilierung von switches.c zunächst in switches.o landet (siehe Makefile).
Ja, das mit den Zeichen, die vor Dir runter rattern ist normal, weil das Programm eben so geschrieben ist. Analysiere doch einfach mal das Programm, das Du verwendest! Sonst lernst Du nichts dazu. ;-)
Von Sternthaler gibt es ein Programm, das die optimalen Werte für myasuro.h selbst erkundet. Such mal danach.
... und hör auf, so laut Hilfe zu schreien, sonst wirkst Du hilfloser und chaotischer als der ASURO selbst. :)
Sternthaler
11.06.2007, 01:28
Hallo dicky, hallo ehenkes,
wenn ich mich mal einmischen darf.
Ich lese so zwischen den Zeilen von dicky, dass er lieber keine Lib neu übersetzen möchte und dafür erst noch das Makefile anpassen muss.
Es sieht ja erst einmal so aus, dass er mit der ursprünglichen Lib von der CD klar kam, bis auf den Faktor in Pollswitch().
Das von ehenkes angesprochene Programm ist unter ASURO emittelt Werte für Lib V2.70 myasuro.h selber (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=31073) zu finden.
Den dort ermittelten Wert kannst man dann ja auch in der Funktion PollSwitch() in der originalen asuro.c von der CD eintragen.
Später, wenn der lustige Smilie mit dem Hammer, nicht mehr nötig ist, kann dicky ja auf die neue Lib umsteigen.
damaltor
13.06.2007, 15:45
ansonsten findet man bei sourceforge immer noch die version 2.61, welche nicht neu übersetzt werden muss. die kann man einfaqch in das programmverzeichnis kopieren, und dann damit die originale lib ersetzen (ist ja noch auf der cd) und ganz normal arbeiten. dann werden die hex-files zwar etwas größer, aber man spart sich das übersetzen (und am anfang hat man genug platz auf dem kleine prozessor, wenns knapp wird kann man sich ja dann mit version 2.7 beschäftigen.
2.1, 2.61, 2.7
Jawohl beliebig kompliziert für Einsteiger. ;-)
damaltor
15.06.2007, 12:20
2.1: Einer der frühen releases aus dem RN. schon gut, aber wird noch gesteigert
2.61: letzer release vor der modularisierung. viele neue funktionen, teilweise kommen klagen über interruptfehler.
2.7(0): erster release mit modularisierung. vorteil: deutlich kleinere hex-files, da nur wirklich benötigte funktionen kompiliert werden. nachteil: undefinierbare installationsprobleme, welche eigentlich durch die gute anleitung ausgeglichen werden sollten...
Jetzt wird es aber Zeit für 3.0 ohne Probleme. Bin gerne dabei.
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.