www.mikrocontroller.net

Forum: Compiler & IDEs xxx=(1 << Bit0) wird hier nur geschrieben oder auch gelesen


Autor: Braten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo liebe Leute.

ich habe folgendes Problem.
Ich habe einen ACTEL FPGA indem ein 8051 implementiert ist. Diesem 
möchte ich nun über Keil in C Programmieren.

Eine Eigenart ist, dass die IO's je 8 Inputs haben und gleichzeitig 8 
outputs.

Wenn ich nun auf auf die Variable (hinter der sich meine IOs verstecken) 
beschreibe, schreibe ich die ausgänge... falls ich aber lese, lese ich 
von den eingängen.

Wenn ich nun aber den Befehl hier verwenden möchte um ein bit der 
ausgänge zu setzten:

myinout |= (1<< BIT5);

dann ist das ja gleichbedeutend mit

myinout = myinout | (1<<BIT5);

Das heisst ja in Worten " LESE myinout aus... und ver"oder"e es mit 
einem bit wo alles 0 ist ausser das 5te bit und SCHREIBE es zurück"

LESE deswegen grossgeschrieben weil, wenn ich von der variable lese die 
eingänge eingelesen werden. Ich möchte doch aber den zustand der 
Ausgänge wissen.

Oder weiss das mein Kompiler dass er dabei nicht aus dem register liest, 
sondern sich den zustand her nimmt.

Ich weiss... es ist etwas speziell, aber ich hoffe das irgend ein C 
profi mir eine Antwort geben kann.

Vielen Dank fürs lesen.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Braten wrote:
> Oder weiss das mein Kompiler dass er dabei nicht aus dem register liest,
> sondern sich den zustand her nimmt.
>
> Ich weiss... es ist etwas speziell, aber ich hoffe das irgend ein C
> profi mir eine Antwort geben kann.

Ne, das hat nichts mit Compiler oder C zu tun, das ist in der 8051 
Architektur festgelegt.

Es gibt Read-Modify-Write Instruktionen und die lesen immer das 
Ausgangslatch, nicht die Eingänge.

Steht aber in jedem 8051 Datenblatt drin.


Peter

Autor: Braten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hey Danke Peter,

Also kann ich solche Konstrukte dennoch verwenden :-)
des finde ich gut, danke für die schnelle Antwort

Autor: Braten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm, zu früh gefreut. Geht leider doch nicht.

Habe jetzt im 8051 Datenblatt von ACTEL geschaut. Mit dem Befehl
ORL kann man Bitweise ver"oder"n. Wenn es sich um einen Ausgang handelt 
werden die Ausgangslatches eingelesen. Also genau das was ich brauche.

also wollte ich das nun mit inline assembler versuchen, brauche aber 
wohl etwas nachhilfe in assembler

soweit bin ich:

#pragma ASM
ORL Variable, #00001000b
#pragma ENDASM

daraufhin bekomme ich diese fehlermeldung
error A48: DATA-ADDRESS EXPECTED

Also möchte der ORL befehl wohl keine Variable von mir, sondern die 
Adresse der Variable.

Wenn ich die adresse der Varialbe (wo sich die IO dahinter verbergen) 
angebe, meckert wer weil die Adresse der memory map 16Bit ist.

Vielen Dank für die Nachhilfe...
und einen schönen sonnigen Nachmittag

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.