www.mikrocontroller.net

Forum: Compiler & IDEs Einfaches Anfängerproblem


Autor: Feissy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Halle, hab da mal ne Frage und zwar möchte ich, wenn ich 2 
angeschlossene tatster am Atmega8 drücke ( und Verknüpfung ) das 2 
Ausgänge geschaltet werden. Das klappt auch ganz gut.
Aber wenn eben diese Bedingung nicht erfüllt ist, soll ein Ausgang 
getoggelt werden, der Ausgang wird aber nur gesetzt und bleibt an. Was 
muss ich da im Code ändern oder warum funktioniert das nich :
else   
    {
      PORTD = 0b00000000;  //  Ausgänge Aus und
 
      PORTD ^=  (1<<PD2)  ;     //      Toggle  LED1
        _delay_ms(100);         //    Status Fehler
                   
    }

gruß Stefan

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So schaltest du D erst komplett ab und togglest dann PD2.
Weil alles (also auch PD2) eben ausgeschaltet wurde, ist
PD2 so immer an anstatt getoggelt.

Autor: Feissy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und wenn man das dann so löst :

[c]
else
    {
      PORTD = 0b00000100;  //  Ausgänge Aus und

      PORTD ^=  (1<<PD2)  ;     //      Toggle  LED1
        _delay_ms(100);         //    Status Fehler

    }
[c]

Oder ist dann der Ausgang auch immer gesetzt?

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
so ist er immer aus, weil mit PORTD = 0b00000100 genau
das Bit gesetzt wird, was gleich danach mit PORTD ^=  (1<<PD2)
wieder gekippt, also gelöscht wird.

Welches willst du denn eigentlich an haben und welches gekippt?

Autor: Feissy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also PD0 und PD1 sollen gelöscht werden und PD2 soll getoggelt werden.

Muss man da dann irgendwie die beiden mit ner und-verknüpfung 
zusammnenbringen oder nwie stellt man das an ?

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Feissy schrieb:
> Also PD0 und PD1 sollen gelöscht werden und PD2 soll getoggelt werden.

Das könnte man so machen:
     PORTD &= ~( (1<<PD0) | (1<<PD1) ); // PD0 und PD1 löschen
     PORTD ^= (1<<PD2); // PD2 kippen

Autor: Feissy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achso also mit
PORTD &= ~( (1<<PD0) | (1<<PD1) ); // PD0 und PD1 löschen

löscht man dann eben nur die beiden Bits und nicht den ganzen Port.

Ok danke dann hab ich das nu auch verstanden .

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bitte, war nicht schwer. Steht ja im Tutorial... :-)

Autor: Feissy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ups ja hab grade nachgeguckt .............
Also ich finde das Tut auch manchmal sehr hilfreich aber manchmal wenn 
man was ganz einfaches sucht überliest man das sowieso meistens und wenn 
man das dann erst einmal gesehen hat wie man das machen muss dann prägt 
man sich das eher ein...........

Gruß

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.