PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Zustand der Ports nach verlassen von Schleife festlegen



popi
16.06.2006, 23:28
Hallo zusammen,

wenn ich eine Schleife verlasse, bleiben die Ports in dem Zustand, wie sie vor Verlassen waren.
Dazu mess gesagt werden, das in der Schleife eine LED via PWM ständig hoch und runtergedimmt wird.

Durch welchen Befehl kann man denn nun erzwingen, das die LED nicht ihren letzten Helligkeitszustand beim verlassen der Schleife behält sondern ganz aus ist???

Contr. mega64

Danke und Grüße

popi

linux_80
16.06.2006, 23:45
Hallo,

wenn eine Schleife verlassen wird, egal ob normal beendet, weil die Bedingung erfüllt wurde, oder durch Abbruch, wird direkt mit dem ersten Befehl nach der Schleife weitergemacht, hier könntest Du einfach die Ports so setzen wie Du es haben willst.

popi
16.06.2006, 23:56
ich habe das mit dem Zurücksetzen ja probiert, oder mache ich was falsch???

if (aktion == "nix") {PORTB = (1 >> PB4) | (1 >> PB5) | (1 >> PB6) | (1 >> PB7);}

Danke und Gruß

popi

linux_80
17.06.2006, 00:50
Was verwendest Du genau für eine Programmiersprache ?

Wo steht denn das If im bezug zur Schleife ?

Ein Fehler ist auf jeden Fall mal, das man die eins (1) nicht nach rechts >> [-X
sondern nach links schiebt <<, um das Bit zu erreichen, das man haben will !

popi
17.06.2006, 01:35
okay, was habe ich denn missverstanden ?????

ein Bit nach links schieben heisst doch "setzen"

Aber ich will doch das Bit löschen?
Also eins nach links nachschieben?

Habs auf jeden Fall probiert und geht leider nicht.

Der Bezug: liegt im restlichen Code versteckt.
Ich dachte, ich poste nur mal die Hauptfrage, anstatt ein haufen Code, wo man sich erst einarbeiten muss... (wollts Euch nur leicht machen)

Liebe Grüße

popi

linux_80
17.06.2006, 02:13
hui !
"nach links schieben" heisst einfach nur "nach links schieben",
und ein Bit setzen, bedeutet, es auf eins (1) zu machen,
beim Bit löschen, wird es auf 0 gemacht.
Ergibt die Begriffe Set und Clear (oder auch Reset).

Du hast Doch schon mal in einem Thread gefragt:
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=189490#189490
und u.a. PicNick hat das erklärt, wie das mit der schieberei hinhaut.

Und zur Sicherheit nochmal die logischen AND und OR betrachten, damit Du weisst, warum das so ist mit den nullen und einsen.


Warum ich nach dem Bezug zur Schleife gefragt habe ?
Du wolltest eine Schleife abbrechen oder sowas i.d. Richtung, deshalb muss man halt wissen wo die Abfrage ist, und was das mit der Schliefe zu tun hat.

VictimOfMyOwn
17.06.2006, 03:01
hi ho...

mal ganz abgesehen von der schleife...

bit setzen: PORTX |= (1 << PIN);

bit löschen: PORTX &= ~(1 << PIN);

oder hab ich jetz irgendwas überlesen...?

mfg

popi
17.06.2006, 05:28
Ihr seid die Profid, was soll ich sagen...
Aber verstehen tue ich das noch immer nicht.

Bisher habe ich immer Bits in Registern mit PORTx = (1 << Pxn) und gelöscht mit PORTx = (1 >> Pxn) und es hat geklappt.

Was ist der Unterschied zwischen meiner Schreibweise und
bit setzen: PORTX |= (1 << PIN);
bit löschen: PORTX &= ~(1 << PIN);

Also man sieht ja im Syntax den Unterschied, aber warum bewirkt es das gleiche.
Habe ich nur Glück gehabt, bleiben bei mir Zustände undeffiniert und hängt sich der Controller mal auf?

Würde mich mal über eine Erklärung freuen.

Grüße

popi

VictimOfMyOwn
17.06.2006, 13:13
hi ho...

ich bin ja auch noch recht frisch, was die programmierung von atmegas betrifft. vom 89cxx51 bin ich eine ganz andere schreibweise gewohnt.

z.b.

SBIT Led 0xB0;

...
...
...

Led = 1;
Led = 0;

also viel simpler wie ich finde. auf jeden fall muss ich mich da auch noch etwas reinfuchsen. aus diesem grunde habe ich gestern einfach mal´n bissl rumprobiert und mir folgendes aufgeschrieben:

PORTB &= 1 << 2; // Alle Bits bis auf 2 löschen
PORTB &= (1 << 2); // Alle Bits bis auf 2 löschen
PORTB &= ~1 << 2; // Alle Bits von 0 bis einschließlig 2 löschen
PORTB &= ~(1 << 2); // Bit 2 löschen

PORTB |= (1 << 2); // Bit 2 setzen
PORTB |= 1 << 2; // Bit 2 setzen
PORTB |= ~1 << 2; // Bit 7 bis 3 setzen
PORTB |= ~(1 << 2); // Alle Bits außer Bit 2 setzen

PORTB ^= (1 << 2); // Bit 2 toggeln
PORTB ^= 1 << 2; // Bit 2 toggeln
PORTB ^= ~1 << 2; // Bit 7 bis 3 toggeln
PORTB ^= ~(1 << 2); // Alle Bits außer 2 toggeln

vielleicht hilft es ja etwas...vor allem hoffe ich, daß das alles soweit richtig ist.

mfg

popi
17.06.2006, 15:17
Vielen Dank...
Das ist doch mal eine Antwort ;o)

Danke für Deine Mühe, habe mir das sofort in meine Formelsammlung übertragen.

Aber auch Du benutzt das =-Zeichen niht alleine, nur mir <, | und ^ sogar.

Komisch, das ich das so verwende, ich würde gerne wissen, wo ich das herhab, bestimmt auch aus einem Forum ;o)

Vielen Dank nochmal...
Hat mir sehr geholfen. Muss mir mal Zeit nehmen und auch einiges ausprobieren..


Liebe Grüße

popi

SeaLion
20.06.2006, 09:19
Die Kombination &= und auch alle anderen =-Kombinationen gibt es nur aus Faulheit. Wenn ma nwill kann man auch folgendes schreiben:

PORTB &= (1<<P3);
PORTB = PORTB & (1<<P3);

Die beiden Zeilen sind für den Compiler identisch.
Bei Controller nimmt man meistens die &= Variante, da man so den alten Zustand mit einliest und nur gezielt einige Bits verändert, die alten werden wieder so gesetzt, wie sie waren.

MfG

popi
21.06.2006, 23:17
Vielen Dank SeaLion für den Nachtrag...

Grüße

popi