mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Fehler in Avr Header


Autor: Sam (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Philip (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#define F_CPU = 8000000

hat er drin :) (siehe zip File)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sam (Gast)
Datum:

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

Autor: Sam (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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
void LcdInit();
ist kein Prototyp. Das lässt offen, wie die Argumentliste tatsächlich 
aussieht.
Das hier
void LcdInit( void );
wäre der korrekte Prototyp

Das hier
void LcdWrite(const char[80] txt);
ist ausser falsch, nur noch falsch
void LcdWrite(const char txt[]);
Aber eigentlich macht man das nicht so. ...
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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
lcd.c

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

void LcdWrite(const char* txt)
{
  while( *txt != '\0' )
    WriteChar( *txt++ );
}

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

Autor: Sam (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Sam (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: g457 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sam (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: g457 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
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/Bitmanipul...
[2] http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial

Autor: Link zu (Gast)
Datum:

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

Autor: Link zu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit Vascom meinte ich Bascom...

Autor: Sam (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Link zu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...]

Autor: Christoph H. (wtzm)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Strichpunkt in der Zeile davor fehlt.

Autor: Link zu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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. ;-)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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'

Autor: Link zu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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. :-)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Link zu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Christoph H. (wtzm)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jop, bin aus AT. Immer diese Sprachbarrieren... ;)

Autor: Bayer (Gast)
Datum:

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

Autor: NurEinGast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auch bei uns in BW ist "Strichpunkt" wohl bekannt und wird gerne 
verwendet.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Link zu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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... ;-)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail ü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
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
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 bestätigst du, die Nutzungsbedingungen anzuerkennen.