Forum: Mikrocontroller und Digitale Elektronik Fehler in Avr Header


von Sam (Gast)


Angehängte Dateien:

Lesenswert?

Hi

Bei meinem Versuch ein Display in C anzusteuern, zeigt der Compiler 
Fehlermeldungen in der Delay.h an. Die Fehler sind natürlich in meinem 
Code, aber ein = expected Fehler hab ich in dieser Form noch nie 
gesehen.
Außerdem sind noch andere, für mich nicht klärbare Fehler drin (kommen 
aber erst wieder wenn die jetzigen behoben sind.

von Hc Z. (mizch)


Lesenswert?

Wichtig wäre noch der Teil, der vor dem #include <util/delay.h> steht. 
Falls davor ebenfalls ein #include steht, dann der Include-File.

von Karl H. (kbuchegg)


Lesenswert?

Hast du zufällig in deinem main.c irgendwas in der Form

#define F_CPU = 4000000

(da gehört kein = an dieser Stelle hin)

Zeig mal die main.c

von Philip (Gast)


Lesenswert?

#define F_CPU = 8000000

hat er drin :) (siehe zip File)

von Karl H. (kbuchegg)


Lesenswert?

Philip schrieb:
> #define F_CPU = 8000000
>
> hat er drin :) (siehe zip File)

Ah. Zip File habe ich übersehen.

Na dann haben wir ja den Übeltäter:
Da versucht wieder einer C zu programmieren, ohne ein vernünftiges 
Lehrbuch :-)

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Übrigens kann man den Text, den Windows in Konsolenfenstern ausgibt, als 
Text in die Zwischenablage kopieren - und hier als Text zitieren.

Eine Bitmap als Screenshot ist einfach nicht nötig.

von Sam (Gast)


Lesenswert?

Wenn ich es weg mach stehen die restlichen Fehler noch da.
Ich hab das auch nur dran gemacht weil er Compiler das sagte.

von Sam (Gast)


Lesenswert?

Rufus t. Firefly schrieb:
> Übrigens kann man den Text, den Windows in Konsolenfenstern ausgibt, als
> Text in die Zwischenablage kopieren - und hier als Text zitieren.
>
> Eine Bitmap als Screenshot ist einfach nicht nötig.
>

Sorry weiß auch nicht was ich vorher gemacht hab, hat nicht 
funktioniert, als ich STRG + C gedrückt hab.

von Karl H. (kbuchegg)


Lesenswert?

Sam schrieb:
> Wenn ich es weg mach stehen die restlichen Fehler noch da.
> Ich hab das auch nur dran gemacht weil er Compiler das sagte.

Das, mein Herr, ist die schlechteste Begründung die du finden kannst.
Ein Compiler ist nur 'eine Maschine'. Jeder denkende Mensch ist einer 
Maschine überlegen.

Du sollst
* dir die angemäkelten Code Stellen ansehen
* überlegen was da falsch sein könnte. Dazu muss man allerdings
  die C Regeln kennen.
* Die 'Korrekturvorschläge' des Compilers immer mit dem Hintergedanken
  in Betracht ziehen, dass der Compiler auch grauslich falsch liegen
  kann. Denn wie gesagt: Der Compiler ist nur eine Maschine

> Wenn ich es weg mach stehen die restlichen Fehler noch da.

Du hast denselben Fehler noch an anderen Stellen gemacht.
Schau mal in die lcd.c hinein


In der lcd.h

das hier
1
void LcdInit();
ist kein Prototyp. Das lässt offen, wie die Argumentliste tatsächlich 
aussieht.
Das hier
1
void LcdInit( void );
wäre der korrekte Prototyp

Das hier
1
void LcdWrite(const char[80] txt);
ist ausser falsch, nur noch falsch
1
void LcdWrite(const char txt[]);
Aber eigentlich macht man das nicht so. ...
1
void LcdWrite(const char* txt);
... ist die gebräuchlichere Form


Und morgen besorgst du dir gleich ein C-Buch und beginnst zu LESEN.
Das hat keinen Sinn, eine Sprache wie C nach der Methode 'Versuch und 
Irrtum' bzw. 'Ich kann schon erraten wie das alles funktioniert' zu 
erlernen.

von Karl H. (kbuchegg)


Lesenswert?

lcd.c

