PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ASURO: probleme mit der programmierung für fortgeschrittene.



Atreyu
15.10.2005, 22:28
HI!
ich bin absolut neu hier, und hab mich extra angemeldet, um ein paar fragen zu meinem asuro loszuwerden, vllt wurden sie schon gestellt, wär nett, wenn einer wüsste, wo ich die postings nachlesen kann!
also, dann fang ich mal:
seit einer guten woche besitze ich funktionstüchtiges exemplar von asuro(hatte ihn schon vorher, aber fertig und funktionstüchtig ist er erst seit letzter woche). ich bin ein neuling in solchen sachen, alles was ich vorher an elektronik gemacht hab war bei kosmos-elektrobaukästen nach der anleitung irgendwelche wiederstände, kondensatoren, LEDs etc. zusammenzustecken, um dann zu gucken, ob alles klapptze, wie es beschrieben war. ist aber auch schon lange her. programmiererfahrung hatte ichauch ziemlich wenig, hab mal bei qbasic ein bisschen herumgewurschtelt...
...ums kurz zu machen: ich hab kaum ahnung!
so.
jetzt habe ich also meinen asuro und hab erstmal die ganzen sachen ausgetestes, die in der anleitung beschrieben sind. klappt auch recht gut!
(mal abgesehen von den tastern, die spinnen völlig, wiederstände sind aber korrekt...).
zu dem asuro habe ich das "buch" "Mehr Spasß mit ASURO" bekommen. und bis zu den interrupts komme ich auch einigermaßen damit klar.
also wie ich eine led auf registerebene zum leuchten krige weiß ich auch und die motoren bekomm ich auch so ans laufen. also mit alles was mit output zu tun hat, komm ich klar . aber beim input hörts auch schon wieder auf.in dem buch ist beschrieben, wie man pins setzen kann usw., aber wie man die auslesen kann steht da nicht, es werden nur ein paar register aufgezählt (ADCSRA,...), aber wofür genau die sind, steht da auch nicht. dann ist da noch ein verweis auf das atmega8 datenblatt, da hab ich auch geguckt, aber da wurde ich nur von noch mehr registern überschüttet und für mein verständniss hats auch nix gebracht(..so schlau als wie zuvor...). also wäre meine erste frage, wie ich sowas machen kann.
2. frage: wie klappt das mit den interrupts?

danke im vorraus!

p.s. ich hoffe, dass die textlänge noch so grade zumutbar ist..^^

Hellmut
15.10.2005, 23:22
Hallo Atreyu, ich hoffe als "Einäugiger" etwas helfen zu können. Mal sehen.

Der Weg wie ich mir einiges erarbeitet habe war mir klar zu machen was eigentlich "Hardware nah" passiert. Damit zu deiner 1. Frage:

Bei Input erwartet der Controller Info über das Bit. Das kann entweder eines von 2 definierten "Werten" haben, also "High" oder "Low", oder einen "analogen Wert", also irgendwo zwischen 0V und 5,5V. Manchmal kann es je nach deinem Programm, auch wünschenswert sein sicher zu stellen das ein "expliziter" Wert anliegt und dann wird dieser Eingang entweder durch interne Widerstände, oder durch externe auf GND oder 5V gezogen oder gedrückt. Tut man das nicht, so kann ein solcher Eingang "floaten" was im allgemeinen nicht Wünschenswert ist.

Je nachdem was du also am Port durch deine Schaltung vorzufinden erwartest musst du bei einem Eingang sicherstellen das es dort so zugeht wie es gewollt ist. Um das tun zu können MUSS man sich mit dem Datenblatt vertaut machen, weil man nur dort wirklich die Detailsinfos bekommt die man bewusst und explizit durch Beschaltung oder durch konfigurieren herstellen muß.

Natürlich gibt es gewisse "Standard" Einstellungen, zum Beispiel bei Datenports die für solche Standardanwendungen von der Konfiguration schon stimmen. Möchtest du aber "verstehen" und "sicherstellen" das alles so passiert und ist wie du es möchtest kommst du um das Datenblatt nicht herum.

