Datum: 08.02.2010 20:02
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
Datum: 08.02.2010 20:10
> 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)
Datum: 08.02.2010 20:13
Zu Frage 2: Der Mega8 hat weder DebugWIRE- noch JTAG-Fähigkeiten. Nimm den Mega88 statt dessen, der kann DebugWIRE.
Datum: 08.02.2010 20:20
> if (PORTD0=1)
was ist in dieser Zeile falsch? :-)
passiert mir auch manchmal, typischer Flüchtigkeitsfehler.
Datum: 08.02.2010 20:45
Datum: 09.02.2010 11:23
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 :-)
Datum: 09.02.2010 11:26
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...
Datum: 09.02.2010 11:45
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.
Datum: 09.02.2010 12:13
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.
Datum: 09.02.2010 12:21
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.
Datum: 09.02.2010 12:47
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
Datum: 09.02.2010 12:49
Det S. schrieb: > Hallo Justus, > sieht auch nicht schlecht aus. Währe mal zu überlegen. das war aber nicht von mir ;c)...
Datum: 09.02.2010 13:02
Uppss Sorry der Karl heinz Buchegger war es glaub ich :-) Gruß Juppy
Datum: 10.02.2010 09:09
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 :-)
Datum: 10.02.2010 09:27
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.
Datum: 10.02.2010 09:32
Für eine kurze Einführung in die Thematik, guckst du zb auch hier http://www.mikrocontroller.net/articles/Bitmanipulation
Datum: 10.02.2010 09:38
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.
Datum: 10.02.2010 09:41
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
Datum: 10.02.2010 09:43
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)) )
Datum: 10.02.2010 09:48
Datum: 10.02.2010 09:57
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.
Datum: 10.02.2010 10:08
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
Datum: 10.02.2010 10:24
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.
Datum: 10.02.2010 10:25
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)
Datum: 10.02.2010 10:30
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.