Das hier
1
void LcdWrite(const char[80] txt)
2
{
3
  for(uint8_t i = 0; txt[i]; i++)
4
    WriteChar((uint8_t)txt[i]);
5
    
6
}
ist auch Unsinn

1
void LcdWrite(const char* txt)
2
{
3
  while( *txt != '\0' )
4
    WriteChar( *txt++ );
5
}

Wenn du schon in C nicht so fit bist, dann sieh dir wenigstens bei 
anderen an, wie man solche Dinge macht.

von Sam (Gast)


Lesenswert?

Ist ja gut, ich hab ein C++ Buch, da muss man nicht xyz(void) angeben.
Und Array in C++ Hab ich nie leiden können.

Aber trotzdem danke.

Jetzt kommen halt die Fehler die ich vorher schon mal hatte:


D:\Projekte\Atmega\sd karte>make.exe all

-------- begin --------
avr-gcc (WinAVR 20100110) 4.3.3
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is 
NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR 
PURPOSE.


Compiling: main.c
avr-gcc -c -mmcu=atmega32 -I. -gdwarf-2   -Os -funsigned-char 
-funsigned-bitfiel
ds -fpack-struct -fshort-enums -Wall -Wstrict-prototypes 
-Wa,-adhlns=main.lst  -
std=gnu99 -DF_OSC=8000000 -MD -MP -MF .dep/main.o.d main.c -o main.o
In file included from main.c:8:
f:/winavr-20100110/lib/gcc/../../avr/include/util/delay.h:85:3: warning: 
#warnin
g "F_CPU not defined for <util/delay.h>"
main.c: In function 'main':
main.c:22: warning: implicit declaration of function 'Clear'

Compiling: lcd.c
avr-gcc -c -mmcu=atmega32 -I. -gdwarf-2   -Os -funsigned-char 
-funsigned-bitfiel
ds -fpack-struct -fshort-enums -Wall -Wstrict-prototypes 
-Wa,-adhlns=lcd.lst  -s
td=gnu99 -DF_OSC=8000000 -MD -MP -MF .dep/lcd.o.d lcd.c -o lcd.o
In file included from lcd.c:2:
f:/winavr-20100110/lib/gcc/../../avr/include/util/delay.h:85:3: warning: 
#warnin
g "F_CPU not defined for <util/delay.h>"
lcd.c: In function 'LcdSend':
lcd.c:69: error: expected ';' before numeric constant
lcd.c:70: error: expected ';' before numeric constant
lcd.c:71: error: expected ';' before numeric constant
lcd.c:72: error: expected ';' before numeric constant
lcd.c:73: error: expected ';' before numeric constant
lcd.c:74: error: expected ';' before numeric constant
lcd.c:75: error: expected ';' before numeric constant
lcd.c: In function 'LcdWrite':
lcd.c:81: warning: implicit declaration of function 'WriteChar'
lcd.c: At top level:
lcd.c:85: error: expected identifier or '(' before '}' token
make.exe: *** [lcd.o] Error 1

Bei den #define waren ein paar =
Keine Ahnung warum ich die da hingeschrieben hab.

Der ; Fehler: Liegt das an dem #define bla x.y das der keinen Punkt 
akzeptiert?

von Sam (Gast)


Lesenswert?

Karl heinz Buchegger schrieb:
> Wenn du schon in C nicht so fit bist, dann sieh dir wenigstens bei
> anderen an, wie man solche Dinge macht.

Das weiß ich, dass man das so macht. Allerdings war txt als Array 
definiert und somit stimmte das Durchzählen.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Sam schrieb:
> Sorry weiß auch nicht was ich vorher gemacht hab, hat nicht
> funktioniert, als ich STRG + C gedrückt hab.

Damit geht das auch nicht. Rechtsklick mit Maus und "Markieren" bei 
nicht aktivem QuickEdit-Modus, sonst direkt Markieren mit Linksklick. 
Kopieren in die Zwischenablage mit Enter/Return.

Ist bei den ernstgemeinten Windowsversionen seit 1993 so.

von g457 (Gast)


Lesenswert?

> #warning "F_CPU not defined for <util/delay.h>"

