www.mikrocontroller.net

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

Autor: Det S. (juppy)
Datum:

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:

>   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:

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

> if (PORTD0=1)


was ist in dieser Zeile falsch? :-)

passiert mir auch manchmal, typischer Flüchtigkeitsfehler.
Autor: Dennis (Gast)
Datum:

ups, ich war zu langsam...
Autor: Stefan B. (stefan) Benutzerseite
Datum:

Autor: Det S. (juppy)
Datum:

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:

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 Buchegger (kbuchegg) (Moderator)
Datum:

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:

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:

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:

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:

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:

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

Gruß
Juppy
Autor: Det S. (juppy)
Datum:

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:

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 Buchegger (kbuchegg) (Moderator)
Datum:

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

http://www.mikrocontroller.net/articles/Bitmanipulation
Autor: Karl heinz Buchegger (kbuchegg) (Moderator)
Datum:

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:

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:

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:

Autor: Karl heinz Buchegger (kbuchegg) (Moderator)
Datum:

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:

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:

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:

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:

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 Email-Adresse ist freiwillig. Wenn Sie automatisch per Email ü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




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 erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net