C164 mit Keil Binärzahlen

Gast #24072
Lesenswert?

Hallo zusammen,

weiß vielleicht jemand, ob es möglich ist, beim Keil-Compiler im 
Zusammenhang mit dem C164 direkt Binärzahlen anzugeben, oder muß man 
sich wie beim GCC ein Makro dazu schreiben?

Ich denke mir das z.B. so:

Var = b00101000

Gruß,

Ralf
Gast #24074
Lesenswert?

>Das ist doch gerade der Witz an C, seine Portabilität !
Was ist denn an einer Binärzahl nicht portabel?

>Warum soll der Keil es anders machen als der GCC.
Weil der ein Schweine-Geld kostet und man für die etlichen tausend Mark, 
die das Gurkenteil gekostet hat, auch was erwarten kann.

Eine Antwort auf obige Frage würde mich auch interessieren.
Wie sieht denn so ein Makro aus?

Grüße
Oliver
Gast #24079
Lesenswert?

hallo,
ich bin zwar etwas am thema vorbei, aber evtl. hilft der nachfolgende 
ansatz beim setzen von einzelnen bits.
läuft zwar unter c++, ist aber für den gcc kein problem.
in anhang habe ich auch noch die erzeugten assemblerfiles für den avr 
und auch einen hitachi beigelegt.

ein kleines problem ist die undefinierte reihenfolge der bits.

der vorteil ist das leichte ändern der bitreihenfolge. wenn ein ausgang 
mit einem anderen portpin geschaltet werden soll, ist nur die 
reihenfolge in der structur zu ändern.

ich würde mich freuen, wenn das mal jemand auf einem arv laufen lassen 
kann. ich habe nur die hitachi's und damit läuft es ohne probleme.

oryx


// Parameter beim compilieren
// avr-gcc -S -mmcu=atmega32 -O3
struct port
{
  union
  {
    unsigned char bit_8;

    struct
    {
      unsigned p0_0 : 1;
      unsigned p0_1 : 1;
      unsigned p0_2 : 1;
      unsigned p0_3 : 1;
      unsigned p0_4 : 1;
      unsigned p0_5 : 1;
      unsigned p0_6 : 1;
      unsigned p0_7 : 1;
    } bit;
  };

};


port test;

int main(void)
{
  test.bit_8 = 0x00;
  test.bit.p0_1 = true;
  test.bit.p0_2 = true;
  test.bit.p0_7 = true;
  return 0;
}
Angehängte Dateien:
#24080
Lesenswert?

@Oliver,

Du hast das Prinzip der Portabilität nicht verstanden:

Ein Standard ist nur deshalb ein Standard, weil sich viele danach 
richten und nicht jeder sein extra Süppchen kocht.

Und gerade teure professionelle Compiler versuchen so nahe wie möglich 
am ANSI-Standard zu bleiben und der kennt nun mal kein "Var = 
b00101000".

Das BIN() Macro tuts ja auch voll, so daß niemand seinen Compiler mit 
Gewalt unportabel machen muß.

Sonst wäre ja C auch nicht so verbreitet.


@Oryx,

das dürfte auf den meisten Compilern laufen (z.B. WINAVR, Keil C51). 
Allerdings kan manchmal der erzeugte Kode sehr umständlich sein.

Der WINAVR unterstützt aber auch das mir vom 8051 vertraute direkte 
Setzen von I/O-Ports, z.B.:

PORTA = BIN(11110000);
DDRB = 1<<PB7^1<<PB6;
PORTB |= 1<<PB7;
PORTB &= ~(1<<PC6);

und erzeugt auch den kürzest möglichen Code dafür.



Peter
Gast #24082
Lesenswert?

@Peter,
willst Du etwa behaupten, C sei portabel?
Das war mal so angedacht und funktionierte vielleicht auch mal eine 
Zeitlang so.
Inzwischen hat doch jeder sein eigenen Standard selbst definiert. M$ 
vorweg.

Gerade die speziellen Compiler für diverse CPUs zeichnen sich doch durch 
"komfortable" Spezialinstruktionen, z.B. für das Ansteuern von Portpins, 
aus. Wem mag man es da verübeln, wenn er diese auch nutzt.

Das Wort Standard bei Software kannst Du getrost aus Deinem Wortschatz 
streichen und durch Richtlinie ersetzen.

Grüße
Oliver
Gast #24083
Lesenswert?

Hi

das ist, mit Verlaub, Mist:

Wenn man Zugriffe auf die Hardware in ein paar Funktionen kapselt, kann 
man wunderbar portable Programme schreiben. Jeder Compilerbauer 
erweitert die Sprache meist um ein paar Funktionen. Aber es liegt am 
Programmierer ob er portablen Code erzeugt oder nicht. Ich hab z.B. 
grade den Sourcecode für einen MP3-Player in weniger als einem halben 
Tag vom SDCC-C (also 8051) auf den M16C portiert. Dabei mußt ich eben 
die Funktionen die auf die HArdware zugreifen ändern den Rest konnte ich 
aber so übernehmen. Es liegt also nicht an der Sprache sondern am 
Programmierer was er verwendet.

Wer natürlich unter Windows solch Sachen wie MFC benutzt ist selber 
Schuld. Es gibt genügend Bibliotheken für grafische Oberflächen die auf 
mehreren System verfügbar sind.

Matthias
#24085
Lesenswert?

@Oliver,

ich stimme da Matthias voll zu. I/O-Zugriffe mache ich meistens über 4 
Funktionen:

My_Special_IO_Init();
My_Special_IO_Status();
My_Special_IO_Read();
My_Special_IO_Write();

"My_Special_IO" ist z.B. CAN, I2C, ADC usw.


Ich editiere meine Keil-Programme gerne mit Borland-C wegen der guten 
deutschsprachigen Online-Hilfe und nehme den Compiler auch zum 
Syntaxcheck. Mit den nachfolgenden Macros geht das auch ziemlich gut. 
Dann kann der Keil ja so schlimm wohl nicht sein.

Einzelne Routinen, die keine I/O-Register direkt zugreifen lasse ich 
auch dort schon mal laufen, um die Funktion zu testen oder z.B. ob ich 
die Formatstrings bei printf() und schanf() richtig geschrieben habe.


Peter


#ifdef _TURBOC_

#define bit             char
#define xdata
#define idata
#define bdata
#define pdata
#define data
#define code
#define sfr             char
#define sbit            char
#define sfr16           int
#define interrupt       /##/            // comment
#define at            ;/##/

#endif

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren