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
> 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)
Zu Frage 2: Der Mega8 hat weder DebugWIRE- noch JTAG-Fähigkeiten. Nimm den Mega88 statt dessen, der kann DebugWIRE.
> if (PORTD0=1)
was ist in dieser Zeile falsch? :-)
passiert mir auch manchmal, typischer Flüchtigkeitsfehler.
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 :-)
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...
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.
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.
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.
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
Det S. schrieb: > Hallo Justus, > sieht auch nicht schlecht aus. Währe mal zu überlegen. das war aber nicht von mir ;c)...
Uppss Sorry der Karl heinz Buchegger war es glaub ich :-) Gruß Juppy
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 :-)
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.
Für eine kurze Einführung in die Thematik, guckst du zb auch hier http://www.mikrocontroller.net/articles/Bitmanipulation
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.
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
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)) )
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.
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
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.
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)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.