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


von Det S. (juppy)


Lesenswert?

Hallo zusammen,
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 4 mit AVR GCC. 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 gedrückten Taster LEDs einzuschalten.
Hier mal der Code dazu. ( Bitte ich bin Anfänger, auch in C )

Frage 1
========
#include <avr/io.h>

int main(void)
{
DDRB = 0b00000111;
DDRD = 0b00000000;

while(1==1)
{
  if (PORTD0=1)  // Taster gedrückt ?
  {
     PORTB = 0b00000111; // Led 1 bis 3 ein
  }
  else
  {
      PORTB = 0b00000101;  // ansonsten LED 2 aus
  }
  };
return 0;
}

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

Kann mir jemand sagen was ich hier falsch mache ?

Frage 2
Kann man eigentlich mit diesem MC auch so debuggen, das
wenn ich z.B. den Taster an PortD1 betätige, ich den Zustand im
AVR Studio (debugModus) sehen kann ?
Oder wie könnte ich ein Tasterdruck während des debuggens simulieren ?

Mfg
Juppy

von Hc Z. (mizch)


Lesenswert?

>   if (PORTD0=1)  // Taster gedrückt ?

Das ist mehrfach verkehrt:

„=” ist kein Vergleich, sondern eine Zuweisung.  Der Vergleichsoperator 
in C heißt „==”.

Eingänge liest man nicht an PORTx, sondern an PINx aus, z.B. PIND.

Ein bestimmtes Bit wird nicht so wie geschrieben geprüft, sondern mit 
einer logischen Verknüpfung (z.B. PIND & PIND0).

Also: Versuch's mal mit

if ((PIND & PIND0) != 0)

oder, dasselbe in Kürzer:

if (PIND & PIND0)

von Hc Z. (mizch)


Lesenswert?

Zu Frage 2:  Der Mega8 hat weder DebugWIRE- noch JTAG-Fähigkeiten.  Nimm 
den Mega88 statt dessen, der kann DebugWIRE.

von Dennis (Gast)


Lesenswert?

> if (PORTD0=1)


was ist in dieser Zeile falsch? :-)

passiert mir auch manchmal, typischer Flüchtigkeitsfehler.

von Dennis (Gast)


Lesenswert?

ups, ich war zu langsam...

von Stefan B. (stefan) Benutzerseite


Lesenswert?


von Det S. (juppy)


Lesenswert?

Hallo zusammen,
erstmal vielen Dank für Eure Antworten.


Hc Zimmerer schrieb:
> Eingänge liest man nicht an PORTx, sondern an PINx aus, z.B. PIND.
>
> Ein bestimmtes Bit wird nicht so wie geschrieben geprüft, sondern mit
> einer logischen Verknüpfung (z.B. PIND & PIND0).
>
> Also: Versuch's mal mit
>
> if ((PIND & PIND0) != 0)
>
> oder, dasselbe in Kürzer:
>
> if (PIND & PIND0)

An diese Schreibweise muß ich mich echt gewöhnen. Was hat eine logische
Verknüpfung mit dem Abfragen des Zustands zu tun ? Egal wenn die Syntax
halt so ist, dann ist sie halt so. Das werd ich hoffentlich auch noch 
hin
bekommen :-)

Hc Zimmerer schrieb:
> Zu Frage 2:  Der Mega8 hat weder DebugWIRE- noch JTAG-Fähigkeiten.  Nimm
> den Mega88 statt dessen, der kann DebugWIRE.
Muß ich mal gucken, ob ich den auf dem myAVR Bord verbauen kann.

Stefan B. schrieb:
> http://www.mikrocontroller.net/articles/AVR-GCC-Tu...

Danke für den Tip. Nur wie gesagt ich muß mich erstmal an die 
Schreibweise
gewöhnen. Ist für mich noch wie Böhmische Dörfer :-)


Aber danke erstmal an Euch allen.

Gruß
Juppy :-)

von Justus S. (jussa)


Lesenswert?