..zeig mal her was Du jetzt drin stehen hast für F_CPU (normalerweise 
gibt man das übrigens als Kommandozeilenoption, behelfsweise im 
Makefile, an - oder in einem extra Header, den dann alle Module 
includieren können. So (und nur so) vermeidet man mehrfache (und ggf. 
widersprüchliche) defines.).

> main.c:22: warning: implicit declaration of function 'Clear'

Heisst die möglicherweise LcdClear()?

> lcd.c:69: error: expected ';' before numeric constant
[..]

Aua. Schau Dir mal [1] an.

HTH

[1] http://www.mikrocontroller.net/articles/Bitmanipulation

von Sam (Gast)


Lesenswert?

g457 schrieb:
>> lcd.c:69: error: expected ';' before numeric constant
> [..]
>
> Aua. Schau Dir mal [1] an.
>
> HTH
>
> [1] http://www.mikrocontroller.net/articles/Bitmanipulation

Tja weißt du was, das hab ich schon die ganze Zeit offen, da ich sowas 
nie vorher brauchte (und keine Ahnung davon hatte).
Ich hab gedacht das geht so:

PORTB.6 = 1;

Und das gleiche mache ich doch: Ich picke mir den Bit den ich brauche 
raus und setzte den Bit im Register. Das dass nicht geht ist ja klar, 
aber warum kapier ich nicht.

von g457 (Gast)


Lesenswert?

>> [1] http://www.mikrocontroller.net/articles/Bitmanipulation
>
> Tja weißt du was, das hab ich schon die ganze Zeit offen, da ich sowas
> nie vorher brauchte (und keine Ahnung davon hatte).
> Ich hab gedacht das geht so:
>
> PORTB.6 = 1;
>
> Und das gleiche mache ich doch:

∗hust∗ bei mir zeigt obige Seite was anderes an, z.B. im Abschitt [1] 
steht da sowas wie
1
PORTB |= ((1 << MEINBIT0) | (1 << MEINBIT2));

..inklusive ausführlicher Erklärung. Im nächsten Abschnitt steht dann 
auch wie man Bits wieder löscht. Schau Dir den Artikel mal an. Und am 
Besten auch gleich noch das AVR-GCC-Tutorial [2], da stehen noch viele 
andere interessante Sachen drin die man wissen sollte.

HTH

[1] http://www.mikrocontroller.net/articles/Bitmanipulation#Standard_C
[2] http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial

von Link zu (Gast)


Lesenswert?

1
PORTB.6 = 1;
Gibt es sowas unter Vascom?
Unter C kenne ich das so
1
PORTB = PORTB | (1<<PB6);
Siehe auch:
Bitmanipulation: Standard C und AVR-GCC-Tutorial unter "Verändern 
von Registerinhalten".

von Link zu (Gast)


Lesenswert?

Mit Vascom meinte ich Bascom...

von Sam (Gast)


Lesenswert?

Ich hab glaub ich das irgendwo mal gelesen gehabt (vielleicht für 
Bascom, da geht das).

LCD_CTRL |= ((data & 0x01) << LCD_RS)
LCD_DATA |= (((data & 0x02) << LCD_DB4) | ((data & 0x04) << LCD_DB5) | 
((data & 0x08) << LCD_DB6) | ((data & 0x10) << LCD_DB7));

LCD_CTRL |= (1 << LCD_EN);
LCD_CTRL |= (0 << LCD_EN);

Hier kommt das:

lcd.c: In function 'LcdSend':
lcd.c:72: error: called object '(int)data << 7 & 255' is not a function
make.exe: *** [lcd.o] Error 1

Fehler ist in LCD_DATA...

von Link zu (Gast)


Lesenswert?

Auf dem ersten Blick fehlt hinter LCD_CTRL ein ;
[Ich bin mal so naiv und glaube dass der Code kopiert und nicht 
(fehlerbehaftet) abgeschrieben worden ist...]

von Christoph H. (wtzm)


Lesenswert?

Strichpunkt in der Zeile davor fehlt.

von Link zu (Gast)


Lesenswert?

Christoph H. schrieb:
> Strichpunkt in der Zeile davor fehlt.
Erster... ;-)

Mal 'ne Frage, wo kommst du her, dass du Strichpunkt sagst? Dass das ein 
Semikolon ist, hat mir Wikipedia verraten, aber wo diese Bezeichnung 
üblich ist, würde ich trotzdem gerne wissen. ;-)

