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


von Braten (Gast)


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.

von Peter D. (peda)


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

von Braten (Gast)


Lesenswert?

hey Danke Peter,

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

von Braten (Gast)


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

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
Noch kein Account? Hier anmelden.