- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 5 von 7 ErsteErste ... 34567 LetzteLetzte
Ergebnis 41 bis 50 von 67

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

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

    Powerstation Test
    Zitat Zitat von radbruch
    Wenn du durch Einrückungen deinen Code etwas struckturierst wird dir vielleicht auch klar, dass du nur eine einzige Schleife hast:
    Struktoriert hab ich das eigendlich. Es ist halt nur das Problem, dass ich diese Struckturen nicht in das Forum kopieren kann. was ist eigendlich so schlimm an nur ener Schleife?
    Zitat Zitat von radbruch
    Nur ein paar Fehler:

    -Zwischen dem Einlesen der alten und neuen Werte funktioniert die Zeitschleife nicht, weil du auf "durchlauf>=1000" prüfst. Wenn die Verzögerung funktionieren sollte, was sollte sie bewirken? Alter Wert einlesen-eine Sekunde warten während das Rad lustig weiterdreht-Überprüfen, ob sich der Wert geändert hat? Wenn er sich nicht geändert hätte, würde mich das sehr wundern!
    Ich hab mr gedacht, wenn die Werte direkt hintereinander kommen sind sie vielleicht nochidentisch und deshalb soll da noch nen bisschen Pause sein.
    [quote="radbruch"]
    -Du sendest immer noch während der Fahrt.
    [quote="radbruch"]
    Sorry, das hab ich oben einfach überlesen.
    Zitat Zitat von radbruch
    -Du kümmerst dich nicht um Hell oder Dunkel, du zählst einfach nur die Unterschiede.
    Reicht das nicht?
    Zitat Zitat von radbruch
    Das sind auf den ersten Blick die gröbsten Dinge. Lies dir mal diesen Codescheiben-Thread durch und führe das Messprogramm (den Datenlogger) aus, dass in diesem Thread angeboten wird. Dann bekommst du vielleicht ein Gefühl für die Odometrie und ihre Tücken.
    Hab ich und es war sehr informativ alledings konnt ich irgendwie die Anhänge nicht öffnen.

    Ich hab aus deinem letzten Berricht irgendwie entschlüsselt, dass ich dich einwenig nerve. Wenn ich damit recht hab tut mir das Leid. Vielleicht stell ich mich auch einfach zu blöd an.
    Du sollst dich auch nicht verpflchtet fühlen mir zu antworten auch wenn ich dich drumm bitte!

    Gruß Roboaktiv
    Gruß Roboaktiv


    It is öde to be blöde

  2. #42
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    08.06.2007
    Alter
    32
    Beiträge
    104
    Hallo Damaltor,
    ich habe bemerkt, dass du so ab dem 3.7 nicht mehr online warst. In letzter Zeit hatte ich ich auch keine Zeit dazu. Jetzt hab ich bemerkt, dass du wieder öffter da bist. Es sind alllerdings die obengestellten Fragen noch offen.

    Hier sind sie nochmal:
    Das was du da oben geschrieben hast hab ich verstanden. Aber woher weiß ich jetzt welches Register zu welchem Pin gehört.

    Auch nicht verstanden hab ich die Geschichte vom Motor. Da gibt es ja so ne Pulsweitende-Funktion oder so ähnlich. Außerdem gibt es da ja 3 Pins pro Motor (z.B. für den linken Motor: PD4(XCK/T0) PD5(T1) PB1(OC1A)). Und was soll das jetzt??

    Allerdings hab ich auch gelesen, dass du z.Z. nurnoch an der FH online gehen kannst. Wenn dir da irgendwie die Zeit fehlt, dich mit mir zu "unterhalten" hab ich dafür auch Verständnis.

    Gruß

    Roboativ
    Gruß Roboaktiv


    It is öde to be blöde

  3. #43
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    38
    Beiträge
    4.067
    hmm ok.
    ich werde es versucchen.

    (fast) immer 8 prozessorpins sind zu einem port zusammengefasst. jeder port hat einen großbuchstaben.
    PD4 bedeutet vierter pin vom port D.

    für jeden port gibt es drei register, in denen jeweils 8 bit gespeichert werden. sinnvollerweise steht immer das nullte bit für den nullten pin, das erste bit für den ersten usw. bis zum siebten bit für den siebten pin. es gibt (zumindest rein auf informatischer ebene =) weder ein achtes bit noch einen achten port =)

    als beispiel nehme ich port D, für alle anderen ports muss nur jeweils der großbuchstabe geändert werden.
    die drei register heissen
    DDRA,DDRB,DDRC,DDRD für die RICHTUNG
    -für jedes bit gilt, 1=ausgang,0=eingang
    PORTA,PORTB,PORTC,PORTD für den ausgangspegel oder die pullups(später)
    1=strom an, 0 = aus ODER 1=pullup an, 0=aus
    PINA,PINB,PINC,PIND für das eingangssignal.
    1 gelesen = strom von aussen ist an, 0=aus

    wenn ich also PD2 zum beispiel einschalten möchte, dass 5v spannung ausgegeben werden, muss ich
    zuerst in das richtungsregister an die entsprechende stelle eine 1 schreiben. damit die anderen bits nicht verändert werden, wird das ganze mit einer ODER-bedingung verknüpft.
    damit man nicht immer alle bitwerte in hex-zahlen umrechnen muss (was aber durchaus möglich ist) wird einfach nur eine 1 verschoben, wie recht weit obern geschrieben mit dem << - operator.
    für pd2:
    DDRD |= (1<<2);

    also im register DDRD wird das zweite bit gesetzt. der pin ist jetzt ein ausgang.

    jetzt wllen wir strom anlegen, dafür ist das register PORTD da. hier muss eine 1 gesetzt werden zum einschalten oder eine null zum ausschalten. aber um eine null zu setzen, muss man umdenken: man verschiebt eine 1 an die entsorechende stelle, (00000100) invertiert das ganze mit dem ~ operator (11111011) und verknüpft das ganze mit dem und-operator.
    PORTD |= (1<<2); //eingeschaltet
    PORTD &= ~(1<<2); //ausgeschaltet.

    damit kannst du zb schon leds anschalten usw, du kannst ja einfach im schaltplan rausfinden an welchem pin die jeweilige led angeschlossen ist.

    um einen pin als eingang zu nutzen, zb um einen taster auszulesen, muss der taster gegen masse an den pin angeschlossen werden.
    also GND --- taster --- atmega
    dann schaltest du dein pin auf eingang:
    DDRD &= ~(1<<2);
    und den pullup-widerstand ein. das ist nötig um festzuegen dass der pin solange high ist bis der taster gedrückt wird.
    PORTD |= (1<<2); //das gleiche register wie für den ausgangpegel, aber hier für den pullupverwenndet
    wenn du jetzt wissen willst ob der taster gedrückt wurde, mach folgendes

    unsigned char test;
    test = PIND & (1<<2);

    wenn test >0 ist, dann wurde die taste NICHT gedrückt, wenn test gleich null ist, wurde die taste gedrückt.

    für die pwm hab ich grade keine zeit, evtl später mal.

    frag wenn du was nicht verstanden hast =)
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  4. #44
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    08.06.2007
    Alter
    32
    Beiträge
    104
    Hallo
    erstmal danke, dass du dir Zeit für mich genommen hast!
    Jetzt die Fragen:
    Im 4. Absatz von oben hast du die Geschichte mit DDRD(Hier hast du mal Großbuchstaben verwendet!!!!) und co erklärt. Warum nimmt man da das? Und das mit der Richtung hab ich auch nicht verstanden.

    Im 5. Absatz von unten hast du geschrieben:"muss der Taster gegen masse (meinst du da masse oder maße?) an den pin angeschlossen werden" außerdem habe ich das mit dem pullup-widerstand nicht verstanden.

    Den Rest hab ich ohne Probleme verstanden. Danke schön.

    Gruß Roboaktiv

    PS: Lass dich nicht von mr stressen! Im Grunde bin ich eigendlich sehr geduldig.
    Gruß Roboaktiv


    It is öde to be blöde

  5. #45
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    38
    Beiträge
    4.067
    allgemeine erklärungen zu abkürzungen:
    VCC = BEtriebsspannung = plus 5V = Pluspol der batterie = logisch 1 = HIGH
    GND = Masse = 0V = Minuspol der batterie = logisch 0 = LOW

    also die ganzen abkürzungen (DDRxPORTx,PINx usw) sind die namen der register, in die man schreiben will.

    DDRx ist das richtungsreigister. wenn hier eine 1 an z.B. die 2te stelle geschrieben wird, ist der 2. Pin vom Port x (zu ersetzen durch A,B,C oder D) ein ausgang. man kann dann mithilfe von PORTx entweder VCC oder GND, also 5V oder 0V, an diesem pin ausgeben. damit leuchtet zB eine LED wenn 5V angegeben sind, und eben nicht, wenn 0V angegeben sind.

    wird in DDRD eine null geschrieben, dann ist der entsprechende pin ein Eingang. man kann also mithilfe des registers PINx herausfinden, ob von aussen strom an den pin geleitet wird, oder ob der pin von aussen mit der masse verbunden wurde.
    Wenn jedoch der pin WEDER mit etwa 5v, NOCH mit der masse verbunden ist, ist er in einem sogenannten undefinierten zusatnd. dieser fall sollte eigentlich nach möglichkeit vermieden werden, da es dann absoluter zufall ist, ob der prozessor nun denkt ob 5V oder Masse(GND, 0V) anliegen.

    nun stell dir mal vor, du würdest den taster einfach so an den pin anschliessen, und den anderen pol des tasters an die Masse (!). solange der taster nicht gedrückt ist, wäre der pin in einem undefinierten zustand (er ist ja weder mit masse noch mit VCC verbunden). man könnte alo nicht rausfinden, ob er gedrückt ist oder nicht - das ergebnis wäre zufällig, wenn er nicht gedrückt wäre, und null, wenn man ihn drückt. das hilft im allgemeinen nicht besonders bei der programmentwicklung, da man sich auf das ergebnis nicht verlassen kann.
    jetzt stell dir mal die folgende konstruktion vor:

    Masse --- Taster --- Prozessorport --- Widerstand --- VCC

    wobei eben sowohl eine seite des tasters als auch der widerstand mit dem prozessor verbunden sind.

    ist der taster nicht gedrückt, wird strom über den widerstand an den prozessorport gegeben. der prozessor meldet also bei einer entsprechenden abfrage ganz sicher eine 1 - schliesslich liegt ja strom an.
    wird der taster gedrückt, fliesst der ganze strom richtung masse ab, der prozessor meldet also eine null für taster wurde gedrückt, da kaum strom bei ihm ankommt.

    (einen solchen widerstand nennt man pullup-widerstand, da er den prozessorpin bei nicht gedrücktem schalter auf VCC "zieht".
    im gegensatz dazu gibt es übrigens auch pulldown-widerstände, diese sind mit masse verbunden und ziehen den pin immer auf GND. der atmega8 hat jedoch solche nicht, und deshalb ist das nur eine nebenbei-info die nix mit dem eigentlichen thema zu tun hat. =) )

    damit man jedoch nicht für jeden taster, oder ähnliches, den man verwenden will, einen eigenen widerstand auf die platine löten muss, hat der atmega eingebaute pullup-widerstände. diese lassen sich aktivieren oder deaktivieren.

    wenn das richtungsregister DDRx (heisst übrigens "Data Direction Register") auf Eingang geschaltet ist, kann man mithilfe des dateneingangsregisters PINx ja den wert null oder eins auslesen, wie oben beschrieben. der datenausgangsregister PORTx wird also nicht benötigt, da er ja nur dafür da ist den spannungspegel zu definieren, der am entsprechenden pin ausgegeben werden soll - und der pin ist ja jetzt ein eingang. also wird der (oder das) register "missbraucht": schreibt man eine eins an die entsprechende stelle, werden intern pullup-widerstände aktiviert - man liest also mit PINx immer eine eins, bis der pin manuell, zum beispiel mithilfe eines tasters, auf GND gezogen wurde. dadurch wird also vermieden, dass der pin in einem undefinierten zustand ist.
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  6. #46
    Benutzer Stammmitglied
    Registriert seit
    25.05.2007
    Ort
    Giessen und Fulda
    Alter
    39
    Beiträge
    81
    Also ich hab gestern auch diese tolle Erfahrung mit der IF-Anweisung gemacht, scheibar hat der Asuro Probleme berechnungn in der Klammer (Wahrheitsprüfung) zu machen, deswegen das Ergebnis der Berechnung vorher in eine seperate Variable speichern und diese dann in der If-Anweisung prüfen.

  7. #47
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    38
    Beiträge
    4.067
    nein, rechner kann der asuro sehr exakt. aber wenn du deinen programmcode herzeigst, können wir ja mal nach fehlern suchen...

    oder wenn du die taster meinst, diese haben einen anderen grund für ihre ehleranfälligkeit. die sind nämlich nicht einzeln am prozessor, sondern hängen alle an einem pin, und benutzen verschiedene (qualitativ schlechte) widerstände.
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  8. #48
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    08.06.2007
    Alter
    32
    Beiträge
    104
    Mit dem letzten Absatz ob hast du mich einwenig verwirrt.

    Ich dachte immer, dass man erstmal mit dem DDR x und der |=(1<<x)-Geschichte definiert, dass ein Pin ein Eingang ist.
    Mit dem Port x und der gleichen Geschichte wird z.B. eine LED eingeschaltet.
    Und diese jetzt wieder aus zu schalten nimmt man die Portx &= ~(1<<x) Geschichte.

    Das ganze als Ausgang:
    abfrage=Portx &= ~ (1<<x)
    if(abfrage=0)//dann ist der z.B. Taster nicht gedrückt

    Stimmt das so?

    Und wozu benötigt man jetzt die Pinx-Geschichte?

    Gruß Roboaktiv

    PS: Ich glaub das heißt DAS Register
    Gruß Roboaktiv


    It is öde to be blöde

  9. #49
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    38
    Beiträge
    4.067
    fast richtig.

    mit PORTx werden werte ausgegeben, oder die pullups werden eingestellt.
    mit PINx wird der aktuelle status des tasters gelesen.

    nehmen wir an, du hast folgende schaltung(eigentlich brauchen leds einen vorwiderstand, den lasse ich jetzt hier weg):

    Prozessor --- LED --- GND am PD2, also port d, pin 2

    zuerst schalten wir den pin auf ausgangsrichtung:
    DDRD |= (1<<2);
    dan schalten wir den pin auf HIGH, um die led einzuschalten:
    PORTD |= (1<<2);
    Die led leuchtet jetzt. wir wollen sie wieder ausschalten:
    PORTD &= ~(1<<2);
    jetzt ist sie wieder aus.

    nun benutzen wir folgende schaltung am gleichen pin:
    Prozessor --- Taster --- GND

    zuerst schalten wir den pin auf eingang:
    DDRD &= ~(1<<2);

    Dann schalten wir den Pullup-widerstand ein:
    PORTD |= (1<<2);
    damit wurde das PORTx-register verwendet, welches normalerweise zum ausgeben eines pegels verwendet wurde.

    jetzt wollen wir den status des tasters einlesen:
    abfrage = PIND & (1<<2);

    zuer erklärung: zuerst wird PIND eingelesen, es wird je nach den angelegten spannungen zB 01001101 sein. dann wird dieser wert mit & mit dem wert 00000100 verknüpft, also werden alle bits ausser dem an stelle 2 auf null gesetzt, weil ja nur dieser eine interessant ist.

    wenn der taster nicht gedrückt wurde, ist der pin auf HIGH-pegel, da er ja über den pullup-widerstand mit VCC verbunden ist. folglich hat die abfrage jetzt den wert 00000100, also 4. alle werte ungleich null gelten als "WAHR"

    wenn der taster gedrückt ist, dann ist der pegel am pin LOW. die variable abfrage hat jetzt den wert 00000000, also 0. der wert null gilt als "FALSCH".

    folgendes programm wäre möglich, wenn du einen taster zur hand hast und den entsprechend anschliesst:

    unsigned char abfrage;
    DDRD &= ~(1<<2); //als eingang wählen
    PORTD |= (1<<2); //pullups aktivieren
    while(1){ //endlosschleife
    abfrage = PIND & (1<<2); //abfrage durchführen
    if(abfrage){ //wenn abfrage nicht null, also WAHR ist
    SerWrite("Taster nicht gedrückt\n\r",23); //dann text ausgeben
    } //ende if
    else{ //wenn abfrage =0 also FALSCH
    SerWrite("Taster gedrückt\n\r",17); //dann text ausgebeb
    } //ende else
    } //ende while

    zusammenfassung:
    DDRx : bestimmt, ob ein pin eingang (1) oder ausgang(0) ist
    PORTx : bestimmt bei ausgängen, ob HIGH (1)oder LOW (0) ausgegeben wird, und bei eingängen pb die pullup-widerstände verwendet werden sollen(1) oder nicht(0).
    PINx : enthält den aktuellen wert des von aussen angelegten spannung, (1) für 5V, (0) für GND
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  10. #50
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    08.06.2007
    Alter
    32
    Beiträge
    104
    Ah! Jetzt hab ich es verstanden und fühle mch schon viel schlauer! Danke schön!

    Beim ASURO kann man diese Art der pullup-Geschichte doch nur für die Taster verwenden oder?

    Bei der Status LED(PD2(zweiter Pin im Port D),PB0(erster Pin im Port B)) muss man doch nur jenach Farbe einen von den beiden Pins ansteuern und wenn man diesen Orange Ton haben will beide.
    Bei der Verbindung zu PD2 steht an der LED "rd" ist das Rot?
    Und bei der Verbindung zu PB0 steht an der LED "gn" scheint Grün zu sein oder?

    Also für Grün:

    DDRB |= (1<<1); //als Ausgang wählen
    PORTB |=(1<<1); //einschalten
    PORTB &=~(1<<1);//ausschalten

    Für Rot die ganze mit DDRD und PORTD
    und für dieses Orange mit beiden.

    War das so jetzt richtig?

    Im meinem ASUROBUCH steht, dass man für die PWM-Geschichte(Geschichte ist vermutlich mein neues Lieblingswort gewöhn dich schonmal daran) nen Register namens TCCR1A, TCCR1B benötigt aber welchen dieser 3 Pins pro Motor soll man jetzt ansteuern?

    Die PWM-Geschichte brauchst du mir nur erklären, wenn ich die LED-Geschichte richtig aufgeschrieben habe.

    Gruß Roboaktiv

    PS: Die PWM-Geschichte scheint relativ kompliziert zu sein wenn du dazu keine Zeit hast kannst du sie mir auch dann erklären, wenn du Zeit hast.
    Gruß Roboaktiv


    It is öde to be blöde

Seite 5 von 7 ErsteErste ... 34567 LetzteLetzte

Berechtigungen

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

12V Akku bauen