Atmega128/LCD unter C

Gast #71105
Hallo!

Ich habe schon mal einen Atmel 89C51RD2 in C programmiert.
Ich habe dabei ein LCD angesprochen. Im 4-BIT Modus.

Dabei habe ich die Include-Datei <intrins.h> benutzt.
Man muss hier die 4 Bit über crols rolieren lassen.
Ich hoffe ihr versteht was ich meine. Also den High- und Lownibble
vertauschen. Das hat funktioniert.

Nun versuche ich das gleiche mit einem ATMEGA128.
Doch hier sagt der Compiler immer:

undefined symbol '_crols_'

Die 'include <intrins.h>' kennt er nicht.

Kann mir da jemand weiterhelfen??

Vielen Dank im voraus!

Carsten
Gast
int Value = (Value << 1) | (Value >> (16 -1));

Du setzt eine Rotation eines 16 Bits Wertes aus einem Links und
Rechtsshift zusammen. Im obigen Bsp. würde also ein 16 Bit Wert um 1
Bit nach links oder eben um 15 Bit nach rechts rotiert.

Gruß Hagen
Gast
Hallo!

Danke erst mal!

Mein Programm:

void LCDbefehl (unsigned char befehl)
      {
       unsigned char a1;
       a1 = befehl;
       a1 = _crol_(a1,4);           //in intrins.h, char um 4 bits
                                    //rolieren -> High und Low-Nibbel
                                    //vertauschen
       a1 = a1 & 0x0F) | 0x10;      //4 Bits maskieren
       LCD_PORT = a1;
       LCD_PORT = a1 & 0x00;
       a1 = befehl;
       a1 = (a1 & 0x0F) | 0x10;
       LCD_PORT = a1;
       LCD_PORT = a1 & 0x00;
       warte100u (10);
      }

Wi kann ich denn nun die oben genannte Zeile hier einbringen??

int Value = (Value << 1) | (Value >> (16 -1));

Jetzt schon vielen Dank!

Carsten
Gast
Besser gar nicht...
Du brauchst hier nicht hi- und lownibble vertauschen, da du hinterher
das highnibble wegmaskierst.
Also schreib doch oben gleich:

a1 = befehl>>4;
Gast
Hallo!

Sorry, aber nochmal zu meiner Problematik...

Schauen wir auf den Befehl den ich nicht einsetzten kann:

a1 = _crol_(a1,3);

Nimmt man einen Wert an:

a = 0xA5;

b = _crol_(a,3); /* b ist jetzt 0x2D */

Das würde bedeuten:

aus:
1010 0101
wird:
0010 1101
---------------------------------------

Bei dem Befehl:

a1 = befehl>>4;
ist das nicht so.

Der Operator ">>" bedeutet: "Rechtsschieben 1 Bit, links Null
auffüllen.

Das ist nicht das gleiche.
Kann mir jemand sagen wie ich diese crol Zeile ersetzten kann?

Grüße

Carsten
Gast
Hallo Leute!

Ich schon wieder!

Ist es richtig, dass ich mit dem Befehl:

a1 = b1 >> 4;

genau ein Bit um vier Stellen nach rechts schiebe und an die ehemalige
Position ne Null schreibe?
Also ich schiebe nicht 4 Bit um 4 stellen nach rechts, oder?

Danke für die Geduld!

Gruß

Carsten
Gast
Doch

0x1100 >> 1 == 0x0110
0x1100 >> 2 == 0x0011
0x1100 >> 3 == 0x0001
0x1100 >> 4 == 0x0000

0x0011 << 1 == 0x0110
0x0011 << 2 == 0x1100
usw,

somit

(0x1100 << 1) | (0x1100 >> (4 -1)) == (0x1000 | 0x0001) == 0x1001 ==
ROL(0x1100, 1)

Wenn man mit 4 Bit Wordbreite rechnet.

Gruß hagen
Gast
sorry 0x ist natürlich nicht richtig da es eine hexadezimale Zahl
bezeichnet. Im obigen Beispiel sind natürlich binäre Zahlen gemeint und
die würden dann zB. so aussehen 1100b, 0011b usw.

Gruß Hagen
Gast
Hallo Hagen!

Danke für deine Auskunft.

Das würde dann bedeuten, dass man bei 8 Bit folgendes rausbekommt:

1111 0000b >> 4 == 0000 1111b

oder

0101 0110b >> 4 == 0000 0101b

Stimmt das so, hab ich es endlich verstanden?

Gruß

Carsten
Gast
Korrekt,

mathematisch bedeutet

x << y == x * (2**y) -> x * (2 hoch y)

und

x >> y == x / (2**y) -> x / (2 hoch y)

In deinem Bespiel ist

11110000b >> 4 == 0xF0 >> 4 == 0xF0 / (2**4) == 240 / 16 == 15 == 0000
1111b
01010110b >> 4 == 0x56 >> 4 == 0x56 / (2**4) ==  86 / 16 ==  5 == 0000
0101b

Gruß Hagen

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 22 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.