Hallo, ich bin neu hier. 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 6. 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 einzelnen Betätigen der Taster an Port D2 und D4 soll die rote und grüne LED an Port C0 und C3 leuchten. Beim Loslassen des Tasters erlischt die entsprechende LED Hier mal der Code dazu. ( Bitte ich bin Anfänger, auch in C ) /* * zwei intelligente Lichtschalter.c * * Created: 08.10.2015 17:00:42 * Author: snwoball */ #include <avr/io.h> // Einbindung der allgemeinen "io.h" Header-Datei int main( void ) { DDRD = 0b00000000; PIND = 0b00010100; DDRC = 0b00001001; PORTC = 0b00000000; while ( 1 ) // Endlosschleife, { if ( bit_is_clear ( PIND,2 ) ) { ( PINC,0 ) |= (1<<1); // Taster ist gedrückt } else { PORTC,0 &= ~(1<<1); // Taster ist nicht gedrückt } if ( bit_is_clear ( PIND,4 ) ) { ( PINC,3 ) |= (1<<1); // Taster ist gedrückt } else { PORTC,3 &= ~(1<<1); // Taster ist nicht gedrückt } } Leider bekomme ich beim übersetzen den Fehler: ../zwei intelligente Lichtschalter.c:11: error: lvalue required as left operand of assignment Kann mir jemand weiterhelfen?
snowball schrieb: > Leider bekomme ich beim übersetzen den Fehler: > ../zwei intelligente Lichtschalter.c:11: error: lvalue required as left > operand of assignment Dann steht da bestimmt auch, auf welche Zeile sich die Fehlermeldung bezieht. Dahilft oft bei der Fehlersuche. p.s. Wenn du deinen Code in C-Tags einschließt, passieren auch nicht so hässliche Dinge wie snowball schrieb: > #include <avr/io.h> // Einbindung der allgemeinen > "io.h" Header-Datei
snowball schrieb: > Kann mir jemand weiterhelfen? Bestimmt. Hilfreich wäre es, wenn du dem Hilfswilligen das Leben etwas leichter machen würdest. Die Fehlermeldung sagt, dass in Zeile 11 etwas nicht stimmt. Welches ist deine Zeile 11? Was steht dort? Noch ein Hinweis: Eine Funktion (main), die als "gibt ein Integer zurück" definiert ist, sollte das auch machen. Da wird der Compiler als nächstes warnen/meckern.
snowball schrieb: > if ( bit_is_clear ( PIND,2 ) ) { > ( PINC,0 ) |= (1<<1); // Taster ist gedrückt Bist du dir sicher, dass du PINC beschreiben möchtest? Normalerweise liest man von einem PIN und schreibt in einen PORT.
1 | if ( bit_is_clear ( PIND,4 ) ) |
2 | {
|
3 | ( PINC,3 ) |= (1<<1); // Taster ist gedrückt |
4 | }
|
Die Zuweisungen stimmen nicht.
Hi, ich muss sagen, dass ich die Notation oben kaum verstehe. Wenn ich ein Bit/Pin als Ausgang setzen möchte, würde ich so etwas wie
1 | PORTC |= (1 << PC0); |
schreiben. Das ist das selbe wie
1 | uint32_t current_bitmask = PORTC; |
2 | PORTC = ( current_bitmask | (1 << PC0) ); |
Gruß Daniel
snowball schrieb: > if ( bit_is_clear ( PIND,2 ) ) { > ( PINC,0 ) |= (1<<1); // Taster ist gedrückt > } > else { > PORTC,0 &= ~(1<<1); // Taster ist nicht gedrückt > } Müsste da nicht PORTC statt PINC?
snowball schrieb: > ( Bitte ich bin Anfänger, auch in C ) imho eine ganz blöde Entscheidung, C auf einem µC lernen zu wollen. Mach dich erstmal am PC mit den C Grundlagen vertraut, dann wechsle zu µCs... Ein C-Tutorial oder Buch wäre man ein Anfang...
snowball schrieb: > Kann mir jemand weiterhelfen? Hallo, ich verwende das AVR Studio 6 zwar nicht, aber trotzdem folgende Hinweise: Wie oben bereits geschrieben liegt der Fehler in Zeile 11. Schaue in den Original Quelltext, um zu sehen welche Zeile genau das ist (Leerzeilen und Kommentare zählen mit). Demnach sollte dieses Zeile 11 sein: DDRD = 0b00000000; Da Du avr/io.h eingebunden hast, sollte er DDRD eigentlich kennen, vorausgesetzt Du hast den richtigen Microcontroller mit der Option -mcu angegeben, z.B. -mmcu=atmega328p "lvalue required as left operand of assignment" bedeutet Du kannst nur Variablen einen Wert zu weisen. Die Variable ist der linke Wert (lvalue) der Zuweisungsoperation. Falls a eine Variable ist, ist a = 1 erlaubt, 1 = a aber nicht, da 1 eine Konstante und keine Variable und damit kein "lvalue" ist.
snowball schrieb: > ( bit_is_clear ( PIND,2 ) Was ist das? Das ist ein Makro, dem 2 "Parameter" übergeben werden. Deswegen steht da auch ein Komma. snowball schrieb: > ( PINC,0 ) |= (1<<1); Und was ist das? Blödsinn. Mal abgesehn davon, dass es PORTC heissen muss: Hier wird einem Register etwas zugewiesen. Da hat ein ", 0" nichts verloren. Guck dir im Tutorial an, wie das gemacht wird: https://www.mikrocontroller.net/articles/Bitmanipulation Und vergiss diese Makros, sondern mach das "zu Fuss". Wenn du das im Schlaf beherrscht, kannst du auch die Makros verwenden. Vorher solltest du allerdings an deinen C-Kenntnissen arbeiten. C lernt man nicht nach der Copy & Paste + Trial & Error Methode. mfg.
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.