Det S. schrieb:
> An diese Schreibweise muß ich mich echt gewöhnen. Was hat eine logische
> Verknüpfung mit dem Abfragen des Zustands zu tun ?

PIND fragt den Zustand von Port D ab, durch die Verknüpfung wird der 
gewünschte Pin D0 "ausgeschnitten"...es schadet nie, sich mal 
anzuschauen, wie  PIND und PIND0 definiert sind...

von Karl H. (kbuchegg)


Lesenswert?

Justus Skorps schrieb:
> Det S. schrieb:
>> An diese Schreibweise muß ich mich echt gewöhnen. Was hat eine logische
>> Verknüpfung mit dem Abfragen des Zustands zu tun ?
>
> PIND fragt den Zustand von Port D ab, durch die Verknüpfung wird der
> gewünschte Pin D0 "ausgeschnitten"...es schadet nie, sich mal
> anzuschauen, wie  PIND und PIND0 definiert sind...

Und im Zweifel kann man sich immer noch die Syntax (wenn man sie nicht 
mag) in ein paar C-Makros verstecken und sich die 'Syntax' 
zurechtzaubern, die einem zusagt.
1
#define IS_BIT_SET( p, b )    ( (p) & (1<<b) )
2
#define IS_BIT_CLEAR( p, b )  ( ! IS_BIT_SET( p, b ) )
3
4
...
5
6
7
   if( IS_BIT_SET( PIND, PD0 ) )
8
     ...

das sieht doch schon ganz ordentlich aus.

von Hc Z. (mizch)


Lesenswert?

Det S. schrieb:

>> if (PIND & PIND0)
>
> An diese Schreibweise muß ich mich echt gewöhnen. Was hat eine logische
> Verknüpfung mit dem Abfragen des Zustands zu tun ? Egal wenn die Syntax
> halt so ist, dann ist sie halt so.

Das ist nicht egal, sondern gehört zu den Grundlagen.  Die solltest Du 
Dir beibringen und erst weitermachen, wenn Du weißt, warum
1
PIND & 32
2
PIND & (1<<5)
3
PIND & (1<<PIND5)
alle den Zustand von Portpin 5 aus den 8 Bits des Ports ausschneiden. 
Also: Stürz' Dich in die Boolesche Algebra und in die Binärdarstellung 
von Zahlen ... Ohne geht's nicht.

von Hc Z. (mizch)


Lesenswert?

Mir fällt noch ein Fehler in meiner Antwort von gestern auf:

> if (PIND & PIND0)

Das MUSS
1
if (PIND & (1<<PIND0))
heißen.  Da war ich zu schnell.

von Det S. (juppy)


Lesenswert?

Karl heinz Buchegger schrieb:
> Justus Skorps schrieb:
>> Det S. schrieb:
>>> An diese Schreibweise muß ich mich echt gewöhnen. Was hat eine logische
>>> Verknüpfung mit dem Abfragen des Zustands zu tun ?
>>
>> PIND fragt den Zustand von Port D ab, durch die Verknüpfung wird der
>> gewünschte Pin D0 "ausgeschnitten"...es schadet nie, sich mal
>> anzuschauen, wie  PIND und PIND0 definiert sind...
>
> Und im Zweifel kann man sich immer noch die Syntax (wenn man sie nicht
> mag) in ein paar C-Makros verstecken und sich die 'Syntax'
> zurechtzaubern, die einem zusagt.
>
>
1
> #define IS_BIT_SET( p, b )    ( (p) & (1<<b) )
2
> #define IS_BIT_CLEAR( p, b )  ( ! IS_BIT_SET( p, b ) )
3
> 
4
> ...
5
> 
6
> 
7
>    if( IS_BIT_SET( PIND, PD0 ) )
8
>      ...
9
>
Hallo Justus,
sieht auch nicht schlecht aus. Währe mal zu überlegen.

Hc Zimmerer schrieb:
> Also: Stürz' Dich in die Boolesche Algebra und in die Binärdarstellung
> von Zahlen ... Ohne geht's nicht.