Meine Empfehlung ist es, teste auch hier wie du es hier schon für anderes beschrieben hast die verschiedenen Möglichkeiten als Eingang definierte Bits zu benutzen und versuche aus dem Datenblatt zu ersehen wie das gemacht wird. Sehr hilfreich ist es auch dir die Testprogramme zu den diversen Bords hier im Forum anzusehen. Dort werden Pins als Eingang definiert und benutzt. Versuch nachzuvollziehen was und wie und warum gemacht wurde. Für analoge Inputs ist der Kode für die Tastendekodierung zur RN-Control sicher hilfreich und zeigt dir einen Weg das unmittelbar am Bildschirm zu sehen, oder die Anzeige der Batteriespannung.

Dann würde ich mit konkreten Fragen wieder hier her kommen.

Zu deiner 2. Frage, beschäftige dich damit nach der 1. Frage, das geht etwas mehr ins Eingemachte.

Aber kurz, Interrupts sind ein Werkzeug durch welches der Controller auf ein "Ereignis" reagiert in dem er eine bestimmte Programmroutine startet wenn dieses eintritt. Es sind im Datenblatt diverse Ereignisse beschrieben und diverse Interrupts aufgeführt. Man kann sagen, das ein spezifisches Interrupt auf ein ganz klar definiertes Ereignis die Abarbeitung eines aktuellen Programmes unterbricht und an eine zu dem Interrupt definierten Adresse, nennt man auch "Interrupt Vector", springt und das dort abgelegte Programm abzuarbeiten beginnt. Anders als bei dem normalen Aufruf einer Subroutine, endet eine sogenannte "Interrupt Service Roputine" mit dem Befehl "RTI" was soviel heisst wie "return from Interrupt". Der Controller führt dann das urprüngliche Programm dort weiter wo er zuvor abgebrochen hat.

Interrupt sind ausserordentlich wertvolle und mächtige Werkzeuge, deshalb aber auch solche wo man ganz genau wissen muss was passiert und was passieren würde und oder soll je nachdem wann es passiert und weshalb.

Aber wie gesagt davon mehr und später falls gewollt.

Vogon
15.10.2005, 23:32
@Atreyu:
Hast du dir schon mal die asuro.c angeschaut ?
Für die meisten eingaben ist dort schon eine Routine vorhanden.
Ist auch eine gute möglichkeit zu sehen wie das geht.

Wenn deine Taster nicht richtig gehen, schau dir mal den Beitrag an:
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=113519#113519

Atreyu
20.10.2005, 15:54
danke schonmal!

zum datenblatt: ich werd das versuchen!
wär aber nett, wenn du/ihr mir sagen könntet, welche stellen was erklären, wenn ich mir das ganze datenblatt durcharbeite, sitze ich hier noch lange^^.

zu vogon: es geht mir ja nicht darum, irgendwas zu programmieren und dann zu sehen, dass er wirklich einer linie hinterherfährt oder sowas, ich möchte auch sozusagen den tieferen sinn dahinter erkennen.
asuro.c hab ich mir schonmal angeschaut und möchte versuchen, jetzt wo ich wieder ins internet kann :shock: , mir die funktion der A/D wandler anhand der linienverfolgeeinheit zu "erschließen"!


edit:
nochmal ne kurze zwischenfrage am rande:
wie bekomme ich es hin, dass ich mit SerWrite nicht nur einen text schicke, sondern werte, die ich z.b. von den fototransistoren bekomme?

Andun
20.10.2005, 19:41
Moin

Also du benutzt entweder die itoa() Funktion um aus einem Integer das Ascii zeichen zu machen oder du suchst hier mal nach der erweiterten asuro.c Lib. Da hat jemand die PrintInt() Funktion geschrieben, die das Umwandeln und wegschicken schon kombiniert.

Atreyu
21.10.2005, 16:31
neue frage: wie arbeite ich mit strings?
also wenn ich zeichen empfangen möchte, immer ein zeichen und dieses dann zu meinen andere zeichen "hinzuaddieren" möchte, das ist doch mit strings zu machen, doer?
bleibt nur die frage offen, wie man strings deklariert etc.
bei QBASIC war das zeichen für string $, da kann ich mich noch dran erinnern^^

Vogon
22.10.2005, 16:41
Ein Beispiel aus der Asuro.c
in der Funktion SerRead() wird ein Zeichen vom Seriellen Port abgeholt und in den String "data" an der Position "i" eingefügt.


while (i < length) {
if (UCSRA & 0x80) data[i++] = UDR;
}

Atreyu
22.10.2005, 16:54
da steht aber

void SerRead(unsigned char *data)

aslo ist data doch ein char und kein string oder nicht?[/align]

ich komm übrigens mit dem datenblatt nicht wirklich vorran!
ich hab leider keine zeit (und lust :oops: ) mich durch die knapp 300 seiten durchzuarbeiten, deshlab frag ich nochmal anders:
- ausgänge auf out- bzw. input setzen kann ich
- jetzt ist die frage, wie ich pins auslesen kann, in meinem buch steht, wie dass man einfach einen pin auslesen muss, wie das geht fragt man sich dann, zumal zum output ein beispiel dadrin steht
- und dann noch die frage, wie ich meine ausgelesenen werte A/D wandeln kann...
-ich stell mal die zeilen aus der asuro.c zur LineData() hier rein, vllt kann mir jemand mithilfe dieser mir was erklären...


an hellmut: ist nicht böse gemeint, ich hatte nur auf etwas konkretere hilfe gehofft

also, die LineData() funktion:


void LineData(unsigned int *data)
{
ADMUX = (1 << REFS0) | IR_LEFT; // AVCC reference with external capacitor
ADCSRA |= (1 << ADSC); // Start conversion
while (!(ADCSRA & (1 << ADIF))); // wait for conversion complete
ADCSRA |= (1 << ADIF); // clear ADCIF
data[0] = ADCL + (ADCH << 8);

ADMUX = (1 << REFS0) | IR_RIGHT; // AVCC reference with external capacitor
ADCSRA |= (1 << ADSC); // Start conversion
while (!(ADCSRA & (1 << ADIF))); // wait for conversion complete
ADCSRA |= (1 << ADIF); // clear ADCIF
data[1] = ADCL + (ADCH << 8);
}

danke für eure geduld!

Atreyu
25.10.2005, 19:47
okee, ich werds dann doch noch mal mit dem datenblatt versuchen...^^

izaseba
25.10.2005, 21:25
Hallo, und wo ist jetzt Dein Problem?
Was verstehst Du an LineData nicht ?


okee, ich werds dann doch noch mal mit dem datenblatt versuchen...^^


Das ist gut, dann endest Du nicht wie der Kolege, der das (https://www.roboternetz.de/phpBB2/viewtopic.php?t=13768) hier gepostet hat.

Gruß Sebastian

Atreyu
26.10.2005, 13:37
Hallo, und wo ist jetzt Dein Problem?
Was verstehst Du an LineData nicht ?


okee, ich werds dann doch noch mal mit dem datenblatt versuchen...^^


Das ist gut, dann endest Du nicht wie der Kolege, der das (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=13768) hier gepostet hat.

Gruß Sebastian
hab ich auch gelesen, naja, ich enthalte mich jetz eines komentars^^
ich versteh nicht, was zum beispiel der register admux bringt, besser gesagt: ich versteh das ganze ding kaum...

edit: ich freunde mich gerade mit dem datenblatt an! =P~

izaseba
26.10.2005, 21:08
ich versteh nicht, was zum beispiel der register admux bringt, besser gesagt: ich versteh das ganze ding kaum...

Zugegeben, es ist schwer das alles zu verstehen, ohne Dattenblatt zu lesen,
und das ist ja auf englisch und verdammt dick, aber Du kommst wirklich nicht drum, wenn Du die Register verstehen willst....
Kennst Du diesen (http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial) Tutorial?

Ist echt eine gute Ergänzung zum Dattenblatt.
Am sonsten C grundlagen, gibt es auch genug im Net.

Viel erfolg, Sebastian

Atreyu
27.10.2005, 21:26
kenn ich nicht, danke für den tipp!
ich hab mir die seiten aus dem datenblatt über A/D wandler ausgedruckt, ich denke, mit der hilfe des tutorials werd ich schaffen!!!!
bidde bidde

Atreyu
20.11.2005, 10:51
ich denke, es klappt, so schwer klingt das gar nciht!
zur zeit ha ich zwar nciht soviel zeit, aber wenn ich im zug sitze les ich dann schonmal öfter im tutorial und ich denke es wirkt!
ich muss bald mal das ganze in der praxis testen!