Hallo, ich hab' ldier schon wieder ein Problem mit avrgcc. Von Assembler her bin ich gewohnt, dass man in variablen oder registern einzelne Bits löschen oser setzen kann - das ist in manchen Fällen meiner Meinung nach wesentlich praktischer und einfacher als die zahllosen Bitoperationen von C (>>, |, &.....) Also hab' ich mal munter "cbi (byte, 4);" hingeschrieben - es gibt zwar keinen Fehler, aber die Warnmeldung - wie kann ich das verhindern oder wie löst man sowas elegant??? Vielen lieben Dank!!! Christian
Das geht doch nur mit vorgesehenen IO-Registern. Auf eine Variable kannst du ein "cbi" nicht anwenden. Lösung: byte = byte & ~0x10; oder byte &=~0x10; Bin mir jetzt mit der cbi-Syntax nicht ganz sicher, aber cbi(byte,4) sollte doch Bit 4 löschen (bei 0 beginnend zu zählen). Zieh dir die "zahllosen Bitoperationen" mal rein, das is garnicht so schwer. Anmerkung: Wenn du in der Variablen byte zufälligerweise eine gültige Adresse eines IO-Registers stehen gehabt hättest, dann hättest du den Inhalt dieses Registers verändert... böse Sache - "nie" zu finden. Schmittchen.
Hallo Schmittchen, Danke für deine Antwort. Meinst du mir deiner Anmerkung, dass man das DDRx register löschen kann und dann das Byte ins PORT Register reinladen kann und dort manipulieren??? Vielen Dank Christian
Zunächst: Ich habe soeben mal wieder einen Beitrag verfaßt und auf
submit geklickt. Leider war das Subject zu lang (>60Zeichen). Das gibt
eine Warnmeldung mit der Aufforderung das bitte zu beheben. Aufmerksam
hab ich darüber nachgedacht wie ich wieder zurückkomme ohne meinen Text
zu löschen. (Wär' ja nicht der erste Beitrag, den ich mir wegschieße).
Ich entschied mich auf "Zurück-zum-Betrag" zu klicken. Alles weg. :-(
@Andreas: Gibts da keine bessere Möglichkeit solche "Bedienfehler" zu
verhindern? (Der Browser-back-button hätte meinen Beitrag nicht zerstört
- hoffentlich kann ich mir das jetzt merken).
Zum Thema:
Ich dachte zunächst daran, dass deine Variable "byte" z.B. den Wert
0x11 annehmen könnte. Wenn du dann mittels "cbi (byte,4)" eine
Bitänderung erzwingen willst, dann würde das nicht auf die Variable
"byte" passieren, sondern das Register mit der Adresse 0x11 betreffen
(in diesem Falle das DDRB-Register). Dadurch würde Pin4 auf Eingang
geschaltet. Das kann zu seltsamen und unerwarteten Fehlern/Effekten
führen, deshalb:
> böse Sache - "nie" zu finden.
ABER: So wie ich mir das jetzt gedacht habe ist das nicht! Der
Compiler muß ja zur Übersetzungszeit schon aus der Anweisung "cbi" und
deiner Variablen "byte" einen Assemblerbefehl generieren. Die Adresse
bzw. das IO-Register auf das das Kommando angewendet wird, fließt mit in
den Opcode ein. Dazu muß sich der Compiler für einen Wert für "byte"
entscheiden. Die Wahl fällt auf 0 - wie er auch später als
Compilerwarnmeldung ausgibt. Es passiert also nichts. Du kannst dir dein
cbi-Kommando also sparen - Bit 6 würde so jedenfalls nicht gelöscht.
Schmittchen "der seine Gedankengänge, trotz Verwirrungsgefahr, stehen
läßt"
Hallo Schmittchen, vielen Dank für deine ausführlich Antwort (die du vermtulich 2 mal schreiben mussetst). Ich hatte bei meinem 2. Posting auch das Problem, dass alles weg war - aus diesem Grund hab' ich mich beim 2. Anlauf auf eine kürzere Variante meiner Antwort beschränkt.... Deine Erklärung leuchtet mir ein - vielen Dank!!!! mfg Christian
Der Bug mit dem zu langen Subject ist schon behoben, es wurde versehentlich ein Zeichen zu wenig abgeschnitten. Wenn du auf "Zurück" klickst sollte der Beitrag eigentlich nicht verschwinden, bei mir bleibt er! Gruß Andreas
Hallo Andreas, vielen Dank für die Bug Behebung!!! Das mit dem "zurück" hat bei mir auch erst einmal nicht funktioniert - keine Ahnung was ich da anderst gemacht habe??? mfg Christian
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.