Seh ich auch so. Werd ich auch tun. Nur man will ja auch zwischendurch
mal auf dem Bord was leuchten sehn. Auch wenns nur eine LED ist :-)

Hc Zimmerer schrieb:
> Mir fällt noch ein Fehler in meiner Antwort von gestern auf:
>
>> if (PIND & PIND0)
>
> Das MUSSif (PIND & (1<<PIND0))
> heißen.  Da war ich zu schnell.

Danke für den Tip und Euren schnellen Antworten. Echt super hier

Mfg
Juppy

von Justus S. (jussa)


Lesenswert?

Det S. schrieb:

> Hallo Justus,
> sieht auch nicht schlecht aus. Währe mal zu überlegen.

das war aber nicht von mir ;c)...

von Det S. (juppy)


Lesenswert?

Uppss Sorry der Karl heinz Buchegger war es
glaub ich :-)

Gruß
Juppy

von Det S. (juppy)


Lesenswert?

Hallo nochmal.
Eine Frage hätte ich noch ;-)

(PIND & (1<<PIND0))

Ist die Schreibweise eigentlich C oder MC spezifisch ?
Und kann man das irgendwo nachlesen ?
also z.b
(1<<PIND0) bedeutet ......
oder
( PINC & (1<<PINC1) bedeutet ......
usw.

Denn ich frage mich immer, wie kommt man auf so etwas ?

Gruß
Juppy :-)

von Hc Z. (mizch)


Lesenswert?

Es sind alles C-Operatoren, die es mit derselben Funktion auch in 
anderen Programmiersprachen gibt.  Auch außerhalb des µC-Bereichs 
brauchst Du sie, z.B. um den Zustand eines bestimmten Bits zu erfahren.

„<<” ist der Schiebeoperator und „&” ist bitweises AND.  Details verrät 
Dir Dein C-Buch.

von Karl H. (kbuchegg)


Lesenswert?

Für eine kurze Einführung in die Thematik, guckst du zb auch hier

http://www.mikrocontroller.net/articles/Bitmanipulation

von Karl H. (kbuchegg)


Lesenswert?

Det S. schrieb:

> Denn ich frage mich immer, wie kommt man auf so etwas ?

Indem man seine Hausaufgaben macht und die Sprache lernt. Anschliessend 
die Einzelteil zur gewünschten Funktion zusammenfügen.

Aber ich verstehe schon was du meinst.
Mir geht es ähnlich, aber in einem anderen Bereich: Schachspielen
Wie die Figuren ziehen dürfen lernt man schnell. Aber wenn du einem 
Meister zusiehst, fragt man sich auch oft: Wie hat der nur jetzt auf die 
Schnelle genau diese Strategie ausgegraben? Er kann ja auch keine 
anderen Züge machen als ich.

Beim Programmieren ist es ähnlich. Die Einzelteile und was sie bewirken, 
die einzelnen Anweisungen, die hat man schnell gelernt. Das Geheimnis 
steckt aber in der Kombination dieser Einzelteile. Kennt man aber die 
zur Verfügung stehenden Einzelteile nicht, wirds auch nichts mit den 
Kombinationen. Da wird einem immer etwas fehlen.

Daher: Hausaufgaben machen und C-Buch (aber ein gutes!) durcharbeiten. 
Dann hat man den Grundstock, auf dem man aufbauen kann.

von Det S. (juppy)


Lesenswert?

Hallo zusammen,
danke für Eure Antworten.

Karl heinz Buchegger schrieb:
> Daher: Hausaufgaben machen und C-Buch (aber ein gutes!) durcharbeiten.
> Dann hat man den Grundstock, auf dem man aufbauen kann.

Könntest du ein Buch (am besten ein kostenloses eBook ;-)) empfehlen ?

Gruß
Juppy

von Vlad T. (vlad_tepesch)


Lesenswert?

Det S. schrieb:
>> #define IS_BIT_SET( p, b )    ( (p) & (1<<b) )

Makro-Parameter IMMER!!! klammern.
->
#define IS_BIT_SET( p, b )    ( (p) & (1<<(b)) )

