www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik C164 mit Keil Binärzahlen


Autor: Ralf (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist doch gerade der Witz an C, seine Portabilität !

Warum soll der Keil es anders machen als der GCC.


Peter

Autor: Oliver K. (Gast)
Datum:

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

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

Bewertung
0 lesenswert
nicht lesenswert
So ein Makro könnte folgendermaßen aussehen (bei Bedarf verlängern):

#define BIN(x) \
        ((x%10)\
         |(((x/10)%10)<<1)\
         |(((x/100)%10)<<2)\
         |(((x/1000)%10)<<3)\
         |(((x/10000)%10)<<4)\
         |(((x/100000)%10)<<5)\
         |(((x/1000000)%10)<<6)\
         |(((x/10000000)%10)<<7)\
        )

Autor: Oliver K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nicht eher so?

#define BIN(x) \
        ((x&1)+\
   (x>>1&1)<<1+\
   (x>>2&1)<<2+\
   (x>>3&1)<<3+\
   (x>>4&1)<<4+\
   (x>>5&1)<<5+\
   (x>>6&1)<<6+\
   (x>>7&1)<<7\
        )

x soll ja als Binärzahl eingebbar sein, z.B.

01100

Autor: Oliver K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nehme alles zurück.
Völliger Schwachsinn...

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

danke für die Hilfe!

So ein Makro habe ich bereits. Ich dachte nur, dass der Compiler es für 
das Geld schon anbieten würde. Habe dazu aber nichts in der Doku 
gefunden. Dann werde ich wohl mit dem Makro leben müssen.

Gruß,
Ralf

Autor: Oryx (Gast)
Datum:
Angehängte Dateien:

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

Autor: Peter Dannegger (peda)
Datum:

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

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

also beim 8051 sollte doch zum setzen eines Bit's

P3_2 = 1;

reichen. Hat doch Bitadressen. Zumindest der SDCC akzeptiert die 
Schreibweise.

Matthias

Autor: Oliver K. (Gast)
Datum:

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

Autor: Matthias (Gast)
Datum:

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

Autor: Oliver K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Ho,

dann wirf mal beide Augen auf den Keil!

Oliver

Autor: Peter Dannegger (peda)
Datum:

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

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.