- Akku Tests und Balkonkraftwerk Speicher         
Seite 3 von 7 ErsteErste 12345 ... LetzteLetzte
Ergebnis 21 bis 30 von 67

Thema: Probleme mit if-Bedingungen????????????????

  1. #21
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    08.06.2007
    Alter
    32
    Beiträge
    104
    Anzeige

    E-Bike
    Ich bin grade dabei das Buch "Mehr Spaß für ASURO" durchzulesen und zu verstehen. Ist ja eigendlich recht einfach. Aber nur eigendlich. Das mit den Registern hab ich noch nicht verstanden. Woher weiß man, welches Register für welchen Pin zuständig ist? Ich vermute, wenn ich mit den Registern gut klar komme wird der Rest auch nicht so schwer. Und vielleicht verstehe ich dann auch V2.7. Welche Libaries würdest du mir denn empfelen?

    Was meinst du eigentlich mit
    "iif taste wird ersetzt durch if (!(PINC & (1<<PC4)))
    if (taste) wird ersetzt durch if ((!(PINC & (1<<PC4))))"

    Roboaktiv
    Gruß Roboaktiv


    It is öde to be blöde

  2. #22
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    08.06.2007
    Alter
    32
    Beiträge
    104
    Das Programm hab ich jetzt einfach mal auf den ASURO geflasht und mal ausprobiert! Und es geht!!! Jetzt hab ich es noch nen bisschen verschönert(Mir den vielen LEDs)und es sieht schon sehr gut aus(Lob und Dank an dich) Hier nochmal das Programm für die, die das Gleicheproblem haben, die sich diese "Unterhaltung" durchgelesen haben und jetzt auch das Endprodukt anschauen möchten:
    Code:
    #include <asuro.h>
    #define taste (!(PINC & (1<<PC4)))// Tastenabfrage
    #define keine_taste (PINC & (1<<PC4))
    
    int main(void)
    {
    int zeit;
    Init();
    while(1)
       {
    	  BackLED(OFF,OFF);								//BackLED beide aus und
    	  StatusLED(GREEN);								//StatusLED grün also alles Okay
          MotorDir(FWD,FWD);//Also kann man auch schön gradeaus fahren
          MotorSpeed(200,220);
          if(taste)
    		{
    		BackLED(ON,ON);//BackLED beide an und
    		StatusLED(RED);//StatusLED ROT also Kollision
    		MotorDir(RWD,RWD);//also erst ein Stück zurück
    		MotorSpeed(200,220);
    		for(zeit=0;zeit<500;zeit++)//(0,5 Sekunde zurück)
    			{
    			 Sleep(36);
    			}
    		StatusLED(YELLOW);//StatusLED orange
    		BackLED(ON,ON);//BachLED ROT also Besserung in Sicht
    		MotorDir(RWD,FWD);//Drehung
    		MotorSpeed(200,220);
    		for(zeit=0;zeit<1000;zeit++)//(1 Sekunden warten)
    			{
    			 Sleep(36);
    			}
    		} 
       }
    while(1);
    return 0;
    }
    Bestimmt sind in diesem Programm auch noch so kleine Fehlerchen, die man mal verbessern könnte. Tut euch keinen Zwang an. Aber mich würds auch Intressieren, was ihr noch so verandert habt.
    @Radbruch Vielleicht hast du ja auch noch Ideen zur Verbesserung

    Danke nochmal
    Roboaktiv
    Gruß Roboaktiv


    It is öde to be blöde

  3. #23
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Lob und Dank an dich
    Quatsch, DICH muss man loben. So macht mir das Spass, viele andere hier sind doof, faul, unhöflich oder beratungsresistent. Natürlich ist es ein eher kleines Programm, aber als Einstieg echt klasse. Die LEDs hast du prima eingesetzt, auch deine Kommentare sind vorbildlich. Allerdings vermeide ich Umlaute in den Kommentaren, denn ich hatte mal ein Problem beim Compilieren das von den Umlauten verursacht wurde.

    Was meinst du eigentlich mit
    if taste wird ersetzt durch if (!(PINC & (1<<PC4)))
    if (taste) wird ersetzt durch if ((!(PINC & (1<<PC4))))
    Beide Zeilen funktionieren gleich und erzeugen auch den selben Code, aber zähl mal die Klammern.

    Das Buch besitze ich nicht, es scheint mir aber ein guter Einstieg zu sein, soweit ich bisher darüber gelesen habe. Die 2.7er-Lib ist eigentlich recht genial und ist auch gut dokumentiert. Die an ihrer Erstellung beteiligten RN-Forum-User helfen auch jedem, der bei der Installation und Anpassung an seinen asuro Probleme hat. Allerdings ist bei ihrer Anwendung die eigentliche Hardware des asuros nicht mehr erkennbar.

    Ich programmiere aber lieber hardwarenah, deshalb verwende ich nur einige Funktionen einer älteren Version (mit IR-Erweiterung von waste). Mein Ziel ist der Einsatz der hvwdefines.h(aktuell ist Version 1.09.) von asuro-henk. Damit programmiert man direkt die Register des ATMega8 und kann herrlich schlanke Programme erzeugen. Allerdings bedeutet das auch viel Tipparbeit und man muss sich alle Funktionen selbst erarbeiten.

    Infos zu den AVRs und deren Programmierung gibt es bei wikipedia, bei mikrocontroller.net, im RN-Wissen, im asuro-wiki und natürlich im Datenblatt des ATMega8L.

    Gruß

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  4. #24
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    08.06.2007
    Alter
    32
    Beiträge
    104
    Danke für das Rücklob!
    Das mit dem if(taste) hab ich mir so angewöhnt. Im meinem C-Buch steht nach den "Schleifen-Einleitewort" (oder wie das heißt) auch immer diese Klammer.
    Ich glaube, es ist jetzt erstmal besser wenn ich bei meiner Libary bleibe und erstmal in Ruhe mit den Registern programmiere. Sonst werde ich da bestimmt vollkommen durcheinander kommen.

    Ansonsten hab ich JETZT keine weiteren Fragen mehr. Du kannst ja mal zwischendurch hier vorbeischauen, ob wieder nen Problem aufgetreten ist.

    Deine Hilfe war echt hilfreich!!

    Danke nochmal!

    Roboaktiv
    Gruß Roboaktiv


    It is öde to be blöde

  5. #25
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    08.06.2007
    Alter
    32
    Beiträge
    104
    Ich hab mal versucht, mit dem Englisch im ATMega8-Datenblatt klar zu kommen. Bin ich auch. Allerdings kam mir das sehr kompliziert vor. Hab mir jetzt überlegt, das ich jetzt erstmal weiter so rumprogrammiere. Wenn mir das dann u langweilig wird, versuch ich es mal mit einer anderen Libary.

    Zitat Zitat von Roboaktiv
    Ideen zur Verbesserung
    Jo ich hab selber eine:
    Man könnte doch mal versuchen, dass der Asuro sich im Verhältniss zur Länge der Strecke davor dreht. Meine ersten Überlegungenansetzte sind, das man nach der If-Schleife noch ne Else-Schleife anhängt, inder dann zu einem Wert immer etwas dazu addiert, der dann mit ins Verhältnis der Dauer der Drehung gesetzt wird. Das sieht dann ungefähr so aus:
    Code:
    while(1)
    {
    Sleep(36);
    zeit=zeit+100;
    if(zeit>=Laenge)
    {
    break;
    }
    }
    }
    else
    {
    Laenge=Laenge+100;
    }
    (Alles was davor und danach nicht da steht, bleibt gleich.)
    Das hab ich auch schon ausprobert. Im Grunde funktioniert alles. Nur die Werte (von Laenge und zeit) sind bei jedem größen Verhältniss anders. Also wenn man den Asuro auf relativ kleinem Raum(1-2qm) fahren lässt, müssen die Werte weiter auseinader liegen als bei einem größeren Raum.

    Gruß
    Roboaktiv
    Gruß Roboaktiv


    It is öde to be blöde

  6. #26
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Die whiles gefallen dir wohl sehr. Wenn ich richtig verstehe, willst du messen, wie lange der asuro frei geradeaus fährt um dann, bei einer Kollision, die Dauer der Drehung abhängig von dieser Messung zu machen.

    Dazu sehe ich eigentlich zwei Ansätze:

    1.: Man misst die Zeit (z.B. über die Anzahl der Schleifendurchgänge oder mit Gettime(); )
    2.: Man misst die Wegstrecke (und auch die Drehung) mit der Odometrie

    Wobei die Zeitmessung "ungenauer" sein wird.

    Zeitmessung mit Schleifenzähler: Du verwendet eine Zählvariable. Diese wird zu Beginn des Programms und jeweils nach dem Drehen auf 0 gesetzt. Bei Geradeausfahrt wird der Zähler dann hochgezählt und beim Drehen ausgewertet. Das Problem dabei ist der schnelle ATMega8, der Zähler wird rasend schnell riesige Werte annehmen. Deshalb verzögere ich den Ablauf etwas (um je eine 1/1000stel Sekunde, deshalb Geradeauszeit ungefähr gleich Drehzeit). Man könnte auch eine größere Zählvariable verwenden (int long) und später den Wert runterteilen:

    Code:
    #include <asuro.h> 
    
    #define taste (!(PINC & (1<<PC4)))// Tastenabfrage
    #define keine_taste (PINC & (1<<PC4))
    
    unsigned int zaehler;  //Schleifenzaehler
    
    int main(void)
    {
    int zeit;
    Init();
    zaehler=0; //Schleifenzaehler zuruecksetzen
    while(1)
       {
         BackLED(OFF,OFF);                        //BackLED beide aus und
         StatusLED(GREEN);                        //StatusLED grün also alles Okay
          MotorDir(FWD,FWD);//Also kann man auch schön gradeaus fahren
          MotorSpeed(200,220);
          Sleep(36); // Ablauf etwas verzoegern, weil ATMega8 so schnell ist
          if (zaehler < 5000) zaehler++; //Schleifenzaehler hochzaehlen mit Begrenzung!
          if(taste)
          {
          BackLED(ON,ON);//BackLED beide an und
          StatusLED(RED);//StatusLED ROT also Kollision
          MotorDir(RWD,RWD);//also erst ein Stück zurück
          MotorSpeed(200,220);
          for(zeit=0;zeit<500;zeit++)//(0,5 Sekunde zurück)
             {
              Sleep(36);
             }
          StatusLED(YELLOW);//StatusLED orange
          BackLED(ON,ON);//BachLED ROT also Besserung in Sicht
          MotorDir(RWD,FWD);//Drehung
          MotorSpeed(200,220);
          for(zeit=0;zeit<zaehler;zeit++) //abhaengig von gerader Fahrt drehen
             {
              Sleep(36);
             }
    	   zaehler=0; //Ende der Drehung, Schleifenzaehler zuruecksetzen
          }
       }
    while(1);
    return 0;
    }
    Die Drehung kann man dann noch z.B. mit
    for(zeit=0;zeit<(zaehler/2);zeit++)
    beeinflussen.

    Mit Gettime() würde es so ähnlich funktionieren. Anstatt den Zähler zurückzusetzen müsste man sich die aktuelle Zeit merken und beim Drehen den aktuellen Zeitunterschied auswerten. Das alles ist aber sehr ungenau und hat auch eigentlich keinen Sinn. Außer eben, dass man übt.

    Ich würde dir aber raten, das über die Odometrie zu lösen. Dann bist auch erstmal beschäftigt, denn die Odometrie hat einige Tücken und ist nicht einfach zu beherrschen. Zusätzlich zur optimierten Mechanik (axiales Spiel der Codescheiben, Abdeckung der Sensoren) must du auch die Min-/Maxwerte kennen(mit PrintInt(); zum Terminal schicken) um eine vernünftige Funktion programmieren zu können. Es gibt noch viel zu tun und zu entdecken.

    Aus dem Datenblatt kann man gut die Beispielcodes verwenden, z.B. das Schreiben und Lesen des EEProms. Ich mische aber im Moment auch die Libary mit einigen direkten Portzugriffen (z.B. Tastenabfrage). Die Libary ist eben bequem, weil man sich um nichts kümmern muss und schnell zu einem Ergebniss kommt. Je nach Interesse kann man sich eben mehr Richtung KI oder Richtung Hardware orientieren.

    Bitte verstehe das jetzt nicht falsch. Ich habe nicht die Zeit und auch keine Lust dich bei jedem Schritt zu unterstützen. Du hast jetzt den Einstieg geschafft, alles weitere kommt von alleine, es braucht eben etwas Zeit und Mühe. Vieles wurde hier schon besprochen und erklärt. Da solltest du einfach mal etwas im Forum stöbern. Wenn's dann mal wirklich wieder klemmt, helfe ich dir natürlich weiter, wenn ich kann. Auch meine Möglichkeiten und Kenntnisse sind begrenzt. Aber es gibt ja auch noch andere asuro-Besitzer die sich gut auskennen und dir helfen können.

    Gruß

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  7. #27
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    08.06.2007
    Alter
    32
    Beiträge
    104
    Ja ich seh es auch ein. Solangsam fallen mir auch keine Fragen mehr ein. Mit der Odometrie hab ich heute morgen auch schon angefangen. Besonders weit bin ich zwar noch nicht gekommen aber ich probier mal fleißig weiter. Wenn es zu einer Stelle kommt, wo ich nicht mehr weiter weiß berichte ich dir hier davon. Wenn ich zu einem MEGAerfolg gekommen bin auch. Vielleicht kuckt ein anderer Forum-User hin und wieder auch mal hier vorbei. Deshalb sind nicht alle meine Einträge hier direkt an dich adressiert. Wenn du Zeit und Lust hast kannst du ja auch noch deine Ideen, Empfelungen usw. dazugeben.

    Gruß
    Roboaktiv
    Gruß Roboaktiv


    It is öde to be blöde

  8. #28
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    38
    Beiträge
    4.063
    Zitat Zitat von roboaktiv
    Ich hab mal versucht, mit dem Englisch im ATMega8-Datenblatt klar zu kommen. Bin ich auch. Allerdings kam mir das sehr kompliziert vor.
    da könnte ich helfen... was genau meinst du denn bzw. welches thema interessiert dich besonders?
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  9. #29
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    08.06.2007
    Alter
    32
    Beiträge
    104
    Eigendlich wollt ich nur wissen, welcher Pin zu welchem Register gehört. Am besten wäre es wenn du das gleich mit den Asuro erklärst.

    Gruß Roboaktiv
    Gruß Roboaktiv


    It is öde to be blöde

  10. #30
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    38
    Beiträge
    4.063
    hmm... ok. schnapp dir mal den schaltplan. dann such nach dem teil, das du ansprechen willst. nehmen wir mal die frontled. die hängt glaube ich an PORTD, PIN 6.

    dann machst du folgendes: zuerst stellst du diese port als ausgang ein.

    DDRD =DDRD | (1<<6);

    das bedeutet:
    DDRD ist das register in dem definiert wird, ob ein pin ein eingang (0) oder ausgang (1) ist.
    (1<<6) bedeutet das gleiche wie 01000000. eine eins, um 6 stellen nach links geschoben.
    durch das | wird der rest des registers nicht beeinflusst.

    dann sagst du dem prozessor, ob der pin high(an, 1) oder low (0) sein soll:
    -ein:
    PORTD = PORTD | (1<<6);
    -aus:
    PORTD = PORTD & ~(1<<6);

    das | sowie das & ~ sorgen wieder dafür, dass der rest des registers nicht beeinflusst werden.
    Read... or die.
    ff.mud.de:7600
    Bild hier  

Seite 3 von 7 ErsteErste 12345 ... LetzteLetzte

Berechtigungen

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

Labornetzteil AliExpress