von Kasperle (Gast)


Lesenswert?


von Karl H. (kbuchegg)


Lesenswert?

Det S. schrieb:

> Könntest du ein Buch (am besten ein kostenloses eBook ;-)) empfehlen ?

Um ehrlich zu sein, empfehle ich an dieser Stelle am liebsten ein 
klassisches Buch in Papierform.

Warum?
Weil man es aufgeschlagen neben dem Monitor liegen haben kann.
Weil man sich dort Einlagezettel reingeben kann, auf die man sich 
Notizen machen kann
Weil es auch ohne Strom funktioniert


Die meiner Meinung nach schlechteste Form ist es, wenn man auf ein und 
demselben Monitor (egal wie gross der ist) gleichzeitig ein E-Book als 
Nachschlagewerk und seine eigene Entwicklungsumgebung laufen hat (ok. 
wenn man 2 Monitore hat, dann geht das). Aber es sollte immer eine 
Möglichkeit geben, beides gleichzeitig zu studieren: Vorlage (also das 
Buch) und das eigene Machwerk.


Der Klassiker
'Kernighan & Ritchie   Programmieren in C'

wenn du dich in Englisch so einigermassen fit fühlst (keine Angst, es 
handelt sich hier nicht um einen Roman bei dem man perfekt Englisch 
können muss. Englisch auf Mittelschulniveau ist mehr als ausreichend), 
dann empfehle ich die englische Version. Wie man so hört, soll die 
deutsche Übersetzung nicht so besonders gut gelungen sein. Was nicht 
heisst, das sie schlecht ist. Aber die englische ist besser.

von Det S. (juppy)


Lesenswert?

Karl heinz Buchegger schrieb:
> Der Klassiker
> 'Kernighan & Ritchie   Programmieren in C'

Dank für die schnellen Antworten.
Ich habe zu Hause noch ein etwas älteres Buch über C. Dort werd ich
erstmal nachgucken, ob ich das nicht benutzen kann. Denn jetzt weiss ich
ja in etwa nach was ich gucken muß.

Karl heinz Buchegger schrieb:
> Die meiner Meinung nach schlechteste Form ist es, wenn man auf ein und
> demselben Monitor (egal wie gross der ist) gleichzeitig ein E-Book als
> Nachschlagewerk und seine eigene Entwicklungsumgebung laufen hat (ok.
> wenn man 2 Monitore hat, dann geht das). Aber es sollte immer eine
> Möglichkeit geben, beides gleichzeitig zu studieren: Vorlage (also das
> Buch) und das eigene Machwerk.

Da geb ich Dir vollkommen recht. Besser ist es auf jeden fall.
Mal sehen, wenn mein Buch zu Hause nix ist, dann werde ich mir entweder
das Buch holen was Du , oder das was  Kasperle von Galileo vorgeschlagen 
hat.

Trotzdem Danke erstmal..
Echt klasses Forum.
So schnell hab ich noch nie Antworten in einem Forum bekommen.
Weiter so.

Gruß
Juppy

von Klaus W. (mfgkw)


Lesenswert?

Karl heinz Buchegger schrieb:
> ...empfehle ich die englische Version. Wie man so hört, soll die
> deutsche Übersetzung nicht so besonders gut gelungen sein.

Die erste Auflage (K&R-C, völlig veraltet) war schlecht übersetzt.
Bei der zweiten Auflage (ANSI-C) ist die deutsche Übersetzung völlig ok.

von bartsch (Gast)


Lesenswert?

Det S. schrieb:
> if (PORTD0=1)  // Taster gedrückt ?
Es hilft auch Fehler solche Zuweisungsfehler zu vermeiden, wenn man die 
Konstante links hinschreibt: if (1 == PORTD0)

von Link zu (Gast)


Lesenswert?

Klaus Wachtler schrieb:
> Bei der zweiten Auflage (ANSI-C) ist die deutsche Übersetzung völlig ok.
Wobei die Übersetzung array == vektor schon ziemlich fragwürdig ist.

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.