- 3D-Druck Einstieg und Tipps         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 14

Thema: ASURO: probleme mit der programmierung für fortgeschrittene.

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    15.10.2005
    Alter
    34
    Beiträge
    23

    ASURO: probleme mit der programmierung für fortgeschrittene.

    Anzeige

    Powerstation Test

    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..^^

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.07.2004
    Ort
    Mammendorf
    Alter
    67
    Beiträge
    1.062
    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.
    MfG

    Hellmut

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    29.04.2005
    Ort
    Weilburg
    Beiträge
    676
    @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/ze...=113519#113519
    Prostetnic Vogon Jeltz

    2B | ~2B, That is the Question?
    The Answer is FF!

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    15.10.2005
    Alter
    34
    Beiträge
    23

    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 , 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?

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    04.04.2005
    Ort
    Hamburg
    Alter
    36
    Beiträge
    826
    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.
    www.subms.de
    Aktuell: Flaschcraft Funkboard - Informationssammlung

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    15.10.2005
    Alter
    34
    Beiträge
    23
    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^^

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    29.04.2005
    Ort
    Weilburg
    Beiträge
    676
    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.
    Code:
    while (i < length) {
    	if (UCSRA & 0x80) data[i++] = UDR;
    	}
    Prostetnic Vogon Jeltz

    2B | ~2B, That is the Question?
    The Answer is FF!

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    15.10.2005
    Alter
    34
    Beiträge
    23

    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 ) 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:

    Code:
    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!

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    15.10.2005
    Alter
    34
    Beiträge
    23
    okee, ich werds dann doch noch mal mit dem datenblatt versuchen...^^

  10. #10
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    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 hier gepostet hat.

    Gruß Sebastian

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen