mikrocontroller.net

Forum: Compiler & IDEs avrgcc warning: asm operand 0 probably doesn't match constr


Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Schmittchen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Schmittchen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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"

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

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.