mikrocontroller.net

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


Autor: Det S. (juppy)
Datum:

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

Autor: Hc Zimmerer (mizch)
Datum:

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

Autor: Hc Zimmerer (mizch)
Datum:

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

Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> if (PORTD0=1)


was ist in dieser Zeile falsch? :-)

passiert mir auch manchmal, typischer Flüchtigkeitsfehler.

Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ups, ich war zu langsam...

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Det S. (juppy)
Datum:

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

Autor: Justus Skorps (jussa)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.
#define IS_BIT_SET( p, b )    ( (p) & (1<<b) )
#define IS_BIT_CLEAR( p, b )  ( ! IS_BIT_SET( p, b ) )

...


   if( IS_BIT_SET( PIND, PD0 ) )
     ...

das sieht doch schon ganz ordentlich aus.

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht 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
PIND & 32
PIND & (1<<5)
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.

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mir fällt noch ein Fehler in meiner Antwort von gestern auf:

> if (PIND & PIND0)

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

Autor: Det S. (juppy)
Datum:

Bewertung
0 lesenswert
nicht 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.
>
>
> #define IS_BIT_SET( p, b )    ( (p) & (1<<b) )
> #define IS_BIT_CLEAR( p, b )  ( ! IS_BIT_SET( p, b ) )
> 
> ...
> 
> 
>    if( IS_BIT_SET( PIND, PD0 ) )
>      ...
> 
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

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Det S. schrieb:

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

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

Autor: Det S. (juppy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Uppss Sorry der Karl heinz Buchegger war es
glaub ich :-)

Gruß
Juppy

Autor: Det S. (juppy)
Datum:

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

Autor: Hc Zimmerer (mizch)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Det S. (juppy)
Datum:

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

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

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

Autor: Kasperle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Det S. (juppy)
Datum:

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

Autor: Klaus Wachtler (mfgkw)
Datum:

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

Autor: bartsch (Gast)
Datum:

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

Autor: Link zu (Gast)
Datum:

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

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.