von Karl H. (kbuchegg)


Lesenswert?

Link zu schrieb:

> Mal 'ne Frage, wo kommst du her, dass du Strichpunkt sagst? Dass das ein
> Semikolon ist, hat mir Wikipedia verraten, aber wo diese Bezeichnung
> üblich ist, würde ich trotzdem gerne wissen. ;-)

Semicolon?

im engl. Sprachraum.
Ein 'Doppelpunkt' schimpft sich dort 'Colon'.
Ein 'Fast-Doppelpunkt' ist daher ein 'Semi-Colon'

von Link zu (Gast)


Lesenswert?

Karl heinz Buchegger schrieb:
>> Mal 'ne Frage, wo kommst du her, dass du Strichpunkt sagst? Dass das ein
>> Semikolon ist, hat mir Wikipedia verraten, aber wo diese Bezeichnung
>> üblich ist, würde ich trotzdem gerne wissen. ;-)
>
> Semicolon?
Neee, ;-)
Strichpunkt ist mir gar nicht geläufig. :-)

von Karl H. (kbuchegg)


Lesenswert?

Link zu schrieb:
> Karl heinz Buchegger schrieb:
>>> Mal 'ne Frage, wo kommst du her, dass du Strichpunkt sagst? Dass das ein
>>> Semikolon ist, hat mir Wikipedia verraten, aber wo diese Bezeichnung
>>> üblich ist, würde ich trotzdem gerne wissen. ;-)
>>
>> Semicolon?
> Neee, ;-)
> Strichpunkt ist mir gar nicht geläufig. :-)

:-)
Österreich

:   ist ein Doppelpunkt
;   ist ein Strichpunkt

von Link zu (Gast)


Lesenswert?

Karl heinz Buchegger schrieb:
> Link zu schrieb:
>> Karl heinz Buchegger schrieb:
>>>> Mal 'ne Frage, wo kommst du her, dass du Strichpunkt sagst? Dass das ein
>>>> Semikolon ist, hat mir Wikipedia verraten, aber wo diese Bezeichnung
>>>> üblich ist, würde ich trotzdem gerne wissen. ;-)
>>>
>>> Semicolon?
>> Neee, ;-)
>> Strichpunkt ist mir gar nicht geläufig. :-)
>
> :-)
> Österreich
Och echt. Sonst habt ihr doch so schöne eigene Namen...
Sowas wie:
-Eierschwammerl
-Naßwadi

von Christoph H. (wtzm)


Lesenswert?

Jop, bin aus AT. Immer diese Sprachbarrieren... ;)

von Bayer (Gast)


Lesenswert?

Auch bei uns in Bayern heißt ";" "Strichpunkt",
liegt an der guten Nachbarschaft.

von NurEinGast (Gast)


Lesenswert?

Auch bei uns in BW ist "Strichpunkt" wohl bekannt und wird gerne 
verwendet.

von Rolf Magnus (Gast)


Lesenswert?

Sam schrieb:
> Ist ja gut, ich hab ein C++ Buch, da muss man nicht xyz(void) angeben.
> Und Array in C++ Hab ich nie leiden können.

C++ ist nicht C, also kannst du auch dessen Regeln nicht alle anwenden.

Sam schrieb:
> Karl heinz Buchegger schrieb:
>> Wenn du schon in C nicht so fit bist, dann sieh dir wenigstens bei
>> anderen an, wie man solche Dinge macht.
>
> Das weiß ich, dass man das so macht. Allerdings war txt als Array
> definiert und somit stimmte das Durchzählen.

Nein, war es nicht. Das hätte aber auch in deinem C++-Buch erklärt sein 
müssen.

Christoph H. schrieb:
> Jop, bin aus AT. Immer diese Sprachbarrieren... ;)

Es ist ja bekannt, daß der größte Unterschied zwischen Deutschland und 
Österreich die gemeinsame Sprache ist.

von Link zu (Gast)


Lesenswert?

Bayer schrieb:
> Auch bei uns in Bayern heißt ";" "Strichpunkt",
> liegt an der guten Nachbarschaft.
Okay, damit ich mal gegenhalten kann: bei uns wäre es Streekpunkt 
(Plattdeutsch), und nein, das habe ich nachschlagen müssen... ;-)

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
Noch kein Account? Hier anmelden.