www.mikrocontroller.net

Forum: Compiler & IDEs sda = (d >> 7); für GCC


Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich versuche grade einen Beispielcode aus einem Datenblatt für meinen 
Mega8  umzuschreiben.
wie kann ich folgenden Codeschnipsel in eine GCC verständliche Form 
bringen?

sda = (d >> 7);

mfg und danke

Gast

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dies sollte beim gcc so funktionieren.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich schreib mal noch ein bischen mehr von meinem Code.

#define sda PC4
#define scl PC5


void i2c_write(unsigned char d)
{
  unsigned char i;

  PORTC &= ~(1<<PC5);
  for ( i=1; i<=8; i++)
    {
      sda = (d >> 7);
      PORTC |= (1<<scl);
      d = d << 1;
      PORTC &= ~(1<<scl);
    }
  PORTC |= (1<<sda);
  PORTC &= ~(1<<scl);
  PORTC |= (1<<scl);
}

als Fehelermeldung bekomme ich "error: invalid lvalue in assignment" für 
die Zeile mit "sda = (d >> 7);"
Alles andere scheint zumindest beim Comilieren Fehlerfrei zu sein.
Der Beispielcode aus dem Datenblatt ist Folgender:

void I2C_write(uchar d)
{
uchar i;
scl = 0;
for (i = 1; i <= 8; i++)
{
sda = (d >> 7);
scl = 1;
d = d << 1; /* increase scl high time */
scl = 0;
}
sda = 1; /* Release the sda line */
scl = 0;
scl = 1;
if(sda) printf("Ack bit missing %02X
",(unsigned int)d);
scl = 0;
}

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sda ist keine Variable. Du kannst somit keinen Wert zuweisen.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Beim AVR mußt Du für Eingänge und Ausgänge verschiedene Register nehmen 
(PINx, PORTx).
Open Drain Ausgänge realisiert man mit dem DDRx-Register

Um Bitvariablen zu definieren, muß man unter GCC Bitfelder benutzen, 
dann gehts ganz einfach wie unter Keil C51:
#include <avr\io.h>
#include <inttypes.h>
#include <stdio.h>


struct bits {
  uint8_t b0:1;
  uint8_t b1:1;
  uint8_t b2:1;
  uint8_t b3:1;
  uint8_t b4:1;
  uint8_t b5:1;
  uint8_t b6:1;
  uint8_t b7:1;
} __attribute__((__packed__));


#define SBIT(port,pin) ((*(volatile struct bits*)&port).b##pin)


#define scl     SBIT(PORTC, 5)
#define sda     SBIT(DDRC, 4)
#define sdain   SBIT(PINC, 4)
#define sdalevel SBIT(PORTC, 4)

#define uchar unsigned char


void I2C_write(uchar d)
{
uchar i;
sdalevel = 0;
scl = 0;
for (i = 1; i <= 8; i++)
{
sda = !(d >> 7);
scl = 1;
d = d << 1; /* increase scl high time */
scl = 0;
}
sda = 0; /* Release the sda line */
scl = 0;
scl = 1;
if(sdain) printf("Ack bit missing %02X",(unsigned int)d);
scl = 0;
}


Peter


P.S.:
d = d << 1; /* increase scl high time */
Dürfte beim AVR nicht reichen.
Außerdem verschiebt der AVR-GCC solche Intruktionen, da sie seiner 
Meinung nach keinen Einfluß auf die Ausführung haben.
IO-Zugriffe stellen leider keine Barrieren für Reordering dar.

Autor: Volker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter hats zwar schon vorweggenommen, aber schau auch mal hier:

Beitrag "sbit macro für avr-gcc"


Gruß Volker

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.