Forum: Mikrocontroller und Digitale Elektronik Anfänger braucht Hilfe bei C Programmierung


von snowball (Gast)


Lesenswert?

Hallo, ich bin neu hier.

Ich möchte mich in der nächsten Zeit mal mit der Programmierung eines
Atmega8 MC beschäftigen.

Dazu habe ich mir ein myAVR Board gekauft. An Software benutze ich
das AVR Studio 6. Einige Testprogramme habe ich auch
bereits zum laufen bekommen. Nur um zu sehen ob das Bord auch läuft.

Jetzt aber zu meiner Fragen.
Ich habe mal ein kleines Programm geschrieben welches nichts anderes
macht als beim einzelnen Betätigen der Taster an Port D2 und D4 soll die 
rote und grüne LED an Port C0 und C3 leuchten. Beim Loslassen des 
Tasters erlischt die entsprechende LED

Hier mal der Code dazu. ( Bitte ich bin Anfänger, auch in C )

/*
 * zwei intelligente Lichtschalter.c
 *
 * Created: 08.10.2015 17:00:42
 *  Author: snwoball
 */

#include <avr/io.h>                     // Einbindung der allgemeinen 
"io.h" Header-Datei

int main( void )
       {

        DDRD  = 0b00000000;
  PIND = 0b00010100;
  DDRC  = 0b00001001;
  PORTC = 0b00000000;

  while ( 1 )                        // Endlosschleife,
  {
    if ( bit_is_clear ( PIND,2 ) )     {
        ( PINC,0 ) |= (1<<1);       // Taster ist gedrückt
  }
  else {
  PORTC,0 &= ~(1<<1);    // Taster ist nicht gedrückt
  }

  if ( bit_is_clear ( PIND,4 ) )      {
  ( PINC,3 ) |= (1<<1);       // Taster ist gedrückt
    }
  else {
  PORTC,3 &= ~(1<<1);    // Taster ist nicht gedrückt
  }
}



Leider bekomme ich beim übersetzen den Fehler:
../zwei intelligente Lichtschalter.c:11: error: lvalue required as left 
operand of assignment


Kann mir jemand weiterhelfen?

von heat ball (Gast)


Lesenswert?

snowball schrieb:
> Leider bekomme ich beim übersetzen den Fehler:
> ../zwei intelligente Lichtschalter.c:11: error: lvalue required as left
> operand of assignment

Dann steht da bestimmt auch, auf welche Zeile sich die Fehlermeldung 
bezieht. Dahilft oft bei der Fehlersuche.

p.s. Wenn du deinen Code in C-Tags einschließt, passieren auch nicht so 
hässliche Dinge wie

snowball schrieb:
> #include <avr/io.h>                     // Einbindung der allgemeinen
> "io.h" Header-Datei

von Georg G. (df2au)


Lesenswert?

snowball schrieb:
> Kann mir jemand weiterhelfen?

Bestimmt. Hilfreich wäre es, wenn du dem Hilfswilligen das Leben etwas 
leichter machen würdest.

Die Fehlermeldung sagt, dass in Zeile 11 etwas nicht stimmt. Welches ist 
deine Zeile 11? Was steht dort?

Noch ein Hinweis: Eine Funktion (main), die als "gibt ein Integer 
zurück" definiert ist, sollte das auch machen. Da wird der Compiler als 
nächstes warnen/meckern.

von Georg G. (df2au)


Lesenswert?

snowball schrieb:
> if ( bit_is_clear ( PIND,2 ) )     {
>         ( PINC,0 ) |= (1<<1);       // Taster ist gedrückt

Bist du dir sicher, dass du PINC beschreiben möchtest? Normalerweise 
liest man von einem PIN und schreibt in einen PORT.

von Frank (Gast)


Lesenswert?

1
if ( bit_is_clear ( PIND,4 ) )
2
{ 
3
  ( PINC,3 ) |= (1<<1); // Taster ist gedrückt
4
}

Die Zuweisungen stimmen nicht.

von Daniel F. (Gast)


Lesenswert?

Hi,

ich muss sagen, dass ich die Notation oben kaum verstehe.

Wenn ich ein Bit/Pin als Ausgang setzen möchte, würde ich so etwas wie
1
PORTC |= (1 << PC0);
schreiben. Das ist das selbe wie
1
uint32_t current_bitmask = PORTC;
2
PORTC = ( current_bitmask | (1 << PC0) );

Gruß
Daniel

von Frank G. (frank_g53)


Lesenswert?

snowball schrieb:
> if ( bit_is_clear ( PIND,2 ) )     {
> ( PINC,0 ) |= (1<<1);       // Taster ist gedrückt
>   }
>   else {
>   PORTC,0 &= ~(1<<1);    // Taster ist nicht gedrückt
>   }

Müsste da nicht PORTC statt PINC?

von Justus S. (jussa)


Lesenswert?

snowball schrieb:
> ( Bitte ich bin Anfänger, auch in C )

imho eine ganz blöde Entscheidung, C auf einem µC lernen zu wollen. Mach 
dich erstmal am PC mit den C Grundlagen vertraut, dann wechsle zu µCs...

Ein C-Tutorial oder Buch wäre man ein Anfang...

von Alexander S. (alesi)


Lesenswert?

snowball schrieb:
> Kann mir jemand weiterhelfen?

Hallo,

ich verwende das AVR Studio 6 zwar nicht, aber trotzdem folgende
Hinweise:

Wie oben bereits geschrieben liegt der Fehler in Zeile 11.
Schaue in den Original Quelltext, um zu sehen welche Zeile genau
das ist (Leerzeilen und Kommentare zählen mit).

Demnach sollte dieses Zeile 11 sein:
      DDRD  = 0b00000000;

Da Du avr/io.h eingebunden hast, sollte er DDRD eigentlich
kennen, vorausgesetzt Du hast den richtigen Microcontroller
mit der Option -mcu angegeben, z.B. -mmcu=atmega328p

"lvalue required as left operand of assignment" bedeutet Du kannst
nur Variablen einen Wert zu weisen. Die Variable ist der linke Wert
(lvalue) der Zuweisungsoperation. Falls a eine Variable ist, ist
a = 1 erlaubt, 1 = a aber nicht, da 1 eine Konstante und keine
Variable und damit kein "lvalue" ist.

von Thomas E. (thomase)


Lesenswert?

snowball schrieb:
> ( bit_is_clear ( PIND,2 )

Was ist das?
Das ist ein Makro, dem 2 "Parameter" übergeben werden. Deswegen steht da 
auch ein Komma.

snowball schrieb:
> ( PINC,0 ) |= (1<<1);

Und was ist das?
Blödsinn.

Mal abgesehn davon, dass es PORTC heissen muss: Hier wird einem Register 
etwas zugewiesen. Da hat ein ", 0" nichts verloren.
Guck dir im Tutorial an, wie das gemacht wird:
https://www.mikrocontroller.net/articles/Bitmanipulation

Und vergiss diese Makros, sondern mach das "zu Fuss". Wenn du das im 
Schlaf beherrscht, kannst du auch die Makros verwenden.

Vorher solltest du allerdings an deinen C-Kenntnissen arbeiten. C lernt 
man nicht nach der Copy & Paste + Trial & Error Methode.

mfg.

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.